#28 - Periodically backup service state and restore state if serive is restarted #30
|
@ -156,7 +156,7 @@ namespace AccessQueueService.Data
|
||||||
foreach (var queueItem in state.AccessQueue)
|
foreach (var queueItem in state.AccessQueue)
|
||||||
{
|
{
|
||||||
_queueNumbers.Add(queueItem.Value.UserId, queueItem.Key);
|
_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);
|
_nowServing = Math.Min(_nowServing, queueItem.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AccessQueueService.Data;
|
using AccessQueueService.Data;
|
||||||
using AccessQueueService.Models;
|
using AccessQueueService.Models;
|
||||||
|
@ -235,5 +236,50 @@ namespace AccessQueueServiceTests
|
||||||
Assert.Equal(0, _repo.GetRequestsAhead("first"));
|
Assert.Equal(0, _repo.GetRequestsAhead("first"));
|
||||||
Assert.Equal(2, _repo.GetRequestsAhead("third"));
|
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"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue