using RadicadeServer.RecNet.Avatar; using Xunit; namespace RadicadeServer.Tests; public class AvatarWireFormatTests { [Theory] [InlineData("8aa79563-ace1-4ba7-ad0c-f3210a78142f,", "8aa79563-ace1-4ba7-ad0c-f3210a78142f,")] [InlineData("prefab,material", "prefab,material")] [InlineData("prefab,material,", "prefab,material,")] [InlineData("prefab,first,second,", "prefab,first,second,")] [InlineData("prefab,,second,", "prefab,,second,")] public void V4PreservesTheExactMaterialCombinationKey(string catalogKey, string selectionKey) { var dto = new AvatarItemV4(new AvatarItem { AvatarItemDesc = catalogKey }); var json = System.Text.Json.JsonSerializer.SerializeToElement(dto); Assert.Equal(selectionKey, json.GetProperty("AvatarItemDesc").GetString()); } [Fact] public void ScreenshotShirtSurvivesCatalogToWireConversion() { var catalog = File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "Fixtures", "2022-avatar.json")); var shirt = AvatarUnlockCatalog.ParseCatalog(catalog) .Single(item => item.AvatarItemDesc == "8aa79563-ace1-4ba7-ad0c-f3210a78142f,"); Assert.Equal("8aa79563-ace1-4ba7-ad0c-f3210a78142f,", new AvatarItemV4(shirt).AvatarItemDesc); Assert.True(shirt.AvatarItemId > 0); } [Fact] public void BaseEndpointDoesNotReclassifyClothingAsHiddenBodyParts() { var originalCatalog = DBConfig.DefaultAvatarCatalog; var originalLookup = DBConfig.ResolvableAvatarItemDescs; try { DBConfig.DefaultAvatarCatalog = """ [{"AvatarItemDesc":"shirt,","IsBaseAvatarItem":false}, {"AvatarItemDesc":"base-body,","IsBaseAvatarItem":true}] """; DBConfig.ResolvableAvatarItemDescs = new HashSet(); // These endpoints do not access the database. var api = new RadicadeServer.API.Avatars.V1.AvatarV1(null!); var response = Assert.IsType(api.GetDefaultBaseAvatarItems()); var baseItems = Assert.IsType>(response.Value); Assert.Equal("base-body,", Assert.Single(baseItems).AvatarItemDesc); Assert.DoesNotContain(api.GetDefaultUnlocks(), item => item.AvatarItemDesc == "shirt,"); Assert.Contains(api.GetDefaultUnlocks(), item => item.AvatarItemDesc == "base-body,"); } finally { DBConfig.DefaultAvatarCatalog = originalCatalog; DBConfig.ResolvableAvatarItemDescs = originalLookup; } } }