From c12a6465f93a1d4f2c11c18d660eaf90824dc472 Mon Sep 17 00:00:00 2001 From: henry Date: Thu, 15 May 2025 20:49:48 -0400 Subject: [PATCH] Added tests for AccessQueueRepo --- .../Data/TakeANumberAccessQueueRepo.cs | 2 +- .../AccessQueueRepoTests.cs | 196 ++++++++ AccessQueueServiceTests/AccessServiceTests.cs | 451 +++++++++--------- 3 files changed, 421 insertions(+), 228 deletions(-) create mode 100644 AccessQueueServiceTests/AccessQueueRepoTests.cs diff --git a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs index 21b1dc6..f05c660 100644 --- a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs +++ b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs @@ -95,7 +95,7 @@ namespace AccessQueueService.Data _accessTickets[ticket.UserId] = ticket; } - bool IAccessQueueRepo.RemoveUser(string userId) + public bool RemoveUser(string userId) { if(_queueNumbers.TryGetValue(userId, out var queueNumber)) { diff --git a/AccessQueueServiceTests/AccessQueueRepoTests.cs b/AccessQueueServiceTests/AccessQueueRepoTests.cs new file mode 100644 index 0000000..a24fa1e --- /dev/null +++ b/AccessQueueServiceTests/AccessQueueRepoTests.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AccessQueueService.Data; +using AccessQueueService.Models; +using AccessQueueService.Services; +using Microsoft.Extensions.Configuration; + +namespace AccessQueueServiceTests +{ + public class AccessQueueRepoTests + { + private readonly TakeANumberAccessQueueRepo _repo; + + public AccessQueueRepoTests() + { + _repo = new TakeANumberAccessQueueRepo(); + } + + [Fact] + public void GetUnexpiredTicketsCount_ReturnsCorrectCount() + { + + _repo.UpsertTicket(new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }); + _repo.UpsertTicket(new AccessTicket { UserId = "b", ExpiresOn = DateTime.UtcNow.AddMinutes(-1), LastActive = DateTime.UtcNow }); + Assert.Equal(1, _repo.GetUnexpiredTicketsCount()); + } + + [Fact] + public void GetActiveTicketsCount_ReturnsCorrectCount() + { + + var activeCutoff = DateTime.UtcNow.AddMinutes(-5); + _repo.UpsertTicket(new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }); + _repo.UpsertTicket(new AccessTicket { UserId = "b", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow.AddMinutes(-10) }); + Assert.Equal(1, _repo.GetActiveTicketsCount(activeCutoff)); + } + + [Fact] + public void GetQueueCount_ReturnsCorrectCount() + { + + Assert.Equal(0, _repo.GetQueueCount()); + _repo.Enqueue(new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }); + Assert.Equal(1, _repo.GetQueueCount()); + } + + [Fact] + public void GetRequestsAhead_ReturnsMinusOneIfUserNotInQueue() + { + + Assert.Equal(-1, _repo.GetRequestsAhead("notfound")); + } + + [Fact] + public void GetRequestsAhead_ReturnsCorrectNumber() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket); + Assert.Equal(0, _repo.GetRequestsAhead("a")); + } + + [Fact] + public void Enqueue_AddsTicketToQueue() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket); + Assert.Equal(1, _repo.GetQueueCount()); + Assert.Equal(0, _repo.GetRequestsAhead("a")); + } + + [Fact] + public void DeleteExpiredTickets_RemovesExpiredTickets() + { + + _repo.UpsertTicket(new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(-1), LastActive = DateTime.UtcNow }); + _repo.UpsertTicket(new AccessTicket { UserId = "b", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }); + int removed = _repo.DeleteExpiredTickets(); + Assert.Equal(1, removed); + Assert.NotNull(_repo.GetTicket("b")); + Assert.Null(_repo.GetTicket("a")); + } + + [Fact] + public void DidDequeueUntilFull_FillsOpenSpots() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket); + bool result = _repo.DidDequeueUntilFull(60, 60, 1); + Assert.True(result); + Assert.NotNull(_repo.GetTicket("a")); + } + + [Fact] + public void DidDequeueUntilFull_ReturnsTrueIfNoOpenSpots() + { + + _repo.UpsertTicket(new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }); + bool result = _repo.DidDequeueUntilFull(60, 60, 0); + Assert.True(result); + } + + [Fact] + public void GetTicket_ReturnsTicketIfExists() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.UpsertTicket(ticket); + var found = _repo.GetTicket("a"); + Assert.NotNull(found); + Assert.Equal("a", found.UserId); + } + + [Fact] + public void GetTicket_ReturnsNullIfNotExists() + { + + Assert.Null(_repo.GetTicket("notfound")); + } + + [Fact] + public void UpsertTicket_AddsOrUpdatesTicket() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.UpsertTicket(ticket); + Assert.NotNull(_repo.GetTicket("a")); + var updated = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + _repo.UpsertTicket(updated); + Assert.Equal(updated.ExpiresOn, _repo.GetTicket("a")!.ExpiresOn); + } + + [Fact] + public void RemoveUser_RemovesFromAllCollections() + { + + var ticket = new AccessTicket { UserId = "a", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket); + _repo.UpsertTicket(ticket); + bool removed = _repo.RemoveUser("a"); + Assert.True(removed); + Assert.Null(_repo.GetTicket("a")); + Assert.Equal(-1, _repo.GetRequestsAhead("a")); + } + + [Fact] + public void DidDequeueUntilFull_SkipsInactiveUser() + { + var inactive = new AccessTicket { UserId = "inactive", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow.AddMinutes(-10) }; + var active = new AccessTicket { UserId = "active", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + _repo.Enqueue(inactive); + _repo.Enqueue(active); + bool result = _repo.DidDequeueUntilFull(5 * 60, 60, 1); + Assert.True(result); + Assert.Null(_repo.GetTicket("inactive")); + Assert.NotNull(_repo.GetTicket("active")); + } + + [Fact] + public void Enqueue_QueuesUsersInOrder() + { + var ticket1 = new AccessTicket { UserId = "first", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + var ticket2 = new AccessTicket { UserId = "second", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + var ticket3 = new AccessTicket { UserId = "third", ExpiresOn = DateTime.UtcNow, LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket1); + _repo.Enqueue(ticket2); + _repo.Enqueue(ticket3); + Assert.Equal(0, _repo.GetRequestsAhead("first")); + Assert.Equal(1, _repo.GetRequestsAhead("second")); + Assert.Equal(2, _repo.GetRequestsAhead("third")); + } + + [Fact] + public void DidDequeueUntilFull_DequeuesUsersInOrder() + { + var ticket1 = new AccessTicket { UserId = "first", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + var ticket2 = new AccessTicket { UserId = "second", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + var ticket3 = new AccessTicket { UserId = "third", ExpiresOn = DateTime.UtcNow.AddMinutes(1), LastActive = DateTime.UtcNow }; + _repo.Enqueue(ticket1); + _repo.Enqueue(ticket2); + _repo.Enqueue(ticket3); + + bool result = _repo.DidDequeueUntilFull(60 * 60, 60, 1); + + Assert.True(result); + Assert.NotNull(_repo.GetTicket("first")); + Assert.Null(_repo.GetTicket("second")); + Assert.Null(_repo.GetTicket("third")); + } + } +} diff --git a/AccessQueueServiceTests/AccessServiceTests.cs b/AccessQueueServiceTests/AccessServiceTests.cs index 98f27a0..97764b5 100644 --- a/AccessQueueServiceTests/AccessServiceTests.cs +++ b/AccessQueueServiceTests/AccessServiceTests.cs @@ -7,22 +7,19 @@ namespace AccessQueueServiceTests using System.Collections.Generic; using System.Threading.Tasks; using Xunit; - - namespace AccessQueueService.Tests + public class AccessServiceTests { - public class AccessServiceTests - { - const int EXP_SECONDS = 5; - const int EXP_MILLIS = 1000 * EXP_SECONDS; - const int ACT_SECONDS = 1; - const int ACT_MILLIS = 1000 * ACT_SECONDS; - const int CAP_LIMIT = 5; - const int BULK_COUNT = 50000; - private readonly AccessService _accessService; + const int EXP_SECONDS = 5; + const int EXP_MILLIS = 1000 * EXP_SECONDS; + const int ACT_SECONDS = 1; + const int ACT_MILLIS = 1000 * ACT_SECONDS; + const int CAP_LIMIT = 5; + const int BULK_COUNT = 50000; + private readonly AccessService _accessService; - public AccessServiceTests() - { - var inMemorySettings = new Dictionary + public AccessServiceTests() + { + var inMemorySettings = new Dictionary { { "AccessQueue:ExpirationSeconds", $"{EXP_SECONDS}" }, { "AccessQueue:ActivitySeconds", $"{ACT_SECONDS}" }, @@ -30,249 +27,249 @@ namespace AccessQueueServiceTests { "AccessQueue:RollingExpiration", "true" } }; - var configuration = new ConfigurationBuilder() - .AddInMemoryCollection(inMemorySettings) - .Build(); - var accessQueueRepo = new TakeANumberAccessQueueRepo(); + var configuration = new ConfigurationBuilder() + .AddInMemoryCollection(inMemorySettings) + .Build(); + var accessQueueRepo = new TakeANumberAccessQueueRepo(); - _accessService = new AccessService(configuration, accessQueueRepo); + _accessService = new AccessService(configuration, accessQueueRepo); + } + + [Fact] + public async Task RequestAccess_ShouldGrantAccess_WhenCapacityIsAvailable() + { + var userId = "user"; + + var response = await _accessService.RequestAccess(userId); + + Assert.NotNull(response); + Assert.NotNull(response.ExpiresOn); + Assert.True(response.RequestsAhead == 0); + Assert.Equal(1, _accessService.UnexpiredTicketsCount); + Assert.Equal(1, _accessService.ActiveTicketsCount); + Assert.Equal(0, _accessService.QueueCount); + } + + [Fact] + public async Task RequestAccess_ShouldReturnAccessResponse_WhenUserAlreadyHasTicket() + { + var userId = "user"; + await _accessService.RequestAccess(userId); + + var response = await _accessService.RequestAccess(userId); + + Assert.NotNull(response); + Assert.NotNull(response.ExpiresOn); + Assert.True(response.RequestsAhead == 0); + Assert.Equal(1, _accessService.UnexpiredTicketsCount); + Assert.Equal(1, _accessService.ActiveTicketsCount); + Assert.Equal(0, _accessService.QueueCount); + } + + [Fact] + public async Task RequestAccess_ShouldQueueUser_WhenCapacityIsFull() + { + for (int i = 0; i < CAP_LIMIT * 2; i++) // Fill double capacity + { + await _accessService.RequestAccess(Guid.NewGuid().ToString()); + } + var userId = "user"; + + var response = await _accessService.RequestAccess(userId); + + Assert.NotNull(response); + Assert.Null(response.ExpiresOn); + Assert.True(response.RequestsAhead == CAP_LIMIT); + Assert.Equal(5, _accessService.UnexpiredTicketsCount); + Assert.Equal(5, _accessService.ActiveTicketsCount); + Assert.Equal(6, _accessService.QueueCount); + } + + + [Fact] + public async Task RevokeAccess_ShouldReturnTrue_WhenUserHasAccess() + { + var userId = "user"; + await _accessService.RequestAccess(userId); + + var result = await _accessService.RevokeAccess(userId); + + Assert.True(result); + } + + [Fact] + public async Task RevokeAccess_ShouldReturnFalse_WhenUserDoesNotHaveAccess() + { + var userId = "user"; + + var result = await _accessService.RevokeAccess(userId); + + Assert.False(result); + } + + [Fact] + public async Task RequestAccess_ShouldQueueUser_AfterAccessRevoked() + { + var userId = "user"; + await _accessService.RequestAccess(userId); + + for (int i = 0; i < CAP_LIMIT; i++) // Fill remaining slots + { + await _accessService.RequestAccess(Guid.NewGuid().ToString()); } - [Fact] - public async Task RequestAccess_ShouldGrantAccess_WhenCapacityIsAvailable() + var response = await _accessService.RequestAccess(userId); // Request access before revoking + Assert.NotNull(response); + Assert.True(response.HasAccess); + + await _accessService.RevokeAccess(userId); // Revoke access + var responseAfterRevoke = await _accessService.RequestAccess(userId); // Request access again + Assert.NotNull(responseAfterRevoke); + Assert.False(responseAfterRevoke.HasAccess); + } + + [Fact] + public async Task RequestAccess_ShouldNotQueueUser_WhenMultipleRequestsForOtherUsersMade() + { + for (int i = 0; i < CAP_LIMIT; i++) // Fill slots without awaiting { - var userId = "user"; - - var response = await _accessService.RequestAccess(userId); - - Assert.NotNull(response); - Assert.NotNull(response.ExpiresOn); - Assert.True(response.RequestsAhead == 0); - Assert.Equal(1, _accessService.UnexpiredTicketsCount); - Assert.Equal(1, _accessService.ActiveTicketsCount); - Assert.Equal(0, _accessService.QueueCount); + _ = _accessService.RequestAccess(Guid.NewGuid().ToString()); } + var response = await _accessService.RequestAccess(Guid.NewGuid().ToString()); // Request access before revoking + Assert.NotNull(response); + Assert.False(response.HasAccess); + } - [Fact] - public async Task RequestAccess_ShouldReturnAccessResponse_WhenUserAlreadyHasTicket() + [Fact] + public async Task RequestAccess_ShouldUpdateExpirationTime_WhenRollingExpirationTrue() + { + var userId = "user"; + var initialResponse = await _accessService.RequestAccess(userId); + await Task.Delay(ACT_MILLIS); + var updatedResponse = await _accessService.RequestAccess(userId); + Assert.True(updatedResponse.ExpiresOn > initialResponse.ExpiresOn); + } + + [Fact] + public async Task RequestAccess_ShouldGrantAccess_WhenUsersWithAccessInactive() + { + for (int i = 0; i < CAP_LIMIT; i++) { - var userId = "user"; - await _accessService.RequestAccess(userId); - - var response = await _accessService.RequestAccess(userId); - - Assert.NotNull(response); - Assert.NotNull(response.ExpiresOn); - Assert.True(response.RequestsAhead == 0); - Assert.Equal(1, _accessService.UnexpiredTicketsCount); - Assert.Equal(1, _accessService.ActiveTicketsCount); - Assert.Equal(0, _accessService.QueueCount); + await _accessService.RequestAccess(Guid.NewGuid().ToString()); } + var userId = "user"; + var response = await _accessService.RequestAccess(userId); + Assert.False(response.HasAccess); + await Task.Delay(ACT_MILLIS); + response = await _accessService.RequestAccess(userId); + Assert.True(response.HasAccess); + } - [Fact] - public async Task RequestAccess_ShouldQueueUser_WhenCapacityIsFull() + [Fact] + public async Task RequestAccess_ShouldRevokeAccess_WhenExpired() + { + var userId = "user"; + var response = await _accessService.RequestAccess(userId); + Assert.True(response.HasAccess); + await Task.Delay(EXP_MILLIS); + for (int i = 0; i < CAP_LIMIT; i++) { - for (int i = 0; i < CAP_LIMIT * 2; i++) // Fill double capacity - { - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - var userId = "user"; - - var response = await _accessService.RequestAccess(userId); - - Assert.NotNull(response); - Assert.Null(response.ExpiresOn); - Assert.True(response.RequestsAhead == CAP_LIMIT); - Assert.Equal(5, _accessService.UnexpiredTicketsCount); - Assert.Equal(5, _accessService.ActiveTicketsCount); - Assert.Equal(6, _accessService.QueueCount); + await _accessService.RequestAccess(Guid.NewGuid().ToString()); } + response = await _accessService.RequestAccess(userId); + Assert.False(response.HasAccess); + } - - [Fact] - public async Task RevokeAccess_ShouldReturnTrue_WhenUserHasAccess() + [Fact] + public async Task RequestAccess_ShouldRetailAccess_WhenNotExpired() + { + var userId = "user"; + var response = await _accessService.RequestAccess(userId); + Assert.True(response.HasAccess); + await Task.Delay(ACT_MILLIS); + for (int i = 0; i < CAP_LIMIT; i++) { - var userId = "user"; - await _accessService.RequestAccess(userId); - - var result = await _accessService.RevokeAccess(userId); - - Assert.True(result); - } - - [Fact] - public async Task RevokeAccess_ShouldReturnFalse_WhenUserDoesNotHaveAccess() - { - var userId = "user"; - - var result = await _accessService.RevokeAccess(userId); - - Assert.False(result); - } - - [Fact] - public async Task RequestAccess_ShouldQueueUser_AfterAccessRevoked() - { - var userId = "user"; - await _accessService.RequestAccess(userId); - - for (int i = 0; i < CAP_LIMIT; i++) // Fill remaining slots - { - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - - var response = await _accessService.RequestAccess(userId); // Request access before revoking - Assert.NotNull(response); - Assert.True(response.HasAccess); - - await _accessService.RevokeAccess(userId); // Revoke access - var responseAfterRevoke = await _accessService.RequestAccess(userId); // Request access again - Assert.NotNull(responseAfterRevoke); - Assert.False(responseAfterRevoke.HasAccess); - } - - [Fact] - public async Task RequestAccess_ShouldNotQueueUser_WhenMultipleRequestsForOtherUsersMade() - { - for (int i = 0; i < CAP_LIMIT; i++) // Fill slots without awaiting - { - _ = _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - var response = await _accessService.RequestAccess(Guid.NewGuid().ToString()); // Request access before revoking - Assert.NotNull(response); - Assert.False(response.HasAccess); - } - - [Fact] - public async Task RequestAccess_ShouldUpdateExpirationTime_WhenRollingExpirationTrue() - { - var userId = "user"; - var initialResponse = await _accessService.RequestAccess(userId); - await Task.Delay(ACT_MILLIS); - var updatedResponse = await _accessService.RequestAccess(userId); - Assert.True(updatedResponse.ExpiresOn > initialResponse.ExpiresOn); - } - - [Fact] - public async Task RequestAccess_ShouldGrantAccess_WhenUsersWithAccessInactive() - { - for (int i = 0; i < CAP_LIMIT; i++) - { - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - var userId = "user"; - var response = await _accessService.RequestAccess(userId); - Assert.False(response.HasAccess); - await Task.Delay(ACT_MILLIS); - response = await _accessService.RequestAccess(userId); + response = await _accessService.RequestAccess(Guid.NewGuid().ToString()); Assert.True(response.HasAccess); } + response = await _accessService.RequestAccess(userId); + Assert.True(response.HasAccess); + } - [Fact] - public async Task RequestAccess_ShouldRevokeAccess_WhenExpired() + [Fact] + public async Task RequestAccess_ShouldProcessBulkRequests() + { + var userId = "user"; + await _accessService.RequestAccess(userId); + for (int i = 0; i < BULK_COUNT; i++) { - var userId = "user"; - var response = await _accessService.RequestAccess(userId); - Assert.True(response.HasAccess); - await Task.Delay(EXP_MILLIS); - for (int i = 0; i < CAP_LIMIT; i++) - { - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - response = await _accessService.RequestAccess(userId); - Assert.False(response.HasAccess); + _ = _accessService.RequestAccess(Guid.NewGuid().ToString()); } + var response = await _accessService.RequestAccess(userId); + Assert.NotNull(response); + Assert.True(response.HasAccess); + } - [Fact] - public async Task RequestAccess_ShouldRetailAccess_WhenNotExpired() + [Fact] + public async Task RequestAccess_ShouldReportLessInQueue_AsTicketsInactivate() + { + var start = DateTime.UtcNow; + for (int i = 0; i < CAP_LIMIT; i++) { - var userId = "user"; - var response = await _accessService.RequestAccess(userId); - Assert.True(response.HasAccess); - await Task.Delay(ACT_MILLIS); - for (int i = 0; i < CAP_LIMIT; i++) - { - response = await _accessService.RequestAccess(Guid.NewGuid().ToString()); - Assert.True(response.HasAccess); - } - response = await _accessService.RequestAccess(userId); - Assert.True(response.HasAccess); + var elapsed = DateTime.UtcNow - start; + await _accessService.RequestAccess(Guid.NewGuid().ToString()); + await Task.Delay(ACT_MILLIS / CAP_LIMIT); } - - [Fact] - public async Task RequestAccess_ShouldProcessBulkRequests() + var users = new[] { - var userId = "user"; - await _accessService.RequestAccess(userId); - for (int i = 0; i < BULK_COUNT; i++) - { - _ = _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - var response = await _accessService.RequestAccess(userId); - Assert.NotNull(response); - Assert.True(response.HasAccess); - } - - [Fact] - public async Task RequestAccess_ShouldReportLessInQueue_AsTicketsInactivate() - { - var start = DateTime.UtcNow; - for (int i = 0; i < CAP_LIMIT; i++) - { - var elapsed = DateTime.UtcNow - start; - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - await Task.Delay(ACT_MILLIS / CAP_LIMIT); - } - var users = new[] - { "user1", "user2", "user3" }; - await _accessService.RequestAccess(users[0]); - await _accessService.RequestAccess(users[1]); - var response = await _accessService.RequestAccess(users[2]); + await _accessService.RequestAccess(users[0]); + await _accessService.RequestAccess(users[1]); + var response = await _accessService.RequestAccess(users[2]); - Assert.Equal(1, response.RequestsAhead); - await Task.Delay(ACT_MILLIS / CAP_LIMIT); + Assert.Equal(1, response.RequestsAhead); + await Task.Delay(ACT_MILLIS / CAP_LIMIT); - await _accessService.RequestAccess(users[0]); - await _accessService.RequestAccess(users[1]); - response = await _accessService.RequestAccess(users[2]); - - Assert.Equal(0, response.RequestsAhead); - } - - [Fact] - public async Task RequestAccess_ShouldShowCorrectRequestsAhead_WhenAccessRerequested() - { - for (int i = 0; i < CAP_LIMIT; i++) - { - await _accessService.RequestAccess(Guid.NewGuid().ToString()); - } - - var id1 = "user1"; - var id2 = "user2"; - var id3 = "user3"; - - var response1 = await _accessService.RequestAccess(id1); - var response2 = await _accessService.RequestAccess(id2); - var response3 = await _accessService.RequestAccess(id3); - - Assert.Equal(0, response1.RequestsAhead); - Assert.Equal(1, response2.RequestsAhead); - Assert.Equal(2, response3.RequestsAhead); - - response1 = await _accessService.RequestAccess(id1); - response2 = await _accessService.RequestAccess(id2); - response3 = await _accessService.RequestAccess(id3); - - Assert.Equal(0, response1.RequestsAhead); - Assert.Equal(1, response2.RequestsAhead); - Assert.Equal(2, response3.RequestsAhead); - } + await _accessService.RequestAccess(users[0]); + await _accessService.RequestAccess(users[1]); + response = await _accessService.RequestAccess(users[2]); + Assert.Equal(0, response.RequestsAhead); } + + [Fact] + public async Task RequestAccess_ShouldShowCorrectRequestsAhead_WhenAccessRerequested() + { + for (int i = 0; i < CAP_LIMIT; i++) + { + await _accessService.RequestAccess(Guid.NewGuid().ToString()); + } + + var id1 = "user1"; + var id2 = "user2"; + var id3 = "user3"; + + var response1 = await _accessService.RequestAccess(id1); + var response2 = await _accessService.RequestAccess(id2); + var response3 = await _accessService.RequestAccess(id3); + + Assert.Equal(0, response1.RequestsAhead); + Assert.Equal(1, response2.RequestsAhead); + Assert.Equal(2, response3.RequestsAhead); + + response1 = await _accessService.RequestAccess(id1); + response2 = await _accessService.RequestAccess(id2); + response3 = await _accessService.RequestAccess(id3); + + Assert.Equal(0, response1.RequestsAhead); + Assert.Equal(1, response2.RequestsAhead); + Assert.Equal(2, response3.RequestsAhead); + } + } + } \ No newline at end of file