From b0033f7caa6918f6985f489fbc257ad4d3b1f977 Mon Sep 17 00:00:00 2001 From: zwu01 Date: Thu, 18 Jan 2024 10:26:50 -0500 Subject: [PATCH 01/11] add callTryCatchWrapper function on JSValue --- ios/packages/JSValueExtensionsTests.swift | 68 ++++++++++++++++ .../core/Sources/Types/Core/Flow.swift | 7 +- .../Sources/Types/Core/FlowController.swift | 4 +- .../utilities/JSValue+Extensions.swift | 78 +++++++++++++++++++ .../core/Tests/HeadlessPlayerTests.swift | 12 ++- .../ManagedPlayerViewModelTests.swift | 8 +- .../ui-test/AssetFlowViewTests.swift | 14 ++-- ...xternalActionViewModifierPluginTests.swift | 12 ++- .../Tests/StageRevertDataPluginTests.swift | 36 ++++++++- .../ViewInspector/TransitionPluginTests.swift | 12 ++- xcode/Podfile.lock | 3 +- 11 files changed, 232 insertions(+), 22 deletions(-) create mode 100644 ios/packages/JSValueExtensionsTests.swift create mode 100644 ios/packages/core/Sources/utilities/JSValue+Extensions.swift diff --git a/ios/packages/JSValueExtensionsTests.swift b/ios/packages/JSValueExtensionsTests.swift new file mode 100644 index 000000000..8b6c7c97c --- /dev/null +++ b/ios/packages/JSValueExtensionsTests.swift @@ -0,0 +1,68 @@ +// +// JSValueExtensionsTests.swift +// PlayerUI +// +// Created by Zhao Xia Wu on 2024-01-17. +// + +import Foundation +import XCTest +import JavaScriptCore +@testable import PlayerUI + +class JSValueExtensionsTests: XCTestCase { + let context: JSContext = JSContext() + func testTryCatchWrapperReturningError() { + + let functionReturningError = self.context + .evaluateScript(""" + (() => { + throw new Error("Fail") + }) + """) + + do { + let _ = try functionReturningError?.callTryCatchWrapperWithReturnValue(args: [] as [String]) + } catch let error { + XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS) + } + } + + func testTryCatchWrapperReturningNumber() { + let functionReturningInt = self.context + .evaluateScript(""" + (() => { + return 1 + }) + """) + + do { + let result = try functionReturningInt?.callTryCatchWrapperWithReturnValue(args: [] as [String]) + XCTAssertEqual(result?.toInt32(), 1) + } catch let error { + XCTFail("Should have returned Int but failed with \(error)") + } + } + + func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { + let player = HeadlessPlayerImpl(plugins: []) + + player.hooks?.viewController.tap { viewController in + viewController.hooks.view.tap { view in + view.hooks.onUpdate.tap { value in + guard view.id == "view-2" else { + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + } catch let error { + XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS) + } + + return + } + } + } + } + + player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) + } +} diff --git a/ios/packages/core/Sources/Types/Core/Flow.swift b/ios/packages/core/Sources/Types/Core/Flow.swift index 5a50d0e4f..ae31cb619 100644 --- a/ios/packages/core/Sources/Types/Core/Flow.swift +++ b/ios/packages/core/Sources/Types/Core/Flow.swift @@ -1,6 +1,6 @@ // // Flow.swift -// +// // // Created by Borawski, Harris on 2/13/20. // @@ -44,13 +44,16 @@ public class Flow: CreatedFromJSValue { */ public init(_ value: JSValue) { self.value = value - hooks = FlowHooks(transition: Hook2(baseValue: value, name: "transition")) + hooks = FlowHooks(transition: Hook2(baseValue: value, name: "transition"), afterTransition: Hook(baseValue: value, name: "afterTransition")) } } public struct FlowHooks { /// A hook that fires when transitioning states and giving the old and new states as parameters public var transition: Hook2 + + /// A hook that fires after a transition occurs giving the FlowInstance as parameter + public var afterTransition: Hook } public struct NamedState: CreatedFromJSValue { diff --git a/ios/packages/core/Sources/Types/Core/FlowController.swift b/ios/packages/core/Sources/Types/Core/FlowController.swift index d5395b3c7..03f18c77f 100644 --- a/ios/packages/core/Sources/Types/Core/FlowController.swift +++ b/ios/packages/core/Sources/Types/Core/FlowController.swift @@ -48,7 +48,7 @@ public class FlowController: CreatedFromJSValue { - parameters: - action: The action to use for transitioning */ - public func transition(with action: String) { - value.invokeMethod("transition", withArguments: [action]) + public func transition(with action: String) throws { + try self.value.objectForKeyedSubscript("transition").callTryCatchWrapper(args: [action]) } } diff --git a/ios/packages/core/Sources/utilities/JSValue+Extensions.swift b/ios/packages/core/Sources/utilities/JSValue+Extensions.swift new file mode 100644 index 000000000..12fa32825 --- /dev/null +++ b/ios/packages/core/Sources/utilities/JSValue+Extensions.swift @@ -0,0 +1,78 @@ +// +// JSValue+Extensions.swift +// PlayerUI +// +// Created by Zhao Xia Wu on 2024-01-18. +// + +import Foundation +import JavaScriptCore + +extension JSValue { + var tryCatchWrapper: JSValue? { + self.context.evaluateScript( + """ + (fn, args) => { + try { + console.log(args) + return fn(...args) + } catch(e) { + console.log(e) + if (e instanceof Error) { + + return e + } + } + } + """) + + } + + var errorCheckWrapper: JSValue? { + self.context.evaluateScript( + """ + (obj) => (obj instanceof Error) + """) + } + + + /** + A way to catch errors for void functions not called inside a player process. Called on void functions. + - parameters: + - args: List of arguments taken by the function + */ + public func callTryCatchWrapper(args: Any...) throws { + let result = self.tryCatchWrapper?.call(withArguments: [self, args]) + + let isError = self.errorCheckWrapper?.call(withArguments: [result as Any]) + + if isError?.toBool() == true { + throw JSValueError.thrownFromJS + } + } + + + /** + A way to catch errors for functions not called inside a player process. Called on functions with a return value. + - parameters: + - args: List of arguments taken by the function + */ + public func callTryCatchWrapperWithReturnValue(args: Any...) throws -> JSValue? { + let result = tryCatchWrapper?.call(withArguments: [self, args]) + + let isError = self.errorCheckWrapper?.call(withArguments: [result as Any]) + + if isError?.toBool() == true { + throw JSValueError.thrownFromJS + } else { + return result + } + } +} + +/** + Represents the different errors that occur when evaluating JSValue + */ +public enum JSValueError: Error { + case thrownFromJS +} diff --git a/ios/packages/core/Tests/HeadlessPlayerTests.swift b/ios/packages/core/Tests/HeadlessPlayerTests.swift index 6cfe14783..71c5a230b 100644 --- a/ios/packages/core/Tests/HeadlessPlayerTests.swift +++ b/ios/packages/core/Tests/HeadlessPlayerTests.swift @@ -71,7 +71,11 @@ class HeadlessPlayerTests: XCTestCase { }) player.start(flow: FlowData.COUNTER, completion: {_ in}) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + } catch { + XCTFail("Transition with 'NEXT' failed") + } wait(for: [inProgress, completed], timeout: 5) } @@ -143,7 +147,11 @@ class HeadlessPlayerTests: XCTestCase { } XCTAssertNotNil(player.state as? InProgressState) XCTAssertEqual(player.state?.status, .inProgress) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + } catch { + XCTFail("Error while transitioning") + } } func testPlayerControllers() { diff --git a/ios/packages/swiftui/Tests/ManagedPlayer/ManagedPlayerViewModelTests.swift b/ios/packages/swiftui/Tests/ManagedPlayer/ManagedPlayerViewModelTests.swift index f20e17806..e711057f1 100644 --- a/ios/packages/swiftui/Tests/ManagedPlayer/ManagedPlayerViewModelTests.swift +++ b/ios/packages/swiftui/Tests/ManagedPlayer/ManagedPlayerViewModelTests.swift @@ -250,7 +250,11 @@ class ManagedPlayerViewModelTests: XCTestCase { XCTAssertNotNil(model.currentState) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "next") + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "next") + } catch { + XCTFail("Transition with 'next' Failed") + } XCTAssertNil(model.currentState) } @@ -313,4 +317,4 @@ internal extension XCTestCase { await fulfillment(of: [expectation], timeout: timeout) return cancel } -} \ No newline at end of file +} diff --git a/ios/packages/test-utils/ViewInspector/ui-test/AssetFlowViewTests.swift b/ios/packages/test-utils/ViewInspector/ui-test/AssetFlowViewTests.swift index 1658d0712..06d2c6b92 100644 --- a/ios/packages/test-utils/ViewInspector/ui-test/AssetFlowViewTests.swift +++ b/ios/packages/test-utils/ViewInspector/ui-test/AssetFlowViewTests.swift @@ -122,13 +122,17 @@ class ForceTransitionPlugin: NativePlugin { func apply

