Skip to content

Commit 9da095c

Browse files
IterableActionRunner now executes instead of returning a result.
1 parent 3058767 commit 9da095c

File tree

7 files changed

+161
-116
lines changed

7 files changed

+161
-116
lines changed

Tests/swift-sdk-swift-tests/IterableActionInterpreterTests.swift

Lines changed: 0 additions & 61 deletions
This file was deleted.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
//
2+
//
3+
// Created by Tapash Majumder on 6/14/18.
4+
// Copyright © 2018 Iterable. All rights reserved.
5+
//
6+
7+
import XCTest
8+
9+
import OHHTTPStubs
10+
11+
@testable import IterableSDK
12+
13+
class IterableActionRunnerTests: XCTestCase {
14+
15+
override func setUp() {
16+
super.setUp()
17+
// Put setup code here. This method is called before the invocation of each test method in the class.
18+
IterableAPIImplementation.initialize(apiKey:"", config: IterableConfig())
19+
}
20+
21+
override func tearDown() {
22+
// Put teardown code here. This method is called after the invocation of each test method in the class.
23+
super.tearDown()
24+
}
25+
26+
func testUrlOpenAction() {
27+
let urlString = "https://example.com"
28+
let action = IterableAction.action(fromDictionary: ["type" : "openUrl", "data" : urlString])!
29+
let context = IterableActionContext(action: action, source: .push)
30+
let urlOpener = MockUrlOpener()
31+
32+
let handled = IterableActionRunner.execute(action: action,
33+
context: context,
34+
urlHandler: { url in return false},
35+
urlOpener: urlOpener)
36+
37+
XCTAssertTrue(handled)
38+
39+
if #available(iOS 10.0, *) {
40+
XCTAssertEqual(urlOpener.ios10OpenedUrl?.absoluteString, urlString)
41+
XCTAssertNil(urlOpener.preIos10openedUrl)
42+
} else {
43+
XCTAssertEqual(urlOpener.preIos10openedUrl?.absoluteString, urlString)
44+
XCTAssertNil(urlOpener.ios10OpenedUrl)
45+
}
46+
}
47+
48+
func testUrlHandlingOverride() {
49+
let urlString = "https://example.com"
50+
let action = IterableAction.action(fromDictionary: ["type" : "openUrl", "data" : urlString])!
51+
let context = IterableActionContext(action: action, source: .push)
52+
let urlOpener = MockUrlOpener()
53+
54+
let handled = IterableActionRunner.execute(action: action,
55+
context: context,
56+
urlHandler: { url in return true},
57+
urlOpener: urlOpener)
58+
59+
XCTAssertTrue(handled)
60+
61+
if #available(iOS 10.0, *) {
62+
XCTAssertNil(urlOpener.ios10OpenedUrl)
63+
XCTAssertNil(urlOpener.preIos10openedUrl)
64+
} else {
65+
XCTAssertNil(urlOpener.ios10OpenedUrl)
66+
XCTAssertNil(urlOpener.preIos10openedUrl)
67+
}
68+
}
69+
70+
func testCustomAction() {
71+
let customActionName = "myCustomActionName"
72+
let action = IterableAction.action(fromDictionary: ["type" : customActionName])!
73+
let context = IterableActionContext(action: action, source: .push)
74+
let customActionHandler: CustomActionHandler = {name in
75+
XCTAssertEqual(name, customActionName)
76+
return true
77+
}
78+
79+
let handled = IterableActionRunner.execute(action: action,
80+
context: context,
81+
customActionHandler: customActionHandler)
82+
83+
XCTAssertTrue(handled)
84+
}
85+
86+
func testCustomActionOverride() {
87+
let customActionName = "myCustomActionName"
88+
let action = IterableAction.action(fromDictionary: ["type" : customActionName])!
89+
let context = IterableActionContext(action: action, source: .push)
90+
let customActionHandler: CustomActionHandler = {name in
91+
XCTAssertEqual(name, customActionName)
92+
return false
93+
}
94+
95+
let handled = IterableActionRunner.execute(action: action,
96+
context: context,
97+
customActionHandler: customActionHandler)
98+
99+
XCTAssertFalse(handled)
100+
}
101+
102+
}

