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; // Тесты ExerciseRepository / ExerciseReplacementRepository / ProgramRepository / ProgramVersionRepository // по repository_tests\ExerciseRepository.md и ProgramRepository.md. public class ExerciseRepositoryTests { private static readonly Guid E1 = Guid.Parse("11111111-1111-1111-1111-111111111111"); private static readonly Guid E2 = Guid.Parse("22222222-2222-2222-2222-222222222222"); [Fact] public void Insert_1Основной_ScalarGuid() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_insert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", E1) .AddParameter("p_name", "TEST-жим") .AddParameter("p_group_id", 1) .AddParameter("p_is_base", true) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, E1); var result = new ExerciseRepository(cs).Insert( new Exercise { Id = E1, AthleteId = 1, Name = "TEST-жим", GroupId = 1, IsBase = true }); Assert.Equal(E1, result); } [Fact] public void Update_1Основной_5Параметров() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_update") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", E1) .AddParameter("p_name", "TEST-жим 45°") .AddParameter("p_group_id", 1) .AddParameter("p_is_base", false) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); var result = new ExerciseRepository(cs).Update( new Exercise { Id = E1, AthleteId = 1, Name = "TEST-жим 45°", GroupId = 1, IsBase = false }); Assert.Equal(1, result); } [Fact] public void Delete_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_delete") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", E1) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); Assert.Equal(1, new ExerciseRepository(cs).Delete(1, E1)); } [Fact] public void Select_1Основной_2Сущности_ЗаменыУe2() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_select") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_name", DBNull.Value) .AddParameter("p_group_id", DBNull.Value) .AddParameter("p_is_base", DBNull.Value) .AddParameter("p_is_active", true) .BuildParams(); var table = TestInfra.Table(TestInfra.ExerciseCols, [E1, 1, "TEST-aжим", 1, true, true, "[]"], [E2, 1, "TEST-bжим", 2, true, true, $"[\"{E1}\"]"]); var cs = new ConnectionStringTest(expArgs, table); var rows = new ExerciseRepository(cs).Select( new ExerciseFilter { AthleteId = 1, IsActive = true }).ToList(); Assert.Equal(2, rows.Count); var e2 = rows.Single(x => x.Id == E2); Assert.Equal([E1], e2.ReplacementIds); } [Fact] public void Select_2Граничный_Пустая() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_select") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_name", DBNull.Value) .AddParameter("p_group_id", DBNull.Value) .AddParameter("p_is_base", DBNull.Value) .AddParameter("p_is_active", DBNull.Value) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.ExerciseCols)); Assert.Empty(new ExerciseRepository(cs).Select(new ExerciseFilter { AthleteId = 1 })); } [Fact] public void Get_1Основной_Сущность_Замены() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", E2) .BuildParams(); var table = TestInfra.Table(TestInfra.ExerciseCols, [E2, 1, "TEST-bжим", 2, true, true, $"[\"{E1}\"]"]); var cs = new ConnectionStringTest(expArgs, table); var e = new ExerciseRepository(cs).Get(1, E2); Assert.NotNull(e); Assert.Equal([E1], e.ReplacementIds); } [Fact] public void Get_2Граничный_Null() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", E2) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.ExerciseCols)); Assert.Null(new ExerciseRepository(cs).Get(1, E2)); } [Fact] public void Replacement_Insert_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_replacement_insert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_exercise_id", E1) .AddParameter("p_replacement_id", E2) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); Assert.Equal(1, new ExerciseReplacementRepository(cs).Insert(1, E1, E2)); } [Fact] public void Replacement_Delete_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.exercise_replacement_delete") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_exercise_id", E1) .AddParameter("p_replacement_id", E2) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); Assert.Equal(1, new ExerciseReplacementRepository(cs).Delete(1, E1, E2)); } } public class ProgramRepositoryTests { [Fact] public void Insert_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.program_insert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_title", "TEST-Программа") .AddParameterNullable("p_external_id", null) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 5); Assert.Equal(5, new ProgramRepository(cs).Insert( new Program { AthleteId = 1, Title = "TEST-Программа" })); } [Fact] public void Insert_2СExternalId() { var expArgs = new ConnectionString().PrepareExecute("src.program_insert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_title", "TEST-Пакет") .AddParameterNullable("p_external_id", "pkg_1") .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 7); Assert.Equal(7, new ProgramRepository(cs).Insert( new Program { AthleteId = 1, Title = "TEST-Пакет", ExternalId = "pkg_1" })); } [Fact] public void Select_1Основной_АктивнаяВерсияДенормализация() { var activeId = Guid.Parse("99999999-9999-9999-9999-999999999999"); var expArgs = new ConnectionString().PrepareExecute("src.program_select") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .BuildParams(); var table = TestInfra.Table(TestInfra.ProgramCols, [1, 1, "TEST-Программа", DBNull.Value, new DateTime(2026, 10, 17), DBNull.Value, DBNull.Value], [2, 1, "TEST-Программа-2", DBNull.Value, new DateTime(2026, 10, 17), activeId, 2]); var cs = new ConnectionStringTest(expArgs, table); var rows = new ProgramRepository(cs).Select(1).ToList(); Assert.Equal(2, rows.Count); Assert.Null(rows[0].ActiveVersionNumber); Assert.Equal(2, rows[1].ActiveVersionNumber); Assert.Equal(activeId, rows[1].ActiveVersionId); } [Fact] public void Get_1Основной_Сущность() { var activeId = Guid.Parse("99999999-9999-9999-9999-999999999999"); var expArgs = new ConnectionString().PrepareExecute("src.program_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_program_id", 2) .BuildParams(); var table = TestInfra.Table(TestInfra.ProgramCols, [2, 1, "TEST-Программа-2", DBNull.Value, new DateTime(2026, 10, 17), activeId, 2]); var cs = new ConnectionStringTest(expArgs, table); var p = new ProgramRepository(cs).Get(1, 2); Assert.NotNull(p); Assert.Equal(activeId, p.ActiveVersionId); } [Fact] public void Get_2Граничный_Null() { var expArgs = new ConnectionString().PrepareExecute("src.program_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_program_id", 999) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.ProgramCols)); Assert.Null(new ProgramRepository(cs).Get(1, 999)); } } public class ProgramVersionRepositoryTests { private static readonly Guid V1 = Guid.Parse("11111111-1111-1111-1111-111111111111"); private static readonly Guid V2 = Guid.Parse("22222222-2222-2222-2222-222222222222"); [Fact] public void Insert_1Основной_7Параметров() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_insert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", V1) .AddParameter("p_program_id", 1) .AddParameter("p_based_on_version", DBNull.Value) .AddParameter("p_author", "user") .AddParameter("p_body", "{}") .AddParameter("p_rationale", "TEST-первая") .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, V1); var result = new ProgramVersionRepository(cs).Insert(1, new ProgramVersion { Id = V1, ProgramId = 1, BasedOnVersion = null, Author = "user", Body = "{}", Rationale = "TEST-первая", }); Assert.Equal(V1, result); } [Fact] public void UpdateStatus_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_update") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", V1) .AddParameter("p_status", "active") .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); Assert.Equal(1, new ProgramVersionRepository(cs).UpdateStatus(1, V1, "active")); } [Fact] public void Select_1Основной_БезBody() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_select") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_program_id", DBNull.Value) .AddParameter("p_status", DBNull.Value) .AddParameter("p_author", DBNull.Value) .BuildParams(); var table = TestInfra.Table(TestInfra.VersionCols, [V1, 1, 1, DBNull.Value, "draft", "user", "TEST", new DateTime(2026, 10, 17)], [V2, 1, 2, 1, "active", "user", "", new DateTime(2026, 10, 17)]); var cs = new ConnectionStringTest(expArgs, table); var rows = new ProgramVersionRepository(cs).Select(new ProgramVersionFilter { AthleteId = 1 }).ToList(); Assert.Equal(2, rows.Count); Assert.Equal(1, rows[0].Version); Assert.Null(rows[0].BasedOnVersion); } [Fact] public void Select_2Граничный_Пустая() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_select") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_program_id", DBNull.Value) .AddParameter("p_status", DBNull.Value) .AddParameter("p_author", DBNull.Value) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.VersionCols)); Assert.Empty(new ProgramVersionRepository(cs).Select(new ProgramVersionFilter { AthleteId = 1 })); } [Fact] public void Get_1Основной_СBody() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", V2) .BuildParams(); var table = TestInfra.Table( TestInfra.VersionCols.Concat([("body", typeof(string))]).ToArray(), [V2, 1, 2, 1, "active", "user", "", new DateTime(2026, 10, 17), "{}"]); var cs = new ConnectionStringTest(expArgs, table); var v = new ProgramVersionRepository(cs).Get(1, V2); Assert.NotNull(v); Assert.Equal("{}", v.Body); } [Fact] public void Get_2Граничный_Null() { var expArgs = new ConnectionString().PrepareExecute("src.program_version_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_id", V2) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.VersionCols)); Assert.Null(new ProgramVersionRepository(cs).Get(1, V2)); } }