From 7bb24df0636ae9ea56bc34831545a17ab1b11390 Mon Sep 17 00:00:00 2001 From: pravin Date: Thu, 24 Jun 2021 05:01:14 -0700 Subject: [PATCH] [Tests] - Bump up the coverage numbers --- AEPAssurance.xcodeproj/project.pbxproj | 8 + AEPAssurance/Source/AssuranceSession.swift | 1 + .../Source/Socket/WebView/WebViewSocket.swift | 2 +- .../UnitTests/AssuranceConnectionError.swift | 8 + .../UnitTests/AssuranceSessionTests.swift | 205 +++++++++++++++++- AEPAssurance/UnitTests/AssuranceTests.swift | 122 +++++++++++ AEPAssurance/UnitTests/ErrorViewTests.swift | 5 + .../UnitTests/Mocks/MockAssurance.swift | 9 + AEPAssurance/UnitTests/Mocks/MockPinPad.swift | 8 + AEPAssurance/UnitTests/Mocks/MockSocket.swift | 12 +- .../UnitTests/Mocks/MockStatusUI.swift | 19 ++ AEPAssurance/UnitTests/PluginHubTests.swift | 1 + .../UnitTests/iOSPinCodeScreenTests.swift | 53 +++++ 13 files changed, 446 insertions(+), 7 deletions(-) create mode 100644 AEPAssurance/UnitTests/AssuranceConnectionError.swift create mode 100644 AEPAssurance/UnitTests/Mocks/MockPinPad.swift diff --git a/AEPAssurance.xcodeproj/project.pbxproj b/AEPAssurance.xcodeproj/project.pbxproj index bcb3be8..8bf213d 100644 --- a/AEPAssurance.xcodeproj/project.pbxproj +++ b/AEPAssurance.xcodeproj/project.pbxproj @@ -51,6 +51,8 @@ B6407206262C90FA00C43183 /* Assurance+PublicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6407205262C90FA00C43183 /* Assurance+PublicAPI.swift */; }; B6407223262CEBC600C43183 /* URL+Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6407222262CEBC600C43183 /* URL+Parser.swift */; }; B640722B262CF06100C43183 /* AssuranceEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B640722A262CF06100C43183 /* AssuranceEnvironment.swift */; }; + B64212B326849021007343B6 /* MockPinPad.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64212B226849021007343B6 /* MockPinPad.swift */; }; + B64212B52684A655007343B6 /* AssuranceConnectionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64212B42684A655007343B6 /* AssuranceConnectionError.swift */; }; B64FDF6E264F33EF00D33192 /* AssurancePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64FDF6D264F33EF00D33192 /* AssurancePlugin.swift */; }; B64FDF70264F341600D33192 /* PluginFakeEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64FDF6F264F341600D33192 /* PluginFakeEvent.swift */; }; B64FDF73264F384700D33192 /* PluginFakeEventTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64FDF71264F384400D33192 /* PluginFakeEventTests.swift */; }; @@ -219,6 +221,8 @@ B6407205262C90FA00C43183 /* Assurance+PublicAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Assurance+PublicAPI.swift"; sourceTree = ""; }; B6407222262CEBC600C43183 /* URL+Parser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Parser.swift"; sourceTree = ""; }; B640722A262CF06100C43183 /* AssuranceEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssuranceEnvironment.swift; sourceTree = ""; }; + B64212B226849021007343B6 /* MockPinPad.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPinPad.swift; sourceTree = ""; }; + B64212B42684A655007343B6 /* AssuranceConnectionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssuranceConnectionError.swift; sourceTree = ""; }; B64FDF6D264F33EF00D33192 /* AssurancePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssurancePlugin.swift; sourceTree = ""; }; B64FDF6F264F341600D33192 /* PluginFakeEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginFakeEvent.swift; sourceTree = ""; }; B64FDF71264F384400D33192 /* PluginFakeEventTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginFakeEventTests.swift; sourceTree = ""; }; @@ -453,6 +457,7 @@ B6D6A016265D8863005042BE /* AssuranceClientInfoTests.swift */, B6D6A01F265F086A005042BE /* AssuranceBlobTests.swift */, B63ADA8D266F718900A1281A /* ErrorViewTests.swift */, + B64212B42684A655007343B6 /* AssuranceConnectionError.swift */, B63EB79C2668D524005BE2C5 /* AssuranceClientLogMessageTests.swift */, B64071A9262C313E00C43183 /* Info.plist */, ); @@ -598,6 +603,7 @@ B6D6A028265FA0EE005042BE /* MockAssuranceUIUtil.swift */, B63ADABB26731A0400A1281A /* MockSocket.swift */, B6DBD81F2678FB19009EB47E /* MockStatusUI.swift */, + B64212B226849021007343B6 /* MockPinPad.swift */, ); path = Mocks; sourceTree = ""; @@ -1137,6 +1143,7 @@ B6CECC682655A94F000D517F /* ThreadSafeQueueTests.swift in Sources */, B6AFD58E2634041E00C63608 /* AssuranceEventTests.swift in Sources */, B6D6A01D265F05F8005042BE /* MockNetworkService.swift in Sources */, + B64212B326849021007343B6 /* MockPinPad.swift in Sources */, B6DBD8202678FB19009EB47E /* MockStatusUI.swift in Sources */, B6AB2DF326337BE700FE8AEA /* AssuranceStateTests.swift in Sources */, B6D2A91026322D6D0062AC5E /* AssuranceEnvironmentTests.swift in Sources */, @@ -1149,6 +1156,7 @@ B63EB79D2668D524005BE2C5 /* AssuranceClientLogMessageTests.swift in Sources */, B6D6A02A265FAAA6005042BE /* MockUIService.swift in Sources */, B6CECC5E26545834000D517F /* MockAssurance.swift in Sources */, + B64212B52684A655007343B6 /* AssuranceConnectionError.swift in Sources */, B6AB2DEE26337BB700FE8AEA /* MockDataStore.swift in Sources */, B6CECC6026545857000D517F /* PluginHubTests.swift in Sources */, B6D6A017265D8863005042BE /* AssuranceClientInfoTests.swift in Sources */, diff --git a/AEPAssurance/Source/AssuranceSession.swift b/AEPAssurance/Source/AssuranceSession.swift index 986c874..368b3dd 100644 --- a/AEPAssurance/Source/AssuranceSession.swift +++ b/AEPAssurance/Source/AssuranceSession.swift @@ -134,6 +134,7 @@ class AssuranceSession { // since we don't give retry option for these errors and UI will be dismissed anyway, hence notify plugins for onSessionTerminated if !error.info.shouldRetry { clearSessionData() + statusUI.remove() pluginHub.notifyPluginsOnSessionTerminated() } } diff --git a/AEPAssurance/Source/Socket/WebView/WebViewSocket.swift b/AEPAssurance/Source/Socket/WebView/WebViewSocket.swift index 0b3a480..335c57e 100644 --- a/AEPAssurance/Source/Socket/WebView/WebViewSocket.swift +++ b/AEPAssurance/Source/Socket/WebView/WebViewSocket.swift @@ -16,7 +16,7 @@ import WebKit class WebViewSocket: NSObject, SocketConnectable, WKNavigationDelegate, WKScriptMessageHandler { - var delegate: SocketDelegate + weak var delegate: SocketDelegate var socketURL: URL? /// variable tracking the current socket status diff --git a/AEPAssurance/UnitTests/AssuranceConnectionError.swift b/AEPAssurance/UnitTests/AssuranceConnectionError.swift new file mode 100644 index 0000000..0bca4d2 --- /dev/null +++ b/AEPAssurance/UnitTests/AssuranceConnectionError.swift @@ -0,0 +1,8 @@ +// +// AssuranceConnectionError.swift +// UnitTests +// +// Created by pprakash on 6/24/21. +// + +import Foundation diff --git a/AEPAssurance/UnitTests/AssuranceSessionTests.swift b/AEPAssurance/UnitTests/AssuranceSessionTests.swift index 6927880..e213161 100644 --- a/AEPAssurance/UnitTests/AssuranceSessionTests.swift +++ b/AEPAssurance/UnitTests/AssuranceSessionTests.swift @@ -20,9 +20,10 @@ class AssuranceSessionTests: XCTestCase { let runtime = TestableExtensionRuntime() var session: AssuranceSession! - var assuranceExtension: Assurance! + var assuranceExtension: MockAssurance! var mockSocket: MockSocket! var mockStatusUI: MockStatusUI! + var mockPinPad: MockPinPad! let mockUIService = MockUIService() let mockMessagePresentable = MockFullscreenMessagePresentable() let mockPlugin = PluginTaco() @@ -35,11 +36,47 @@ class AssuranceSessionTests: XCTestCase { mockSocket = MockSocket(withDelegate: session) mockStatusUI = MockStatusUI(withSession: session) session.socket = mockSocket + mockPinPad = MockPinPad(withExtension: assuranceExtension) } override func tearDown() { } + func test_startSession() throws { + // setup + assuranceExtension.connectedWebSocketURL = nil + + // test + session.startSession() + + // verify + XCTAssertTrue(mockUIService.createFullscreenMessageCalled) + XCTAssertTrue(mockMessagePresentable.showCalled) + } + + func test_startSession_whenAlreadyConnected() throws { + // setup + mockSocket.socketState = .open + + // test + session.startSession() + + // verify + XCTAssertFalse(mockUIService.createFullscreenMessageCalled) + } + + func test_startSession_whenConnectionURLExist() throws { + // setup + assuranceExtension.connectedWebSocketURL = "wss://socket/connection" + + // test + session.startSession() + + // verify + XCTAssertTrue(mockSocket.connectCalled) + XCTAssertEqual("wss://socket/connection", mockSocket.connectURL?.absoluteString) + } + func test_session_RegistersPlugins() throws { // verify that 3 internal plugins are registered XCTAssertEqual(4, session.pluginHub.pluginCollection[AssuranceConstants.Vendor.MOBILE.hash]?.count) @@ -139,6 +176,36 @@ class AssuranceSessionTests: XCTestCase { XCTAssertEqual(0, session.inboundQueue.size()) } + func test_session_receives_startForwardingEvent() throws { + // setup + session.pluginHub.registerPlugin(mockPlugin, toSession: session) + session.statusUI = mockStatusUI + mockPlugin.expectation = XCTestExpectation(description: "Calls SessionConnected delegate method on plugin") + + // test + session.webSocket(mockSocket, didReceiveEvent: startForwardingEvent) + + // verify + wait(for: [mockPlugin.expectation!], timeout: 1.0) + XCTAssertTrue(session.canStartForwarding) + XCTAssertTrue(mockStatusUI.displayCalled) + XCTAssertTrue(mockStatusUI.updateForSocketConnectedCalled) + XCTAssertTrue(mockPlugin.isSessionConnectedCalled) + } + + func test_session_receives_startForwardingEvent_AfterBootEventsAreCleared() throws { + // setup + session.didClearBootEvent = true + assuranceExtension.expectation = XCTestExpectation(description: "Calls extension to get the shared state events") + + // test + session.webSocket(mockSocket, didReceiveEvent: startForwardingEvent) + + // verify + wait(for: [assuranceExtension.expectation!], timeout: 2.0) + XCTAssertTrue(assuranceExtension.getAllExtensionStateDataCalled) + } + func test_session_addsClientLogs() throws { // setup session.statusUI = mockStatusUI @@ -170,11 +237,137 @@ class AssuranceSessionTests: XCTestCase { XCTAssertEqual(AssuranceConstants.DEFAULT_ENVIRONMENT, assuranceExtension.environment) } - private func sampleAssuranceEvent() -> AssuranceEvent { - return AssuranceEvent(type: "sampleType", payload: nil) + func test_session_whenConnected_sendsClientInfoEvent() throws { + // test + session.webSocketDidConnect(mockSocket) + + // verify + XCTAssertTrue(mockSocket.sendEventCalled) + XCTAssertEqual(AssuranceConstants.EventType.CLIENT, mockSocket.sentEvent?.type) + } + + func test_session_whenWebSocketOnError() throws { + // test + XCTAssertNoThrow(session.webSocketOnError(mockSocket)) + } + + func test_session_whenSocketStateOpen_savesWebSocketURL() throws { + // setup + let sampleURL = URL(string: "https://adobe.com") + mockSocket.socketURL = sampleURL + + // test + session.webSocket(mockSocket, didChangeState: .open) + + // verify + XCTAssertEqual(sampleURL?.absoluteString, assuranceExtension.connectedWebSocketURL) + } + + func test_session_whenSocketDisconnect_NormalClosure() throws { + // setup + session.pluginHub.registerPlugin(mockPlugin, toSession: session) + session.statusUI = mockStatusUI + session.pinCodeScreen = mockPinPad + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.NORMAL_CLOSURE, "Normal Closure", true) + + // verify + XCTAssertTrue(mockStatusUI.removeCalled) + XCTAssertTrue(mockPlugin.isSessionDisconnectCalled) + XCTAssertTrue(mockPinPad.connectionFinishedCalled) } - private func startForwardingEvent() -> AssuranceEvent { + func test_session_whenSocketDisconnect_OrgMismatch() throws { + // setup + session.pluginHub.registerPlugin(mockPlugin, toSession: session) + session.statusUI = mockStatusUI + mockPinPad.isDisplayed = true + session.pinCodeScreen = mockPinPad + assuranceExtension.sessionId = "sampleSessionID" + assuranceExtension.connectedWebSocketURL = "url://with/sampleSessionID" + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.ORG_MISMATCH, "", true) + + // verify + XCTAssertTrue(mockStatusUI.removeCalled) + XCTAssertTrue(mockPinPad.connectionFailedWithErrorCalled) + XCTAssertEqual(AssuranceConnectionError.orgIDMismatch, mockPinPad.connectionFailedWithErrorValue) + XCTAssertFalse(session.canStartForwarding) + XCTAssertNil(assuranceExtension.sessionId) + XCTAssertNil(assuranceExtension.connectedWebSocketURL) + XCTAssertEqual(AssuranceConstants.DEFAULT_ENVIRONMENT, assuranceExtension.environment) + } + + func test_session_whenSocketDisconnect_ConnectionLimit() throws { + // setup + session.statusUI = mockStatusUI + mockPinPad.isDisplayed = true + session.pinCodeScreen = mockPinPad + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.CONNECTION_LIMIT, "", true) + + // verify + XCTAssertTrue(mockStatusUI.removeCalled) + XCTAssertTrue(mockPinPad.connectionFailedWithErrorCalled) + XCTAssertEqual(AssuranceConnectionError.connectionLimit, mockPinPad.connectionFailedWithErrorValue) + } + + func test_session_whenSocketDisconnect_EventLimit() throws { + // setup + session.statusUI = mockStatusUI + mockPinPad.isDisplayed = true + session.pinCodeScreen = mockPinPad + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.EVENTS_LIMIT, "", true) + + // verify + XCTAssertTrue(mockStatusUI.removeCalled) + XCTAssertTrue(mockPinPad.connectionFailedWithErrorCalled) + XCTAssertEqual(AssuranceConnectionError.eventLimit, mockPinPad.connectionFailedWithErrorValue) + } + + func test_session_whenSocketDisconnect_ClientError() throws { + // setup + session.statusUI = mockStatusUI + mockPinPad.isDisplayed = true + session.pinCodeScreen = mockPinPad + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.CLIENT_ERROR, "", true) + + // verify + XCTAssertTrue(mockStatusUI.removeCalled) + XCTAssertTrue(mockPinPad.connectionFailedWithErrorCalled) + XCTAssertEqual(AssuranceConnectionError.clientError, mockPinPad.connectionFailedWithErrorValue) + } + + func test_session_whenSocketDisconnect_AbnormalClosure() throws { + // setup + let sampleSocketURL = "wss://socketURL" + mockSocket.expectation = XCTestExpectation(description: "Attempts to reconnect") + session.statusUI = mockStatusUI + mockPinPad.isDisplayed = true + session.pinCodeScreen = mockPinPad + assuranceExtension.connectedWebSocketURL = sampleSocketURL + + // test + session.webSocketDidDisconnect(mockSocket, AssuranceConstants.SocketCloseCode.ABNORMAL_CLOSURE, "", true) + + // verify + wait(for: [mockSocket.expectation!], timeout: 2.0) + XCTAssertTrue(session.isAttemptingToReconnect) + XCTAssertFalse(session.canStartForwarding) + XCTAssertTrue(mockPinPad.connectionFailedWithErrorCalled) + XCTAssertTrue(mockSocket.connectCalled) + XCTAssertEqual(sampleSocketURL, mockSocket.connectURL?.absoluteString) + + } + + private func sampleAssuranceEvent() -> AssuranceEvent { return AssuranceEvent(type: "sampleType", payload: nil) } @@ -182,4 +375,8 @@ class AssuranceSessionTests: XCTestCase { return AssuranceEvent(type: "control", payload: ["type": "Taco"], vendor: "Food") } + private var startForwardingEvent: AssuranceEvent { + return AssuranceEvent(type: "control", payload: ["type": AnyCodable.init(AssuranceConstants.CommandType.START_EVENT_FORWARDING)], vendor: AssuranceConstants.Vendor.MOBILE) + } + } diff --git a/AEPAssurance/UnitTests/AssuranceTests.swift b/AEPAssurance/UnitTests/AssuranceTests.swift index e8274ca..e323b87 100644 --- a/AEPAssurance/UnitTests/AssuranceTests.swift +++ b/AEPAssurance/UnitTests/AssuranceTests.swift @@ -18,6 +18,7 @@ import XCTest class AssuranceTests: XCTestCase { + let CONSENT_SHARED_STATE_NAME = "com.adobe.edge.consent" let runtime = TestableExtensionRuntime() let mockUIService = MockUIService() let mockDataStore = MockDataStore() @@ -100,6 +101,22 @@ class AssuranceTests: XCTestCase { verify_sessionIdAndEnvironmentId_notSetInDatastore() } + func test_startSession_whenDeepLinkNotAString() throws { + // setup + let eventData = [AssuranceConstants.EventDataKey.START_SESSION_URL: 235663] + let event = Event(name: "Test Request Identifiers", + type: AssuranceConstants.SDKEventType.ASSURANCE, + source: EventSource.requestContent, + data: eventData) + + // test + runtime.simulateComingEvent(event: event) + + // verify + verify_PinCodeScreen_isNotShown() + verify_sessionIdAndEnvironmentId_notSetInDatastore() + } + func test_startSession_withNilEventData() throws { // setup let event = Event(name: "Test Request Identifiers", @@ -134,6 +151,21 @@ class AssuranceTests: XCTestCase { XCTAssertEqual("Any SDK Event", mockSession.sentEvent?.payload?[AssuranceConstants.ACPExtensionEventKey.NAME]?.stringValue) } + func test_handleWildCardEvent_whenAssuranceShutDown() throws { + // setup + let event = Event(name: "Any SDK Event", + type: EventType.analytics, + source: EventSource.requestContent, + data: nil) + assurance.shouldProcessEvents = false + + // test + runtime.simulateComingEvent(event: event) + + // verify that the event is not forwarded to session + XCTAssertFalse(mockSession.sendEventCalled) + } + //--------------------------------------------------*/ // MARK: - handleSharedStateEvent //--------------------------------------------------*/ @@ -262,6 +294,41 @@ class AssuranceTests: XCTestCase { XCTAssertEqual("Places - Found 0 nearby POIs.", mockSession.addClientLogMessage) } + func test_getAllExtensionStateData() throws { + // setup + runtime.simulateSharedState(extensionName: AssuranceConstants.SharedStateName.EVENT_HUB, event: nil, data: (sampleEventHubState, .set)) + runtime.simulateSharedState(extensionName: AssuranceConstants.SharedStateName.CONFIGURATION, event: nil, data: (sampleConfigurationState, .set)) + runtime.simulateXDMSharedState(for: CONSENT_SHARED_STATE_NAME, data: (sampleConsentState, .set)) + + // test + let resultEvents = assurance.getAllExtensionStateData() + + // verify that the required shared state events are generated + XCTAssertEqual(2, resultEvents.count) + XCTAssertTrue(resultEvents.hasEventWithName("Configuration State")) + XCTAssertTrue(resultEvents.hasEventWithName("\(CONSENT_SHARED_STATE_NAME) XDM State")) + } + + func test_getAllExtensionStateData_WhenNoExtensionRegistered() throws { + // setup + runtime.simulateSharedState(extensionName: AssuranceConstants.SharedStateName.EVENT_HUB, event: nil, data: ([:], .set)) + + // test + let resultEvents = assurance.getAllExtensionStateData() + + // verify that the required shared state events are generated + XCTAssertEqual(0, resultEvents.count) + } + + func test_readyForEvent() { + // should always return true + XCTAssertTrue(assurance.readyForEvent(regionEvent)) + } + + func test_onUnregistered() { + XCTAssertNoThrow(assurance.onUnregistered()) + } + // MARK: Private methods private func verify_PinCodeScreen_isNotShown() { XCTAssertFalse(mockUIService.createFullscreenMessageCalled) @@ -321,4 +388,59 @@ class AssuranceTests: XCTestCase { ]) } + var sampleEventHubState: [String: Any] { + let data = """ + { + "extensions": { + "com.adobe.module.configuration": { + "version": "1.8.0", + "friendlyName": "Configuration" + }, + "com.adobe.edge.consent": { + "version": "1.0.0" + } + }, + "version": "1.8.0" + } + """.data(using: .utf8)! + + return try! (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any])! + } + + var sampleConfigurationState: [String: Any] { + let data = """ + { + "global.privacy" : "optedin", + "target.timout" : 5, + "analytics.rsid": "rsids" + } + """.data(using: .utf8)! + + return try! (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any])! + } + + var sampleConsentState: [String: Any] { + let data = """ + { + "consents" : { + "collect" : { + "val" : "n" + } + } + } + """.data(using: .utf8)! + + return try! (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any])! + } +} + +extension Array where Element == AssuranceEvent { + func hasEventWithName(_ stateName: String) -> Bool { + for eachElement in self { + if stateName == eachElement.payload![AssuranceConstants.ACPExtensionEventKey.NAME]?.stringValue { + return true + } + } + return false + } } diff --git a/AEPAssurance/UnitTests/ErrorViewTests.swift b/AEPAssurance/UnitTests/ErrorViewTests.swift index bb5ba93..f46f700 100644 --- a/AEPAssurance/UnitTests/ErrorViewTests.swift +++ b/AEPAssurance/UnitTests/ErrorViewTests.swift @@ -72,4 +72,9 @@ class ErrorViewTests: XCTestCase { XCTAssertNil(errorView.fullscreenMessage) XCTAssertNil(errorView.fullscreenWebView) } + + func test_errorView_onShowFailure() throws { + // test + XCTAssertNoThrow(errorView.onShowFailure()) + } } diff --git a/AEPAssurance/UnitTests/Mocks/MockAssurance.swift b/AEPAssurance/UnitTests/Mocks/MockAssurance.swift index 90e5c7a..b973e17 100644 --- a/AEPAssurance/UnitTests/Mocks/MockAssurance.swift +++ b/AEPAssurance/UnitTests/Mocks/MockAssurance.swift @@ -13,10 +13,19 @@ @testable import AEPAssurance @testable import AEPCore import Foundation +import XCTest class MockAssurance: Assurance { + var expectation: XCTestExpectation? required init?(runtime: ExtensionRuntime) { super.init(runtime: runtime) } + var getAllExtensionStateDataCalled = false + override func getAllExtensionStateData() -> [AssuranceEvent] { + expectation?.fulfill() + getAllExtensionStateDataCalled = true + return [] + } + } diff --git a/AEPAssurance/UnitTests/Mocks/MockPinPad.swift b/AEPAssurance/UnitTests/Mocks/MockPinPad.swift new file mode 100644 index 0000000..2e21b0e --- /dev/null +++ b/AEPAssurance/UnitTests/Mocks/MockPinPad.swift @@ -0,0 +1,8 @@ +// +// MockPinPad.swift +// UnitTests +// +// Created by pprakash on 6/24/21. +// + +import Foundation diff --git a/AEPAssurance/UnitTests/Mocks/MockSocket.swift b/AEPAssurance/UnitTests/Mocks/MockSocket.swift index e5e299b..8f824a5 100644 --- a/AEPAssurance/UnitTests/Mocks/MockSocket.swift +++ b/AEPAssurance/UnitTests/Mocks/MockSocket.swift @@ -18,7 +18,7 @@ import XCTest class MockSocket: SocketConnectable { var expectation: XCTestExpectation? var socketURL: URL? - var delegate: SocketDelegate + weak var delegate: SocketDelegate var socketState: SocketState required init(withDelegate delegate: SocketDelegate) { @@ -26,7 +26,13 @@ class MockSocket: SocketConnectable { self.socketState = .closed } - func connect(withUrl url: URL) {} + var connectCalled = false + var connectURL: URL? + func connect(withUrl url: URL) { + expectation?.fulfill() + connectCalled = true + connectURL = url + } var disconnectCalled = false func disconnect() { @@ -34,9 +40,11 @@ class MockSocket: SocketConnectable { } var sendEventCalled = false + var sentEvent: AssuranceEvent? func sendEvent(_ event: AssuranceEvent) { expectation?.fulfill() sendEventCalled = true + sentEvent = event } func mockSocketState(state: SocketState) { diff --git a/AEPAssurance/UnitTests/Mocks/MockStatusUI.swift b/AEPAssurance/UnitTests/Mocks/MockStatusUI.swift index 95ac873..55155e4 100644 --- a/AEPAssurance/UnitTests/Mocks/MockStatusUI.swift +++ b/AEPAssurance/UnitTests/Mocks/MockStatusUI.swift @@ -16,6 +16,25 @@ import Foundation import XCTest class MockStatusUI: iOSStatusUI { + var displayCalled = false + override func display() { + displayCalled = true + } + + var removeCalled = false + override func remove() { + removeCalled = true + } + + var updateForSocketConnectedCalled = false + override func updateForSocketConnected() { + updateForSocketConnectedCalled = true + } + + var updateForSocketInActiveCalled = false + override func updateForSocketInActive() { + updateForSocketInActiveCalled = true + } var addClientLogCalled = false override func addClientLog(_ message: String, visibility: AssuranceClientLogVisibility) { diff --git a/AEPAssurance/UnitTests/PluginHubTests.swift b/AEPAssurance/UnitTests/PluginHubTests.swift index e4c0eb5..d3c5f12 100644 --- a/AEPAssurance/UnitTests/PluginHubTests.swift +++ b/AEPAssurance/UnitTests/PluginHubTests.swift @@ -257,6 +257,7 @@ class PluginTaco: AssurancePlugin { var isSessionConnectedCalled = false func onSessionConnected() { + expectation?.fulfill() isSessionConnectedCalled = true } diff --git a/AEPAssurance/UnitTests/iOSPinCodeScreenTests.swift b/AEPAssurance/UnitTests/iOSPinCodeScreenTests.swift index 36e18a9..4386c84 100644 --- a/AEPAssurance/UnitTests/iOSPinCodeScreenTests.swift +++ b/AEPAssurance/UnitTests/iOSPinCodeScreenTests.swift @@ -178,4 +178,57 @@ class iOSPinCodeScreenTests: XCTestCase { XCTAssertTrue(mockMessage.dismissCalled) } + /*-------------------------------------------------- + onShowFailure + --------------------------------------------------*/ + func test_onShowFailure() throws { + // test + XCTAssertNoThrow(pinCodeScreen.onShowFailure()) + } + + /*-------------------------------------------------- + onShow + --------------------------------------------------*/ + func test_onShow() throws { + // setup + pinCodeScreen.isDisplayed = false + + // test + pinCodeScreen.onShow(message: mockMessage) + + // verify + XCTAssertTrue(pinCodeScreen.isDisplayed) + } + + /*-------------------------------------------------- + onDismiss + --------------------------------------------------*/ + func test_onDismiss() throws { + // setup + pinCodeScreen.fullscreenWebView = mockWebView + pinCodeScreen.fullscreenMessage = mockMessage + pinCodeScreen.isDisplayed = true + + // test + pinCodeScreen.onDismiss(message: mockMessage) + + // verify + XCTAssertFalse(pinCodeScreen.isDisplayed) + XCTAssertNil(pinCodeScreen.fullscreenMessage) + XCTAssertNil(pinCodeScreen.fullscreenWebView) + } + + /*-------------------------------------------------- + connectionFailedWithError + --------------------------------------------------*/ + + func test_connectionFailedWithError() throws { + // test + pinCodeScreen.connectionFailedWithError(AssuranceConnectionError.clientError) + + // verify + XCTAssertEqual("showError('Client Disconnected','This client has been disconnected due to an unexpected error. Error Code 4400.', 0);", + mockWebView.javaScriptStringReceived) + } + }