使用 Apollo Server (apollo-server) 上的executeOperation 获取标头以进行集成测试

Sak*_*dow 5 apollo graphql apollo-server

自从弃用以来,apollo-server-testing我正在使用与 apollo-server 进行集成测试的新方法(包含在 apollo-server 2.25.0 中)。从突变登录中,我在 OutgoingMessage 标头(在 中'Set-Cookie')中设置了刷新令牌。

简化的解析器

    @Mutation(() => RefreshTokenOutput)
    async refreshToken(@Ctx() { response, contextRefreshToken }: Context): Promise<RefreshTokenOutput> {
        if (contextRefreshToken) {
            const { accessToken, refreshToken } = await this.authService.refreshToken(contextRefreshToken);
            response.setHeader(
                'Set-Cookie',
                cookie.serialize('refreshToken', refreshToken, {
                    httpOnly: true,
                    maxAge: maxAge,
                    secure: true,
                })
            );
            return { accessToken: accessToken };
        } else {
            throw new AuthenticationError();
        }
    }
Run Code Online (Sandbox Code Playgroud)

测试用例

            // given:
            const { user, clearPassword } = await userLoader.createUser16c();
            const input = new UserSigninInput();
            input.email = user.email;
            input.password = clearPassword;

            const MUTATE_signin = gql`
                mutation signin($userInput: UserSigninInput!) {
                    signin(input: $userInput) {
                        accessToken
                    }
                }
            `;

            // when:
            const res = await server.executeOperation(
                { query: MUTATE_signin, variables: { userInput: input }, operationName: 'signin' },
                buildContext(user)
            );
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试此令牌是否设置正确且格式良好。您知道我如何使用 访问此标头吗executeOperation

fuz*_*zes 0

server.executeOperation 调用 processGraphQLRequest

processGraphQLRequest 返回类型是 GraphQLResponse

export interface GraphQLResponse {
  data?: Record<string, any> | null;
  errors?: ReadonlyArray<GraphQLFormattedError>;
  extensions?: Record<string, any>;
  http?: Pick<Response, 'headers'> & Partial<Pick<Mutable<Response>, 'status'>>;
}
Run Code Online (Sandbox Code Playgroud)

我不确定,但我认为 GraphQLResponse.http 中的标头

你可以在 github repo 中找到调用结构。

https://github.com/apollographql/apollo-server/blob/6b9c2a0f1932e6d8fb94a8662cc1da24980aec6f/packages/apollo-server-core/src/requestPipeline.ts#L126