VEU.WathBody/3-app/2-cli/Server.WatchBody.Core.Tests/DailyLogRepositoryTests.cs

233 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Kit.Helpers.SqlHelperAbstract;
using Server.WatchBody.Core.Dal.Src.Domain;
using Server.WatchBody.Core.Dal.Src.Repository;
using Xunit;
namespace Server.WatchBody.Core.Tests;
// Тесты DailyLogRepository / WorkoutMetricsRepository / BreakRepository
// по repository_tests\DailyLogRepository.md, WorkoutMetricsRepository.md, BreakRepository.md.
public class DailyLogRepositoryTests
{
private static readonly Guid D1 = Guid.Parse("dddd0000-0000-0000-0000-000000000001");
[Fact]
public void Upsert_1Основной_8Параметров()
{
var expArgs = new ConnectionString().PrepareExecute("src.daily_log_upsert")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_id", D1)
.AddParameter("p_date", new DateOnly(2026, 10, 17))
.AddParameter("p_bp_sys", 130)
.AddParameter("p_bp_dias", 80)
.AddParameter("p_weight_kg", 157.5m)
.AddParameter("p_hr_resting", 60)
.AddParameter("p_wellbeing", 5)
.BuildParams();
var cs = ConnectionStringTest.Scalar(expArgs, D1);
var result = new DailyLogRepository(cs).Upsert(1, new DailyLog
{
Id = D1, Date = new DateOnly(2026, 10, 17),
BpSys = 130, BpDias = 80, WeightKg = 157.5m, HrResting = 60, Wellbeing = 5,
});
Assert.Equal(D1, result);
}
[Fact]
public void Select_1Основной_1Сущность()
{
var expArgs = new ConnectionString().PrepareExecute("src.daily_log_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var table = TestInfra.Table(TestInfra.DailyLogCols,
[D1, 1, new DateTime(2026, 10, 17), 130, 80, 157.5m, 60, DBNull.Value, DBNull.Value, 5]);
var cs = new ConnectionStringTest(expArgs, table);
var rows = new DailyLogRepository(cs).Select(new DailyLogFilter { AthleteId = 1 }).ToList();
var d = Assert.Single(rows);
Assert.Equal(new DateOnly(2026, 10, 17), d.Date);
Assert.Null(d.WaistCm);
}
[Fact]
public void Select_2Граничный_Пустая()
{
var expArgs = new ConnectionString().PrepareExecute("src.daily_log_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.DailyLogCols));
Assert.Empty(new DailyLogRepository(cs).Select(new DailyLogFilter { AthleteId = 1 }));
}
}
public class WorkoutMetricsRepositoryTests
{
private static readonly Guid W1 = Guid.Parse("aaaa0000-0000-0000-0000-000000000001");
[Fact]
public void Upsert_1Основной_8Параметров()
{
var expArgs = new ConnectionString().PrepareExecute("src.workout_metrics_upsert")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_workout_id", W1)
.AddParameter("p_adherence", 92.5m)
.AddParameter("p_tonnage", 4200.0m)
.AddParameter("p_tonnage_by_group", "{\"push\":4200}")
.AddParameter("p_e1pm_by_exercise", "{}")
.AddParameter("p_hr_metrics", "{}")
.AddParameter("p_red_flags", "[]")
.BuildParams();
var cs = ConnectionStringTest.Scalar(expArgs, 9);
var result = new WorkoutMetricsRepository(cs).Upsert(1, new WorkoutMetrics
{
WorkoutId = W1, Adherence = 92.5m, Tonnage = 4200.0m,
TonnageByGroup = "{\"push\":4200}", E1pmByExercise = "{}",
HrMetrics = "{}", RedFlags = "[]",
});
Assert.Equal(9, result);
}
[Fact]
public void Select_1Основной_StartedAt()
{
var expArgs = new ConnectionString().PrepareExecute("src.workout_metrics_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_workout_id", DBNull.Value)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var table = TestInfra.Table(TestInfra.MetricsCols,
[9, W1, 1, 92.5m, 4200.0m, "{}", "{}", "{}", "[]",
new DateTime(2026, 10, 17, 20, 0, 0), new DateTime(2026, 10, 17, 18, 0, 0)]);
var cs = new ConnectionStringTest(expArgs, table);
var rows = new WorkoutMetricsRepository(cs).Select(new WorkoutMetricsFilter { AthleteId = 1 }).ToList();
var m = Assert.Single(rows);
Assert.Equal(92.5m, m.Adherence);
}
[Fact]
public void Select_2Граничный_Пустая()
{
var expArgs = new ConnectionString().PrepareExecute("src.workout_metrics_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_workout_id", DBNull.Value)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.MetricsCols));
Assert.Empty(new WorkoutMetricsRepository(cs).Select(new WorkoutMetricsFilter { AthleteId = 1 }));
}
}
public class BreakRepositoryTests
{
private static readonly Guid B1 = Guid.Parse("eeee0000-0000-0000-0000-000000000001");
private static readonly Guid B2 = Guid.Parse("eeee0000-0000-0000-0000-000000000002");
[Fact]
public void Insert_1Основной_KindNull_КакDbNull()
{
var expArgs = new ConnectionString().PrepareExecute("src.break_insert")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_id", B2)
.AddParameter("p_kind", DBNull.Value)
.AddParameter("p_source", "auto")
.AddParameter("p_started_on", new DateOnly(2026, 10, 1))
.AddParameter("p_planned_return", DBNull.Value)
.AddParameter("p_note", "")
.BuildParams();
var cs = ConnectionStringTest.Scalar(expArgs, B2);
var result = new BreakRepository(cs).Insert(1, new Break
{
Id = B2, Kind = null, Source = "auto",
StartedOn = new DateOnly(2026, 10, 1), PlannedReturn = null, Note = "",
});
Assert.Equal(B2, result);
}
[Fact]
public void Update_1Основной_6Параметров()
{
var expArgs = new ConnectionString().PrepareExecute("src.break_update")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_id", B1)
.AddParameter("p_kind", "vacation")
.AddParameter("p_note", "TEST-отпуск")
.AddParameter("p_planned_return", new DateOnly(2026, 10, 27))
.AddParameter("p_ended_on", DBNull.Value)
.BuildParams();
var cs = ConnectionStringTest.Scalar(expArgs, 1);
var result = new BreakRepository(cs).Update(1, new Break
{
Id = B1, Kind = "vacation", Note = "TEST-отпуск",
PlannedReturn = new DateOnly(2026, 10, 27), EndedOn = null,
});
Assert.Equal(1, result);
}
[Fact]
public void Select_1Основной_2Сущности_KindNull()
{
var expArgs = new ConnectionString().PrepareExecute("src.break_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_kind", DBNull.Value)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var table = TestInfra.Table(TestInfra.BreakCols,
[B1, 1, "vacation", "manual", new DateTime(2026, 10, 20),
new DateTime(2026, 10, 27), DBNull.Value, "TEST-отпуск"],
[B2, 1, DBNull.Value, "auto", new DateTime(2026, 10, 1),
DBNull.Value, DBNull.Value, ""]);
var cs = new ConnectionStringTest(expArgs, table);
var rows = new BreakRepository(cs).Select(new BreakFilter { AthleteId = 1 }).ToList();
Assert.Equal(2, rows.Count);
Assert.Null(rows[1].Kind);
Assert.Equal(DateOnly.FromDateTime(new DateTime(2026, 10, 20)), rows[0].StartedOn);
}
[Fact]
public void Select_2Граничный_Пустая()
{
var expArgs = new ConnectionString().PrepareExecute("src.break_select")
.AsStoredProcedure()
.AddParameter("p_athlete_id", 1)
.AddParameter("p_kind", DBNull.Value)
.AddParameter("p_date_from", DBNull.Value)
.AddParameter("p_date_to", DBNull.Value)
.BuildParams();
var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.BreakCols));
Assert.Empty(new BreakRepository(cs).Select(new BreakFilter { AthleteId = 1 }));
}
}