From 0e1a7ab449d440af081894ffd1039c5b2146fe25 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 5 Sep 2024 12:04:39 -0600 Subject: [PATCH 1/3] Add redirected --- Source/Visit/VisitResponse.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Visit/VisitResponse.swift b/Source/Visit/VisitResponse.swift index baa5ad5..7b90496 100644 --- a/Source/Visit/VisitResponse.swift +++ b/Source/Visit/VisitResponse.swift @@ -1,12 +1,14 @@ import Foundation public struct VisitResponse: Codable { + public let redirected: Bool public let statusCode: Int public let responseHTML: String? - public init(statusCode: Int, responseHTML: String? = nil) { + public init(statusCode: Int, responseHTML: String? = nil, redirected: Bool = false) { self.statusCode = statusCode self.responseHTML = responseHTML + self.redirected = redirected } public var isSuccessful: Bool { From 48ab5ae76b796a1041823ee8d2dd2fabe410f760 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 5 Sep 2024 12:05:15 -0600 Subject: [PATCH 2/3] Remove visit options processing --- Source/Session/Session.swift | 3 +- Source/Session/VisitOptionsHandler.swift | 24 -------- Tests/VisitOptionsTests.swift | 71 ------------------------ 3 files changed, 1 insertion(+), 97 deletions(-) delete mode 100644 Source/Session/VisitOptionsHandler.swift delete mode 100644 Tests/VisitOptionsTests.swift diff --git a/Source/Session/Session.swift b/Source/Session/Session.swift index 3ed74cd..4af2d7f 100644 --- a/Source/Session/Session.swift +++ b/Source/Session/Session.swift @@ -68,8 +68,7 @@ public class Session: NSObject { initialized = false } - let processedOptions = visitOptionsHandler.process(options) - let visit = makeVisit(for: visitable, options: processedOptions) + let visit = makeVisit(for: visitable, options: options ?? VisitOptions()) currentVisit?.cancel() currentVisit = visit diff --git a/Source/Session/VisitOptionsHandler.swift b/Source/Session/VisitOptionsHandler.swift deleted file mode 100644 index 303337a..0000000 --- a/Source/Session/VisitOptionsHandler.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation - -class VisitOptionsHandler { - - private var unhandledVisitOptions: VisitOptions? - - /// If a form submission provides a response HTML, save the options and pass them to the next visit proposal. - func process(_ options: VisitOptions?) -> VisitOptions { - - if let options, options.response?.responseHTML != nil { - /// A `responseHTML` is provided for the next visit. - unhandledVisitOptions = options - return options - } else if let unhandledVisitOptions { - /// Next visit is happening. Use the previous `responseHTML`. - self.unhandledVisitOptions = nil - return unhandledVisitOptions - } else { - /// No options are unhandled. - return options ?? VisitOptions() - } - } - -} diff --git a/Tests/VisitOptionsTests.swift b/Tests/VisitOptionsTests.swift deleted file mode 100644 index ecd9a85..0000000 --- a/Tests/VisitOptionsTests.swift +++ /dev/null @@ -1,71 +0,0 @@ -@testable import Turbo -import XCTest - -class VisitOptionsTests: XCTestCase { - func test_Decodable_defaultsToAdvanceActionWhenNotProvided() throws { - let json = "{}".data(using: .utf8)! - - let options = try JSONDecoder().decode(VisitOptions.self, from: json) - XCTAssertEqual(options.action, .advance) - XCTAssertNil(options.response) - } - - func test_Decodable_usesProvidedActionWhenNotNil() throws { - let json = """ - {"action": "restore"} - """.data(using: .utf8)! - - let options = try JSONDecoder().decode(VisitOptions.self, from: json) - XCTAssertEqual(options.action, .restore) - XCTAssertNil(options.response) - } - - func test_Decodable_canBeInitializedWithResponse() throws { - _ = try validVisitVisitOptions(responseHTMLString: "") - } - - func test_visitOptionsArePreserved() throws { - let visitOptionsWithResponse = try validVisitVisitOptions(responseHTMLString: "") - let handler = VisitOptionsHandler() - - let processedOptions = handler.process(visitOptionsWithResponse) - XCTAssert(processedOptions == visitOptionsWithResponse) - - let nextVisitOptions = try validVisitVisitOptions(responseHTMLString: nil) - let savedOptions = handler.process(nextVisitOptions) - XCTAssert(savedOptions == visitOptionsWithResponse) - } -} - -extension VisitOptionsTests { - func validVisitVisitOptions(responseHTMLString: String?) throws -> VisitOptions { - var responseJSON = "" - if let responseHTMLString { - responseJSON = ", \"responseHTML\": \"\(responseHTMLString)\"" - } - - let json = """ - {"response": {"statusCode": 200\(responseJSON)}} - """.data(using: .utf8)! - - let options = try JSONDecoder().decode(VisitOptions.self, from: json) - XCTAssertEqual(options.action, .advance) - - let response = try XCTUnwrap(options.response) - XCTAssertEqual(response.statusCode, 200) - XCTAssertEqual(response.responseHTML, responseHTMLString) - return options - } -} - -extension VisitOptions : Equatable { - public static func == (lhs: VisitOptions, rhs: VisitOptions) -> Bool { - lhs.action == rhs.action && lhs.response == rhs.response - } -} - -extension VisitResponse : Equatable { - public static func == (lhs: VisitResponse, rhs: VisitResponse) -> Bool { - lhs.responseHTML == rhs.responseHTML && lhs.statusCode == rhs.statusCode - } -} From 23b042722252423518582c2684b9236a7ba222fe Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Thu, 5 Sep 2024 12:06:22 -0600 Subject: [PATCH 3/3] Remove visit options from session --- Source/Session/Session.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Source/Session/Session.swift b/Source/Session/Session.swift index 4af2d7f..54accc1 100644 --- a/Source/Session/Session.swift +++ b/Source/Session/Session.swift @@ -14,9 +14,6 @@ public class Session: NSObject { private lazy var bridge = WebViewBridge(webView: webView) private var initialized = false private var refreshing = false - - /// Options behave differently if a response is provided. - private let visitOptionsHandler = VisitOptionsHandler() private var isShowingStaleContent = false private var isSnapshotCacheStale = false