Files
2026-06-23 11:18:54 -05:00

134 lines
5.3 KiB
C#

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AutoMapper;
using NUnit.Framework;
using Strata.Analytics.Biz.DbContexts;
using Strata.Analytics.Biz.Extracts.Models;
using Strata.Analytics.Biz.Extracts.Services;
using Strata.Analytics.Test.Unit.Biz.TestData;
using Strata.CoreLib.Claims;
using Strata.CoreLib.Claims.Extensions;
using Strata.Testing.Categories;
namespace Strata.Analytics.Test.Unit.Biz.Extracts
{
[Category(TestCategory.Unit)]
[Parallelizable(ParallelScope.Self)]
public class ExtractCrudTests
{
private IClaimsPrincipalAccessor _claimsPrincipalAccessor;
private AnalyticsDbContext _dbContext;
private IMapper _mapper;
private IExtractService _extractService;
[OneTimeSetUp]
public void OneTimeSetup()
{
_claimsPrincipalAccessor = IClaimsPrincipalAccessorMock.GetClaimsPrincipalAccessor(5, true);
_dbContext = AnalyticsDbContextMock.GetAnalyticsDbContext(_claimsPrincipalAccessor);
_mapper = AutoMapperMock.GetAutoMapper();
_extractService = new ExtractService(_dbContext, _claimsPrincipalAccessor, _mapper);
_dbContext.Extracts.AddRange(ExtractTestData.Extracts());
_dbContext.ExtractExportHistory.AddRange(ExtractTestData.ExtractExportHistories());
_dbContext.SaveChanges();
}
[OneTimeTearDown]
public async Task OneTimeTearDown()
{
await _dbContext.Database.EnsureDeletedAsync();
}
[Test]
public async Task CanCreate()
{
var now = DateTime.UtcNow;
// arrange
var saveInfo = new ExtractCreateInfo()
{
Name = "My First Unit Test Extract!",
Description = "Be Happy For Me!!!",
ExtractType = ExtractType.DataSource,
Content = "{\"dataSourceId\":1,\"rows\":[],\"columnGroups\":[{\"groupId\":\"ABCD1\",\"values\":[],\"dimensions\":[],\"sortOrder\":0}],\"filters\":[],\"queryConfig\":{\"rows\":[],\"values\":[],\"filterGroups\":[],\"withTotals\":false,\"rowLimit\":25}}"
};
// act
var result = await _extractService.CreateAsync(saveInfo, CancellationToken.None);
// assert
Assert.IsNotNull(result);
Assert.That(result.ExtractId, Is.GreaterThan(ExtractTestData.Extracts().Max(h => h.ExtractId)));
Assert.That(result.ExtractType, Is.EqualTo(ExtractType.DataSource));
Assert.That(result.Content, Is.EqualTo(saveInfo.Content));
Assert.That(result.CreatedByUserGuid, Is.EqualTo(_claimsPrincipalAccessor.GetCurrentClaimsPrincipal().GetUserGuid()));
Assert.That(result.UpdatedByUserGuid, Is.EqualTo(_claimsPrincipalAccessor.GetCurrentClaimsPrincipal().GetUserGuid()));
Assert.IsNotNull(result.CreatedDate);
Assert.IsNotNull(result.UpdatedDate);
}
[Test]
public async Task CanGetById()
{
// act
var result = await _extractService.GetByIdAsync(1, CancellationToken.None);
// assert
Assert.IsNotNull(result);
}
[Test]
public async Task CanUpdate()
{
// arrange
var extractId = _dbContext.Extracts.First().ExtractId;
var extract = await _extractService.GetByIdAsync(extractId, CancellationToken.None);
var saveInfo = new ExtractSaveInfo();
_mapper.Map(extract, saveInfo);
saveInfo.Name = "My First RENAMED Extract!";
saveInfo.Description = "Fear Me!!!";
saveInfo.RawSql = "My New and IMPROVED Query...";
_dbContext.ChangeTracker.Clear();
// act
var result = await _extractService.UpdateAsync(extract.ExtractId, saveInfo, CancellationToken.None);
// assert
Assert.IsNotNull(result);
Assert.That(result.ExtractId, Is.EqualTo(extract.ExtractId));
Assert.That(result.Name, Is.EqualTo(saveInfo.Name));
Assert.That(result.Description, Is.EqualTo(saveInfo.Description));
Assert.That(result.RawSql, Is.EqualTo(saveInfo.RawSql));
Assert.That(result.CreatedByUserGuid, Is.EqualTo(extract.CreatedByUserGuid));
Assert.That(result.UpdatedByUserGuid, Is.EqualTo(_claimsPrincipalAccessor.GetCurrentClaimsPrincipal().GetUserGuid()));
Assert.That(result.CreatedDate, Is.EqualTo(extract.CreatedDate));
Assert.That(result.UpdatedDate, Is.EqualTo(DateTimeOffset.UtcNow).Within(500).Milliseconds); // this could fail in debug
}
[Test]
public async Task CanDelete_LeaveOrphanHistory()
{
// arrange
var extractId = _dbContext.Extracts.Last().ExtractId;
_dbContext.ChangeTracker.Clear();
// act
await _extractService.DeleteAsync(extractId, CancellationToken.None);
var result = await _extractService.GetByIdAsync(extractId, CancellationToken.None);
var histories = new ExtractExportHistoryService(_dbContext, _claimsPrincipalAccessor, _mapper).GetByExtractIdAsync(extractId, CancellationToken.None);
// assert
Assert.IsNull(result);
Assert.IsNotNull(histories);
}
}
}