From d0be68f2a98bac450af8cae8e7330bc241548a1a Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Sat, 2 May 2026 12:51:30 +1000 Subject: [PATCH 01/13] test(audience-sdk): centralise per-test fixture data values in TestFixtures The SDK test suite repeated the same identifier and payload literals across MessageBuilderTests, TypedEventTests, JsonTests, ImmutableAudienceTests, and DeleteDataTests. The pairs that appeared both as inputs and as assertion targets were the worst offenders (anon-42, user-42, user-99, from-id, to-id) since a typo flipping one side would silently pass on the other. Add TestFixtures alongside TestDefaults (which already centralises config defaults) and reference TestFixtures.X across the five files. Constants cover anonymous IDs (1, 42, 123), user IDs (42, 99), alias endpoints (from / to), identity values keyed to IdentityType.Custom / Steam / Passport (player-42 / player_steam / player_passport), Resource event payload values (gold currency, quest_reward itemType, main_quest_01 itemId), Purchase event payload values (gem_pack_01 itemId, Starter Gem Pack itemName, txn_abc123 transactionId), and the MilestoneReached name (first_boss_defeated). Includes main_quest_01, player_passport, anon-123, and first_boss_defeated beyond the user's listed values: same per-fixture data category, same migration treatment. tutorial_complete from the user's list does not appear in the test suite (the milestone fixture uses first_boss_defeated); skipped on that basis. Per the user's "everything random goes in a constant" stance, applied against the previous session's recommendation that scenario descriptors read better inline. Recording the override on the user's explicit request. Follow-up to SDK-272 (centralisation of duplicated literals). --- .../Audience/Tests/Runtime/DeleteDataTests.cs | 8 ++-- .../Runtime/Events/MessageBuilderTests.cs | 22 +++++------ .../Tests/Runtime/Events/TypedEventTests.cs | 32 ++++++++-------- .../Tests/Runtime/ImmutableAudienceTests.cs | 12 +++--- .../Audience/Tests/Runtime/TestFixtures.cs | 37 +++++++++++++++++++ .../Tests/Runtime/TestFixtures.cs.meta | 11 ++++++ .../Tests/Runtime/Utility/JsonTests.cs | 2 +- 7 files changed, 86 insertions(+), 38 deletions(-) create mode 100644 src/Packages/Audience/Tests/Runtime/TestFixtures.cs create mode 100644 src/Packages/Audience/Tests/Runtime/TestFixtures.cs.meta diff --git a/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs b/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs index 0daa64807..831f947c1 100644 --- a/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs +++ b/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs @@ -74,7 +74,7 @@ public void DeleteData_WithUserId_FiresDelete_WithUserIdQuery() var handler = new CapturingHandler(); ImmutableAudience.Init(MakeConfig(handler)); - ImmutableAudience.DeleteData(userId: "player-42"); + ImmutableAudience.DeleteData(userId: TestFixtures.PlayerCustomId); WaitForRequest(handler); // Filter out the game_launch POST from Init. @@ -151,7 +151,7 @@ public async Task DeleteData_ReturnsTask_ThatCompletesAfterRequest() var handler = new CapturingHandler(); ImmutableAudience.Init(MakeConfig(handler)); - var task = ImmutableAudience.DeleteData(userId: "player-42"); + var task = ImmutableAudience.DeleteData(userId: TestFixtures.PlayerCustomId); Assert.IsNotNull(task, "DeleteData must return a non-null Task"); // Await directly: no need for the RequestSent gate when the task @@ -168,7 +168,7 @@ public void DeleteData_BeforeInit_ReturnsCompletedTask() // Not initialised: must not throw, must return a completed Task. ImmutableAudience.ResetState(); - var task = ImmutableAudience.DeleteData(userId: "player-42"); + var task = ImmutableAudience.DeleteData(userId: TestFixtures.PlayerCustomId); Assert.IsNotNull(task); Assert.IsTrue(task.IsCompleted, "DeleteData before Init must return an already-completed Task"); @@ -189,7 +189,7 @@ public void DeleteData_ServerError_InvokesOnError() }; ImmutableAudience.Init(config); - ImmutableAudience.DeleteData(userId: "player-42"); + ImmutableAudience.DeleteData(userId: TestFixtures.PlayerCustomId); Assert.IsTrue(received.Wait(TimeSpan.FromSeconds(5)), "OnError should fire when DeleteData's response is non-2xx"); diff --git a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs index 593f28d0a..4bd110ee6 100644 --- a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs @@ -13,7 +13,7 @@ public class MessageBuilderTests [Test] public void Track_RequiredFieldsPresent() { - var result = MessageBuilder.Track(TestEventNames.LevelComplete, "anon-1", null, PackageVersion); + var result = MessageBuilder.Track(TestEventNames.LevelComplete, TestFixtures.AnonId1, null, PackageVersion); Assert.AreEqual(MessageTypes.Track, result[MessageFields.Type]); Assert.IsTrue(result.ContainsKey(MessageFields.MessageId)); @@ -36,7 +36,7 @@ public void Track_EventNameLongerThan256Chars_TruncatedTo256() [Test] public void Track_NullUserId_NotPresentInDict() { - var result = MessageBuilder.Track("evt", "anon-1", null, PackageVersion); + var result = MessageBuilder.Track("evt", TestFixtures.AnonId1, null, PackageVersion); Assert.IsFalse(result.ContainsKey(MessageFields.UserId)); } @@ -44,20 +44,20 @@ public void Track_NullUserId_NotPresentInDict() [Test] public void Track_NonNullUserId_PresentInDict() { - var result = MessageBuilder.Track("evt", "anon-1", "user-99", PackageVersion); + var result = MessageBuilder.Track("evt", TestFixtures.AnonId1, TestFixtures.UserId99, PackageVersion); Assert.IsTrue(result.ContainsKey(MessageFields.UserId)); - Assert.AreEqual("user-99", result[MessageFields.UserId]); + Assert.AreEqual(TestFixtures.UserId99, result[MessageFields.UserId]); } [Test] public void Identify_TypeAndIdentityFieldsPresent() { - var result = MessageBuilder.Identify("anon-42", "user-42", IdentityType.Steam.ToLowercaseString(), PackageVersion); + var result = MessageBuilder.Identify(TestFixtures.AnonId42, TestFixtures.UserId42, IdentityType.Steam.ToLowercaseString(), PackageVersion); Assert.AreEqual(MessageTypes.Identify, result[MessageFields.Type]); - Assert.AreEqual("anon-42", result[MessageFields.AnonymousId]); - Assert.AreEqual("user-42", result[MessageFields.UserId]); + Assert.AreEqual(TestFixtures.AnonId42, result[MessageFields.AnonymousId]); + Assert.AreEqual(TestFixtures.UserId42, result[MessageFields.UserId]); Assert.AreEqual(IdentityType.Steam.ToLowercaseString(), result[MessageFields.IdentityType]); } @@ -65,14 +65,14 @@ public void Identify_TypeAndIdentityFieldsPresent() public void Alias_AllFourFieldsPresent() { var result = MessageBuilder.Alias( - "from-id", IdentityType.Email.ToLowercaseString(), - "to-id", IdentityType.Steam.ToLowercaseString(), + TestFixtures.AliasFromId, IdentityType.Email.ToLowercaseString(), + TestFixtures.AliasToId, IdentityType.Steam.ToLowercaseString(), PackageVersion); Assert.AreEqual(MessageTypes.Alias, result[MessageFields.Type]); - Assert.AreEqual("from-id", result[MessageFields.FromId]); + Assert.AreEqual(TestFixtures.AliasFromId, result[MessageFields.FromId]); Assert.AreEqual(IdentityType.Email.ToLowercaseString(), result[MessageFields.FromType]); - Assert.AreEqual("to-id", result[MessageFields.ToId]); + Assert.AreEqual(TestFixtures.AliasToId, result[MessageFields.ToId]); Assert.AreEqual(IdentityType.Steam.ToLowercaseString(), result[MessageFields.ToType]); } diff --git a/src/Packages/Audience/Tests/Runtime/Events/TypedEventTests.cs b/src/Packages/Audience/Tests/Runtime/Events/TypedEventTests.cs index 82318087b..681186416 100644 --- a/src/Packages/Audience/Tests/Runtime/Events/TypedEventTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Events/TypedEventTests.cs @@ -61,19 +61,19 @@ public void Resource_Source_ProducesCorrectProperties() var evt = new Resource { Flow = ResourceFlow.Source, - Currency = "gold", + Currency = TestFixtures.ResourceCurrency, Amount = 100, - ItemType = "quest_reward", - ItemId = "main_quest_01" + ItemType = TestFixtures.ResourceItemType, + ItemId = TestFixtures.ResourceItemId }; var props = evt.ToProperties(); Assert.AreEqual(ResourceFlow.Source.ToLowercaseString(), props[EventPropertyKeys.Flow]); - Assert.AreEqual("gold", props[EventPropertyKeys.Currency]); + Assert.AreEqual(TestFixtures.ResourceCurrency, props[EventPropertyKeys.Currency]); Assert.AreEqual(100m, props[EventPropertyKeys.Amount]); - Assert.AreEqual("quest_reward", props[EventPropertyKeys.ItemType]); - Assert.AreEqual("main_quest_01", props[EventPropertyKeys.ItemId]); + Assert.AreEqual(TestFixtures.ResourceItemType, props[EventPropertyKeys.ItemType]); + Assert.AreEqual(TestFixtures.ResourceItemId, props[EventPropertyKeys.ItemId]); } [Test] @@ -85,7 +85,7 @@ public void Resource_EventName_IsResource() [Test] public void Resource_WithoutFlow_ThrowsOnToProperties() { - var evt = new Resource { Currency = "gold", Amount = 100 }; + var evt = new Resource { Currency = TestFixtures.ResourceCurrency, Amount = 100 }; var ex = Assert.Throws(() => evt.ToProperties()); Assert.That(ex!.Message, Does.Contain("Flow")); @@ -103,7 +103,7 @@ public void Resource_WithoutCurrency_ThrowsOnToProperties() [Test] public void Resource_WithoutAmount_ThrowsOnToProperties() { - var evt = new Resource { Flow = ResourceFlow.Source, Currency = "gold" }; + var evt = new Resource { Flow = ResourceFlow.Source, Currency = TestFixtures.ResourceCurrency }; var ex = Assert.Throws(() => evt.ToProperties()); Assert.That(ex!.Message, Does.Contain("Amount")); @@ -116,20 +116,20 @@ public void Purchase_ProducesCorrectProperties() { Currency = "USD", Value = 9.99m, - ItemId = "gem_pack_01", - ItemName = "Starter Gem Pack", + ItemId = TestFixtures.PurchaseItemId, + ItemName = TestFixtures.PurchaseItemName, Quantity = 1, - TransactionId = "txn_abc123" + TransactionId = TestFixtures.PurchaseTransactionId }; var props = evt.ToProperties(); Assert.AreEqual("USD", props[EventPropertyKeys.Currency]); Assert.AreEqual(9.99m, props[EventPropertyKeys.Value]); - Assert.AreEqual("gem_pack_01", props[EventPropertyKeys.ItemId]); - Assert.AreEqual("Starter Gem Pack", props[EventPropertyKeys.ItemName]); + Assert.AreEqual(TestFixtures.PurchaseItemId, props[EventPropertyKeys.ItemId]); + Assert.AreEqual(TestFixtures.PurchaseItemName, props[EventPropertyKeys.ItemName]); Assert.AreEqual(1, props[EventPropertyKeys.Quantity]); - Assert.AreEqual("txn_abc123", props[EventPropertyKeys.TransactionId]); + Assert.AreEqual(TestFixtures.PurchaseTransactionId, props[EventPropertyKeys.TransactionId]); } [Test] @@ -172,9 +172,9 @@ public void Purchase_WithoutValue_ThrowsOnToProperties() [Test] public void MilestoneReached_ProducesCorrectProperties() { - var props = new MilestoneReached { Name = "first_boss_defeated" }.ToProperties(); + var props = new MilestoneReached { Name = TestFixtures.MilestoneName }.ToProperties(); - Assert.AreEqual("first_boss_defeated", props[EventPropertyKeys.Name]); + Assert.AreEqual(TestFixtures.MilestoneName, props[EventPropertyKeys.Name]); Assert.AreEqual(1, props.Count); } diff --git a/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs b/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs index 07861159d..f8aefd166 100644 --- a/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs +++ b/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs @@ -105,8 +105,8 @@ public void UserId_AfterIdentifyAndReset_TracksState() Assert.IsNull(ImmutableAudience.UserId, "UserId should be null until Identify is called"); - ImmutableAudience.Identify("player-42", IdentityType.Custom); - Assert.AreEqual("player-42", ImmutableAudience.UserId, + ImmutableAudience.Identify(TestFixtures.PlayerCustomId, IdentityType.Custom); + Assert.AreEqual(TestFixtures.PlayerCustomId, ImmutableAudience.UserId, "UserId must reflect the most recent Identify call"); ImmutableAudience.Reset(); @@ -215,7 +215,7 @@ public void ContextProvider_Set_MergesOnIdentifyPath() }; ImmutableAudience.Init(MakeConfig(ConsentLevel.Full)); - ImmutableAudience.Identify("player-42", IdentityType.Custom); + ImmutableAudience.Identify(TestFixtures.PlayerCustomId, IdentityType.Custom); ImmutableAudience.Shutdown(); var queueDir = AudiencePaths.QueueDir(_testDir); @@ -1325,8 +1325,8 @@ public void FullToAnonymous_StripsUserIdFromQueuedTrackAndDropsIdentifyAlias() { ImmutableAudience.Init(MakeConfig(ConsentLevel.Full)); - ImmutableAudience.Identify("player_steam", IdentityType.Steam); - ImmutableAudience.Alias("player_steam", IdentityType.Steam, "player_passport", IdentityType.Passport); + ImmutableAudience.Identify(TestFixtures.PlayerSteamId, IdentityType.Steam); + ImmutableAudience.Alias(TestFixtures.PlayerSteamId, IdentityType.Steam, TestFixtures.PlayerPassportId, IdentityType.Passport); ImmutableAudience.Track(TestEventNames.TrackedBeforeDowngrade); ImmutableAudience.FlushQueueToDiskForTesting(); @@ -1351,7 +1351,7 @@ public void FullToAnonymous_StripsUserIdFromQueuedTrackAndDropsIdentifyAlias() public void FullToAnonymous_FutureTracksOmitUserId() { ImmutableAudience.Init(MakeConfig(ConsentLevel.Full)); - ImmutableAudience.Identify("player_steam", IdentityType.Steam); + ImmutableAudience.Identify(TestFixtures.PlayerSteamId, IdentityType.Steam); ImmutableAudience.SetConsent(ConsentLevel.Anonymous); ImmutableAudience.Track(TestEventNames.TrackedAfterDowngrade); diff --git a/src/Packages/Audience/Tests/Runtime/TestFixtures.cs b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs new file mode 100644 index 000000000..d2f001f77 --- /dev/null +++ b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs @@ -0,0 +1,37 @@ +namespace Immutable.Audience.Tests +{ + // Per-fixture data values shared across the SDK test suite. + internal static class TestFixtures + { + // Anonymous IDs + internal const string AnonId1 = "anon-1"; + internal const string AnonId42 = "anon-42"; + internal const string AnonId123 = "anon-123"; + + // User IDs + internal const string UserId42 = "user-42"; + internal const string UserId99 = "user-99"; + + // Alias endpoints + internal const string AliasFromId = "from-id"; + internal const string AliasToId = "to-id"; + + // Identity values keyed to IdentityType.Custom / Steam / Passport + internal const string PlayerCustomId = "player-42"; + internal const string PlayerSteamId = "player_steam"; + internal const string PlayerPassportId = "player_passport"; + + // Resource event payload values + internal const string ResourceCurrency = "gold"; + internal const string ResourceItemType = "quest_reward"; + internal const string ResourceItemId = "main_quest_01"; + + // Purchase event payload values + internal const string PurchaseItemId = "gem_pack_01"; + internal const string PurchaseItemName = "Starter Gem Pack"; + internal const string PurchaseTransactionId = "txn_abc123"; + + // MilestoneReached event payload values + internal const string MilestoneName = "first_boss_defeated"; + } +} diff --git a/src/Packages/Audience/Tests/Runtime/TestFixtures.cs.meta b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs.meta new file mode 100644 index 000000000..4376c4879 --- /dev/null +++ b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd6da3a651764490959fa341975848f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Packages/Audience/Tests/Runtime/Utility/JsonTests.cs b/src/Packages/Audience/Tests/Runtime/Utility/JsonTests.cs index b8f9c4524..68798c0e0 100644 --- a/src/Packages/Audience/Tests/Runtime/Utility/JsonTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Utility/JsonTests.cs @@ -183,7 +183,7 @@ public void Serialize_RealisticEventPayload_ProducesCorrectJson() { { MessageFields.Type, MessageTypes.Track }, { MessageFields.EventName, TestEventNames.LevelComplete }, - { MessageFields.AnonymousId, "anon-123" }, + { MessageFields.AnonymousId, TestFixtures.AnonId123 }, { MessageFields.UserId, null }, { MessageFields.Properties, new Dictionary { From 56541042a4f2e38763dccd6f6623626a3ac406ac Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Sat, 2 May 2026 12:51:45 +1000 Subject: [PATCH 02/13] test(audience-sdk): add missing meta file for TestEventNames TestEventNames.cs (SHA 6d237a3a) was committed without its .meta file. Unity generates one on project open, but the convention across the test folder is to commit them so the GUID is stable across machines (mirrors TestDefaults.cs.meta and TestFixtures.cs.meta). Follow-up to SDK-272 (centralisation of duplicated literals). --- .../Audience/Tests/Runtime/TestEventNames.cs.meta | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/Packages/Audience/Tests/Runtime/TestEventNames.cs.meta diff --git a/src/Packages/Audience/Tests/Runtime/TestEventNames.cs.meta b/src/Packages/Audience/Tests/Runtime/TestEventNames.cs.meta new file mode 100644 index 000000000..5dd577b09 --- /dev/null +++ b/src/Packages/Audience/Tests/Runtime/TestEventNames.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0913bc77fd8c4a419bfcdb5dcfebb4e8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d27fc2eef0572e4f5990e4af752ed7d59fcb2395 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Sat, 2 May 2026 13:01:39 +1000 Subject: [PATCH 03/13] test(audience-sdk): extend TestEventNames with transport and queue scenarios Adds named event-name constants for the EventQueue scenario tests (IntervalFlush, DisposeTest), placeholder constants for transport / queue scaffolding where the event name is just filler (PlaceholderA, PlaceholderB, PlaceholderTest, PlaceholderTrack, PlaceholderIgnored, PlaceholderEvt), and BlockedPrefix for the OfflineResilienceTests $"blocked_{i}" templated string. Migrates inline references in: - MessageBuilderTests ("evt" placeholders, six sites) - EventQueueTests (Msg() helper calls, six sites) - HttpTransportTests (WireFixture.Track event-name args, eight sites) - OfflineResilienceTests ($"blocked_{i}" templated literal, three sites) Per the user's "everything random goes in a constant" stance. Follow-up to SDK-272 (centralisation of duplicated literals). --- .../Tests/Runtime/Events/MessageBuilderTests.cs | 12 ++++++------ .../Tests/Runtime/OfflineResilienceTests.cs | 6 +++--- .../Audience/Tests/Runtime/TestEventNames.cs | 15 +++++++++++++++ .../Tests/Runtime/Transport/EventQueueTests.cs | 12 ++++++------ .../Runtime/Transport/HttpTransportTests.cs | 16 ++++++++-------- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs index 4bd110ee6..1a9b6f486 100644 --- a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs @@ -36,7 +36,7 @@ public void Track_EventNameLongerThan256Chars_TruncatedTo256() [Test] public void Track_NullUserId_NotPresentInDict() { - var result = MessageBuilder.Track("evt", TestFixtures.AnonId1, null, PackageVersion); + var result = MessageBuilder.Track(TestEventNames.PlaceholderEvt, TestFixtures.AnonId1, null, PackageVersion); Assert.IsFalse(result.ContainsKey(MessageFields.UserId)); } @@ -44,7 +44,7 @@ public void Track_NullUserId_NotPresentInDict() [Test] public void Track_NonNullUserId_PresentInDict() { - var result = MessageBuilder.Track("evt", TestFixtures.AnonId1, TestFixtures.UserId99, PackageVersion); + var result = MessageBuilder.Track(TestEventNames.PlaceholderEvt, TestFixtures.AnonId1, TestFixtures.UserId99, PackageVersion); Assert.IsTrue(result.ContainsKey(MessageFields.UserId)); Assert.AreEqual(TestFixtures.UserId99, result[MessageFields.UserId]); @@ -79,7 +79,7 @@ public void Alias_AllFourFieldsPresent() [Test] public void AllMessages_ContextContainsLibraryAndLibraryVersion() { - var track = MessageBuilder.Track("evt", null, null, PackageVersion); + var track = MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); var identify = MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); var alias = MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); @@ -94,7 +94,7 @@ public void AllMessages_ContextContainsLibraryAndLibraryVersion() [Test] public void AllMessages_SurfaceIsUnity() { - var track = MessageBuilder.Track("evt", null, null, PackageVersion); + var track = MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); var identify = MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); var alias = MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); @@ -120,7 +120,7 @@ public void Track_MessageId_IsUniquePerCall() // Backend deduplicates on messageId; collisions silently drop events. var ids = new HashSet(); for (var i = 0; i < 1000; i++) - ids.Add((string)MessageBuilder.Track("evt", null, null, PackageVersion)[MessageFields.MessageId]); + ids.Add((string)MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion)[MessageFields.MessageId]); Assert.AreEqual(1000, ids.Count); } @@ -161,7 +161,7 @@ public void AllMessages_Context_LibraryAndLibraryVersionAreNonEmptyStrings() private static IEnumerable> EveryMessageType() { - yield return MessageBuilder.Track("evt", null, null, PackageVersion); + yield return MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); yield return MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); yield return MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); } diff --git a/src/Packages/Audience/Tests/Runtime/OfflineResilienceTests.cs b/src/Packages/Audience/Tests/Runtime/OfflineResilienceTests.cs index 7da31a416..6a18c1b90 100644 --- a/src/Packages/Audience/Tests/Runtime/OfflineResilienceTests.cs +++ b/src/Packages/Audience/Tests/Runtime/OfflineResilienceTests.cs @@ -79,7 +79,7 @@ public void Track_DiskWritesBlocked_DoesNotThrowToCallers() Assert.DoesNotThrow(() => { - for (int i = 0; i < 50; i++) ImmutableAudience.Track($"blocked_{i}"); + for (int i = 0; i < 50; i++) ImmutableAudience.Track($"{TestEventNames.BlockedPrefix}{i}"); ImmutableAudience.FlushQueueToDiskForTesting(); }, "Track must not propagate disk-write IOException to callers"); @@ -95,7 +95,7 @@ public void Shutdown_DiskWritesBlocked_DoesNotThrow() ImmutableAudience.Init(MakeConfig()); ImmutableAudience.Track(TestEventNames.EventPreBlock); BlockDiskWrites(); - for (int i = 0; i < 20; i++) ImmutableAudience.Track($"blocked_{i}"); + for (int i = 0; i < 20; i++) ImmutableAudience.Track($"{TestEventNames.BlockedPrefix}{i}"); Assert.DoesNotThrow(() => ImmutableAudience.Shutdown(), "Shutdown must absorb disk-write failure during the final drain"); @@ -114,7 +114,7 @@ public void Track_DiskWritesBlocked_RetainsEventsInMemory_AndSurfacesOnError() BlockDiskWrites(); const int eventCount = 50; - for (int i = 0; i < eventCount; i++) ImmutableAudience.Track($"blocked_{i}"); + for (int i = 0; i < eventCount; i++) ImmutableAudience.Track($"{TestEventNames.BlockedPrefix}{i}"); ImmutableAudience.FlushQueueToDiskForTesting(); Assert.GreaterOrEqual(ImmutableAudience.QueueSize, eventCount, diff --git a/src/Packages/Audience/Tests/Runtime/TestEventNames.cs b/src/Packages/Audience/Tests/Runtime/TestEventNames.cs index 657c18926..c54a8d7cb 100644 --- a/src/Packages/Audience/Tests/Runtime/TestEventNames.cs +++ b/src/Packages/Audience/Tests/Runtime/TestEventNames.cs @@ -26,5 +26,20 @@ internal static class TestEventNames internal const string MixedLoadTrack = "mixed_load_track"; internal const string SteadyState = "steady_state"; internal const string LevelComplete = "level_complete"; + + // EventQueue scenario names where the event name is meaningful in the test description. + internal const string IntervalFlush = "interval_flush"; + internal const string DisposeTest = "dispose_test"; + + // Placeholder event names for tests where the event name itself is irrelevant. + internal const string PlaceholderA = "a"; + internal const string PlaceholderB = "b"; + internal const string PlaceholderTest = "test"; + internal const string PlaceholderTrack = "track"; + internal const string PlaceholderIgnored = "ignored"; + internal const string PlaceholderEvt = "evt"; + + // Prefix for OfflineResilienceTests' $"blocked_{i}" loop. + internal const string BlockedPrefix = "blocked_"; } } diff --git a/src/Packages/Audience/Tests/Runtime/Transport/EventQueueTests.cs b/src/Packages/Audience/Tests/Runtime/Transport/EventQueueTests.cs index 0a437629c..2661b4dc7 100644 --- a/src/Packages/Audience/Tests/Runtime/Transport/EventQueueTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Transport/EventQueueTests.cs @@ -35,7 +35,7 @@ public void Enqueue_ThenFlushSync_PersistesEventToDisk() { using var queue = new EventQueue(_store, flushIntervalSeconds: 60, flushSize: 100); - queue.Enqueue(Msg("track")); + queue.Enqueue(Msg(TestEventNames.PlaceholderTrack)); queue.FlushSync(); Assert.AreEqual(1, _store.Count(), "event should be on disk after FlushSync"); @@ -77,8 +77,8 @@ public void Shutdown_FlushesRemainingEvents() { var queue = new EventQueue(_store, flushIntervalSeconds: 60, flushSize: 100); - queue.Enqueue(Msg("a")); - queue.Enqueue(Msg("b")); + queue.Enqueue(Msg(TestEventNames.PlaceholderA)); + queue.Enqueue(Msg(TestEventNames.PlaceholderB)); queue.Shutdown(); @@ -99,7 +99,7 @@ public void Enqueue_AfterShutdown_IsIgnored() var queue = new EventQueue(_store, flushIntervalSeconds: 60, flushSize: 100); queue.Shutdown(); - queue.Enqueue(Msg("ignored")); + queue.Enqueue(Msg(TestEventNames.PlaceholderIgnored)); Assert.AreEqual(0, _store.Count(), "events enqueued after Shutdown should be discarded"); } @@ -110,7 +110,7 @@ public void IntervalFlush_DrainsToDiskWithoutExplicitCall() // Very short interval to make the test fast using var queue = new EventQueue(_store, flushIntervalSeconds: 1, flushSize: 100); - queue.Enqueue(Msg("interval_flush")); + queue.Enqueue(Msg(TestEventNames.IntervalFlush)); // Wait slightly longer than the flush interval var deadline = DateTime.UtcNow.AddSeconds(4); @@ -125,7 +125,7 @@ public void Dispose_FlushesAndStopsDrainThread() { using (var queue = new EventQueue(_store, flushIntervalSeconds: 60, flushSize: 100)) { - queue.Enqueue(Msg("dispose_test")); + queue.Enqueue(Msg(TestEventNames.DisposeTest)); } // Dispose called here Assert.AreEqual(1, _store.Count(), "Dispose should flush events to disk"); diff --git a/src/Packages/Audience/Tests/Runtime/Transport/HttpTransportTests.cs b/src/Packages/Audience/Tests/Runtime/Transport/HttpTransportTests.cs index b7f41f040..ea14dd568 100644 --- a/src/Packages/Audience/Tests/Runtime/Transport/HttpTransportTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Transport/HttpTransportTests.cs @@ -49,8 +49,8 @@ public void TearDown() [Test] public async Task SendBatchAsync_200_DeletesFilesFromDisk() { - _store.Write(WireFixture.Track((MessageFields.EventName, "a"))); - _store.Write(WireFixture.Track((MessageFields.EventName, "b"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderA))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderB))); var handler = new MockHandler(HttpStatusCode.OK, $"{{\"accepted\":2,\"{ResponseFields.Rejected}\":0}}"); using var transport = new HttpTransport(_store, TestDefaults.PublishableKey, handler: handler); @@ -65,7 +65,7 @@ public async Task SendBatchAsync_200_DeletesFilesFromDisk() [Test] public async Task SendBatchAsync_200_SendsGzippedPayloadWithCorrectHeaders() { - _store.Write(WireFixture.Track((MessageFields.EventName, "test"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderTest))); byte[]? capturedBody = null; string? capturedKey = null; @@ -97,7 +97,7 @@ public async Task SendBatchAsync_200_SendsGzippedPayloadWithCorrectHeaders() [Test] public async Task SendBatchAsync_200_SendsPlainJsonPayloadWithoutContentEncoding() { - _store.Write(WireFixture.Track((MessageFields.EventName, "test"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderTest))); string? capturedKey = null; string? capturedContentType = null; @@ -322,8 +322,8 @@ public async Task SendBatchAsync_200_WithRejected_DeletesFilesAndSurfacesValidat // per-message validation errors. The batch is deleted (retries // would not help) and the count is surfaced via onError so // studios can observe silently dropped events. - _store.Write(WireFixture.Track((MessageFields.EventName, "a"))); - _store.Write(WireFixture.Track((MessageFields.EventName, "b"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderA))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderB))); var handler = new MockHandler(HttpStatusCode.OK, $"{{\"accepted\":1,\"{ResponseFields.Rejected}\":1}}"); AudienceError? reportedError = null; @@ -341,7 +341,7 @@ public async Task SendBatchAsync_200_WithRejected_DeletesFilesAndSurfacesValidat [Test] public async Task SendBatchAsync_200_ZeroRejected_DoesNotFireOnError() { - _store.Write(WireFixture.Track((MessageFields.EventName, "a"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderA))); var handler = new MockHandler(HttpStatusCode.OK, $"{{\"accepted\":1,\"{ResponseFields.Rejected}\":0}}"); AudienceError? reportedError = null; @@ -357,7 +357,7 @@ public async Task SendBatchAsync_200_ZeroRejected_DoesNotFireOnError() public async Task SendBatchAsync_200_MalformedBody_TreatsAsZeroRejected() { // Malformed diagnostic body must not block the success path. - _store.Write(WireFixture.Track((MessageFields.EventName, "a"))); + _store.Write(WireFixture.Track((MessageFields.EventName, TestEventNames.PlaceholderA))); var handler = new MockHandler(HttpStatusCode.OK, "not-json"); AudienceError? reportedError = null; From 5edc01214ceaa20ddd7c5380d5d0daf7714ed46e Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Sat, 2 May 2026 13:04:04 +1000 Subject: [PATCH 04/13] test(audience-sdk): extend TestFixtures with more scenario values Adds: - Track properties: CustomPropKeyRecipeId, CraftingRecipeIronSword - Distribution platform fixture: ProviderValue - IdentityType fallback fixture: UnknownProvider - Identity persistence fixtures: PreExistingId, PreExistingIdFromLastLaunch - ConsentStore corruption fixture: NotAnInt - Stress test userId: UserRaceStress - DeleteData generic userId: SomeUser - Templated prefix for GzipTests $"anon-{i}": AnonIdPrefix - Minimal placeholders for MessageBuilder Identify / Alias arg slots (GenericUserId, GenericFromId, GenericToId, GenericFromType, GenericToType) Migrates inline references in: - DeleteDataTests - ImmutableAudienceTests (Track props, race-stress userId, provider value) - Core/IdentityTests (pre-existing-id fixtures) - IdentityTypeTests (TestCase attribute now references the const) - Core/ConsentStoreTests (corrupt-file fixture) - Utility/GzipTests (anon-{i} templated prefix) - Events/MessageBuilderTests (Identify / Alias placeholder slots) Per the user's "everything random goes in a constant" stance. Follow-up to SDK-272 (centralisation of duplicated literals). --- .../Tests/Runtime/Core/ConsentStoreTests.cs | 2 +- .../Tests/Runtime/Core/IdentityTests.cs | 4 +-- .../Audience/Tests/Runtime/DeleteDataTests.cs | 2 +- .../Runtime/Events/MessageBuilderTests.cs | 12 +++---- .../Tests/Runtime/IdentityTypeTests.cs | 2 +- .../Tests/Runtime/ImmutableAudienceTests.cs | 8 ++--- .../Audience/Tests/Runtime/TestFixtures.cs | 33 +++++++++++++++++++ .../Tests/Runtime/Utility/GzipTests.cs | 2 +- 8 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/Packages/Audience/Tests/Runtime/Core/ConsentStoreTests.cs b/src/Packages/Audience/Tests/Runtime/Core/ConsentStoreTests.cs index 85713b777..313d6bbfc 100644 --- a/src/Packages/Audience/Tests/Runtime/Core/ConsentStoreTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Core/ConsentStoreTests.cs @@ -50,7 +50,7 @@ public void Load_MalformedFile_ReturnsNull() // A garbage value that isn't a valid enum int. var dir = AudiencePaths.AudienceDir(_testDir); Directory.CreateDirectory(dir); - File.WriteAllText(AudiencePaths.ConsentFile(_testDir), "not-an-int"); + File.WriteAllText(AudiencePaths.ConsentFile(_testDir), TestFixtures.NotAnInt); Assert.IsNull(ConsentStore.Load(_testDir)); } diff --git a/src/Packages/Audience/Tests/Runtime/Core/IdentityTests.cs b/src/Packages/Audience/Tests/Runtime/Core/IdentityTests.cs index cd2cf5fd6..4a1c33a06 100644 --- a/src/Packages/Audience/Tests/Runtime/Core/IdentityTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Core/IdentityTests.cs @@ -39,7 +39,7 @@ public void NewDirectory_GeneratesNonEmptyId_AndWritesFile() public void ExistingFile_ReturnsPreviousId_WithoutGeneratingNew() { // Simulate a returning player by pre-writing an identity file (as a previous launch would have done). - var expectedId = "pre-existing-id-from-last-launch"; + var expectedId = TestFixtures.PreExistingIdFromLastLaunch; var dir = AudiencePaths.AudienceDir(_testDir); Directory.CreateDirectory(dir); File.WriteAllText(AudiencePaths.IdentityFile(_testDir), expectedId); @@ -93,7 +93,7 @@ public void Get_NoExistingFile_ReturnsNull_AndDoesNotCreate() [Test] public void Get_ExistingFile_ReturnsPersistedId() { - var expectedId = "pre-existing-id"; + var expectedId = TestFixtures.PreExistingId; var dir = AudiencePaths.AudienceDir(_testDir); Directory.CreateDirectory(dir); File.WriteAllText(AudiencePaths.IdentityFile(_testDir), expectedId); diff --git a/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs b/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs index 831f947c1..18aed4868 100644 --- a/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs +++ b/src/Packages/Audience/Tests/Runtime/DeleteDataTests.cs @@ -136,7 +136,7 @@ public void DeleteData_DoesNotCreateAnonymousIdFile() var handler = new CapturingHandler(); ImmutableAudience.Init(MakeConfig(handler, ConsentLevel.None)); - ImmutableAudience.DeleteData(userId: "some-user"); + ImmutableAudience.DeleteData(userId: TestFixtures.SomeUser); // Even with a userId request, the anonymousId file must not materialise. Thread.Sleep(250); diff --git a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs index 1a9b6f486..abddbc74b 100644 --- a/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Events/MessageBuilderTests.cs @@ -80,8 +80,8 @@ public void Alias_AllFourFieldsPresent() public void AllMessages_ContextContainsLibraryAndLibraryVersion() { var track = MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); - var identify = MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); - var alias = MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); + var identify = MessageBuilder.Identify(null, TestFixtures.GenericUserId, IdentityType.Steam.ToLowercaseString(), PackageVersion); + var alias = MessageBuilder.Alias(TestFixtures.GenericFromId, TestFixtures.GenericFromType, TestFixtures.GenericToId, TestFixtures.GenericToType, PackageVersion); foreach (var msg in new[] { track, identify, alias }) { @@ -95,8 +95,8 @@ public void AllMessages_ContextContainsLibraryAndLibraryVersion() public void AllMessages_SurfaceIsUnity() { var track = MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); - var identify = MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); - var alias = MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); + var identify = MessageBuilder.Identify(null, TestFixtures.GenericUserId, IdentityType.Steam.ToLowercaseString(), PackageVersion); + var alias = MessageBuilder.Alias(TestFixtures.GenericFromId, TestFixtures.GenericFromType, TestFixtures.GenericToId, TestFixtures.GenericToType, PackageVersion); Assert.AreEqual(Constants.Surface, track[MessageFields.Surface]); Assert.AreEqual(Constants.Surface, identify[MessageFields.Surface]); @@ -162,8 +162,8 @@ public void AllMessages_Context_LibraryAndLibraryVersionAreNonEmptyStrings() private static IEnumerable> EveryMessageType() { yield return MessageBuilder.Track(TestEventNames.PlaceholderEvt, null, null, PackageVersion); - yield return MessageBuilder.Identify(null, "u1", IdentityType.Steam.ToLowercaseString(), PackageVersion); - yield return MessageBuilder.Alias("f", "t1", "t", "t2", PackageVersion); + yield return MessageBuilder.Identify(null, TestFixtures.GenericUserId, IdentityType.Steam.ToLowercaseString(), PackageVersion); + yield return MessageBuilder.Alias(TestFixtures.GenericFromId, TestFixtures.GenericFromType, TestFixtures.GenericToId, TestFixtures.GenericToType, PackageVersion); } } } diff --git a/src/Packages/Audience/Tests/Runtime/IdentityTypeTests.cs b/src/Packages/Audience/Tests/Runtime/IdentityTypeTests.cs index 4050e73fe..0ec2de376 100644 --- a/src/Packages/Audience/Tests/Runtime/IdentityTypeTests.cs +++ b/src/Packages/Audience/Tests/Runtime/IdentityTypeTests.cs @@ -42,7 +42,7 @@ public void ParseLowercaseString_AcceptsMixedCase(string wire, IdentityType expe [TestCase(null)] [TestCase("")] - [TestCase("unknown_provider")] + [TestCase(TestFixtures.UnknownProvider)] [TestCase("steamX")] public void ParseLowercaseString_FallsBackToCustomForUnknownOrEmpty(string? wire) { diff --git a/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs b/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs index f8aefd166..dc33cf9b1 100644 --- a/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs +++ b/src/Packages/Audience/Tests/Runtime/ImmutableAudienceTests.cs @@ -490,7 +490,7 @@ public void Track_CustomEvent_WritesEventToDisk() ImmutableAudience.Track(TestEventNames.CraftingStarted, new Dictionary { - { "recipe_id", "iron_sword" } + { TestFixtures.CustomPropKeyRecipeId, TestFixtures.CraftingRecipeIronSword } }); // Flush memory → disk @@ -968,7 +968,7 @@ public void SetConsent_DowngradeToAnonymous_StressTest_NoUserIdLeak() // EnqueueTrack and this test leaks reproducibly. const int iterations = 200; const int trackersPerIteration = 4; - const string testUserId = "user_race_stress"; + const string testUserId = TestFixtures.UserRaceStress; for (int iter = 0; iter < iterations; iter++) { @@ -1224,7 +1224,7 @@ public void Init_GameLaunch_ConfigDistributionPlatformOverridesProvider() { ImmutableAudience.LaunchContextProvider = () => new Dictionary { - [GameLaunchPropertyKeys.DistributionPlatform] = "provider_value", + [GameLaunchPropertyKeys.DistributionPlatform] = TestFixtures.ProviderValue, }; var config = MakeConfig(); @@ -1237,7 +1237,7 @@ public void Init_GameLaunch_ConfigDistributionPlatformOverridesProvider() .Select(File.ReadAllText) .First(c => c.Contains($"\"{EventNames.GameLaunch}\"")); StringAssert.Contains($"\"{GameLaunchPropertyKeys.DistributionPlatform}\":\"{DistributionPlatforms.Steam}\"", launchFile); - Assert.IsFalse(launchFile.Contains("provider_value"), + Assert.IsFalse(launchFile.Contains(TestFixtures.ProviderValue), "config.DistributionPlatform should win over the provider's value"); } diff --git a/src/Packages/Audience/Tests/Runtime/TestFixtures.cs b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs index d2f001f77..3df86b820 100644 --- a/src/Packages/Audience/Tests/Runtime/TestFixtures.cs +++ b/src/Packages/Audience/Tests/Runtime/TestFixtures.cs @@ -33,5 +33,38 @@ internal static class TestFixtures // MilestoneReached event payload values internal const string MilestoneName = "first_boss_defeated"; + + // Track properties scenario data + internal const string CustomPropKeyRecipeId = "recipe_id"; + internal const string CraftingRecipeIronSword = "iron_sword"; + + // Distribution platform fixture for the "platform from outside SDK" path. + internal const string ProviderValue = "provider_value"; + + // IdentityTypeExtensions.ParseLowercaseString fallback fixture. + internal const string UnknownProvider = "unknown_provider"; + + // Identity persistence fixtures (id read back from disk on next launch). + internal const string PreExistingId = "pre-existing-id"; + internal const string PreExistingIdFromLastLaunch = "pre-existing-id-from-last-launch"; + + // ConsentStore corruption fixture (non-integer file content). + internal const string NotAnInt = "not-an-int"; + + // ThreadSafetyStressTests userId for race-stress scenarios. + internal const string UserRaceStress = "user_race_stress"; + + // DeleteDataTests generic userId. + internal const string SomeUser = "some-user"; + + // Prefix for GzipTests' $"anon-{i}" loop (per-message anonymous IDs). + internal const string AnonIdPrefix = "anon-"; + + // Placeholders for fixture slots where the value itself is not under test. + internal const string GenericUserId = "u1"; + internal const string GenericFromId = "f"; + internal const string GenericToId = "t"; + internal const string GenericFromType = "t1"; + internal const string GenericToType = "t2"; } } diff --git a/src/Packages/Audience/Tests/Runtime/Utility/GzipTests.cs b/src/Packages/Audience/Tests/Runtime/Utility/GzipTests.cs index efc40110a..995b2f1ba 100644 --- a/src/Packages/Audience/Tests/Runtime/Utility/GzipTests.cs +++ b/src/Packages/Audience/Tests/Runtime/Utility/GzipTests.cs @@ -35,7 +35,7 @@ public void Compress_OutputIsSmallerThanInput_ForRealisticPayload() if (i > 0) sb.Append(','); sb.Append(WireFixture.Track( (MessageFields.EventName, TestEventNames.LevelComplete), - (MessageFields.AnonymousId, $"anon-{i}"))); + (MessageFields.AnonymousId, $"{TestFixtures.AnonIdPrefix}{i}"))); } sb.Append("]}"); From febd8379a0f9f4815ab6d708ffba59bde5b0c7b1 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Sat, 2 May 2026 13:05:10 +1000 Subject: [PATCH 05/13] test(audience-sample): centralise live-fire test fixture values Adds SampleAppLiveFireFixtures alongside SampleAppLiveFireTests with three constants (MilestoneSmokeName, GameId, LinkUrl) shared across five inline call sites in the live-fire batch. Retargeting the smoke suite (e.g. switching the game id slug) is now a one-line change instead of a five-line touch. Migrates inline references in SampleAppLiveFireTests for the typed-event Resource / Purchase / MilestoneReached fills and the sample-app custom catalogue fills (WishlistAdd, WishlistRemove, GamePageViewed, LinkClicked). Per the user's "everything random goes in a constant" stance. Follow-up to SDK-272 (centralisation of duplicated literals). --- .../Tests/Runtime/SampleAppLiveFireFixtures.cs | 10 ++++++++++ .../Tests/Runtime/SampleAppLiveFireFixtures.cs.meta | 11 +++++++++++ .../Tests/Runtime/SampleAppLiveFireTests.cs | 12 ++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs create mode 100644 examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs.meta diff --git a/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs new file mode 100644 index 000000000..a642eb2f9 --- /dev/null +++ b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs @@ -0,0 +1,10 @@ +namespace Immutable.Audience.Samples.SampleApp.Tests +{ + // Values used by SampleAppLiveFireTests when filling the demo input fields. + internal static class SampleAppLiveFireFixtures + { + internal const string MilestoneSmokeName = "il2cpp_smoke"; + internal const string GameId = "il2cpp_game_1"; + internal const string LinkUrl = "https://example.com/il2cpp"; + } +} diff --git a/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs.meta b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs.meta new file mode 100644 index 000000000..fab7470eb --- /dev/null +++ b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireFixtures.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7e230edd97bb4848af6b5988e961d01c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireTests.cs b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireTests.cs index 2682fb149..1565cca1d 100644 --- a/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireTests.cs +++ b/examples/audience/Assets/SampleApp/Tests/Runtime/SampleAppLiveFireTests.cs @@ -172,7 +172,7 @@ public IEnumerator TypedEvent_MilestoneReached_FlushReportsOk() { yield return DriveTypedEventAndFlush(SampleAppUi.Buttons.TypedEvent(EventNames.MilestoneReached), root => { - root.Q(SampleAppUi.TypedEventField(EventNames.MilestoneReached, EventPropertyKeys.Name)).value = "il2cpp_smoke"; + root.Q(SampleAppUi.TypedEventField(EventNames.MilestoneReached, EventPropertyKeys.Name)).value = SampleAppLiveFireFixtures.MilestoneSmokeName; }); } @@ -262,7 +262,7 @@ public IEnumerator CustomTrack_WithDictionaryProps_FlushReportsOk() // Custom event name + JSON props (the sample app parses props as JSON // and forwards them as Dictionary to ImmutableAudience.Track). - _root!.Q(SampleAppUi.CustomEvent.Name).value = "il2cpp_smoke"; + _root!.Q(SampleAppUi.CustomEvent.Name).value = SampleAppLiveFireFixtures.MilestoneSmokeName; _root.Q(SampleAppUi.CustomEvent.Props).value = "{\"int_field\":42,\"str_field\":\"hello\",\"bool_field\":true,\"nested\":{\"a\":1}}"; _root.Q