Как протестировать запрос GraphQL, предоставляющий токен авторизации с Apollo Server? - PullRequest
0 голосов
/ 28 февраля 2019

Документация тестирования Apollo Server Integration показывает, как тестировать простые запросы, используя createTestClient:

const { query } = createTestClient(server);
const res = await query({ query: GET_LAUNCH, variables: { id: 1 } });

В попытке протестировать запрос, который требует токен авторизации , я попытался передать jwtToken в качестве дополнительного поля для объекта, переданного для запроса, как показано ниже:

const res = await query({ 
  query: MY_QUERY, 
  http: { headers: { authorization: `Bearer ${jwtToken}` } },
});

К сожалению, это не работает.При попытке запустить его я получаю следующий ответ:

{
  "http": {
    "headers": {}
  },
  "errors": [{
    "message": "must authenticate",
    "locations": [{
      "line": 2,
      "column": 3
    }],
    "path": ["myQuery"],
    "extensions": {
      "code": "UNAUTHENTICATED"
    }
  }],
  "data": {
    "myQuery": null
  }
}

Есть идеи, как правильно тестировать запросы, требующие токен авторизации?

Использование:

  "devDependencies": {
    "jest": "^23.6.0",
    "apollo-server-testing": "^2.4.8"
  }

1 Ответ

0 голосов
/ 08 марта 2019

Вы можете создать новый экземпляр сервера с отдельным контекстом для ваших тестов.Примерно так (возможно, синтаксически не на 100% правильно, но вы поймете):

// Create a test user, no need to mess with JWT here, just create a plain object
// that resembles a user in your system.
const testUser = {
  id: 'testId',
  email: 'test@example.com',
};

// Use this for both test servers and real servers
export function getContext(models, viewer) {
  return {
    ...models,
    viewer,
  };
}

// Create test server
const testServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: getContext({}, testUser),
});

const { query } = createTestClient(testServer);

// The actual server (you know better how this looks on your end, but just for
// the concept)
const realServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req, res }) => {
    const user = decodeUser(req.headers.authorization);

    return getContext({}, user);
  },
});
...