using DynamicCrud.Tests.Fixtures; using ServicesDAO.Repositories; using Xunit; namespace DynamicCrud.Tests; // Modelos sin FKs críticas — seguros para ciclo Create/Update/Delete public class WriteOperationsTests : IClassFixture { private readonly DbContextFixture _fixture; public WriteOperationsTests(DbContextFixture fixture) { _fixture = fixture; } public static IEnumerable WriteFixtures => new[] { new object[] { "region", new Dictionary { ["regionName"] = "test-region-crud" }, new Dictionary { ["regionName"] = "test-region-crud-upd" } }, new object[] { "periodicity", new Dictionary { ["name"] = "test-period-crud" }, new Dictionary { ["name"] = "test-period-crud-upd" } }, new object[] { "exp_category", new Dictionary { ["expositionCategoryName"] = "test-cat-crud" }, new Dictionary { ["expositionCategoryName"] = "test-cat-crud-upd" } }, new object[] { "status_type", new Dictionary { ["name"] = "test-status-crud", ["active"] = true }, new Dictionary { ["name"] = "test-status-crud-upd" } }, }; [Theory] [MemberData(nameof(WriteFixtures))] public async Task Create_Update_Delete_FullCycle( string modelName, Dictionary createData, Dictionary updateData) { var entityType = ModelRegistry.Resolve(modelName)!; // --- CREATE --- using var ctx1 = _fixture.CreateContext(); var (createOk, _, insertedId, createDetail) = await RepoHelper.CreateRecord(RepoHelper.Create(ctx1, entityType), createData); Assert.True(createOk, $"[{modelName}] Create falló: {createDetail}"); Assert.NotNull(insertedId); var id = Convert.ToInt32(insertedId); // --- GET BY ID --- using var ctx2 = _fixture.CreateContext(); var found = await RepoHelper.GetById(RepoHelper.Create(ctx2, entityType), id); Assert.NotNull(found); // --- UPDATE --- using var ctx3 = _fixture.CreateContext(); var (updateOk, _, updateStatus) = await RepoHelper.Update(RepoHelper.Create(ctx3, entityType), id, updateData); Assert.True(updateOk, $"[{modelName}] Update falló (status={updateStatus})"); // --- DELETE --- using var ctx4 = _fixture.CreateContext(); var (deleteOk, deleteMsg) = await RepoHelper.Delete(RepoHelper.Create(ctx4, entityType), id); Assert.True(deleteOk, $"[{modelName}] Delete falló: {deleteMsg}"); // --- VERIFY DELETED --- using var ctx5 = _fixture.CreateContext(); var notFound = await RepoHelper.GetById(RepoHelper.Create(ctx5, entityType), id); Assert.Null(notFound); } }