using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; using UniVerse.Application.DTOs.Sync; using UniVerse.Application.Interfaces; using UniVerse.Infrastructure.Data; using UniVerse.Infrastructure.Services; using Xunit; namespace UniVerse.Api.Tests.Sync; public class ScheduleSyncServiceTests { [Fact] public async Task SyncScheduleAsync_UsesRoomWorkingCapacityForLectureSeats() { await using var db = CreateDbContext(); var modeus = Substitute.For(); modeus.SearchEventsAsync(Arg.Any()) .Returns(new ModeusEventsResponse { Embedded = new ModeusEventsEmbedded { Events = [ new ModeusEvent { Id = "event-1", Name = "Open lecture", StartsAt = new DateTime(2026, 5, 13, 9, 0, 0, DateTimeKind.Utc), EndsAt = new DateTime(2026, 5, 13, 10, 30, 0, DateTimeKind.Utc) } ], EventRooms = [ new ModeusEventRoom { Links = new ModeusEventRoomLinks { Event = new ModeusHrefLink("/events/event-1"), Room = new ModeusHrefLink("/rooms/room-1") } } ], Rooms = [ new ModeusRoom("room-1", "Room 101", "101", null, TotalCapacity: 60, WorkingCapacity: 42) ], EventTeams = [ new ModeusEventTeam("event-1", 15) ] } }); var service = new ScheduleSyncService(db, modeus, NullLogger.Instance); var result = await service.SyncScheduleAsync(new SyncScheduleRequest(null, null, null, null)); var lecture = await db.Lectures.SingleAsync(); Assert.Null(result.Error); Assert.Equal(1, result.Created); Assert.Equal(42, lecture.MaxEnrollments); } [Fact] public async Task SyncScheduleAsync_LoadsRoomCapacityWhenEventRoomHasNoCapacity() { await using var db = CreateDbContext(); var modeus = Substitute.For(); modeus.SearchEventsAsync(Arg.Any()) .Returns(new ModeusEventsResponse { Embedded = new ModeusEventsEmbedded { Events = [ new ModeusEvent { Id = "event-1", Name = "Open lecture", StartsAt = new DateTime(2026, 5, 13, 9, 0, 0, DateTimeKind.Utc), EndsAt = new DateTime(2026, 5, 13, 10, 30, 0, DateTimeKind.Utc) } ], EventRooms = [ new ModeusEventRoom { Links = new ModeusEventRoomLinks { Event = new ModeusHrefLink("/events/event-1"), Room = new ModeusHrefLink("/rooms/room-1") } } ], Rooms = [ new ModeusRoom("room-1", "Room 101", "101", null, TotalCapacity: null, WorkingCapacity: null) ], EventTeams = [ new ModeusEventTeam("event-1", 15) ] } }); modeus.SearchRoomsAsync() .Returns(new ModeusRoomsResponse { Rooms = [ new ModeusRoom("room-1", "Room 101", "101", null, TotalCapacity: 60, WorkingCapacity: 48) ] }); var service = new ScheduleSyncService(db, modeus, NullLogger.Instance); var result = await service.SyncScheduleAsync(new SyncScheduleRequest(null, null, null, null)); var lecture = await db.Lectures.SingleAsync(); Assert.Null(result.Error); Assert.Equal(1, result.Created); Assert.Equal(48, lecture.MaxEnrollments); } private static AppDbContext CreateDbContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase($"ScheduleSyncTests_{Guid.NewGuid()}") .Options; return new AppDbContext(options); } }