Skip to content

Commit 482e9e6

Browse files
test(audience-sdk): pin AudienceErrorMessages and AudienceArgumentMessages
The two centralised message catalogues had no direct unit tests. Behavioural tests observed wording loosely via Does.Contain assertions, which let typos and partial rewords through. Add MessagesTests.cs with one fixture per catalogue. Each constant / formatter has an exact-string assertion. A reword anywhere in the catalogue now fails the build. Follow-up to SDK-272 (centralisation of duplicated literals).
1 parent f4a0520 commit 482e9e6

1 file changed

Lines changed: 133 additions & 0 deletions

File tree

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
using System;
2+
using NUnit.Framework;
3+
4+
namespace Immutable.Audience.Tests
5+
{
6+
// Pins each message constant to its exact wording so a reword breaks the build.
7+
[TestFixture]
8+
internal class AudienceErrorMessagesTests
9+
{
10+
[Test]
11+
public void LocalStorageReadFailed_PrefixesAndAppendsExceptionMessage()
12+
{
13+
var ex = new InvalidOperationException("disk full");
14+
Assert.AreEqual(
15+
"Local storage read failed: disk full",
16+
AudienceErrorMessages.LocalStorageReadFailed(ex));
17+
}
18+
19+
[Test]
20+
public void BatchPartiallyRejected_FormatsRejectedAndTotalCounts()
21+
{
22+
Assert.AreEqual(
23+
"Batch partially rejected: 3 of 20 events dropped",
24+
AudienceErrorMessages.BatchPartiallyRejected(3, 20));
25+
}
26+
27+
[Test]
28+
public void BatchRejectedPrefix_IsExactWording()
29+
{
30+
Assert.AreEqual("Batch rejected", AudienceErrorMessages.BatchRejectedPrefix);
31+
}
32+
33+
[Test]
34+
public void ServerErrorWillRetryPrefix_IsExactWording()
35+
{
36+
Assert.AreEqual("Server error, will retry", AudienceErrorMessages.ServerErrorWillRetryPrefix);
37+
}
38+
39+
[Test]
40+
public void ConsentSyncFailedWithStatus_FormatsStatusCode()
41+
{
42+
Assert.AreEqual(
43+
"Consent sync failed with status 503",
44+
AudienceErrorMessages.ConsentSyncFailedWithStatus(503));
45+
}
46+
47+
[Test]
48+
public void ConsentSyncThrew_PrefixesAndAppendsExceptionMessage()
49+
{
50+
var ex = new TimeoutException("timed out");
51+
Assert.AreEqual(
52+
"Consent sync threw: timed out",
53+
AudienceErrorMessages.ConsentSyncThrew(ex));
54+
}
55+
}
56+
57+
[TestFixture]
58+
internal class AudienceArgumentMessagesTests
59+
{
60+
[Test]
61+
public void PublishableKeyRequired_IsExactWording()
62+
{
63+
Assert.AreEqual("PublishableKey is required",
64+
AudienceArgumentMessages.PublishableKeyRequired);
65+
}
66+
67+
[Test]
68+
public void PersistentDataPathRequired_IsExactWording()
69+
{
70+
Assert.AreEqual("PersistentDataPath is required",
71+
AudienceArgumentMessages.PersistentDataPathRequired);
72+
}
73+
74+
[Test]
75+
public void ProgressionStatusRequired_IsExactWording()
76+
{
77+
Assert.AreEqual(
78+
"Progression.Status is required. Set it before calling Track(IEvent).",
79+
AudienceArgumentMessages.ProgressionStatusRequired);
80+
}
81+
82+
[Test]
83+
public void ResourceFlowRequired_IsExactWording()
84+
{
85+
Assert.AreEqual(
86+
"Resource.Flow is required. Set it before calling Track(IEvent).",
87+
AudienceArgumentMessages.ResourceFlowRequired);
88+
}
89+
90+
[Test]
91+
public void ResourceCurrencyRequired_IsExactWording()
92+
{
93+
Assert.AreEqual(
94+
"Resource.Currency is required. Set a non-empty string before calling Track(IEvent).",
95+
AudienceArgumentMessages.ResourceCurrencyRequired);
96+
}
97+
98+
[Test]
99+
public void ResourceAmountRequired_IsExactWording()
100+
{
101+
Assert.AreEqual(
102+
"Resource.Amount is required. Set it before calling Track(IEvent).",
103+
AudienceArgumentMessages.ResourceAmountRequired);
104+
}
105+
106+
[Test]
107+
public void PurchaseValueRequired_IsExactWording()
108+
{
109+
Assert.AreEqual(
110+
"Purchase.Value is required. Set it before calling Track(IEvent).",
111+
AudienceArgumentMessages.PurchaseValueRequired);
112+
}
113+
114+
[Test]
115+
public void MilestoneReachedNameRequired_IsExactWording()
116+
{
117+
Assert.AreEqual(
118+
"MilestoneReached.Name must not be null or empty",
119+
AudienceArgumentMessages.MilestoneReachedNameRequired);
120+
}
121+
122+
[TestCase("USD",
123+
"Purchase.Currency 'USD' must be a three-letter uppercase ISO 4217 code")]
124+
[TestCase(null,
125+
"Purchase.Currency '' must be a three-letter uppercase ISO 4217 code")]
126+
[TestCase("usd",
127+
"Purchase.Currency 'usd' must be a three-letter uppercase ISO 4217 code")]
128+
public void PurchaseCurrencyInvalid_FormatsCurrencyValue(string? currency, string expected)
129+
{
130+
Assert.AreEqual(expected, AudienceArgumentMessages.PurchaseCurrencyInvalid(currency));
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)