mirror of
https://github.com/graphql-hive/console
synced 2026-04-28 09:57:17 +00:00
173 lines
4.9 KiB
TypeScript
173 lines
4.9 KiB
TypeScript
import nock from 'nock';
|
|
import { describe, expect, test } from 'vitest';
|
|
import { createSupergraphSDLFetcher } from '../src/index.js';
|
|
import { version } from '../src/version';
|
|
import { maskRequestId } from './test-utils.js';
|
|
|
|
describe('supergraph SDL fetcher', async () => {
|
|
test('createSupergraphSDLFetcher without ETag', async () => {
|
|
const supergraphSdl = 'type SuperQuery { sdl: String }';
|
|
const newSupergraphSdl = 'type NewSuperQuery { sdl: String }';
|
|
const key = 'secret-key';
|
|
nock('http://localhost')
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.reply(200, supergraphSdl, {
|
|
ETag: 'first',
|
|
})
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.matchHeader('User-Agent', `hive-client/${version}`)
|
|
.reply(200, newSupergraphSdl, {
|
|
ETag: 'second',
|
|
});
|
|
|
|
const fetcher = createSupergraphSDLFetcher({
|
|
endpoint: 'http://localhost',
|
|
key,
|
|
});
|
|
|
|
const result = await fetcher();
|
|
|
|
expect(result.id).toBeDefined();
|
|
expect(result.supergraphSdl).toEqual(supergraphSdl);
|
|
|
|
const secondResult = await fetcher();
|
|
|
|
expect(secondResult.id).toBeDefined();
|
|
expect(secondResult.supergraphSdl).toEqual(newSupergraphSdl);
|
|
});
|
|
|
|
test('createSupergraphSDLFetcher', async () => {
|
|
const supergraphSdl = 'type SuperQuery { sdl: String }';
|
|
const newSupergraphSdl = 'type Query { sdl: String }';
|
|
const key = 'secret-key';
|
|
nock('http://localhost')
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.reply(200, supergraphSdl, {
|
|
ETag: 'first',
|
|
})
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.matchHeader('If-None-Match', 'first')
|
|
.reply(304)
|
|
.get('/supergraph')
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.matchHeader('User-Agent', `hive-client/${version}`)
|
|
.matchHeader('If-None-Match', 'first')
|
|
.reply(200, newSupergraphSdl, {
|
|
ETag: 'changed',
|
|
});
|
|
|
|
const fetcher = createSupergraphSDLFetcher({
|
|
endpoint: 'http://localhost',
|
|
key,
|
|
});
|
|
|
|
const result = await fetcher();
|
|
|
|
expect(result.id).toBeDefined();
|
|
expect(result.supergraphSdl).toEqual(supergraphSdl);
|
|
|
|
const cachedResult = await fetcher();
|
|
|
|
expect(cachedResult.id).toBeDefined();
|
|
expect(cachedResult.supergraphSdl).toEqual(supergraphSdl);
|
|
|
|
const staleResult = await fetcher();
|
|
|
|
expect(staleResult.id).toBeDefined();
|
|
expect(staleResult.supergraphSdl).toEqual(newSupergraphSdl);
|
|
});
|
|
|
|
test('createSupergraphSDLFetcher retry with unexpected status code (nRetryCount=10)', async () => {
|
|
const supergraphSdl = 'type SuperQuery { sdl: String }';
|
|
const key = 'secret-key';
|
|
nock('http://localhost')
|
|
.get('/supergraph')
|
|
.times(10)
|
|
.reply(500)
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.reply(200, supergraphSdl, {
|
|
ETag: 'first',
|
|
});
|
|
|
|
const fetcher = createSupergraphSDLFetcher({
|
|
endpoint: 'http://localhost',
|
|
key,
|
|
});
|
|
|
|
const result = await fetcher();
|
|
|
|
expect(result.id).toBeDefined();
|
|
expect(result.supergraphSdl).toEqual(supergraphSdl);
|
|
});
|
|
|
|
test('createSupergraphSDLFetcher retry with unexpected status code (nRetryCount=11)', async () => {
|
|
expect.assertions(1);
|
|
const supergraphSdl = 'type SuperQuery { sdl: String }';
|
|
const key = 'secret-key';
|
|
nock('http://localhost')
|
|
.get('/supergraph')
|
|
.times(11)
|
|
.reply(500)
|
|
.get('/supergraph')
|
|
.once()
|
|
.matchHeader('X-Hive-CDN-Key', key)
|
|
.reply(200, supergraphSdl, {
|
|
ETag: 'first',
|
|
});
|
|
|
|
const fetcher = createSupergraphSDLFetcher({
|
|
endpoint: 'http://localhost',
|
|
key,
|
|
});
|
|
|
|
try {
|
|
await fetcher();
|
|
} catch (err: any) {
|
|
expect(maskRequestId(err.message)).toMatchInlineSnapshot(
|
|
`GET http://localhost/supergraph (x-request-id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) failed with status 500.`,
|
|
);
|
|
}
|
|
});
|
|
|
|
test('fetch override is invoked', async () => {
|
|
let fetcherImplementationCallArgs: Parameters<typeof fetch>;
|
|
const supergraphSdl = 'type SuperQuery { sdl: String }';
|
|
|
|
const fetcher = createSupergraphSDLFetcher({
|
|
endpoint: 'http://localhost',
|
|
key: 'bubatz',
|
|
async fetchImplementation(...args): Promise<Response> {
|
|
fetcherImplementationCallArgs = args;
|
|
return new Response(supergraphSdl, {
|
|
status: 200,
|
|
});
|
|
},
|
|
});
|
|
|
|
const result = await fetcher();
|
|
expect(result).toMatchInlineSnapshot(`
|
|
{
|
|
id: cHnQuh1kIZhekOeaPxXiLtvOGplY9Beu//gftP9ppYo=,
|
|
supergraphSdl: type SuperQuery { sdl: String },
|
|
}
|
|
`);
|
|
|
|
expect(fetcherImplementationCallArgs![0]).toEqual(`http://localhost/supergraph`);
|
|
expect(fetcherImplementationCallArgs![1]).toMatchObject({
|
|
method: 'GET',
|
|
headers: {
|
|
'X-Hive-CDN-Key': 'bubatz',
|
|
},
|
|
});
|
|
});
|
|
});
|