Contents

bdbergeron/apollo-ios-extensions

Helpful extensions to the apollo-ios package.

Features

MockApolloClient

Want to test your app's code around ApolloClient? Look no further than MockApolloClient! This mock object conforms to ApolloClientProtocol and allows you to stub responses to queries, mutations, and subscriptions.

@Test
func fetchAllFriends() throws {
  let mockedResponseData = GetAllFriendsQuery.Data(friends: .init(edges: [.init(node: .init(id: "1", name: "Brad"))]))
  let apolloClient = MockApolloClient()
  await apolloClient.registerResult(
    .success(.init(
      data: mockedResponseData,
      extensions: nil,
      errors: nil,
      source: .server,
      dependentKeys: nil
    )),
    for: GetAllFriendsQuery.self
  )
  let friendsService = FriendsService(apolloClient: apolloClient)
  let friends = try await friendsService.fetchAllFriends() // Internally performs the fetch operation on its apolloClient with GetAllFriendsQuery
  let data = try #require(response.data)
  #expect(data.people.edges.count == 1)
  #expect(data.people.edges[0].node.fragments.person.id == "1")
  #expect(data.people.edges[0].node.fragments.person.name == "Brad")
}

Testing / Mocking GraphQL Operations

Want to validate your generated GraphQL operations and data models against stable JSON data that you control? mockedJSONResponse is your answer.

Mock your response, like people.json in your app bundle:

{
  "data": {
    "people": {
      "__typename": "PersonCollection",
      "edges": [
        {
          "__typename": "PersonCollectionEdge",
          "node": {
            "__typename": "Item",
            "id": "1",
            "name": "Brad"
          }
        }
      ]
    }
  }
}

And use that mock response in your tests:

@Test
func mockedPeopleQueryResponse() async throws {
  let mockURL = try #require(Bundle.module.url(forResource: "people", withExtension: "json"))
  let query = PeopleQuery()
  let response = try await query.mockedJSONResponse(url: mockURL)
  let data = try #require(response.data)

  let person = Person(id: "1", name: "Bradley", nickname: "Brad", age: 36)
  #expect(data.people.edges[0].node.fragments.person == person)
}

Package Metadata

Repository: bdbergeron/apollo-ios-extensions

Stars: 0

Forks: 0

Open issues: 0

Default branch: main

Primary language: swift

License: MIT

Topics: graphql, ios, swift

README: README.md