Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,74 +40,7 @@ final class StorefrontAPIMutationsTests: XCTestCase {
}
}

// MARK: - Mock URLProtocol for Network Mocking

class MockURLProtocol: URLProtocol {
static var mockResponseData: Data?
static var mockError: Error?
static var mockStatusCode: Int = 200
static var capturedRequest: URLRequest?
static var capturedRequestBody: Data?

override class func canInit(with _: URLRequest) -> Bool {
return true
}

override class func canonicalRequest(for request: URLRequest) -> URLRequest {
return request
}

override func startLoading() {
Self.capturedRequest = request

// Capture the request body properly
if let bodyStream = request.httpBodyStream {
bodyStream.open()
defer { bodyStream.close() }

var data = Data()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer { buffer.deallocate() }

while bodyStream.hasBytesAvailable {
let bytesRead = bodyStream.read(buffer, maxLength: bufferSize)
if bytesRead > 0 {
data.append(buffer, count: bytesRead)
} else {
break
}
}
Self.capturedRequestBody = data
} else {
Self.capturedRequestBody = request.httpBody
}

if let error = Self.mockError {
client?.urlProtocol(self, didFailWithError: error)
} else if let data = Self.mockResponseData {
let response = HTTPURLResponse(
url: request.url!,
statusCode: Self.mockStatusCode,
httpVersion: nil,
headerFields: nil
)!
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
client?.urlProtocol(self, didLoad: data)
}
client?.urlProtocolDidFinishLoading(self)
}

override func stopLoading() {}

static func reset() {
mockResponseData = nil
mockError = nil
mockStatusCode = 200
capturedRequest = nil
capturedRequestBody = nil
}
}
typealias MockURLProtocol = StorefrontAPIMockURLProtocol

// MARK: - Test Setup

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,74 +3,7 @@ import XCTest

