using Vanguard.Server.Tickets; namespace Vanguard.Server.Tests; public class GameTicketServiceTests { [Fact] public void Ticket_Is_Redeemed_Only_Once() { var time = new FakeTimeProvider(DateTimeOffset.UnixEpoch); var service = new GameTicketService(ServerTestData.SmallOptions(), time); var ticket = service.Issue("p1", "m1", 0); var first = service.Redeem(ticket.Token); var second = service.Redeem(ticket.Token); Assert.NotNull(first); Assert.Equal("p1", first!.PlayerId); Assert.Equal("m1", first.MatchId); Assert.Equal(0, first.Seat); Assert.Null(second); } [Fact] public void Ticket_Expires_After_Ttl() { var time = new FakeTimeProvider(DateTimeOffset.UnixEpoch); var options = ServerTestData.SmallOptions(); options.TicketTtlSeconds = 60; var service = new GameTicketService(options, time); var ticket = service.Issue("p1", "m1", 1); time.Advance(TimeSpan.FromSeconds(61)); Assert.Null(service.Redeem(ticket.Token)); } [Fact] public void Unknown_Token_Is_Rejected() { var service = new GameTicketService( ServerTestData.SmallOptions(), new FakeTimeProvider(DateTimeOffset.UnixEpoch)); Assert.Null(service.Redeem(null)); Assert.Null(service.Redeem("")); Assert.Null(service.Redeem("no-such-ticket")); } }