using Moq; using ScadaLink.Commons.Entities.Templates; using ScadaLink.Commons.Interfaces.Repositories; using ScadaLink.Commons.Interfaces.Services; using ScadaLink.TemplateEngine.Services; namespace ScadaLink.TemplateEngine.Tests.Services; public class TemplateFolderServiceTests { private readonly Mock _repoMock = new(); private readonly Mock _auditMock = new(); private readonly TemplateFolderService _sut; public TemplateFolderServiceTests() { _sut = new TemplateFolderService(_repoMock.Object, _auditMock.Object); } [Fact] public async Task CreateFolder_ValidInput_ReturnsSuccess() { _repoMock.Setup(r => r.GetAllFoldersAsync(It.IsAny())) .ReturnsAsync(new List()); var result = await _sut.CreateFolderAsync("Dev", null, "admin"); Assert.True(result.IsSuccess); Assert.Equal("Dev", result.Value.Name); Assert.Null(result.Value.ParentFolderId); _repoMock.Verify(r => r.AddFolderAsync(It.IsAny(), It.IsAny()), Times.Once); _repoMock.Verify(r => r.SaveChangesAsync(It.IsAny()), Times.Once); } [Fact] public async Task CreateFolder_EmptyName_ReturnsFailure() { var result = await _sut.CreateFolderAsync(" ", null, "admin"); Assert.True(result.IsFailure); Assert.Contains("required", result.Error, StringComparison.OrdinalIgnoreCase); } [Fact] public async Task CreateFolder_DuplicateSiblingName_CaseInsensitive_ReturnsFailure() { _repoMock.Setup(r => r.GetAllFoldersAsync(It.IsAny())) .ReturnsAsync(new List { new("Dev") { Id = 1, ParentFolderId = null } }); var result = await _sut.CreateFolderAsync("dev", null, "admin"); Assert.True(result.IsFailure); Assert.Contains("already exists", result.Error); } [Fact] public async Task CreateFolder_ParentNotFound_ReturnsFailure() { _repoMock.Setup(r => r.GetFolderByIdAsync(99, It.IsAny())) .ReturnsAsync((TemplateFolder?)null); var result = await _sut.CreateFolderAsync("Sub", 99, "admin"); Assert.True(result.IsFailure); Assert.Contains("not found", result.Error); } }