summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-07-01 15:15:02 +0200
committerRory& <root@rory.gay>2026-07-01 19:46:31 +0200
commite780079eb06a13aba73fd0eeb90a1449156c31f1 (patch)
treed1378d4090b12573cc001da31867c384de4c137b
parentAdd application emojis implementation based on the guilds one, models (diff)
downloadserver-ts-e780079eb06a13aba73fd0eeb90a1449156c31f1.tar.xz
Add tests for guild/app emojis
-rw-r--r--extra/admin-api/Tests/Spacebar.Tests/Tests/ApplicationEmojiTests.cs135
-rw-r--r--extra/admin-api/Tests/Spacebar.Tests/Tests/GuildEmojiTests.cs131
-rw-r--r--extra/admin-api/Tests/Spacebar.Tests/appsettings.json4
3 files changed, 268 insertions, 2 deletions
diff --git a/extra/admin-api/Tests/Spacebar.Tests/Tests/ApplicationEmojiTests.cs b/extra/admin-api/Tests/Spacebar.Tests/Tests/ApplicationEmojiTests.cs
new file mode 100644

index 00000000..6a61f67d --- /dev/null +++ b/extra/admin-api/Tests/Spacebar.Tests/Tests/ApplicationEmojiTests.cs
@@ -0,0 +1,135 @@ +using System.Diagnostics; +using System.Net.Http.Json; +using System.Text.Json.Nodes; +using ArcaneLibs.Extensions; +using Spacebar.Models.AdminApi; +using Spacebar.Models.Generic; +using Spacebar.Sdk.Core; +using Spacebar.Tests.Abstractions; +using Spacebar.Tests.Extensions; +using Spacebar.Tests.Fixtures; +using Xunit.Internal; +using Xunit.Microsoft.DependencyInjection.Abstracts; + +namespace Spacebar.Tests.Tests; + +public class ApplicationEmojiTests(ITestOutputHelper testOutputHelper, TestFixture fixture) : TestBed<TestFixture>(testOutputHelper, fixture), IAsyncLifetime { + private readonly Config _config = fixture.GetRequiredService<Config>(testOutputHelper); + private readonly SpacebarClientWellKnownResolverService _wellKnownResolver = fixture.GetRequiredService<SpacebarClientWellKnownResolverService>(testOutputHelper); + private readonly SpacebarClientProviderService _clientProvider = fixture.GetRequiredService<SpacebarClientProviderService>(testOutputHelper); + private readonly UserAbstraction _userAbstraction = fixture.GetRequiredService<UserAbstraction>(testOutputHelper); + + private static AuthenticatedSpacebarClient Client { get; set; } = null!; + private static ApplicationModel? Application { get; set; } + + private const string Base64ImageData = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA8hJREFUeNrtnD9oE1EYwL8XOxwIphksdIjQoUNQB41TumVrpoJLwUUI2EEpQltwyOaN7SI4KHRwELqomeLmZqdWBwMdKgjNUMmS1qnbuahoTXq5u/fu3r38fputzd19v/e97/27KFFXBbKjQAgQgABAAAIAAQgABCAAEIAAQAACAAEIAAQgABCAAEAAAgABCAAEIAAQgABAAAIAAQiA5Eylcxnl9//+Z/BmVT7vWBUI1WzLXO2fm2zNpHFd4y9oeEXVOhz6m3SeMEb7SPMOjQsY9Wy/GPSCraqFoU/NQcF4Xl9Mqaz8vkxfyyD0tZXQ6IvIuX4pZxkw1hNm0SPZc2NTYg3K78tBJ3h93+xVWl/Fu8IwdASVRqS2GY3Zm8rvWxV9wxlQaSTpH/QmvkGvybgk6rKpZH/8MdGf1zeUiHzbTT4QUHefJfqI6bIcvM9fEdbV6OKnwugpSHr3kKMirLdHsrbPsbsIXxzQ8aYLqr6Rl+gbzAB175X+z1zfC00FU6H3inJ2mqcaYLYNDlvAMHvFs9PAn5/oLmjIAoZX/L1asGC8z/lzrQkswqPntIeSfwr5ai/uYWQipp50ZcpzLVSDnnzvkgHZ9XgJp9NOFWGHQIB7Am4vE9Ysi7B6+MHZaM1ely9t6zPAXVTcHQ4EUIQhHQEmFkHtYrpsdwZUFh0vA480DzFsWYwLNqty0gv5T6WyWtsP/6hx9s4qizGTVfckX/N+QIxl4aDTkt2XUcaCN0aNdCNvW67vxTiUp3d/WGsXVIp+wnBwFC36InLcHXpUItisRk+7O04VYbW2FzkEW3FCEGwvDflpaA+mqznXHjAMzbQON3wE/N+V9XJ642SAMwJqK0QzSwGq8XSCykDzHV1QpswtIIAuCOwREP4ynntoWhbVlAGGXyW0sQ6v79skACZdQKmMAMihgHgnnIfX/Fh1KPN3abLOAK+o6hvRQnZreWisVbMddbtKVyFN1AS17Iglb0fB9lL4G6lzC+OsAQT+fPjrRLWV5GsnWrbGbBGQR7QIoAgzCspp8++0LBJgz3dfpUfUswRkgJ3oO57uFVW5OiFRCzarcvbDsgzQ1CfmgxNtZwB0dkHB8zqjz0xrwHHX/fAPjqwehjo/HIp3lC/VUZDDDkw8WiEvN+pk9A3OA4LWjJwcORL63RfmmlTWX108qQ0/PQH51eDKt6efo9lWFh+hCD7tyNvVNK+YugBIpwgDAhAACEAAIAABgAAEAAIQAAhAACAAAYAABAACEAAIQAACCAECEAAIQAAgAAGAAAQAAiaKn3vk4S2WTtVqAAAAAElFTkSuQmCC"; + + public async ValueTask InitializeAsync() { + testOutputHelper.WriteLine("Running InitializeAsync"); + // All these tests can share a single client + Client = await _userAbstraction.GetSharedUser(); + if (Application is null) { + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync("applications", new JsonObject() { + { "name", "meow" } + })); + Application = await res.Content.ReadFromJsonAsync<ApplicationModel>(); + } + } + + [Fact] + public async Task GetEmojis() { + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.GetAsync($"/api/v9/applications/{Application.Id}/emojis", TestContext.Current.CancellationToken)); + var resEmojisObj = await res.Content.ReadFromJsonAsync<JsonObject>(); + var resEmojis = resEmojisObj?["items"]?.AsArray(); + + resEmojis!.ForEach(eJson => { + Assert.StringNotNullOrWhitespace(eJson?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(eJson?["name"]?.GetValue<string>()); + }); + } + + [Fact] + public async Task UploadEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/applications/{Application.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + } + + [Fact] + public async Task UpdateEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/applications/{Application.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + var reqJson2 = new JsonObject() { + { "name", "meowtwo" } + }; + var res2 = await Assert.HttpSuccess(await Client.ApiHttpClient.PatchAsJsonAsync($"/api/v9/applications/{Application.Id}/emojis/{resEmoji?["id"]?.GetValue<string>()}", reqJson2, + TestContext.Current.CancellationToken)); + var resEmoji2 = await res2.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji2?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji2?["name"]?.GetValue<string>()); + Assert.Equal("meowtwo", resEmoji2?["name"]?.GetValue<string>()); + } + + [Fact] + public async Task DeleteEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/applications/{Application.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + await Assert.HttpSuccess(await Client.ApiHttpClient.DeleteAsync($"/api/v9/applications/{Application.Id}/emojis/{resEmoji?["id"]?.GetValue<string>()}", + TestContext.Current.CancellationToken)); + } + + [Fact] + public async Task GetEmojiSource() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/applications/{Application.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + var sourceRes = await Assert.HttpSuccess(await Client.ApiHttpClient.GetAsync($"/api/v9/emojis/{resEmoji?["id"]?.GetValue<string>()}/source", + TestContext.Current.CancellationToken)); + var sourceResJson = await sourceRes.Content.ReadFromJsonAsync<JsonObject>(cancellationToken: TestContext.Current.CancellationToken); + + Assert.StringNotNullOrWhitespace(sourceResJson?["type"]?.GetValue<string>()); + Assert.Equal("APPLICATION", sourceResJson?["type"]?.GetValue<string>()); + + Assert.StringNotNullOrWhitespace(sourceResJson?["application"]?.AsObject()["id"]?.GetValue<string>()); + Assert.Equal(Application.Id.ToString(), sourceResJson?["application"]?.AsObject()["id"]?.GetValue<string>()); + } +} \ No newline at end of file diff --git a/extra/admin-api/Tests/Spacebar.Tests/Tests/GuildEmojiTests.cs b/extra/admin-api/Tests/Spacebar.Tests/Tests/GuildEmojiTests.cs new file mode 100644
index 00000000..0a9344be --- /dev/null +++ b/extra/admin-api/Tests/Spacebar.Tests/Tests/GuildEmojiTests.cs
@@ -0,0 +1,131 @@ +using System.Diagnostics; +using System.Net.Http.Json; +using System.Text.Json.Nodes; +using ArcaneLibs.Extensions; +using Spacebar.Models.Generic; +using Spacebar.Sdk.Core; +using Spacebar.Tests.Abstractions; +using Spacebar.Tests.Extensions; +using Spacebar.Tests.Fixtures; +using Xunit.Internal; +using Xunit.Microsoft.DependencyInjection.Abstracts; + +namespace Spacebar.Tests.Tests; + +public class GuildEmojiTests(ITestOutputHelper testOutputHelper, TestFixture fixture) : TestBed<TestFixture>(testOutputHelper, fixture), IAsyncLifetime { + private readonly Config _config = fixture.GetRequiredService<Config>(testOutputHelper); + private readonly SpacebarClientWellKnownResolverService _wellKnownResolver = fixture.GetRequiredService<SpacebarClientWellKnownResolverService>(testOutputHelper); + private readonly SpacebarClientProviderService _clientProvider = fixture.GetRequiredService<SpacebarClientProviderService>(testOutputHelper); + private readonly UserAbstraction _userAbstraction = fixture.GetRequiredService<UserAbstraction>(testOutputHelper); + + private static AuthenticatedSpacebarClient Client { get; set; } = null!; + private static Guild? Guild { get; set; } + + private const string Base64ImageData = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA8hJREFUeNrtnD9oE1EYwL8XOxwIphksdIjQoUNQB41TumVrpoJLwUUI2EEpQltwyOaN7SI4KHRwELqomeLmZqdWBwMdKgjNUMmS1qnbuahoTXq5u/fu3r38fputzd19v/e97/27KFFXBbKjQAgQgABAAAIAAQgABCAAEIAAQAACAAEIAAQgABCAAEAAAgABCAAEIAAQgABAAAIAAQiA5Eylcxnl9//+Z/BmVT7vWBUI1WzLXO2fm2zNpHFd4y9oeEXVOhz6m3SeMEb7SPMOjQsY9Wy/GPSCraqFoU/NQcF4Xl9Mqaz8vkxfyyD0tZXQ6IvIuX4pZxkw1hNm0SPZc2NTYg3K78tBJ3h93+xVWl/Fu8IwdASVRqS2GY3Zm8rvWxV9wxlQaSTpH/QmvkGvybgk6rKpZH/8MdGf1zeUiHzbTT4QUHefJfqI6bIcvM9fEdbV6OKnwugpSHr3kKMirLdHsrbPsbsIXxzQ8aYLqr6Rl+gbzAB175X+z1zfC00FU6H3inJ2mqcaYLYNDlvAMHvFs9PAn5/oLmjIAoZX/L1asGC8z/lzrQkswqPntIeSfwr5ai/uYWQipp50ZcpzLVSDnnzvkgHZ9XgJp9NOFWGHQIB7Am4vE9Ysi7B6+MHZaM1ely9t6zPAXVTcHQ4EUIQhHQEmFkHtYrpsdwZUFh0vA480DzFsWYwLNqty0gv5T6WyWtsP/6hx9s4qizGTVfckX/N+QIxl4aDTkt2XUcaCN0aNdCNvW67vxTiUp3d/WGsXVIp+wnBwFC36InLcHXpUItisRk+7O04VYbW2FzkEW3FCEGwvDflpaA+mqznXHjAMzbQON3wE/N+V9XJ642SAMwJqK0QzSwGq8XSCykDzHV1QpswtIIAuCOwREP4ynntoWhbVlAGGXyW0sQ6v79skACZdQKmMAMihgHgnnIfX/Fh1KPN3abLOAK+o6hvRQnZreWisVbMddbtKVyFN1AS17Iglb0fB9lL4G6lzC+OsAQT+fPjrRLWV5GsnWrbGbBGQR7QIoAgzCspp8++0LBJgz3dfpUfUswRkgJ3oO57uFVW5OiFRCzarcvbDsgzQ1CfmgxNtZwB0dkHB8zqjz0xrwHHX/fAPjqwehjo/HIp3lC/VUZDDDkw8WiEvN+pk9A3OA4LWjJwcORL63RfmmlTWX108qQ0/PQH51eDKt6efo9lWFh+hCD7tyNvVNK+YugBIpwgDAhAACEAAIAABgAAEAAIQAAhAACAAAYAABAACEAAIQAACCAECEAAIQAAgAAGAAAQAAiaKn3vk4S2WTtVqAAAAAElFTkSuQmCC"; + + public async ValueTask InitializeAsync() { + testOutputHelper.WriteLine("Running InitializeAsync"); + // All these tests can share a single client + Client = await _userAbstraction.GetSharedUser(); + // ...and a guild + Guild ??= await Client.CreateGuild(new() { + Name = "Test guild" + }); + } + + [Fact] + public async Task GetEmojis() { + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.GetAsync($"/api/v9/guilds/{Guild.Id}/emojis", TestContext.Current.CancellationToken)); + var resEmojis = await res.Content.ReadFromJsonAsync<JsonArray>(); + + resEmojis!.ForEach(eJson => { + Assert.StringNotNullOrWhitespace(eJson?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(eJson?["name"]?.GetValue<string>()); + }); + } + + [Fact] + public async Task UploadEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/guilds/{Guild.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + } + + [Fact] + public async Task UpdateEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/guilds/{Guild.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + var reqJson2 = new JsonObject() { + { "name", "meowtwo" } + }; + var res2 = await Assert.HttpSuccess(await Client.ApiHttpClient.PatchAsJsonAsync($"/api/v9/guilds/{Guild.Id}/emojis/{resEmoji?["id"]?.GetValue<string>()}", reqJson2, + TestContext.Current.CancellationToken)); + var resEmoji2 = await res2.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji2?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji2?["name"]?.GetValue<string>()); + Assert.Equal("meowtwo", resEmoji2?["name"]?.GetValue<string>()); + } + + [Fact] + public async Task DeleteEmoji() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/guilds/{Guild.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + await Assert.HttpSuccess(await Client.ApiHttpClient.DeleteAsync($"/api/v9/guilds/{Guild.Id}/emojis/{resEmoji?["id"]?.GetValue<string>()}", + TestContext.Current.CancellationToken)); + } + + [Fact] + public async Task GetEmojiSource() { + var reqJson = new JsonObject() { + { "name", "meow" }, + { "image", Base64ImageData } + }; + + var res = await Assert.HttpSuccess(await Client.ApiHttpClient.PostAsJsonAsync($"/api/v9/guilds/{Guild.Id}/emojis", reqJson, TestContext.Current.CancellationToken)); + var resEmoji = await res.Content.ReadFromJsonAsync<JsonObject>(); + + Assert.StringNotNullOrWhitespace(resEmoji?["id"]?.GetValue<string>()); + Assert.StringNotNullOrWhitespace(resEmoji?["name"]?.GetValue<string>()); + Assert.Equal("meow", resEmoji?["name"]?.GetValue<string>()); + + var sourceRes = await Assert.HttpSuccess(await Client.ApiHttpClient.GetAsync($"/api/v9/emojis/{resEmoji?["id"]?.GetValue<string>()}/source", + TestContext.Current.CancellationToken)); + var sourceResJson = await sourceRes.Content.ReadFromJsonAsync<JsonObject>(cancellationToken: TestContext.Current.CancellationToken); + + Assert.StringNotNullOrWhitespace(sourceResJson?["type"]?.GetValue<string>()); + Assert.Equal("GUILD", sourceResJson?["type"]?.GetValue<string>()); + + Assert.StringNotNullOrWhitespace(sourceResJson?["guild"]?.AsObject()["id"]?.GetValue<string>()); + Assert.Equal(Guild.Id.ToString(), sourceResJson?["guild"]?.AsObject()["id"]?.GetValue<string>()); + } +} \ No newline at end of file diff --git a/extra/admin-api/Tests/Spacebar.Tests/appsettings.json b/extra/admin-api/Tests/Spacebar.Tests/appsettings.json
index ecf2dd46..44ec2796 100644 --- a/extra/admin-api/Tests/Spacebar.Tests/appsettings.json +++ b/extra/admin-api/Tests/Spacebar.Tests/appsettings.json
@@ -1,7 +1,7 @@ { "Configuration": { -// "TestInstance": "http://localhost:3001", - "TestInstance": "http://localhost:5085", + "TestInstance": "http://localhost:3001", +// "TestInstance": "http://localhost:5085", "RegisterConcurrentCount": 150 } } \ No newline at end of file