Fix small bug and add tests for serializing and deserializing

This commit is contained in:
henry 2025-07-04 11:34:46 -04:00
parent 493820c3ad
commit 18d39b5dc2
2 changed files with 47 additions and 1 deletions

View File

@ -156,7 +156,7 @@ namespace AccessQueueService.Data
foreach (var queueItem in state.AccessQueue)
{
_queueNumbers.Add(queueItem.Value.UserId, queueItem.Key);
_nextUnusedTicket = Math.Max(_nextUnusedTicket, queueItem.Key);
_nextUnusedTicket = Math.Max(_nextUnusedTicket, queueItem.Key + 1);
_nowServing = Math.Min(_nowServing, queueItem.Key);
}

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using AccessQueueService.Data;
using AccessQueueService.Models;
@ -235,5 +236,50 @@ namespace AccessQueueServiceTests
Assert.Equal(0, _repo.GetRequestsAhead("first"));
Assert.Equal(2, _repo.GetRequestsAhead("third"));
}
[Fact]
public void ToState_ReturnsAccurateJson()
{
var ticketWithAccess = new AccessTicket { UserId = "access", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow };
var ticketWithoutAccess = new AccessTicket { UserId = "noAccess", LastActive = DateTime.UtcNow };
_repo.UpsertTicket(ticketWithAccess);
_repo.Enqueue(ticketWithoutAccess);
string stateJson = _repo.ToState();
var state = JsonSerializer.Deserialize<TakeANumberAccessQueueRepoState>(stateJson);
Assert.NotNull(state?.AccessQueue);
Assert.NotNull(state?.AccessTickets);
Assert.Single(state!.AccessTickets);
Assert.Single(state!.AccessQueue);
Assert.Equal(ticketWithAccess.UserId, state.AccessTickets.First().Key);
Assert.Equal(ticketWithAccess.ExpiresOn, state.AccessTickets.First().Value.ExpiresOn);
Assert.Equal(ticketWithAccess.LastActive, state.AccessTickets.First().Value.LastActive);
Assert.Equal(ticketWithoutAccess.UserId, state.AccessQueue.First().Value.UserId);
Assert.Equal(ticketWithoutAccess.LastActive, state.AccessQueue.First().Value.LastActive);
}
[Fact]
public void FromState_DeserializesJsonCorrectly()
{
var ticketWithAccess = new AccessTicket { UserId = "access", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow };
var ticketWithoutAccess = new AccessTicket { UserId = "noAccess", LastActive = DateTime.UtcNow };
_repo.UpsertTicket(ticketWithAccess);
_repo.Enqueue(ticketWithoutAccess);
string stateJson = _repo.ToState();
var deserializedRepo = TakeANumberAccessQueueRepo.FromState(stateJson);
Assert.Equal(1, deserializedRepo.GetUnexpiredTicketsCount());
Assert.Equal(1, deserializedRepo.GetQueueCount());
Assert.Equal(deserializedRepo.GetTicket("access")!.ExpiresOn, ticketWithAccess.ExpiresOn);
Assert.Null(deserializedRepo.GetTicket("noAccess"));
Assert.Equal(0, deserializedRepo.GetRequestsAhead("noAccess"));
}
}
}