Files
JudoWeb/API.Tests/Controllers/AgeGroupControllerTests.cs
Claude b401882510 Add comprehensive unit tests for backend services and controllers
- Add API.Tests xUnit project with Moq and EF Core InMemory
- Add AgeGroupService tests (CRUD operations, edge cases)
- Add RegistrationKeyService tests (CRUD + DeleteOldRegistrationKeys)
- Add AgeGroupController tests (all endpoints with mocked service)
- Add PlunkEmailSender tests (HTTP client mocking, payload verification)
- Add Mapper tests (AltersgruppeMapper, RegistrationKeyMapper)

https://claude.ai/code/session_01Kv7Mp2c9FKsHEgQe4BoftH
2026-02-03 08:39:15 +00:00

185 lines
6.0 KiB
C#

using API.Controllers;
using API.Models.Internal.Altersgruppen;
using API.Repository.AgeGroupRepo;
using Microsoft.AspNetCore.Mvc;
using Moq;
namespace API.Tests.Controllers;
public class AgeGroupControllerTests
{
private readonly Mock<IAgeGroupService> _mockService;
private readonly AgeGroupController _controller;
public AgeGroupControllerTests()
{
_mockService = new Mock<IAgeGroupService>();
_controller = new AgeGroupController(_mockService.Object);
}
[Fact]
public async Task GetAll_ReturnsOkWithAllGroups()
{
// Arrange
var groups = new List<AltersGruppe>
{
new AltersGruppe { Id = "1", Name = "U10", StartingAge = 8, EndingAge = 10 },
new AltersGruppe { Id = "2", Name = "U12", StartingAge = 10, EndingAge = 12 }
};
_mockService.Setup(s => s.GetAllAsync()).ReturnsAsync(groups);
// Act
var result = await _controller.GetAll();
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var returnedGroups = Assert.IsType<List<AltersGruppe>>(okResult.Value);
Assert.Equal(2, returnedGroups.Count);
}
[Fact]
public async Task GetAll_EmptyList_ReturnsOkWithEmptyList()
{
// Arrange
_mockService.Setup(s => s.GetAllAsync()).ReturnsAsync(new List<AltersGruppe>());
// Act
var result = await _controller.GetAll();
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var returnedGroups = Assert.IsType<List<AltersGruppe>>(okResult.Value);
Assert.Empty(returnedGroups);
}
[Fact]
public async Task GetOne_ExistingId_ReturnsOkWithGroup()
{
// Arrange
var group = new AltersGruppe { Id = "123", Name = "U14", StartingAge = 12, EndingAge = 14 };
_mockService.Setup(s => s.GetAsync("123")).ReturnsAsync(group);
// Act
var result = await _controller.GetOne("123");
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var returnedGroup = Assert.IsType<AltersGruppe>(okResult.Value);
Assert.Equal("U14", returnedGroup.Name);
}
[Fact]
public async Task GetOne_NonExistingId_ReturnsNotFound()
{
// Arrange
_mockService.Setup(s => s.GetAsync("nonexistent")).ReturnsAsync((AltersGruppe?)null);
// Act
var result = await _controller.GetOne("nonexistent");
// Assert
Assert.IsType<NotFoundResult>(result);
}
[Fact]
public async Task Create_ValidGroup_ReturnsCreatedAtAction()
{
// Arrange
var ingoingGroup = new AltersGruppeIngoing { Name = "U16", StartingAge = 14, EndingAge = 16 };
var createdGroup = new AltersGruppe { Id = "new-id", Name = "U16", StartingAge = 14, EndingAge = 16 };
_mockService.Setup(s => s.CreateAsync(It.IsAny<AltersGruppe>())).ReturnsAsync(createdGroup);
// Act
var result = await _controller.Create(ingoingGroup);
// Assert
var createdResult = Assert.IsType<CreatedAtActionResult>(result);
Assert.Equal(nameof(AgeGroupController.GetOne), createdResult.ActionName);
var returnedGroup = Assert.IsType<AltersGruppe>(createdResult.Value);
Assert.Equal("U16", returnedGroup.Name);
Assert.Equal("new-id", createdResult.RouteValues?["Id"]);
}
[Fact]
public async Task Update_ExistingGroup_ReturnsOkWithUpdatedGroup()
{
// Arrange
var ingoingGroup = new AltersGruppeIngoing { Name = "U16 Updated", StartingAge = 15, EndingAge = 16 };
var updatedGroup = new AltersGruppe { Id = "123", Name = "U16 Updated", StartingAge = 15, EndingAge = 16 };
_mockService.Setup(s => s.UpdateAsync("123", It.IsAny<AltersGruppe>())).ReturnsAsync(updatedGroup);
// Act
var result = await _controller.Update("123", ingoingGroup);
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var returnedGroup = Assert.IsType<AltersGruppe>(okResult.Value);
Assert.Equal("U16 Updated", returnedGroup.Name);
Assert.Equal(15, returnedGroup.StartingAge);
}
[Fact]
public async Task Update_NonExistingGroup_ReturnsNotFound()
{
// Arrange
var ingoingGroup = new AltersGruppeIngoing { Name = "U16 Updated", StartingAge = 15, EndingAge = 16 };
_mockService.Setup(s => s.UpdateAsync("nonexistent", It.IsAny<AltersGruppe>())).ReturnsAsync((AltersGruppe?)null);
// Act
var result = await _controller.Update("nonexistent", ingoingGroup);
// Assert
Assert.IsType<NotFoundResult>(result);
}
[Fact]
public async Task Delete_ExistingGroup_ReturnsNoContent()
{
// Arrange
var group = new AltersGruppe { Id = "123", Name = "U18", StartingAge = 16, EndingAge = 18 };
_mockService.Setup(s => s.DeleteAsync("123")).ReturnsAsync(group);
// Act
var result = await _controller.Delete("123");
// Assert
Assert.IsType<NoContentResult>(result);
}
[Fact]
public async Task Delete_NonExistingGroup_ReturnsNotFound()
{
// Arrange
_mockService.Setup(s => s.DeleteAsync("nonexistent")).ReturnsAsync((AltersGruppe?)null);
// Act
var result = await _controller.Delete("nonexistent");
// Assert
Assert.IsType<NotFoundResult>(result);
}
[Fact]
public async Task Create_ServiceIsCalled_WithCorrectParameters()
{
// Arrange
var ingoingGroup = new AltersGruppeIngoing { Name = "U20", StartingAge = 18, EndingAge = 20 };
var createdGroup = new AltersGruppe { Id = "new-id", Name = "U20", StartingAge = 18, EndingAge = 20 };
_mockService.Setup(s => s.CreateAsync(It.IsAny<AltersGruppe>())).ReturnsAsync(createdGroup);
// Act
await _controller.Create(ingoingGroup);
// Assert
_mockService.Verify(s => s.CreateAsync(It.Is<AltersGruppe>(g =>
g.Name == "U20" &&
g.StartingAge == 18 &&
g.EndingAge == 20
)), Times.Once);
}
}