using Kit.Helpers.SqlHelperAbstract; using Server.WatchBody.Core.Dal.Src.Domain; using Server.WatchBody.Core.Dal.Src.Repository; using Server.WatchBody.Core.Dal.Ref.Repository; using Xunit; namespace Server.WatchBody.Core.Tests; // Тесты AthleteRepository / AthleteProfileRepository по repository_tests\AthleteRepository.md // и AthleteProfileRepository.md (d-tst: тест → репозиторий → фейк-транспорт). public class AthleteRepositoryTests { [Fact] public void Insert_1Основной_Scalar7_ПараметрыИмяХэш() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_insert") .AsStoredProcedure() .AddParameter("p_name", "TEST-Атлет") .AddParameter("p_api_key_hash", "TEST-hash-1") .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 7); var result = new AthleteRepository(cs).Insert( new Athlete { Name = "TEST-Атлет", ApiKeyHash = "TEST-hash-1" }); Assert.Equal(7, result); Assert.Single(cs.Requests); } [Fact] public void Update_1Основной_Scalar1_ВсеПоля() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_update") .AsStoredProcedure() .AddParameter("p_id", 1) .AddParameter("p_name", "TEST-Атлет-новый") .AddParameter("p_api_key_hash", "TEST-hash-новый") .AddParameter("p_is_blocked", true) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); var result = new AthleteRepository(cs).Update( new Athlete { Id = 1, Name = "TEST-Атлет-новый", ApiKeyHash = "TEST-hash-новый", IsBlocked = true }); Assert.Equal(1, result); } [Fact] public void Select_1Основной_ФильтрХэш_1Сущность() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_select") .AsStoredProcedure() .AddParameter("p_api_key_hash", "TEST-hash-1") .AddParameter("p_is_blocked", DBNull.Value) .BuildParams(); var table = TestInfra.Table(TestInfra.AthleteCols, [1, "TEST-Атлет", "TEST-hash-1", false, new DateTime(2026, 10, 17)]); var cs = new ConnectionStringTest(expArgs, table); var rows = new AthleteRepository(cs).Select( new AthleteFilter { ApiKeyHash = "TEST-hash-1", IsBlocked = null }).ToList(); var a = Assert.Single(rows); Assert.Equal(1, a.Id); Assert.Equal("TEST-Атлет", a.Name); Assert.False(a.IsBlocked); } [Fact] public void Select_2Граничный_ПустаяТаблица_ПустаяКоллекция() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_select") .AsStoredProcedure() .AddParameter("p_api_key_hash", DBNull.Value) .AddParameter("p_is_blocked", DBNull.Value) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.AthleteCols)); var rows = new AthleteRepository(cs).Select(new AthleteFilter()); Assert.Empty(rows); } [Fact] public void Get_1Основной_Сущность() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_get") .AsStoredProcedure() .AddParameter("p_id", 1) .BuildParams(); var table = TestInfra.Table(TestInfra.AthleteCols, [1, "TEST-Атлет", "TEST-hash-1", false, new DateTime(2026, 10, 17)]); var cs = new ConnectionStringTest(expArgs, table); var a = new AthleteRepository(cs).Get(1); Assert.NotNull(a); Assert.Equal("TEST-Атлет", a.Name); } [Fact] public void Get_2Граничный_ПустаяТаблица_Null() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_get") .AsStoredProcedure() .AddParameter("p_id", 999) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.AthleteCols)); Assert.Null(new AthleteRepository(cs).Get(999)); } } public class AthleteProfileRepositoryTests { [Fact] public void Upsert_1Основной_HrMaxNull_КакDbNull() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_profile_upsert") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .AddParameter("p_sex", "m") .AddParameter("p_birth_year", 1978) .AddParameter("p_weight_kg", 158.0m) .AddParameter("p_hr_max", DBNull.Value) .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 3); var result = new AthleteProfileRepository(cs).Upsert( new AthleteProfile { AthleteId = 1, Sex = "m", BirthYear = 1978, WeightKg = 158.0m, HrMax = null }); Assert.Equal(3, result); } [Fact] public void Get_1Основной_Сущность() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_profile_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 1) .BuildParams(); var table = TestInfra.Table(TestInfra.ProfileCols, [10, 1, "m", 1978, 158.0m, DBNull.Value, new DateTime(2026, 10, 17)]); var cs = new ConnectionStringTest(expArgs, table); var p = new AthleteProfileRepository(cs).Get(1); Assert.NotNull(p); Assert.Equal(158.0m, p.WeightKg); Assert.Null(p.HrMax); } [Fact] public void Get_2Граничный_ПустаяТаблица_Null() { var expArgs = new ConnectionString().PrepareExecute("src.athlete_profile_get") .AsStoredProcedure() .AddParameter("p_athlete_id", 2) .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.ProfileCols)); Assert.Null(new AthleteProfileRepository(cs).Get(2)); } } public class ExerciseGroupRepositoryTests { [Fact] public void Select_1Основной_2Сущности() { var expArgs = new ConnectionString().PrepareExecute("ref.exercise_group_select") .AsStoredProcedure() .BuildParams(); var table = TestInfra.Table(TestInfra.GroupCols, [1, "push", "Жимовые"], [3, "legs", "Ноги"]); var cs = new ConnectionStringTest(expArgs, table); var rows = new ExerciseGroupRepository(cs).Select().ToList(); Assert.Equal(2, rows.Count); Assert.Equal("push", rows[0].Code); } [Fact] public void Select_2Граничный_ПустаяТаблица() { var expArgs = new ConnectionString().PrepareExecute("ref.exercise_group_select") .AsStoredProcedure() .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.GroupCols)); Assert.Empty(new ExerciseGroupRepository(cs).Select()); } } public class MigrationRepositoryTests { [Fact] public void Insert_1Основной() { var expArgs = new ConnectionString().PrepareExecute("src.migration_insert") .AsStoredProcedure() .AddParameter("p_filename", "TEST-0001.sql") .BuildParams(); var cs = ConnectionStringTest.Scalar(expArgs, 1); Assert.Equal(1, new MigrationRepository(cs).Insert("TEST-0001.sql")); } [Fact] public void Select_1Основной_Сущность() { var expArgs = new ConnectionString().PrepareExecute("src.migration_select") .AsStoredProcedure() .AddParameter("p_filename", "TEST-0001.sql") .BuildParams(); var table = TestInfra.Table(TestInfra.MigrationCols, [1, "TEST-0001.sql", new DateTime(2026, 10, 17)]); var cs = new ConnectionStringTest(expArgs, table); var m = new MigrationRepository(cs).Select("TEST-0001.sql"); Assert.NotNull(m); Assert.Equal("TEST-0001.sql", m.Filename); } [Fact] public void Select_2Граничный_ПустаяТаблица_Null() { var expArgs = new ConnectionString().PrepareExecute("src.migration_select") .AsStoredProcedure() .AddParameter("p_filename", "TEST-нет.sql") .BuildParams(); var cs = new ConnectionStringTest(expArgs, TestInfra.Table(TestInfra.MigrationCols)); Assert.Null(new MigrationRepository(cs).Select("TEST-нет.sql")); } }