diff --git a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs index f86c22d..ad45a83 100644 --- a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs +++ b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs @@ -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); } diff --git a/AccessQueueServiceTests/AccessQueueRepoTests.cs b/AccessQueueServiceTests/AccessQueueRepoTests.cs index f80a9a3..3f56f1a 100644 --- a/AccessQueueServiceTests/AccessQueueRepoTests.cs +++ b/AccessQueueServiceTests/AccessQueueRepoTests.cs @@ -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(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")); + } } }