using RadicadeServer.API.Events; using RadicadeServer.RecNet.Enums; using RadicadeServer.RecNet.Events; using Xunit; namespace RadicadeServer.Tests; /// /// Tests the filtering rules behind the game's event endpoints: /// - /api/playerevents/v1/search (public, not-ended events; name/description match) /// - /api/playerevents/v1/room/{roomId} (events hosted in that room) /// public class PlayerEventQueriesTests { private static PlayerEventDB MakeEvent( long id, long roomId, string name = "Launch Party", DateTime? start = null, DateTime? end = null, Accessibility accessibility = Accessibility.Public) { var startTime = start ?? DateTime.UtcNow.AddHours(1); return new PlayerEventDB { PlayerEventId = id, Name = name, Description = "A test event", ImageName = "", StartTime = startTime, EndTime = end ?? startTime.AddHours(2), CreatorPlayerId = 42, AttendeeCount = 1, RoomId = roomId, Accessibility = accessibility }; } [Fact] public void CreatedPublicEvent_AppearsInSearchResults() { var ev = MakeEvent(1, 100, name: "Launch Party"); var results = PlayerEventQueries.Search(new[] { ev }, null, DateTime.UtcNow); Assert.Single(results); Assert.Equal(1, results[0].PlayerEventId); } [Fact] public void CreatedEvent_AppearsInRoomResults() { var ev = MakeEvent(1, 100); var results = PlayerEventQueries.InRoom(new[] { ev }, 100); Assert.Single(results); Assert.Equal(1, results[0].PlayerEventId); } [Fact] public void Search_MatchesNameCaseInsensitively() { var ev = MakeEvent(1, 100, name: "Launch Party"); var results = PlayerEventQueries.Search(new[] { ev }, "launch", DateTime.UtcNow); Assert.Single(results); } [Fact] public void Search_MatchesDescription() { var ev = MakeEvent(1, 100, name: "Other"); ev.Description = "A test event"; var results = PlayerEventQueries.Search(new[] { ev }, "TEST", DateTime.UtcNow); Assert.Single(results); } [Fact] public void Search_ExcludesEndedEvents() { var ev = MakeEvent(1, 100, end: DateTime.UtcNow.AddHours(-1)); var results = PlayerEventQueries.Search(new[] { ev }, null, DateTime.UtcNow); Assert.Empty(results); } [Fact] public void Search_ExcludesPrivateEvents() { var ev = MakeEvent(1, 100, accessibility: Accessibility.Private); var results = PlayerEventQueries.Search(new[] { ev }, null, DateTime.UtcNow); Assert.Empty(results); } [Fact] public void RoomEvents_OnlyReturnEventsForThatRoom() { var inRoom = MakeEvent(1, 100); var otherRoom = MakeEvent(2, 200); var results = PlayerEventQueries.InRoom(new[] { inRoom, otherRoom }, 100); Assert.Single(results); Assert.Equal(1, results[0].PlayerEventId); } [Fact] public void Search_ReturnsNewestEventsFirst() { var later = MakeEvent(1, 100, start: DateTime.UtcNow.AddHours(3)); var sooner = MakeEvent(2, 100, start: DateTime.UtcNow.AddHours(1)); var results = PlayerEventQueries.Search(new[] { sooner, later }, null, DateTime.UtcNow); Assert.Equal(2, results.Count); Assert.Equal(1, results[0].PlayerEventId); Assert.Equal(2, results[1].PlayerEventId); } }