(player: P) where P: HeadlessPlayer { guard let player = player as? SwiftUIPlayer else { return } - player.hooks?.viewController.tap { viewController in - viewController.hooks.view.tap { view in - view.hooks.onUpdate.tap { _ in + player.hooks?.flowController.tap({ flowController in + flowController.hooks.flow.tap { flow in + flow.hooks.afterTransition.tap { _ in guard let state = player.state as? InProgressState else { return } - state.controllers?.flow.transition(with: "Next") + do { + try flowController.transition(with: "NEXT") + } catch { + XCTFail("Transition with 'NEXT' failed") + } } } - } + }) } } diff --git a/ios/plugins/ExternalActionViewModifierPlugin/ViewInspector/ExternalActionViewModifierPluginTests.swift b/ios/plugins/ExternalActionViewModifierPlugin/ViewInspector/ExternalActionViewModifierPluginTests.swift index 8d89f2596..ef2520e9e 100644 --- a/ios/plugins/ExternalActionViewModifierPlugin/ViewInspector/ExternalActionViewModifierPluginTests.swift +++ b/ios/plugins/ExternalActionViewModifierPlugin/ViewInspector/ExternalActionViewModifierPluginTests.swift @@ -165,7 +165,11 @@ class ExternalActionViewModifierPluginTests: ViewInspectorTestCase { let content = try view.vStack().first?.anyView().anyView().modifier(ExternalStateSheetModifier.self).viewModifierContent() let value = try content?.sheet().anyView().text().string() XCTAssertEqual(value, "External State") - (try view.actualView().state as? InProgressState)?.controllers?.flow.transition(with: "Next") + do { + try (view.actualView().state as? InProgressState)?.controllers?.flow.transition(with: "Next") + } catch { + XCTFail("Transition with 'Next' failed") + } } wait(for: [exp, handlerExpectation], timeout: 10) @@ -174,7 +178,11 @@ class ExternalActionViewModifierPluginTests: ViewInspectorTestCase { XCTAssertEqual(state?.controllers?.flow.current?.currentState?.value?.stateType, "VIEW") XCTAssertNil(plugin.state) XCTAssertFalse(plugin.isExternalState) - state?.controllers?.flow.transition(with: "Next") + do { + try state?.controllers?.flow.transition(with: "Next") + } catch { + XCTFail("Transition with 'Next' failed") + } wait(for: [completionExpectation], timeout: 10) ViewHosting.expel() diff --git a/ios/plugins/StageRevertDataPlugin/Tests/StageRevertDataPluginTests.swift b/ios/plugins/StageRevertDataPlugin/Tests/StageRevertDataPluginTests.swift index 58049f7a9..487e77c80 100644 --- a/ios/plugins/StageRevertDataPlugin/Tests/StageRevertDataPluginTests.swift +++ b/ios/plugins/StageRevertDataPlugin/Tests/StageRevertDataPluginTests.swift @@ -69,8 +69,6 @@ class StageRevertDataPluginTests: XCTestCase { viewController.hooks.view.tap { view in view.hooks.onUpdate.tap { value in guard view.id == "view-3" else { - (player.state as? InProgressState)?.controllers?.data.set(transaction: ["name": "Test"]) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "clear") return } @@ -82,6 +80,22 @@ class StageRevertDataPluginTests: XCTestCase { } } + player.hooks?.flowController.tap({ flowController in + flowController.hooks.flow.tap { flow in + flow.hooks.afterTransition.tap { flowInstance in + guard flowInstance.currentState?.name == "VIEW_3" else { + (player.state as? InProgressState)?.controllers?.data.set(transaction: ["name": "Test"]) + do { + try flowController.transition(with: "clear") + } catch { + XCTFail("Transition with 'clear' failed") + } + return + } + } + } + }) + player.start(flow: json, completion: {_ in}) wait(for: [expected], timeout: 1) } @@ -94,8 +108,6 @@ class StageRevertDataPluginTests: XCTestCase { viewController.hooks.view.tap { view in view.hooks.onUpdate.tap { value in guard view.id == "view-2" else { - (player.state as? InProgressState)?.controllers?.data.set(transaction: ["name": "Test"]) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "commit") return } @@ -107,6 +119,22 @@ class StageRevertDataPluginTests: XCTestCase { } } + player.hooks?.flowController.tap({ flowController in + flowController.hooks.flow.tap { flow in + flow.hooks.afterTransition.tap { flowInstance in + guard flowInstance.currentState?.name == "VIEW_2" else { + (player.state as? InProgressState)?.controllers?.data.set(transaction: ["name": "Test"]) + do { + try flowController.transition(with: "commit") + } catch { + XCTFail("Transition with 'commit' failed") + } + return + } + } + } + }) + player.start(flow: json, completion: {_ in}) wait(for: [expected], timeout: 1) } diff --git a/ios/plugins/TransitionPlugin/ViewInspector/TransitionPluginTests.swift b/ios/plugins/TransitionPlugin/ViewInspector/TransitionPluginTests.swift index 89b63da2b..78ac7d9e2 100644 --- a/ios/plugins/TransitionPlugin/ViewInspector/TransitionPluginTests.swift +++ b/ios/plugins/TransitionPlugin/ViewInspector/TransitionPluginTests.swift @@ -31,11 +31,19 @@ class TransitionPluginTests: ViewInspectorTestCase { let playerTransition1 = player.hooks?.transition.call() XCTAssertEqual(playerTransition1, .identity) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "next") + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "next") + } catch { + XCTFail("Transition with 'next' failed") + } let playerTransitions3 = player.hooks?.transition.call() XCTAssertEqual(playerTransitions3, .test1) - (player.state as? InProgressState)?.controllers?.flow.transition(with: "prev") + do { + try (player.state as? InProgressState)?.controllers?.flow.transition(with: "prev") + } catch { + "Transition with 'next' failed" + } let playerTransitions4 = player.hooks?.transition.call() XCTAssertEqual(playerTransitions4, .test2) diff --git a/xcode/Podfile.lock b/xcode/Podfile.lock index c93c82995..d922f5381 100644 --- a/xcode/Podfile.lock +++ b/xcode/Podfile.lock @@ -50,6 +50,7 @@ PODS: - PlayerUI/BeaconPlugin - PlayerUI/Core - PlayerUI/SwiftUI + - PlayerUI/SwiftUIPendingTransactionPlugin - PlayerUI/StageRevertDataPlugin (0.0.1-placeholder): - PlayerUI/Core - PlayerUI/SwiftUI (0.0.1-placeholder): @@ -133,7 +134,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: EyesXCUI: bbb10a48b8bd1a15d541f2bc1f4d18f4db654ef1 - PlayerUI: 7b9bdbf01b4da672a0b6be1281f7b70e134d4e3c + PlayerUI: da5780c2da508c19a029536a070e73efe14b1bd4 SwiftHooks: 3ecc67c23da335d44914a8a74bd1dd23c7c149e6 SwiftLint: 4fa9579c63416865179bc416f0a92d55f009600d ViewInspector: 53313c757eddc5c4842bc7943a66821a68d02d3e From 09ab468743e34d2df31b81678f2309c743641f23 Mon Sep 17 00:00:00 2001 From: zwu01 Date: Fri, 19 Jan 2024 17:14:10 -0500 Subject: [PATCH 02/11] address comments --- ios/packages/JSValueExtensionsTests.swift | 15 ++-- .../Sources/Types/Core/FlowController.swift | 2 +- .../utilities/JSValue+Extensions.swift | 71 +++++++------------ 3 files changed, 38 insertions(+), 50 deletions(-) diff --git a/ios/packages/JSValueExtensionsTests.swift b/ios/packages/JSValueExtensionsTests.swift index 8b6c7c97c..a65bd660f 100644 --- a/ios/packages/JSValueExtensionsTests.swift +++ b/ios/packages/JSValueExtensionsTests.swift @@ -22,9 +22,9 @@ class JSValueExtensionsTests: XCTestCase { """) do { - let _ = try functionReturningError?.callTryCatchWrapperWithReturnValue(args: [] as [String]) + let _ = try functionReturningError?.tryCatch(args: [] as [String]) } catch let error { - XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS) + XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Fail")) } } @@ -37,7 +37,7 @@ class JSValueExtensionsTests: XCTestCase { """) do { - let result = try functionReturningInt?.callTryCatchWrapperWithReturnValue(args: [] as [String]) + let result = try functionReturningInt?.tryCatch(args: [] as [String]) XCTAssertEqual(result?.toInt32(), 1) } catch let error { XCTFail("Should have returned Int but failed with \(error)") @@ -47,6 +47,8 @@ class JSValueExtensionsTests: XCTestCase { func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { let player = HeadlessPlayerImpl(plugins: []) + var caughtError = false + player.hooks?.viewController.tap { viewController in viewController.hooks.view.tap { view in view.hooks.onUpdate.tap { value in @@ -54,7 +56,12 @@ class JSValueExtensionsTests: XCTestCase { do { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") } catch let error { - XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS) + caughtError = true + XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) + } + + if !caughtError { + XCTFail("Expected error, but no error was caught") } return diff --git a/ios/packages/core/Sources/Types/Core/FlowController.swift b/ios/packages/core/Sources/Types/Core/FlowController.swift index 03f18c77f..1c192ff7b 100644 --- a/ios/packages/core/Sources/Types/Core/FlowController.swift +++ b/ios/packages/core/Sources/Types/Core/FlowController.swift @@ -49,6 +49,6 @@ public class FlowController: CreatedFromJSValue { - action: The action to use for transitioning */ public func transition(with action: String) throws { - try self.value.objectForKeyedSubscript("transition").callTryCatchWrapper(args: [action]) + try self.value.objectForKeyedSubscript("transition").tryCatch(args: [action]) } } diff --git a/ios/packages/core/Sources/utilities/JSValue+Extensions.swift b/ios/packages/core/Sources/utilities/JSValue+Extensions.swift index 12fa32825..321433995 100644 --- a/ios/packages/core/Sources/utilities/JSValue+Extensions.swift +++ b/ios/packages/core/Sources/utilities/JSValue+Extensions.swift @@ -9,61 +9,42 @@ import Foundation import JavaScriptCore extension JSValue { - var tryCatchWrapper: JSValue? { - self.context.evaluateScript( - """ - (fn, args) => { - try { - console.log(args) - return fn(...args) - } catch(e) { - console.log(e) - if (e instanceof Error) { - - return e - } - } - } - """) - - } - - var errorCheckWrapper: JSValue? { - self.context.evaluateScript( - """ - (obj) => (obj instanceof Error) - """) - } /** - A way to catch errors for void functions not called inside a player process. Called on void functions. + A way to catch errors for functions not called inside a player process. Can be called on functions with a return value and void with discardableResult. - parameters: - args: List of arguments taken by the function */ - public func callTryCatchWrapper(args: Any...) throws { - let result = self.tryCatchWrapper?.call(withArguments: [self, args]) - - let isError = self.errorCheckWrapper?.call(withArguments: [result as Any]) - - if isError?.toBool() == true { - throw JSValueError.thrownFromJS + @discardableResult + public func tryCatch(args: Any...) throws -> JSValue? { + var tryCatchWrapper: JSValue? { + self.context.evaluateScript( + """ + (fn, args) => { + try { + return fn(...args) + } catch(e) { + return e + } + } + """) } - } + var errorCheckWrapper: JSValue? { + self.context.evaluateScript( + """ + (obj) => (obj instanceof Error) + """) + } + let result = tryCatchWrapper?.call(withArguments: [self, args]) - /** - A way to catch errors for functions not called inside a player process. Called on functions with a return value. - - parameters: - - args: List of arguments taken by the function - */ - public func callTryCatchWrapperWithReturnValue(args: Any...) throws -> JSValue? { - let result = tryCatchWrapper?.call(withArguments: [self, args]) + let isError = errorCheckWrapper?.call(withArguments: [result as Any]) - let isError = self.errorCheckWrapper?.call(withArguments: [result as Any]) + let errorMessage = result?.toString() ?? "" if isError?.toBool() == true { - throw JSValueError.thrownFromJS + throw JSValueError.thrownFromJS(message: errorMessage) } else { return result } @@ -73,6 +54,6 @@ extension JSValue { /** Represents the different errors that occur when evaluating JSValue */ -public enum JSValueError: Error { - case thrownFromJS +public enum JSValueError: Error, Equatable { + case thrownFromJS(message: String) } From a14755471dcfe67c892265af299c783d661406e2 Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Mon, 22 Jan 2024 13:29:51 -0500 Subject: [PATCH 03/11] move test to core utilities folder --- .../Tests/utilities}/JSValueExtensionsTests.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) rename ios/packages/{ => core/Tests/utilities}/JSValueExtensionsTests.swift (97%) diff --git a/ios/packages/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift similarity index 97% rename from ios/packages/JSValueExtensionsTests.swift rename to ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index a65bd660f..486e0664a 100644 --- a/ios/packages/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -1,10 +1,11 @@ // // JSValueExtensionsTests.swift -// PlayerUI +// PlayerUI-Unit-Unit // -// Created by Zhao Xia Wu on 2024-01-17. +// Created by Zhao Xia Wu on 2024-01-22. // + import Foundation import XCTest import JavaScriptCore @@ -13,7 +14,7 @@ import JavaScriptCore class JSValueExtensionsTests: XCTestCase { let context: JSContext = JSContext() func testTryCatchWrapperReturningError() { - + let functionReturningError = self.context .evaluateScript(""" (() => { From d0cd3d9d4bbd878c735c6f34bc33f49d10520fe5 Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Mon, 22 Jan 2024 16:58:19 -0500 Subject: [PATCH 04/11] use expectation to wait for error --- .../Tests/utilities/JSValueExtensionsTests.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index 486e0664a..1f736b039 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -48,7 +48,7 @@ class JSValueExtensionsTests: XCTestCase { func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { let player = HeadlessPlayerImpl(plugins: []) - var caughtError = false + let expectation = expectation(description: "Error caught") player.hooks?.viewController.tap { viewController in viewController.hooks.view.tap { view in @@ -56,13 +56,12 @@ class JSValueExtensionsTests: XCTestCase { guard view.id == "view-2" else { do { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") + + } catch let error { - caughtError = true - XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) - } + expectation.fulfill() - if !caughtError { - XCTFail("Expected error, but no error was caught") + XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) } return @@ -72,5 +71,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) + wait(for: [expectation], timeout: 1) } } From 95756359534d7c4221b0495f6e12156f124b093a Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Mon, 22 Jan 2024 16:59:33 -0500 Subject: [PATCH 05/11] remove extra lines --- ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index 1f736b039..ec0493632 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -56,8 +56,6 @@ class JSValueExtensionsTests: XCTestCase { guard view.id == "view-2" else { do { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") - - } catch let error { expectation.fulfill() From fcf4ec5729a0b3ac418a040b23eb040c565c7f31 Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Mon, 22 Jan 2024 18:06:24 -0500 Subject: [PATCH 06/11] increase timeout --- .../core/Tests/utilities/JSValueExtensionsTests.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index ec0493632..8b9b88467 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -57,9 +57,8 @@ class JSValueExtensionsTests: XCTestCase { do { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") } catch let error { - expectation.fulfill() - XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) + expectation.fulfill() } return @@ -69,6 +68,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) - wait(for: [expectation], timeout: 1) + wait(for: [expectation], timeout: 3) } } From e742320751676c54efd42ad9a73f1e487d569c3f Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Tue, 23 Jan 2024 11:22:59 -0500 Subject: [PATCH 07/11] move expectation --- .../core/Tests/utilities/JSValueExtensionsTests.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index 8b9b88467..e61deda5a 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -48,7 +48,7 @@ class JSValueExtensionsTests: XCTestCase { func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { let player = HeadlessPlayerImpl(plugins: []) - let expectation = expectation(description: "Error caught") + let expectation = expectation(description: "Wait for on update") player.hooks?.viewController.tap { viewController in viewController.hooks.view.tap { view in @@ -58,9 +58,10 @@ class JSValueExtensionsTests: XCTestCase { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") } catch let error { XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) - expectation.fulfill() + } + expectation.fulfill() return } } @@ -68,6 +69,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) - wait(for: [expectation], timeout: 3) + wait(for: [expectation], timeout: 5) } } From 2ffc0fd0601141dc71c916e6a6c1c57d087721cc Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Wed, 24 Jan 2024 10:45:07 -0500 Subject: [PATCH 08/11] decrease timeout --- ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index e61deda5a..33c4f51a4 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -69,6 +69,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) - wait(for: [expectation], timeout: 5) + wait(for: [expectation], timeout: 2) } } From 1cd22cc2827fb11ca871fb40473f6125115dac54 Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Wed, 24 Jan 2024 13:15:58 -0500 Subject: [PATCH 09/11] move expectation to catch --- .../core/Tests/utilities/JSValueExtensionsTests.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index 33c4f51a4..805fee700 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -58,10 +58,9 @@ class JSValueExtensionsTests: XCTestCase { try (player.state as? InProgressState)?.controllers?.flow.transition(with: "NEXT") } catch let error { XCTAssertEqual(error as? JSValueError, JSValueError.thrownFromJS(message: "Error: Transitioning while ongoing transition from VIEW_1 is in progress is not supported")) - + expectation.fulfill() } - expectation.fulfill() return } } @@ -69,6 +68,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) - wait(for: [expectation], timeout: 2) + wait(for: [expectation], timeout: 6) } } From 2f18739c4866d5efa8767dae5f54545d6b14fb03 Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Wed, 24 Jan 2024 17:57:54 -0500 Subject: [PATCH 10/11] comment out test --- .../core/Tests/utilities/JSValueExtensionsTests.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index 805fee700..a089f8790 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -45,7 +45,8 @@ class JSValueExtensionsTests: XCTestCase { } } - func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { + // TODO: uncomment this test once https://github.com/player-ui/player/pull/263 is merged to include change that adds the error + /*func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { let player = HeadlessPlayerImpl(plugins: []) let expectation = expectation(description: "Wait for on update") @@ -68,6 +69,6 @@ class JSValueExtensionsTests: XCTestCase { } player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) - wait(for: [expectation], timeout: 6) - } + wait(for: [expectation], timeout: 1) + }*/ } From 97c840584287f9e00d48f1eccba64b25b736670a Mon Sep 17 00:00:00 2001 From: nancywu1 Date: Thu, 25 Jan 2024 14:32:37 -0500 Subject: [PATCH 11/11] uncomment test --- .../core/Tests/utilities/JSValueExtensionsTests.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift index a089f8790..ba506ce67 100644 --- a/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift +++ b/ios/packages/core/Tests/utilities/JSValueExtensionsTests.swift @@ -45,8 +45,7 @@ class JSValueExtensionsTests: XCTestCase { } } - // TODO: uncomment this test once https://github.com/player-ui/player/pull/263 is merged to include change that adds the error - /*func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { + func testTransitionDuringAnActiveTransitionShouldCatchErrorUsingTryCatchWrapper() { let player = HeadlessPlayerImpl(plugins: []) let expectation = expectation(description: "Wait for on update") @@ -70,5 +69,5 @@ class JSValueExtensionsTests: XCTestCase { player.start(flow: FlowData.MULTIPAGE, completion: {_ in}) wait(for: [expectation], timeout: 1) - }*/ + } }