@@ -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