- 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
245 lines
7.2 KiB
C#
245 lines
7.2 KiB
C#
using API.Database;
|
|
using API.Models.Internal.User;
|
|
using API.Repository.RegistrationKeyRepo;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace API.Tests.Services;
|
|
|
|
public class RegistrationKeyServiceTests : IDisposable
|
|
{
|
|
private readonly ApplicationDbContext _context;
|
|
private readonly RegistrationKeyService _service;
|
|
|
|
public RegistrationKeyServiceTests()
|
|
{
|
|
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
|
|
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
|
|
.Options;
|
|
|
|
_context = new ApplicationDbContext(options);
|
|
_service = new RegistrationKeyService(_context);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_context.Database.EnsureDeleted();
|
|
_context.Dispose();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetAllAsync_EmptyDatabase_ReturnsEmptyList()
|
|
{
|
|
// Act
|
|
var result = await _service.GetAllAsync();
|
|
|
|
// Assert
|
|
Assert.NotNull(result);
|
|
Assert.Empty(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetAllAsync_WithData_ReturnsAllKeys()
|
|
{
|
|
// Arrange
|
|
var key1 = new RegistrationKey { LinkedRole = "Admin" };
|
|
var key2 = new RegistrationKey { LinkedRole = "User" };
|
|
await _context.RegistrationKeys.AddRangeAsync(key1, key2);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.GetAllAsync();
|
|
|
|
// Assert
|
|
Assert.Equal(2, result.Count);
|
|
Assert.Contains(result, k => k.LinkedRole == "Admin");
|
|
Assert.Contains(result, k => k.LinkedRole == "User");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetAsync_ExistingId_ReturnsKey()
|
|
{
|
|
// Arrange
|
|
var key = new RegistrationKey { LinkedRole = "Moderator" };
|
|
await _context.RegistrationKeys.AddAsync(key);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.GetAsync(key.Id);
|
|
|
|
// Assert
|
|
Assert.NotNull(result);
|
|
Assert.Equal("Moderator", result.LinkedRole);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetAsync_NonExistingId_ReturnsNull()
|
|
{
|
|
// Act
|
|
var result = await _service.GetAsync("nonexistent-id");
|
|
|
|
// Assert
|
|
Assert.Null(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CreateAsync_ValidKey_AddsToDatabase()
|
|
{
|
|
// Arrange
|
|
var keyIngoing = new RegistrationKeyIngoing { LinkedRole = "Admin" };
|
|
|
|
// Act
|
|
var result = await _service.CreateAsync(keyIngoing);
|
|
|
|
// Assert
|
|
Assert.NotNull(result);
|
|
Assert.Equal("Admin", result.LinkedRole);
|
|
Assert.NotNull(result.Id);
|
|
|
|
var dbKey = await _context.RegistrationKeys.FindAsync(result.Id);
|
|
Assert.NotNull(dbKey);
|
|
Assert.Equal("Admin", dbKey.LinkedRole);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CreateAsync_NullRole_AddsToDatabase()
|
|
{
|
|
// Arrange
|
|
var keyIngoing = new RegistrationKeyIngoing { LinkedRole = null };
|
|
|
|
// Act
|
|
var result = await _service.CreateAsync(keyIngoing);
|
|
|
|
// Assert
|
|
Assert.NotNull(result);
|
|
Assert.Null(result.LinkedRole);
|
|
|
|
var dbKey = await _context.RegistrationKeys.FindAsync(result.Id);
|
|
Assert.NotNull(dbKey);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteAsync_ExistingKey_RemovesFromDatabase()
|
|
{
|
|
// Arrange
|
|
var key = new RegistrationKey { LinkedRole = "ToDelete" };
|
|
await _context.RegistrationKeys.AddAsync(key);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteAsync(key.Id);
|
|
|
|
// Assert
|
|
Assert.NotNull(result);
|
|
Assert.Equal("ToDelete", result.LinkedRole);
|
|
|
|
var dbKey = await _context.RegistrationKeys.FindAsync(key.Id);
|
|
Assert.Null(dbKey);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteAsync_NonExistingKey_ReturnsNull()
|
|
{
|
|
// Act
|
|
var result = await _service.DeleteAsync("nonexistent-id");
|
|
|
|
// Assert
|
|
Assert.Null(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_ZeroDays_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var key = new RegistrationKey { LinkedRole = "Old", Created = DateTime.UtcNow.AddDays(-10) };
|
|
await _context.RegistrationKeys.AddAsync(key);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(0);
|
|
|
|
// Assert
|
|
Assert.Equal(0, result);
|
|
Assert.Single(await _context.RegistrationKeys.ToListAsync());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_NegativeDays_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var key = new RegistrationKey { LinkedRole = "Old", Created = DateTime.UtcNow.AddDays(-10) };
|
|
await _context.RegistrationKeys.AddAsync(key);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(-5);
|
|
|
|
// Assert
|
|
Assert.Equal(0, result);
|
|
Assert.Single(await _context.RegistrationKeys.ToListAsync());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_NoOldKeys_ReturnsZero()
|
|
{
|
|
// Arrange
|
|
var key = new RegistrationKey { LinkedRole = "New", Created = DateTime.UtcNow };
|
|
await _context.RegistrationKeys.AddAsync(key);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(7);
|
|
|
|
// Assert
|
|
Assert.Equal(0, result);
|
|
Assert.Single(await _context.RegistrationKeys.ToListAsync());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_WithOldKeys_DeletesOldKeysOnly()
|
|
{
|
|
// Arrange
|
|
var oldKey1 = new RegistrationKey { LinkedRole = "Old1", Created = DateTime.UtcNow.AddDays(-10) };
|
|
var oldKey2 = new RegistrationKey { LinkedRole = "Old2", Created = DateTime.UtcNow.AddDays(-15) };
|
|
var newKey = new RegistrationKey { LinkedRole = "New", Created = DateTime.UtcNow.AddDays(-2) };
|
|
|
|
await _context.RegistrationKeys.AddRangeAsync(oldKey1, oldKey2, newKey);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(7);
|
|
|
|
// Assert
|
|
Assert.Equal(2, result);
|
|
|
|
var remainingKeys = await _context.RegistrationKeys.ToListAsync();
|
|
Assert.Single(remainingKeys);
|
|
Assert.Equal("New", remainingKeys[0].LinkedRole);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_ExactCutoffDate_KeyNotDeleted()
|
|
{
|
|
// Arrange - key created exactly at cutoff should NOT be deleted
|
|
var keyAtCutoff = new RegistrationKey { LinkedRole = "AtCutoff", Created = DateTime.UtcNow.AddDays(-7) };
|
|
await _context.RegistrationKeys.AddAsync(keyAtCutoff);
|
|
await _context.SaveChangesAsync();
|
|
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(7);
|
|
|
|
// Assert - cutoff is < not <=, so exactly 7 days old should not be deleted
|
|
Assert.Equal(0, result);
|
|
Assert.Single(await _context.RegistrationKeys.ToListAsync());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeleteOldRegistrationKeysAsync_EmptyDatabase_ReturnsZero()
|
|
{
|
|
// Act
|
|
var result = await _service.DeleteOldRegistrationKeysAsync(7);
|
|
|
|
// Assert
|
|
Assert.Equal(0, result);
|
|
}
|
|
}
|