Skip to content

Commit 434cfd6

Browse files
committed
[tests] Add dictionary sorting to request's parameters
* There is a need to compare two User Update Requests, with limitations of comparing Objc dictionaries to Swift dictionaries, and the Mock Client not knowing about product-specific OneSignalRequest implementations like OSRequestUpdateUser. * So, we can do comparison via their parameters payload. * Add logic to stringify the params in alphabetical order to allow streamlined comparison
1 parent 3b47509 commit 434cfd6

File tree

4 files changed

+60
-5
lines changed

4 files changed

+60
-5
lines changed

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
3CE8CC5B29143F4B000DB0D3 /* NSDateFormatter+OneSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = DE98772A2591655800DE07D5 /* NSDateFormatter+OneSignal.m */; };
156156
3CE9227A289FA88B001B1062 /* OSIdentityModelStoreListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CE92279289FA88B001B1062 /* OSIdentityModelStoreListener.swift */; };
157157
3CEE90A72BFE6ABD00B0FB5B /* SupportedProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEE90A62BFE6ABD00B0FB5B /* SupportedProperty.swift */; };
158+
3CEE90A92C000BD500B0FB5B /* OneSignalRequest+UnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEE90A82C000BD500B0FB5B /* OneSignalRequest+UnitTests.swift */; };
158159
3CEE93422B7C4174008440BD /* OneSignalUserMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; };
159160
3CEE93432B7C4174008440BD /* OneSignalUserMocks.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
160161
3CEE93462B7C73AB008440BD /* OneSignalCoreMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; };
@@ -1189,6 +1190,7 @@
11891190
3CE8CC572911B2B2000DB0D3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
11901191
3CE92279289FA88B001B1062 /* OSIdentityModelStoreListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSIdentityModelStoreListener.swift; sourceTree = "<group>"; };
11911192
3CEE90A62BFE6ABD00B0FB5B /* SupportedProperty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedProperty.swift; sourceTree = "<group>"; };
1193+
3CEE90A82C000BD500B0FB5B /* OneSignalRequest+UnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OneSignalRequest+UnitTests.swift"; sourceTree = "<group>"; };
11921194
3CF8629D28A183F900776CA4 /* OSIdentityModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSIdentityModel.swift; sourceTree = "<group>"; };
11931195
3CF8629F28A1964F00776CA4 /* OSPropertiesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSPropertiesModel.swift; sourceTree = "<group>"; };
11941196
3CF862A128A197D200776CA4 /* OSPropertiesModelStoreListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSPropertiesModelStoreListener.swift; sourceTree = "<group>"; };
@@ -1912,6 +1914,7 @@
19121914
isa = PBXGroup;
19131915
children = (
19141916
3C8706752BDEED75000D8CD2 /* NSDictionary+UnitTests.swift */,
1917+
3CEE90A82C000BD500B0FB5B /* OneSignalRequest+UnitTests.swift */,
19151918
);
19161919
path = Extensions;
19171920
sourceTree = "<group>";
@@ -3760,6 +3763,7 @@
37603763
4710EA552B8FD04400435356 /* MockOSDispatchQueue.swift in Sources */,
37613764
3CC063B22B6D7AD8002BB07F /* MockOneSignalClient.swift in Sources */,
37623765
3C8706762BDEED75000D8CD2 /* NSDictionary+UnitTests.swift in Sources */,
3766+
3CEE90A92C000BD500B0FB5B /* OneSignalRequest+UnitTests.swift in Sources */,
37633767
3CC063B42B6D7BA2002BB07F /* OneSignalCoreMocks.swift in Sources */,
37643768
);
37653769
runOnlyForDeploymentPostprocessing = 0;

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,28 @@ extension NSDictionary {
7070
guard y is AnyHashable else { return false }
7171
return (x as! AnyHashable) == (y as! AnyHashable)
7272
}
73+
74+
/**
75+
Returns a string representation of a dictionary in alphabetical order by key.
76+
If there are dictionaries within this dictionary, those will also be stringified in alphabetical order by key.
77+
This method is motivated by the need to compare two requests whose payloads may be unordered dictionaries.
78+
*/
79+
public func toSortedString() -> String {
80+
guard let dict = self as? [String: Any] else {
81+
return "[:]"
82+
}
83+
var result = "["
84+
let sortedKeys = Array(dict.keys).sorted(by: <)
85+
for key in sortedKeys {
86+
if let value = dict[key] as? NSDictionary {
87+
result += " \(key): \(value.toSortedString()),"
88+
} else {
89+
result += " \(key): \(String(describing: dict[key])),"
90+
}
91+
}
92+
// drop the last comma within a dictionary's items
93+
result = String(result.dropLast())
94+
result += "]"
95+
return result
96+
}
7397
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import OneSignalCore
2+
3+
extension OneSignalRequest {
4+
/// Returns alphabetically ordered string representation of request's parameters
5+
public func stringifyParams() -> String {
6+
guard let dict = self.parameters as? NSDictionary else {
7+
return "[:]"
8+
}
9+
return dict.toSortedString()
10+
}
11+
}

iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,21 @@ public class MockOneSignalClient: NSObject, IOneSignalClient {
101101
}
102102
}
103103

104+
/// Helper method to stringify the name of a request for identification and comparison
105+
private func stringify(_ request: OneSignalRequest) -> String {
106+
var stringified = request.description
107+
108+
switch request.description {
109+
case let str where str.contains("OSRequestUpdateProperties"):
110+
// Return an ordered representation of the request parameters
111+
stringified = "<OSRequestUpdateProperties with parameters: \(request.stringifyParams())>"
112+
default:
113+
break
114+
}
115+
116+
return stringified
117+
}
118+
104119
func finishExecutingRequest(_ request: OneSignalRequest, onSuccess successBlock: OSResultSuccessBlock, onFailure failureBlock: OSFailureBlock) {
105120

106121
// TODO: This entire method needs to contained within the equivalent of @synchronized ❗️
@@ -110,18 +125,19 @@ public class MockOneSignalClient: NSObject, IOneSignalClient {
110125

111126
self.didCompleteRequest(request)
112127

128+
let stringifiedRequest = stringify(request)
113129
// Switch between types of requests with mock responses
114130
if request.isKind(of: OSRequestGetIosParams.self) {
115131
// send a mock remote params response
116132
successBlock(["mockTodo": "responseTodo"])
117133
}
118-
if (mockResponses[String(describing: request)]) != nil {
119-
successBlock(mockResponses[String(describing: request)])
120-
} else if (mockFailureResponses[String(describing: request)]) != nil {
121-
failureBlock(mockFailureResponses[String(describing: request)])
134+
if (mockResponses[stringifiedRequest]) != nil {
135+
successBlock(mockResponses[stringifiedRequest])
136+
} else if (mockFailureResponses[stringifiedRequest]) != nil {
137+
failureBlock(mockFailureResponses[stringifiedRequest])
122138
} else {
123139
allRequestsHandled = false
124-
print("🧪 cannot find a mock response for request: \(request)")
140+
print("🧪 cannot find a mock response for request: \(stringifiedRequest)")
125141
}
126142
}
127143

0 commit comments

Comments
 (0)