239 lines
8.5 KiB
C#
239 lines
8.5 KiB
C#
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"));
|
||
}
|
||
}
|