@available(iOS 17.0, *)
final class StorefrontAPIQueriesTests: XCTestCase {
// MARK: - Mock URLProtocol for Network Mocking

class MockURLProtocol: URLProtocol {
static var mockResponseData: Data?
static var mockError: Error?
static var mockStatusCode: Int = 200
static var capturedRequest: URLRequest?
static var capturedRequestBody: Data?

override class func canInit(with _: URLRequest) -> Bool {
return true
}

override class func canonicalRequest(for request: URLRequest) -> URLRequest {
return request
}

override func startLoading() {
Self.capturedRequest = request

// Capture the request body properly
if let bodyStream = request.httpBodyStream {
bodyStream.open()
defer { bodyStream.close() }

var data = Data()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer { buffer.deallocate() }

while bodyStream.hasBytesAvailable {
let bytesRead = bodyStream.read(buffer, maxLength: bufferSize)
if bytesRead > 0 {
data.append(buffer, count: bytesRead)
} else {
break
}
}
Self.capturedRequestBody = data
} else {
Self.capturedRequestBody = request.httpBody
}

if let error = Self.mockError {
client?.urlProtocol(self, didFailWithError: error)
} else if let data = Self.mockResponseData {
let response = HTTPURLResponse(
url: request.url!,
statusCode: Self.mockStatusCode,
httpVersion: nil,
headerFields: nil
)!
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
client?.urlProtocol(self, didLoad: data)
}
client?.urlProtocolDidFinishLoading(self)
}

override func stopLoading() {}

static func reset() {
mockResponseData = nil
mockError = nil
mockStatusCode = 200
capturedRequest = nil
capturedRequestBody = nil
}
}
typealias MockURLProtocol = StorefrontAPIMockURLProtocol

// MARK: - Test Setup

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import os.log
import XCTest

@available(iOS 17.0, *)
@MainActor
class ShopifyAcceleratedCheckoutsTests: XCTestCase {
var originalLogLevel: LogLevel!

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import Foundation
@testable import ShopifyCheckoutKit

class StorefrontAPIMockURLProtocol: URLProtocol {
private struct State {
var mockResponseData: Data?
var mockError: Error?
var mockStatusCode = 200
var capturedRequest: URLRequest?
var capturedRequestBody: Data?
}

private static let state = LockedValue(State())

static var mockResponseData: Data? {
get { state.get().mockResponseData }
set { state.update { $0.mockResponseData = newValue } }
}

static var mockError: Error? {
get { state.get().mockError }
set { state.update { $0.mockError = newValue } }
}

static var mockStatusCode: Int {
get { state.get().mockStatusCode }
set { state.update { $0.mockStatusCode = newValue } }
}

static var capturedRequest: URLRequest? {
get { state.get().capturedRequest }
set { state.update { $0.capturedRequest = newValue } }
}

static var capturedRequestBody: Data? {
get { state.get().capturedRequestBody }
set { state.update { $0.capturedRequestBody = newValue } }
}

override class func canInit(with _: URLRequest) -> Bool {
true
}

override class func canonicalRequest(for request: URLRequest) -> URLRequest {
request
}

override func startLoading() {
Self.capturedRequest = request
Self.capturedRequestBody = requestBody(for: request)

if let error = Self.mockError {
client?.urlProtocol(self, didFailWithError: error)
} else if let data = Self.mockResponseData {
let response = HTTPURLResponse(
url: request.url!,
statusCode: Self.mockStatusCode,
httpVersion: nil,
headerFields: nil
)!
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
client?.urlProtocol(self, didLoad: data)
}
client?.urlProtocolDidFinishLoading(self)
}

override func stopLoading() {}

static func reset() {
mockResponseData = nil
mockError = nil
mockStatusCode = 200
capturedRequest = nil
capturedRequestBody = nil
}

private func requestBody(for request: URLRequest) -> Data? {
guard let bodyStream = request.httpBodyStream else {
return request.httpBody
}

bodyStream.open()
defer { bodyStream.close() }

var data = Data()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer { buffer.deallocate() }

while bodyStream.hasBytesAvailable {
let bytesRead = bodyStream.read(buffer, maxLength: bufferSize)
if bytesRead > 0 {
data.append(buffer, count: bytesRead)
} else {
break
}
}

return data
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import XCTest

// MARK: - Configuration Helpers

@MainActor
func XCTAssertThrowsErrorAsync(
_ expression: @autoclosure () async throws -> some Any,
_ errorHandler: (Error) -> Void,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import SwiftUI
import XCTest

@available(iOS 17.0, *)
@MainActor
final class AcceleratedCheckoutButtonsRenderStateTests: XCTestCase {
// MARK: - Render State Change Callback Tests

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Contacts
import PassKit
@testable import ShopifyAcceleratedCheckouts
import ShopifyCheckoutKit
@testable import ShopifyCheckoutKit
import XCTest

@available(iOS 17.0, *)
Expand Down Expand Up @@ -612,12 +612,46 @@ final class ApplePayAuthorizationDelegateControllerTests: XCTestCase {
"\"cost\":{\"totalAmount\":{\"amount\":\"0.00\",\"currencyCode\":\"USD\"}}," +
"\"discountCodes\":[],\"discountAllocations\":[]}"

static var failReplace = false
static var failDeliveryUpdate = false
static var failPrepareForCompletion = false
static var returnMappableCartUserError = false
static var returnInvalidCart = false
static var lastOperation: String?
private struct State {
var failReplace = false
var failDeliveryUpdate = false
var failPrepareForCompletion = false
var returnMappableCartUserError = false
var returnInvalidCart = false
var lastOperation: String?
}

private static let state = LockedValue(State())

static var failReplace: Bool {
get { state.get().failReplace }
set { state.update { $0.failReplace = newValue } }
}

static var failDeliveryUpdate: Bool {
get { state.get().failDeliveryUpdate }
set { state.update { $0.failDeliveryUpdate = newValue } }
}

static var failPrepareForCompletion: Bool {
get { state.get().failPrepareForCompletion }
set { state.update { $0.failPrepareForCompletion = newValue } }
}

static var returnMappableCartUserError: Bool {
get { state.get().returnMappableCartUserError }
set { state.update { $0.returnMappableCartUserError = newValue } }
}

static var returnInvalidCart: Bool {
get { state.get().returnInvalidCart }
set { state.update { $0.returnInvalidCart = newValue } }
}

static var lastOperation: String? {
get { state.get().lastOperation }
set { state.update { $0.lastOperation = newValue } }
}

static func response(for op: String) -> Data {
if op == "cartPrepareForCompletion" {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ final class ApplePayCallbackTests: XCTestCase {

// MARK: - Setup

override func setUp() {
super.setUp()
override func setUp() async throws {
try await super.setUp()

// Create mock configuration
let commonConfig = ShopifyAcceleratedCheckouts.Configuration(
Expand Down Expand Up @@ -53,13 +53,13 @@ final class ApplePayCallbackTests: XCTestCase {
)
}

override func tearDown() {
override func tearDown() async throws {
viewController = nil
mockConfiguration = nil
mockIdentifier = nil
errorExpectation = nil
cancelExpectation = nil
super.tearDown()
try await super.tearDown()
}

// MARK: - Error Callback Tests
Expand Down
Loading
Loading