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

365 lines
14 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;
// Тесты 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));
}
}