mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-26 07:28:45 -07:00
feat: Add tests for room visit visibility and bootstrap logic; update versioning and image references
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using DorkNet.Server.Data;
|
||||
|
||||
namespace DorkNet.Server.Tests;
|
||||
|
||||
public sealed class CanonicalRoomBootstrapTests : IClassFixture<DorkNetServerFactory>
|
||||
{
|
||||
private readonly DorkNetServerFactory _factory;
|
||||
|
||||
public CanonicalRoomBootstrapTests(DorkNetServerFactory factory) => _factory = factory;
|
||||
|
||||
[Fact]
|
||||
public async Task Bootstrap_seeds_stunt_runner_subroom_and_rec_rally_remote_image_name()
|
||||
{
|
||||
using var _ = _factory.CreateClient(new() { AllowAutoRedirect = false });
|
||||
|
||||
await using var scope = _factory.Services.CreateAsyncScope();
|
||||
var db = scope.ServiceProvider.GetRequiredService<DorkNetDbContext>();
|
||||
|
||||
var stuntRunner = await db.Rooms.SingleAsync(r => r.Name == "StuntRunner");
|
||||
var stuntRunnerScenes = await db.RoomScenes
|
||||
.Where(s => s.RoomId == stuntRunner.Id)
|
||||
.OrderBy(s => s.OrderIndex)
|
||||
.ToListAsync();
|
||||
|
||||
Assert.Collection(
|
||||
stuntRunnerScenes,
|
||||
scene =>
|
||||
{
|
||||
Assert.Equal(0, scene.OrderIndex);
|
||||
Assert.Equal("StuntRunner", scene.Name);
|
||||
Assert.Equal("b7281665-a715-4051-826b-8e08e69c6172", scene.RoomSceneLocationId);
|
||||
Assert.Equal("", scene.DataBlobName);
|
||||
},
|
||||
scene =>
|
||||
{
|
||||
Assert.Equal(1, scene.OrderIndex);
|
||||
Assert.Equal("TheMainEvent", scene.Name);
|
||||
Assert.Equal("3a636bd2-f896-424c-9225-c184522c0d87", scene.RoomSceneLocationId);
|
||||
Assert.Equal("", scene.DataBlobName);
|
||||
});
|
||||
|
||||
var recRally = await db.Rooms.SingleAsync(r => r.Name == "RecRally");
|
||||
Assert.Equal("image_RecRally.jpg", recRally.ImageName);
|
||||
}
|
||||
}
|
||||
@@ -38,8 +38,8 @@ public sealed class DorkNetServerFactory : WebApplicationFactory<Program>
|
||||
["S3:Endpoint"] = "",
|
||||
["S3:AccessKey"] = "",
|
||||
["S3:SecretKey"] = "",
|
||||
["DorkNet:DefaultClientVersion"] = "december_2020_12_18",
|
||||
["DorkNet:SupportedVersions:0"] = "december_2020_12_18",
|
||||
["DorkNet:DefaultClientVersion"] = "march_2023_03_21",
|
||||
["DorkNet:SupportedVersions:0"] = "march_2023_03_21",
|
||||
});
|
||||
});
|
||||
builder.ConfigureServices(services =>
|
||||
|
||||
@@ -61,8 +61,8 @@ public sealed class GameClientEndpointContractTests :
|
||||
ToHttpMethod(route.Method),
|
||||
new Uri($"http://{host}{path}"));
|
||||
request.Headers.Accept.ParseAdd("application/json");
|
||||
request.Headers.UserAgent.ParseAdd("RecRoom/2020.12.18");
|
||||
request.Headers.TryAddWithoutValidation("X-DorkNet-Version", "december_2020_12_18");
|
||||
request.Headers.UserAgent.ParseAdd("RecRoom/2023.03.21");
|
||||
request.Headers.TryAddWithoutValidation("X-DorkNet-Version", "march_2023_03_21");
|
||||
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", session.AccessToken);
|
||||
|
||||
if (NeedsRequestBody(request.Method))
|
||||
|
||||
@@ -21,8 +21,8 @@ public static class GameClientSessionFactory
|
||||
HttpMethod.Post,
|
||||
new Uri($"http://auth.{apexDomain}/connect/token"));
|
||||
tokenRequest.Headers.Accept.ParseAdd("application/json");
|
||||
tokenRequest.Headers.UserAgent.ParseAdd("RecRoom/2020.12.18");
|
||||
tokenRequest.Headers.TryAddWithoutValidation("X-DorkNet-Version", "december_2020_12_18");
|
||||
tokenRequest.Headers.UserAgent.ParseAdd("RecRoom/2023.03.21");
|
||||
tokenRequest.Headers.TryAddWithoutValidation("X-DorkNet-Version", "march_2023_03_21");
|
||||
tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
|
||||
{
|
||||
["grant_type"] = "password",
|
||||
@@ -49,8 +49,8 @@ public static class GameClientSessionFactory
|
||||
HttpMethod.Get,
|
||||
new Uri($"http://auth.{apexDomain}/connect/userinfo"));
|
||||
userInfoRequest.Headers.Accept.ParseAdd("application/json");
|
||||
userInfoRequest.Headers.UserAgent.ParseAdd("RecRoom/2020.12.18");
|
||||
userInfoRequest.Headers.TryAddWithoutValidation("X-DorkNet-Version", "december_2020_12_18");
|
||||
userInfoRequest.Headers.UserAgent.ParseAdd("RecRoom/2023.03.21");
|
||||
userInfoRequest.Headers.TryAddWithoutValidation("X-DorkNet-Version", "march_2023_03_21");
|
||||
userInfoRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
|
||||
|
||||
using var userInfoResponse = await client.SendAsync(userInfoRequest);
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text.Json;
|
||||
using DorkNet.Server.Data;
|
||||
using DorkNet.Server.Data.Entities;
|
||||
using DorkNet.Server.Services;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace DorkNet.Server.Tests;
|
||||
|
||||
public sealed class RoomsVisitedByTests : IClassFixture<DorkNetServerFactory>
|
||||
{
|
||||
private readonly DorkNetServerFactory _factory;
|
||||
|
||||
public RoomsVisitedByTests(DorkNetServerFactory factory) => _factory = factory;
|
||||
|
||||
[Fact]
|
||||
public async Task Continue_rooms_hide_private_rooms_from_non_owners()
|
||||
{
|
||||
using var setupClient = ApiClient();
|
||||
var owner = await GameClientSessionFactory.CreateAsync(setupClient, _factory.ApexDomain);
|
||||
var visitor = await GameClientSessionFactory.CreateAsync(setupClient, _factory.ApexDomain);
|
||||
|
||||
var suffix = Guid.NewGuid().ToString("N")[..8];
|
||||
var publicRoomId = 9_100_001L;
|
||||
var privateRoomId = 9_100_002L;
|
||||
var publicRoomName = $"ContinuePublic_{suffix}";
|
||||
var privateRoomName = $"ContinuePrivate_{suffix}";
|
||||
var now = DateTime.UtcNow;
|
||||
|
||||
await using (var scope = _factory.Services.CreateAsyncScope())
|
||||
{
|
||||
var db = scope.ServiceProvider.GetRequiredService<DorkNetDbContext>();
|
||||
db.Rooms.AddRange(
|
||||
BuildRoom(publicRoomId, publicRoomName, owner.PlayerId, accessibility: 1),
|
||||
BuildRoom(privateRoomId, privateRoomName, owner.PlayerId, accessibility: 0));
|
||||
db.RoomVisits.AddRange(
|
||||
BuildVisit(publicRoomId, visitor.PlayerId, now.AddMinutes(-2)),
|
||||
BuildVisit(privateRoomId, visitor.PlayerId, now.AddMinutes(-1)),
|
||||
BuildVisit(privateRoomId, owner.PlayerId, now));
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
using var visitorClient = ApiClient(visitor);
|
||||
var visitorNames = await GetContinueRoomNamesAsync(visitorClient);
|
||||
|
||||
Assert.Contains(publicRoomName, visitorNames);
|
||||
Assert.DoesNotContain(privateRoomName, visitorNames);
|
||||
|
||||
using var ownerClient = ApiClient(owner);
|
||||
var ownerNames = await GetContinueRoomNamesAsync(ownerClient);
|
||||
|
||||
Assert.Contains(privateRoomName, ownerNames);
|
||||
}
|
||||
|
||||
private HttpClient ApiClient(GameClientSession? session = null)
|
||||
{
|
||||
var client = _factory.CreateClient(new() { AllowAutoRedirect = false });
|
||||
client.BaseAddress = new Uri($"http://api.{_factory.ApexDomain}");
|
||||
client.Timeout = TimeSpan.FromSeconds(30);
|
||||
client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
|
||||
client.DefaultRequestHeaders.UserAgent.ParseAdd("RecRoom/2023.03.21");
|
||||
client.DefaultRequestHeaders.TryAddWithoutValidation("X-DorkNet-Version", "march_2023_03_21");
|
||||
if (session is not null)
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", session.AccessToken);
|
||||
return client;
|
||||
}
|
||||
|
||||
private static async Task<string[]> GetContinueRoomNamesAsync(HttpClient client)
|
||||
{
|
||||
using var response = await client.GetAsync("/rooms/visitedby/me");
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
await using var body = await response.Content.ReadAsStreamAsync();
|
||||
using var document = await JsonDocument.ParseAsync(body);
|
||||
return document.RootElement
|
||||
.EnumerateArray()
|
||||
.Select(room => room.GetProperty("Name").GetString() ?? string.Empty)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private static RoomEntity BuildRoom(long id, string name, long creatorPlayerId, int accessibility) => new()
|
||||
{
|
||||
Id = id,
|
||||
Name = name,
|
||||
Description = name,
|
||||
CreatorPlayerId = creatorPlayerId,
|
||||
ImageName = RoomService.DefaultRoomImageName,
|
||||
State = 0,
|
||||
Accessibility = accessibility,
|
||||
IsAGRoom = true,
|
||||
IsDormRoom = false,
|
||||
HiddenFromBrowse = false,
|
||||
TagsCsv = "community",
|
||||
};
|
||||
|
||||
private static RoomVisitEntity BuildVisit(long roomId, long playerId, DateTime visitedAt) => new()
|
||||
{
|
||||
RoomId = roomId,
|
||||
PlayerId = playerId,
|
||||
FirstVisitAt = visitedAt,
|
||||
LastVisitAt = visitedAt,
|
||||
VisitCount = 1,
|
||||
};
|
||||
}
|
||||
@@ -11,11 +11,11 @@ namespace DorkNet.Server.Tests;
|
||||
public sealed class VersionCheckControllerTests
|
||||
{
|
||||
[Fact]
|
||||
public void December_2020_build_is_valid_with_minimal_service_config()
|
||||
public void March_2023_build_is_valid_with_minimal_service_config()
|
||||
{
|
||||
var controller = CreateController();
|
||||
|
||||
var result = Assert.IsType<OkObjectResult>(controller.Check("20201210", "0"));
|
||||
var result = Assert.IsType<OkObjectResult>(controller.Check("20230321", "0"));
|
||||
|
||||
Assert.Equal(0, ReadVersionStatus(result.Value));
|
||||
}
|
||||
@@ -37,9 +37,9 @@ public sealed class VersionCheckControllerTests
|
||||
[new Late2020VersionPlugin()],
|
||||
new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
"december_2020_12_18",
|
||||
"march_2023_03_21",
|
||||
},
|
||||
"december_2020_12_18");
|
||||
"march_2023_03_21");
|
||||
|
||||
return new VersionCheckController(
|
||||
config,
|
||||
|
||||
Reference in New Issue
Block a user