diff --git a/src/utils/http.spec.ts b/src/utils/http.spec.ts new file mode 100644 index 00000000..7bcea42f --- /dev/null +++ b/src/utils/http.spec.ts @@ -0,0 +1,34 @@ +import { describe, it, expect, vi, afterEach } from 'vitest' +import { createValidateStatusCode, HttpError, Response } from '.' + +const makeResponse = (statusCode: number, body = '{"sys":{"type":"Error"}}') => + ({ statusCode, body }) as Response + +describe('createValidateStatusCode', () => { + afterEach(() => { + vi.restoreAllMocks() + }) + + it('returns the response when status code is allowed', () => { + const validate = createValidateStatusCode([200, 201]) + const response = makeResponse(201) + expect(validate(response)).toBe(response) + }) + + it('throws HttpError when status code is not allowed', () => { + const validate = createValidateStatusCode([201]) + const response = makeResponse(404, '{"sys":{"type":"Error","id":"NotFound"}}') + expect(() => validate(response)).toThrow(HttpError) + }) + + it('does not write to stdout when throwing', () => { + const consoleSpy = vi.spyOn(console, 'log') + const validate = createValidateStatusCode([201]) + try { + validate(makeResponse(404)) + } catch { + // expected + } + expect(consoleSpy).not.toHaveBeenCalled() + }) +}) diff --git a/src/utils/http.ts b/src/utils/http.ts index 84450844..6237e37f 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -1,4 +1,7 @@ import got, { ExtendOptions, Got, HTTPError, Response as GotResponse } from 'got' +import { createLogger } from './logger' + +const log = createLogger({ namespace: 'utils/http' }) const config = { prefixUrl: process.env.BASE_URL || 'https://api.contentful.com', @@ -11,7 +14,7 @@ export const createHttpClient = (configOverride: ExtendOptions = {}) => { export const createValidateStatusCode = (allowedStatusCodes: number[]) => (response: Response) => { if (!allowedStatusCodes.includes(response.statusCode)) { - console.log(response.body) + log(`unexpected status code %d: %s`, response.statusCode, response.body) throw new HTTPError(response) } return response