65e3d1bf18
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 6m5s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 29s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 9s
134 lines
4.9 KiB
C#
134 lines
4.9 KiB
C#
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<IModeusApiClient>();
|
|
modeus.SearchEventsAsync(Arg.Any<SyncScheduleRequest>())
|
|
.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<ScheduleSyncService>.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<IModeusApiClient>();
|
|
modeus.SearchEventsAsync(Arg.Any<SyncScheduleRequest>())
|
|
.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<ScheduleSyncService>.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<AppDbContext>()
|
|
.UseInMemoryDatabase($"ScheduleSyncTests_{Guid.NewGuid()}")
|
|
.Options;
|
|
return new AppDbContext(options);
|
|
}
|
|
}
|