Testprojekt hinzugefügt & umfassende Server-Tests
Neues Testprojekt SlipItIn.Server.Tests erstellt und in die Solution eingebunden. Unit- und Integrationstests für AuthController, DbSeeder, GameHub und GameService implementiert. TestDbHelper für InMemory-DbContexts und Testdaten hinzugefügt. Tests prüfen Erfolgs- und Fehlerfälle inkl. Validierungen, Fehlerbehandlung und DB-Zustände.
This commit is contained in:
56
SlipItIn.Server.Tests/TestDbHelper.cs
Normal file
56
SlipItIn.Server.Tests/TestDbHelper.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using SlipItIn.Server.Data;
|
||||
using SlipItIn.Shared.Models;
|
||||
|
||||
namespace SlipItIn.Server.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// Hilfsmethoden zum Erstellen isolierter InMemory-DbContexts und Testdaten.
|
||||
/// </summary>
|
||||
public static class TestDbHelper
|
||||
{
|
||||
public static IDbContextFactory<SlipItInDbContext> CreateFactory()
|
||||
{
|
||||
var options = new DbContextOptionsBuilder<SlipItInDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.Options;
|
||||
return new TestDbContextFactory(options);
|
||||
}
|
||||
|
||||
public static User SeedUser(SlipItInDbContext db, string username = "user", string email = "user@test.local", bool isActive = true)
|
||||
{
|
||||
var user = new User { Username = username, Email = email, PasswordHash = "hash", IsActive = isActive };
|
||||
db.Users.Add(user);
|
||||
db.SaveChanges();
|
||||
return user;
|
||||
}
|
||||
|
||||
public static List<Phrase> SeedPhrases(SlipItInDbContext db, int count, bool isActive = true)
|
||||
{
|
||||
var creator = SeedUser(db, "creator-" + Guid.NewGuid().ToString("N")[..8], Guid.NewGuid().ToString("N")[..8] + "@t.local");
|
||||
var phrases = Enumerable.Range(1, count)
|
||||
.Select(i => new Phrase { Text = $"Phrase {i}", CreatorId = creator.Id, IsActive = isActive })
|
||||
.ToList();
|
||||
db.Phrases.AddRange(phrases);
|
||||
db.SaveChanges();
|
||||
return phrases;
|
||||
}
|
||||
|
||||
/// <summary>Erstellt ein Spiel inkl. Host-Spieler über den echten GameService-Pfad (direkt in DB).</summary>
|
||||
public static (Game game, Player hostPlayer) SeedGame(SlipItInDbContext db, User host, GameStatus status = GameStatus.Lobby)
|
||||
{
|
||||
var game = new Game { LobbyCode = Guid.NewGuid().ToString("N")[..6].ToUpper(), HostId = host.Id, Status = status };
|
||||
var hostPlayer = new Player { UserId = host.Id, Game = game };
|
||||
game.Players.Add(hostPlayer);
|
||||
db.Games.Add(game);
|
||||
db.SaveChanges();
|
||||
return (game, hostPlayer);
|
||||
}
|
||||
|
||||
private class TestDbContextFactory(DbContextOptions<SlipItInDbContext> options) : IDbContextFactory<SlipItInDbContext>
|
||||
{
|
||||
public SlipItInDbContext CreateDbContext() => new(options);
|
||||
public Task<SlipItInDbContext> CreateDbContextAsync(CancellationToken cancellationToken = default)
|
||||
=> Task.FromResult(new SlipItInDbContext(options));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user