swift-sdk.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
AC2C668020D31B1F00D46CC9 /* IterableNotificationResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2C667F20D31B1F00D46CC9 /* IterableNotificationResponseTests.swift */; };
2020
AC2C668220D32F2800D46CC9 /* IterableAppIntegrationInternal.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2C668120D32F2800D46CC9 /* IterableAppIntegrationInternal.swift */; };
2121
AC2C668420D3370600D46CC9 /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2C668320D3370600D46CC9 /* Mocks.swift */; };
22-
AC2C668720D3435700D46CC9 /* IterableActionInterpreterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2C668620D3435700D46CC9 /* IterableActionInterpreterTests.swift */; };
22+
AC2C668720D3435700D46CC9 /* IterableActionRunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2C668620D3435700D46CC9 /* IterableActionRunnerTests.swift */; };
2323
AC347B5C20E5A7E1003449CF /* IterableAPNSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC347B5B20E5A7E1003449CF /* IterableAPNSUtil.swift */; };
2424
AC347B5D20E5C7C6003449CF /* IterableConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = AC72A0B120CF4C32004D7997 /* IterableConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
2525
AC347B6720E699FA003449CF /* IterableAppExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = AC347B6620E699D8003449CF /* IterableAppExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -34,7 +34,7 @@
3434
AC72A0C720CF4CE2004D7997 /* CommerceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C120CF4CB8004D7997 /* CommerceItem.swift */; };
3535
AC72A0C820CF4CE2004D7997 /* ITBConsts.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0BE20CF4CB8004D7997 /* ITBConsts.swift */; };
3636
AC72A0C920CF4CE2004D7997 /* IterableAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0BF20CF4CB8004D7997 /* IterableAction.swift */; };
37-
AC72A0CA20CF4CE2004D7997 /* IterableActionInterpreter.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C420CF4CB8004D7997 /* IterableActionInterpreter.swift */; };
37+
AC72A0CA20CF4CE2004D7997 /* IterableActionRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C420CF4CB8004D7997 /* IterableActionRunner.swift */; };
3838
AC72A0CB20CF4CE2004D7997 /* IterableAPIImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C520CF4CB9004D7997 /* IterableAPIImplementation.swift */; };
3939
AC72A0CD20CF4CE2004D7997 /* IterableAppIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C620CF4CB9004D7997 /* IterableAppIntegration.swift */; };
4040
AC72A0CE20CF4CE2004D7997 /* IterableAttributionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC72A0C020CF4CB8004D7997 /* IterableAttributionInfo.swift */; };
@@ -128,7 +128,7 @@
128128
AC2C667F20D31B1F00D46CC9 /* IterableNotificationResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableNotificationResponseTests.swift; sourceTree = "<group>"; };
129129
AC2C668120D32F2800D46CC9 /* IterableAppIntegrationInternal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAppIntegrationInternal.swift; sourceTree = "<group>"; };
130130
AC2C668320D3370600D46CC9 /* Mocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mocks.swift; sourceTree = "<group>"; };
131-
AC2C668620D3435700D46CC9 /* IterableActionInterpreterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableActionInterpreterTests.swift; sourceTree = "<group>"; };
131+
AC2C668620D3435700D46CC9 /* IterableActionRunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableActionRunnerTests.swift; sourceTree = "<group>"; };
132132
AC347B5B20E5A7E1003449CF /* IterableAPNSUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAPNSUtil.swift; sourceTree = "<group>"; };
133133
AC347B6620E699D8003449CF /* IterableAppExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IterableAppExtensions.h; sourceTree = "<group>"; };
134134
AC431DF320D18E9000BFAFD1 /* swift-sdk-objc-tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "swift-sdk-objc-tests-Bridging-Header.h"; sourceTree = "<group>"; };
@@ -150,7 +150,7 @@
150150
AC72A0C020CF4CB8004D7997 /* IterableAttributionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAttributionInfo.swift; sourceTree = "<group>"; };
151151
AC72A0C120CF4CB8004D7997 /* CommerceItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommerceItem.swift; sourceTree = "<group>"; };
152152
AC72A0C220CF4CB8004D7997 /* IterableNotificationMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableNotificationMetadata.swift; sourceTree = "<group>"; };
153-
AC72A0C420CF4CB8004D7997 /* IterableActionInterpreter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableActionInterpreter.swift; sourceTree = "<group>"; };
153+
AC72A0C420CF4CB8004D7997 /* IterableActionRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableActionRunner.swift; sourceTree = "<group>"; };
154154
AC72A0C520CF4CB9004D7997 /* IterableAPIImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAPIImplementation.swift; sourceTree = "<group>"; };
155155
AC72A0C620CF4CB9004D7997 /* IterableAppIntegration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAppIntegration.swift; sourceTree = "<group>"; };
156156
AC7B142B20D02CE200877BFE /* swift-sdk-swift-tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-sdk-swift-tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -361,7 +361,7 @@
361361
AC72A0AC20CF4C08004D7997 /* Util */,
362362
AC72A0C520CF4CB9004D7997 /* IterableAPIImplementation.swift */,
363363
AC72A0BC20CF4C98004D7997 /* IterableAPIImplementation+Extension.swift */,
364-
AC72A0C420CF4CB8004D7997 /* IterableActionInterpreter.swift */,
364+
AC72A0C420CF4CB8004D7997 /* IterableActionRunner.swift */,
365365
AC72A0BD20CF4C98004D7997 /* IterableDeeplinkManager.swift */,
366366
AC2C667D20D3111900D46CC9 /* DateProvider.swift */,
367367
AC2C668120D32F2800D46CC9 /* IterableAppIntegrationInternal.swift */,
@@ -378,7 +378,7 @@
378378
AC2C668520D3370D00D46CC9 /* Helper Files */,
379379
AC2C668320D3370600D46CC9 /* Mocks.swift */,
380380
AC2C667F20D31B1F00D46CC9 /* IterableNotificationResponseTests.swift */,
381-
AC2C668620D3435700D46CC9 /* IterableActionInterpreterTests.swift */,
381+
AC2C668620D3435700D46CC9 /* IterableActionRunnerTests.swift */,
382382
AC6FDD8B20F56309005D811E /* IterableInAppNotificationTests.swift */,
383383
ACD6116D21080564003E7F6B /* IterableAPITests.swift */,
384384
00CB31B4210960C4004ACDEC /* TestUtils.swift */,
@@ -769,7 +769,7 @@
769769
AC72A0BA20CF4C83004D7997 /* NSData+Conversion.m in Sources */,
770770
AC72A0D420CF4D19004D7997 /* IterableDeeplinkManager.swift in Sources */,
771771
AC72A0C920CF4CE2004D7997 /* IterableAction.swift in Sources */,
772-
AC72A0CA20CF4CE2004D7997 /* IterableActionInterpreter.swift in Sources */,
772+
AC72A0CA20CF4CE2004D7997 /* IterableActionRunner.swift in Sources */,
773773
AC72A0CF20CF4CE2004D7997 /* IterableNotificationMetadata.swift in Sources */,
774774
ACD6116C2107D004003E7F6B /* NetworkHelper.swift in Sources */,
775775
AC72A0D220CF4D12004D7997 /* IterableUtil.swift in Sources */,
@@ -793,7 +793,7 @@
793793
isa = PBXSourcesBuildPhase;
794794
buildActionMask = 2147483647;
795795
files = (
796-
AC2C668720D3435700D46CC9 /* IterableActionInterpreterTests.swift in Sources */,
796+
AC2C668720D3435700D46CC9 /* IterableActionRunnerTests.swift in Sources */,
797797
00CB31B621096129004ACDEC /* TestUtils.swift in Sources */,
798798
00B6FACC210E8484007535CF /* APNSUtilTests.swift in Sources */,
799799
AC6FDD8C20F56309005D811E /* IterableInAppNotificationTests.swift in Sources */,

swift-sdk/IterableAPIImplementation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,8 +864,8 @@ import Foundation
864864

865865
IterableAppIntegration.minion = IterableAppIntegrationInternal(tracker: self,
866866
versionInfo: SystemVersionInfo(),
867-
contextToUrlHandler: IterableActionInterpreter.contextToUrlHandler(fromUrlDelegate: config.urlDelegate),
868-
contextToCustomActionHandler: IterableActionInterpreter.contextToCustomActionHandler(fromCustomActionDelegate: config.customActionDelegate),
867+
contextToUrlHandler: IterableActionRunner.contextToUrlHandler(fromUrlDelegate: config.urlDelegate),
868+
contextToCustomActionHandler: IterableActionRunner.contextToCustomActionHandler(fromCustomActionDelegate: config.customActionDelegate),
869869
urlOpener: AppUrlOpener())
870870

871871
handle(launchOptions: launchOptions)

swift-sdk/IterableActionInterpreter.swift renamed to swift-sdk/IterableActionRunner.swift

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,51 @@ class AppUrlOpener : UrlOpenerProtocol {
2929
}
3030
}
3131

