Skip to content

Commit 5c37734

Browse files
committed
[tests] add testing combining user updates
* Add a test where many user properties updates are made and check they are all sent in one payload correctly * Update an equality checker helper method to handle testing float equality, needed for checking lat and long in the payload.
1 parent a8a4033 commit 5c37734

File tree

2 files changed

+90
-3
lines changed

2 files changed

+90
-3
lines changed

iOS_SDK/OneSignalSDK/OneSignalCoreMocks/Extensions/NSDictionary+UnitTests.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,15 @@ extension NSDictionary {
6666
}
6767

6868
private func equals(_ x: Any, _ y: Any) -> Bool {
69-
guard x is AnyHashable else { return false }
70-
guard y is AnyHashable else { return false }
71-
return (x as! AnyHashable) == (y as! AnyHashable)
69+
switch (x, y) {
70+
case let (x as NSNumber, y as NSNumber):
71+
// Handle float equality imprecision
72+
return abs(x.floatValue - y.floatValue) <= .ulpOfOne
73+
default:
74+
guard x is AnyHashable else { return false }
75+
guard y is AnyHashable else { return false }
76+
return (x as! AnyHashable) == (y as! AnyHashable)
77+
}
7278
}
7379

7480
/**

iOS_SDK/OneSignalSDK/OneSignalUserTests/OneSignalUserTests.swift

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,85 @@ final class OneSignalUserTests: XCTestCase {
137137
identityModel.clearData()
138138
}
139139
}
140+
141+
/**
142+
Tests multiple user updates should be combined and sent together.
143+
Multiple session times should be added.
144+
Adding and removing multiple tags should be combined correctly.
145+
Language uses the last language that is set.
146+
Location uses the last point that is set.
147+
*/
148+
func testBasicCombiningUserUpdateDeltas_resultsInOneRequest() throws {
149+
/* Setup */
150+
151+
let client = MockOneSignalClient()
152+
MockUserRequests.setDefaultCreateAnonUserResponses(with: client)
153+
OneSignalCoreImpl.setSharedClient(client)
154+
155+
/* When */
156+
157+
OneSignalUserManagerImpl.sharedInstance.sendSessionTime(100)
158+
159+
// This adds a `session_count` property with value of 1
160+
// It also sets `refresh_device_metadata` to `true`
161+
OneSignalUserManagerImpl.sharedInstance.startNewSession()
162+
163+
OneSignalUserManagerImpl.sharedInstance.setLanguage("lang_1")
164+
165+
OneSignalUserManagerImpl.sharedInstance.addTag(key: "tag_1", value: "value_1")
166+
167+
OneSignalUserManagerImpl.sharedInstance.setLanguage("lang_2")
168+
169+
OneSignalUserManagerImpl.sharedInstance.addTag(key: "tag_2", value: "value_2")
170+
171+
OneSignalUserManagerImpl.sharedInstance.sendSessionTime(50)
172+
173+
OneSignalUserManagerImpl.sharedInstance.setLocation(latitude: 123.123, longitude: 145.145)
174+
175+
OneSignalUserManagerImpl.sharedInstance.removeTag("tag_1")
176+
177+
OneSignalUserManagerImpl.sharedInstance.addTags(["a": "a", "b": "b", "c": "c"])
178+
179+
OneSignalUserManagerImpl.sharedInstance.startNewSession()
180+
181+
let purchases = [
182+
["sku": "sku1", "amount": "1.25", "iso": "USD"],
183+
["sku": "sku2", "amount": "3.99", "iso": "USD"]
184+
]
185+
186+
OneSignalUserManagerImpl.sharedInstance.sendPurchases(purchases as [[String: AnyObject]])
187+
188+
OneSignalUserManagerImpl.sharedInstance.setLocation(latitude: 111.111, longitude: 222.222)
189+
190+
/* Then */
191+
192+
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
193+
194+
let expectedPayload: [String: Any] = [
195+
"deltas": [
196+
"session_time": 150, // addition of 2 session times
197+
"session_count": 2, // addition of 2 session counts
198+
"purchases": purchases
199+
],
200+
"properties": [
201+
"lat": 111.111,
202+
"long": 222.222,
203+
"language": "lang_2",
204+
"tags": [
205+
"tag_1": "",
206+
"tag_2": "value_2",
207+
"a": "a",
208+
"b": "b",
209+
"c": "c"
210+
]
211+
],
212+
"refresh_device_metadata": true
213+
]
214+
215+
// Assert there is an update user request with the expected payload
216+
XCTAssertTrue(client.onlyOneRequest(
217+
contains: "apps/test-app-id/users/by/onesignal_id/\(anonUserOSID)",
218+
contains: expectedPayload)
219+
)
220+
}
140221
}

0 commit comments

Comments
 (0)