Skip to content

Commit

Permalink
Fix MockSchemaMetadata actor isolation (#496)
Browse files Browse the repository at this point in the history
  • Loading branch information
AnthonyMDev authored Sep 30, 2024
1 parent 1e5c98b commit 9c139b3
Show file tree
Hide file tree
Showing 19 changed files with 251 additions and 199 deletions.
36 changes: 22 additions & 14 deletions Tests/ApolloInternalTestHelpers/MockSchemaMetadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,39 @@ public class MockSchemaMetadata: SchemaMetadata {
public init() { }

public static var _configuration: SchemaConfiguration.Type = SchemaConfiguration.self
public static var configuration: any ApolloAPI.SchemaConfiguration.Type = SchemaConfiguration.self
public static let configuration: any ApolloAPI.SchemaConfiguration.Type = SchemaConfiguration.self

@MainActor
private static let testObserver = TestObserver() { _ in
stub_objectTypeForTypeName = nil
stub_cacheKeyInfoForType_Object = nil
stub_objectTypeForTypeName(nil)
stub_cacheKeyInfoForType_Object(nil)
}

public static var stub_objectTypeForTypeName: ((String) -> Object?)? {
didSet {
if stub_objectTypeForTypeName != nil { testObserver.start() }
}
private static var _objectTypeForTypeName: ((String) -> Object?)?
public static var objectTypeForTypeName: ((String) -> Object?)? {
_objectTypeForTypeName
}

public static var stub_cacheKeyInfoForType_Object: ((Object, ObjectData) -> CacheKeyInfo?)? {
get {
_configuration.stub_cacheKeyInfoForType_Object
@MainActor
public static func stub_objectTypeForTypeName(_ stub: ((String) -> Object?)?) {
_objectTypeForTypeName = stub
if _objectTypeForTypeName != nil {
testObserver.start()
}
set {
_configuration.stub_cacheKeyInfoForType_Object = newValue
if newValue != nil { testObserver.start() }
}

@MainActor
public static func stub_cacheKeyInfoForType_Object(
_ stub: ((Object, ObjectData) -> CacheKeyInfo?)?
){
_configuration.stub_cacheKeyInfoForType_Object = stub
if stub != nil {
testObserver.start()
}
}

public static func objectType(forTypename __typename: String) -> Object? {
if let stub = stub_objectTypeForTypeName {
if let stub = objectTypeForTypeName {
return stub(__typename)
}

Expand Down
30 changes: 15 additions & 15 deletions Tests/ApolloInternalTestHelpers/TestObserver.swift
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import Apollo
import XCTest

@MainActor
public class TestObserver: NSObject, XCTestObservation {

private let onFinish: (XCTestCase) -> Void

@Atomic private var isStarted: Bool = false
let stopAfterEachTest: Bool

private var isStarted: Bool = false
private let onFinish: (XCTestCase) -> Void

public init(
startOnInit: Bool = true,
stopAfterEachTest: Bool = true,
onFinish: @escaping ((XCTestCase) -> Void)
onFinish: @escaping (@MainActor (XCTestCase) -> Void)
) {
self.stopAfterEachTest = stopAfterEachTest
self.onFinish = onFinish
Expand All @@ -22,22 +23,21 @@ public class TestObserver: NSObject, XCTestObservation {

public func start() {
guard !isStarted else { return }
$isStarted.mutate {
XCTestObservationCenter.shared.addTestObserver(self)
$0 = true
}

XCTestObservationCenter.shared.addTestObserver(self)
isStarted = true
}

public func stop() {
guard isStarted else { return }
$isStarted.mutate {
XCTestObservationCenter.shared.removeTestObserver(self)
$0 = false
}
XCTestObservationCenter.shared.removeTestObserver(self)
isStarted = false
}

public func testCaseDidFinish(_ testCase: XCTestCase) {
onFinish(testCase)
if stopAfterEachTest { stop() }
public nonisolated func testCaseDidFinish(_ testCase: XCTestCase) {
MainActor.assumeIsolated {
onFinish(testCase)
if stopAfterEachTest { stop() }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@ final class AsyncGraphQLQueryPagerCoordinatorTests: XCTestCase, CacheDependentTe
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@ final class BidirectionalPaginationTests: XCTestCase, CacheDependentTesting {
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
9 changes: 5 additions & 4 deletions Tests/ApolloPaginationTests/ForwardPaginationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@ final class ForwardPaginationTests: XCTestCase, CacheDependentTesting {
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@ final class GraphQLQueryPagerCoordinatorTests: XCTestCase, CacheDependentTesting
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
9 changes: 5 additions & 4 deletions Tests/ApolloPaginationTests/ReversePaginationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@ final class ReversePaginationTests: XCTestCase, CacheDependentTesting {
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
9 changes: 5 additions & 4 deletions Tests/ApolloPaginationTests/SubscribeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,18 @@ final class SubscribeTest: XCTestCase, CacheDependentTesting {
var client: ApolloClient!
var cancellables: [AnyCancellable] = []

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

server = MockGraphQLServer()
let networkTransport = MockNetworkTransport(server: server, store: store)

client = ApolloClient(networkTransport: networkTransport, store: store)
MockSchemaMetadata.stub_cacheKeyInfoForType_Object = IDCacheKeyProvider.resolver
MockSchemaMetadata.stub_cacheKeyInfoForType_Object(IDCacheKeyProvider.resolver)
}

override func tearDownWithError() throws {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ class StarWarsServerCachingRoundtripTests: XCTestCase, CacheDependentTesting {
var store: ApolloStore!
var client: ApolloClient!

override func setUpWithError() throws {
try super.setUpWithError()
cache = try makeNormalizedCache()
override func setUp() async throws {
try await super.setUp()

cache = try await makeNormalizedCache()
store = ApolloStore(cache: cache)
let provider = DefaultInterceptorProvider(store: store)
let network = RequestChainNetworkTransport(interceptorProvider: provider,
Expand Down
10 changes: 5 additions & 5 deletions Tests/ApolloServerIntegrationTests/StarWarsServerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ class StarWarsServerTests: XCTestCase, CacheDependentTesting {
var cache: (any NormalizedCache)!
var client: ApolloClient!

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

config = DefaultConfig()
cache = try makeNormalizedCache()

cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

client = ApolloClient(networkTransport: config.network(store: store), store: store)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ class StarWarsWebSocketTests: XCTestCase, CacheDependentTesting {
var cache: (any NormalizedCache)!
var client: ApolloClient!

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

cache = try makeNormalizedCache()
cache = try await makeNormalizedCache()
let store = ApolloStore(cache: cache)

let networkTransport = WebSocketTransport(
Expand Down
Loading

0 comments on commit 9c139b3

Please sign in to comment.