365 lines
14 KiB
C#
365 lines
14 KiB
C#
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-Программа", new DateTime(2026, 10, 17), DBNull.Value, DBNull.Value],
|
||
[2, 1, "TEST-Программа-2", 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", 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));
|
||
}
|
||
}
|