You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
8.0 KiB
C#

using Xunit;
using Moq;
using FluentAssertions;
using Haoliang.Core.Services;
using Haoliang.Models.Template;
using Haoliang.Data.Repositories;
namespace Haoliang.Tests;
public class TemplateServiceTests
{
private readonly Mock<ITemplateRepository> _mockTemplateRepository;
private readonly TemplateService _templateService;
public TemplateServiceTests()
{
_mockTemplateRepository = new Mock<ITemplateRepository>();
_templateService = new TemplateService(_mockTemplateRepository.Object);
}
[Fact]
public async Task GetAllTemplatesAsync_ReturnsTemplatesFromRepository()
{
var templates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", Description = "Fanuc CNC" },
new CNCBrandTemplate { Id = 2, BrandName = "Mitsubishi", Description = "Mitsubishi CNC" }
};
_mockTemplateRepository.Setup(r => r.GetAllAsync()).ReturnsAsync(templates);
var result = await _templateService.GetAllTemplatesAsync();
result.Should().HaveCount(2);
result.Should().BeEquivalentTo(templates);
}
[Fact]
public async Task GetTemplateByIdAsync_ReturnsTemplate_WhenExists()
{
var template = new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", Description = "Fanuc CNC" };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(template);
var result = await _templateService.GetTemplateByIdAsync(1);
result.Should().NotBeNull();
result!.BrandName.Should().Be("Fanuc");
}
[Fact]
public async Task GetTemplateByIdAsync_ReturnsNull_WhenNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.GetTemplateByIdAsync(999);
result.Should().BeNull();
}
[Fact]
public async Task CreateTemplateAsync_SetsCreatedAtUpdatedAtAndIsEnabled()
{
var template = new CNCBrandTemplate { BrandName = "NewBrand", Description = "New CNC" };
_mockTemplateRepository.Setup(r => r.AddAsync(It.IsAny<CNCBrandTemplate>())).Returns(Task.CompletedTask);
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var beforeCreate = DateTime.Now;
var result = await _templateService.CreateTemplateAsync(template);
var afterCreate = DateTime.Now;
result.CreatedAt.Should().BeOnOrAfter(beforeCreate);
result.CreatedAt.Should().BeOnOrBefore(afterCreate);
result.UpdatedAt.Should().BeOnOrAfter(beforeCreate);
result.UpdatedAt.Should().BeOnOrBefore(afterCreate);
result.IsEnabled.Should().BeTrue();
}
[Fact]
public async Task UpdateTemplateAsync_UpdatesTemplate_WhenExists()
{
var existing = new CNCBrandTemplate { Id = 1, BrandName = "Original", Description = "Original Desc" };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(existing);
_mockTemplateRepository.Setup(r => r.Update(It.IsAny<CNCBrandTemplate>())).Verifiable();
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var updated = await _templateService.UpdateTemplateAsync(1, new CNCBrandTemplate
{
BrandName = "Updated",
Description = "Updated Desc"
});
updated.Should().NotBeNull();
updated!.BrandName.Should().Be("Updated");
updated.Description.Should().Be("Updated Desc");
}
[Fact]
public async Task UpdateTemplateAsync_ReturnsNull_WhenNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.UpdateTemplateAsync(999, new CNCBrandTemplate());
result.Should().BeNull();
}
[Fact]
public async Task DeleteTemplateAsync_ReturnsTrue_WhenTemplateExists()
{
var template = new CNCBrandTemplate { Id = 1 };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(template);
_mockTemplateRepository.Setup(r => r.Remove(template)).Verifiable();
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var result = await _templateService.DeleteTemplateAsync(1);
result.Should().BeTrue();
}
[Fact]
public async Task DeleteTemplateAsync_ReturnsFalse_WhenTemplateNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.DeleteTemplateAsync(999);
result.Should().BeFalse();
}
[Fact]
public async Task EnableTemplateAsync_CallsUpdateTemplateEnabled()
{
_mockTemplateRepository.Setup(r => r.UpdateTemplateEnabledAsync(1, true)).Returns(Task.CompletedTask);
var result = await _templateService.EnableTemplateAsync(1);
result.Should().BeTrue();
_mockTemplateRepository.Verify(r => r.UpdateTemplateEnabledAsync(1, true), Times.Once);
}
[Fact]
public async Task DisableTemplateAsync_CallsUpdateTemplateEnabled()
{
_mockTemplateRepository.Setup(r => r.UpdateTemplateEnabledAsync(1, false)).Returns(Task.CompletedTask);
var result = await _templateService.DisableTemplateAsync(1);
result.Should().BeTrue();
_mockTemplateRepository.Verify(r => r.UpdateTemplateEnabledAsync(1, false), Times.Once);
}
[Fact]
public async Task CloneTemplateAsync_CreatesCopyWithNewName()
{
var original = new CNCBrandTemplate
{
Id = 1,
BrandName = "Original",
Description = "Original Description",
FieldMappings = new List<TemplateFieldMapping>
{
new TemplateFieldMapping { SourceFieldPath = "tag1", StandardFieldId = "Status" }
}
};
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(original);
_mockTemplateRepository.Setup(r => r.AddAsync(It.IsAny<CNCBrandTemplate>())).Returns(Task.CompletedTask);
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var result = await _templateService.CloneTemplateAsync(1, "ClonedTemplate");
result.Should().NotBeNull();
result!.BrandName.Should().Be("ClonedTemplate");
result.Description.Should().Be("Original Description (Cloned)");
result.FieldMappings.Should().HaveCount(1);
result.IsEnabled.Should().BeFalse();
}
[Fact]
public async Task CloneTemplateAsync_ReturnsNull_WhenOriginalNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.CloneTemplateAsync(999, "NewName");
result.Should().BeNull();
}
[Fact]
public async Task GetTemplatesByBrandAsync_ReturnsMatchingTemplates()
{
var templates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc" }
};
_mockTemplateRepository.Setup(r => r.FindAsync(t => t.BrandName == "Fanuc")).ReturnsAsync(templates);
var result = await _templateService.GetTemplatesByBrandAsync("Fanuc");
result.Should().HaveCount(1);
}
[Fact]
public async Task GetActiveTemplatesAsync_ReturnsEnabledTemplates()
{
var activeTemplates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", IsEnabled = true }
};
_mockTemplateRepository.Setup(r => r.GetEnabledTemplatesAsync()).ReturnsAsync(activeTemplates);
var result = await _templateService.GetActiveTemplatesAsync();
result.Should().HaveCount(1);
}
[Fact]
public async Task ValidateTemplateAsync_ReturnsTrue()
{
var template = new CNCBrandTemplate { BrandName = "Test", Description = "Test" };
var result = await _templateService.ValidateTemplateAsync(template);
result.Should().BeTrue();
}
[Fact]
public async Task TestTemplateAsync_Completes()
{
await _templateService.TestTemplateAsync(1);
}
}