Added tests for AccessQueueRepo

This commit is contained in:
henry 2025-05-15 20:49:48 -04:00
parent 713d8c9956
commit c12a6465f9
3 changed files with 421 additions and 228 deletions

View File

@ -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))
{

View File

@ -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"));
}
}
}

View File

@ -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<string, string?>
public AccessServiceTests()
{
var inMemorySettings = new Dictionary<string, string?>
{
{ "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);
}
}
}