32-
struct IterableActionInterpreter {
33-
enum Result {
34-
case openUrl(URL)
35-
case openedUrl(URL)
36-
case performedCustomAction(String)
37-
case notHandled
32+
struct IterableActionRunner {
33+
// returns true if an action is performed either by us or by the calling app.
34+
@discardableResult static func execute(action: IterableAction,
35+
context: IterableActionContext,
36+
urlHandler: UrlHandler? = nil,
37+
customActionHandler: CustomActionHandler? = nil,
38+
urlOpener: UrlOpenerProtocol? = nil) -> Bool {
39+
40+
let handled = callExternalHandlers(action: action,
41+
from: context.source,
42+
urlHandler: urlHandler,
43+
customActionHandler: customActionHandler)
44+
45+
if handled {
46+
return true
47+
} else {
48+
if case let .openUrl(url) = detectActionType(fromAction: action), shouldOpenUrl(url: url, from: context.source), let urlOpener = urlOpener {
49+
urlOpener.open(url: url)
50+
return true
51+
} else {
52+
return false
53+
}
54+
}
3855
}
3956

40-
static func execute(action: IterableAction,
57+
// return true if the action is handled by the calling app either by opening a url or performing a custom action.
58+
private static func callExternalHandlers(action: IterableAction,
4159
from source: IterableActionSource,
4260
urlHandler: UrlHandler? = nil,
43-
customActionHandler: CustomActionHandler? = nil) -> Result {
61+
customActionHandler: CustomActionHandler? = nil) -> Bool {
4462
let actionType = detectActionType(fromAction: action)
4563
switch(actionType) {
4664
case .noop:
47-
return .notHandled
65+
return false
4866
case .openUrl(let url):
4967
if urlHandler?(url) == true {
50-
return .openedUrl(url)
68+
return true
5169
} else {
52-
if shouldOpenUrl(url: url, from: source) {
53-
return .openUrl(url)
54-
} else {
55-
return .notHandled
56-
}
70+
return false
5771
}
5872
case .customAction(let type):
5973
if customActionHandler?(type) == true {
60-
return .performedCustomAction(type)
74+
return true
6175
} else {
62-
return .notHandled
76+
return false
6377
}
6478
}
6579
}

0 commit comments

Comments
 (0)