Merge pull request #2831 from spotify/migrate-to-msw

Remove node-fetch and jest-mock-fetch from all plugins and packages
This commit is contained in:
Ben Lambert
2020-10-22 13:34:28 +02:00
committed by GitHub
103 changed files with 319 additions and 342 deletions
+3 -4
View File
@@ -32,10 +32,12 @@
"@backstage/cli-common": "^0.1.1-alpha.25",
"@backstage/config": "^0.1.1-alpha.25",
"@backstage/config-loader": "^0.1.1-alpha.25",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@types/cors": "^2.8.6",
"@types/express": "^4.17.6",
"compression": "^1.7.4",
"cors": "^2.8.5",
"cross-fetch": "^3.0.6",
"express": "^4.17.1",
"express-prom-bundle": "^6.1.0",
"express-promise-router": "^3.0.3",
@@ -45,7 +47,6 @@
"lodash": "^4.17.15",
"logform": "^2.1.1",
"morgan": "^1.10.0",
"node-fetch": "^2.6.0",
"prom-client": "^12.0.0",
"selfsigned": "^1.10.7",
"stoppable": "^1.1.0",
@@ -64,7 +65,6 @@
"@types/compression": "^1.7.0",
"@types/http-errors": "^1.6.3",
"@types/morgan": "^1.9.0",
"@types/node-fetch": "^2.5.7",
"@types/stoppable": "^1.1.0",
"@types/supertest": "^2.0.8",
"@types/webpack-env": "^1.15.2",
@@ -72,8 +72,7 @@
"get-port": "^5.1.1",
"http-errors": "^1.7.3",
"jest": "^26.0.1",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"msw": "^0.21.2",
"supertest": "^4.0.2"
},
"files": [
@@ -19,14 +19,13 @@ import { setupServer } from 'msw/node';
import { ConfigReader } from '@backstage/config';
import { getVoidLogger } from '../logging';
import { AzureUrlReader } from './AzureUrlReader';
import { msw } from '@backstage/test-utils';
const logger = getVoidLogger();
describe('AzureUrlReader', () => {
const worker = setupServer();
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
msw.setupDefaultHandlers(worker);
beforeEach(() => {
worker.use(
@@ -41,7 +40,6 @@ describe('AzureUrlReader', () => {
),
);
});
afterEach(() => worker.resetHandlers());
const createConfig = (token?: string) =>
new ConfigReader(
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import fetch, { RequestInit, HeadersInit, Response } from 'node-fetch';
import fetch from 'cross-fetch';
import { Config } from '@backstage/config';
import { NotFoundError } from '../errors';
import { ReaderFactory, UrlReader } from './types';
@@ -76,7 +76,7 @@ export class AzureUrlReader implements UrlReader {
// for private repos when PAT is not valid, Azure API returns a http status code 203 with sign in page html
if (response.ok && response.status !== 203) {
return response.buffer();
return Buffer.from(await response.text());
}
const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`;
@@ -19,14 +19,14 @@ import { setupServer } from 'msw/node';
import { ConfigReader } from '@backstage/config';
import { getVoidLogger } from '../logging';
import { BitbucketUrlReader } from './BitbucketUrlReader';
import { msw } from '@backstage/test-utils';
const logger = getVoidLogger();
describe('BitbucketUrlReader', () => {
const worker = setupServer();
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
msw.setupDefaultHandlers(worker);
beforeEach(() => {
worker.use(
@@ -41,7 +41,6 @@ describe('BitbucketUrlReader', () => {
),
);
});
afterEach(() => worker.resetHandlers());
const createConfig = (username?: string, appPassword?: string) =>
new ConfigReader(
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import fetch, { RequestInit, HeadersInit, Response } from 'node-fetch';
import fetch from 'cross-fetch';
import { Config } from '@backstage/config';
import { ReaderFactory, UrlReader } from './types';
import { NotFoundError } from '../errors';
@@ -84,7 +84,7 @@ export class BitbucketUrlReader implements UrlReader {
}
if (response.ok) {
return response.buffer();
return Buffer.from(await response.text());
}
const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`;
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import fetch, { Response } from 'node-fetch';
import fetch from 'cross-fetch';
import { NotFoundError } from '../errors';
import { UrlReader } from './types';
@@ -31,7 +31,7 @@ export class FetchUrlReader implements UrlReader {
}
if (response.ok) {
return response.buffer();
return Buffer.from(await response.text());
}
const message = `could not read ${url}, ${response.status} ${response.statusText}`;
@@ -16,7 +16,7 @@
import { Config } from '@backstage/config';
import parseGitUri from 'git-url-parse';
import fetch, { HeadersInit, RequestInit, Response } from 'node-fetch';
import fetch from 'cross-fetch';
import { NotFoundError } from '../errors';
import { ReaderFactory, UrlReader } from './types';
@@ -219,7 +219,7 @@ export class GithubUrlReader implements UrlReader {
}
if (response.ok) {
return response.buffer();
return Buffer.from(await response.text());
}
const message = `${url} could not be read as ${ghUrl}, ${response.status} ${response.statusText}`;
@@ -19,14 +19,14 @@ import { setupServer } from 'msw/node';
import { ConfigReader } from '@backstage/config';
import { getVoidLogger } from '../logging';
import { GitlabUrlReader } from './GitlabUrlReader';
import { msw } from '@backstage/test-utils';
const logger = getVoidLogger();
describe('GitlabUrlReader', () => {
const worker = setupServer();
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
msw.setupDefaultHandlers(worker);
beforeEach(() => {
worker.use(
@@ -44,7 +44,6 @@ describe('GitlabUrlReader', () => {
),
);
});
afterEach(() => worker.resetHandlers());
const createConfig = (token?: string) =>
new ConfigReader(
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import fetch, { RequestInit, Response } from 'node-fetch';
import fetch from 'cross-fetch';
import { Config } from '@backstage/config';
import { NotFoundError } from '../errors';
import { ReaderFactory, UrlReader } from './types';
@@ -77,7 +77,7 @@ export class GitlabUrlReader implements UrlReader {
}
if (response.ok) {
return response.buffer();
return Buffer.from(await response.text());
}
const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`;
@@ -29,14 +29,14 @@
"express": "^4.17.1",
"express-promise-router": "^3.0.3",
"winston": "^3.2.1",
"node-fetch": "^2.6.1",
"cross-fetch": "^3.0.6",
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^{{backstageVersion}}",
"@types/supertest": "^2.0.8",
"supertest": "^4.0.2",
"msw": "^0.20.5"
"msw": "^0.21.2"
},
"files": [
"dist"
@@ -15,4 +15,3 @@
*/
export {};
global.fetch = require('node-fetch');
@@ -36,13 +36,14 @@
"devDependencies": {
"@backstage/cli": "^{{backstageVersion}}",
"@backstage/dev-utils": "^{{backstageVersion}}",
"@backstage/test-utils": "^{{backstageVersion}}",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^10.4.1",
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
@@ -5,18 +5,13 @@ import { ThemeProvider } from '@material-ui/core';
import { lightTheme } from '@backstage/theme';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
describe('ExampleComponent', () => {
const server = setupServer();
// Enable API mocking before tests.
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
// Reset any runtime request handlers we may add during the tests.
afterEach(() => server.resetHandlers())
// Disable API mocking after the tests are done.
afterAll(() => server.close())
// Enable sane handlers for network requests
msw.setupDefaultHandlers(server);
// setup mock response
beforeEach(() => {
@@ -3,18 +3,13 @@ import { render } from '@testing-library/react';
import ExampleFetchComponent from './ExampleFetchComponent';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
describe('ExampleFetchComponent', () => {
const server = setupServer();
// Enable API mocking before tests.
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
// Reset any runtime request handlers we may add during the tests.
afterEach(() => server.resetHandlers())
// Disable API mocking after the tests are done.
afterAll(() => server.close())
// Enable sane handlers for network requests
msw.setupDefaultHandlers(server);
// setup mock response
beforeEach(() => {
server.use(rest.get('https://randomuser.me/*', (_, res, ctx) => res(ctx.status(200), ctx.delay(2000), ctx.json({}))))
@@ -1,2 +1,2 @@
import '@testing-library/jest-dom';
global.fetch = require('node-fetch');
import 'cross-fetch/polyfill'
+3 -1
View File
@@ -30,6 +30,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.1-alpha.25",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@backstage/theme": "^0.1.1-alpha.25",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -49,7 +50,8 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/zen-observable": "^0.8.0",
"jest-fetch-mock": "^3.0.3"
"cross-fetch": "^3.0.6",
"msw": "^0.21.3"
},
"files": [
"dist"
@@ -19,8 +19,9 @@ import { DefaultAuthConnector } from './DefaultAuthConnector';
import MockOAuthApi from '../../apis/implementations/OAuthRequestApi/MockOAuthApi';
import * as loginPopup from '../loginPopup';
import { UrlPatternDiscovery } from '../../apis';
const anyFetch = fetch as any;
import { msw } from '@backstage/test-utils';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
const defaultOptions = {
discoveryApi: UrlPatternDiscovery.compile('http://my-host/api/{{pluginId}}'),
@@ -39,19 +40,25 @@ const defaultOptions = {
};
describe('DefaultAuthConnector', () => {
const server = setupServer();
msw.setupDefaultHandlers(server);
afterEach(() => {
jest.resetAllMocks();
anyFetch.resetMocks();
});
it('should refresh a session', async () => {
anyFetch.mockResponseOnce(
JSON.stringify({
idToken: 'mock-id-token',
accessToken: 'mock-access-token',
scopes: 'a b c',
expiresInSeconds: '60',
}),
server.use(
rest.get('*', (_req, res, ctx) =>
res(
ctx.json({
idToken: 'mock-id-token',
accessToken: 'mock-access-token',
scopes: 'a b c',
expiresInSeconds: '60',
}),
),
),
);
const helper = new DefaultAuthConnector<any>(defaultOptions);
@@ -64,7 +71,11 @@ describe('DefaultAuthConnector', () => {
});
it('should handle failure to refresh session', async () => {
anyFetch.mockRejectOnce(new Error('Network NOPE'));
server.use(
rest.get('*', (_req, res, ctx) =>
res(ctx.status(500, 'Error: Network NOPE')),
),
);
const helper = new DefaultAuthConnector(defaultOptions);
await expect(helper.refreshSession()).rejects.toThrow(
@@ -73,7 +84,7 @@ describe('DefaultAuthConnector', () => {
});
it('should handle failure response when refreshing session', async () => {
anyFetch.mockResponseOnce({}, { status: 401, statusText: 'NOPE' });
server.use(rest.get('*', (_req, res, ctx) => res(ctx.status(401, 'NOPE'))));
const helper = new DefaultAuthConnector(defaultOptions);
await expect(helper.refreshSession()).rejects.toThrow(
+1 -2
View File
@@ -15,5 +15,4 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
import 'cross-fetch/polyfill';
+1 -2
View File
@@ -65,8 +65,7 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/react-helmet": "^6.1.0",
"@types/zen-observable": "^0.8.0",
"jest-fetch-mock": "^3.0.3"
"@types/zen-observable": "^0.8.0"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+1 -1
View File
@@ -31,7 +31,7 @@
"commander": "^6.1.0",
"fs-extra": "^9.0.0",
"handlebars": "^4.7.3",
"node-fetch": "^2.6.0",
"cross-fetch": "^3.0.6",
"pgtools": "^0.3.0",
"tree-kill": "^1.2.2",
"ts-node": "^8.6.2",
+1 -1
View File
@@ -16,7 +16,7 @@
import os from 'os';
import fs from 'fs-extra';
import fetch from 'node-fetch';
import fetch from 'cross-fetch';
import handlebars from 'handlebars';
import killTree from 'tree-kill';
import { resolve as resolvePath, join as joinPath } from 'path';
+1
View File
@@ -38,6 +38,7 @@
"@testing-library/react": "^10.4.1",
"@testing-library/user-event": "^12.0.7",
"@types/react": "^16.9",
"msw": "^0.21.3",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-router": "6.0.0-beta.0",
@@ -17,3 +17,4 @@
export * from './apis';
export { default as mockBreakpoint } from './mockBreakpoint';
export { wrapInTestApp, renderInTestApp } from './appWrappers';
export * from './msw';
@@ -0,0 +1,27 @@
/*
* Copyright 2020 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export const msw = {
setupDefaultHandlers: (worker: {
listen: (t: any) => void;
close: () => void;
resetHandlers: () => void;
}) => {
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
afterEach(() => worker.resetHandlers());
},
};
+2 -3
View File
@@ -49,9 +49,8 @@
"@types/node": "^12.0.0",
"@types/react": "^16.9",
"@types/swagger-ui-react": "^3.23.3",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+2 -4
View File
@@ -37,7 +37,6 @@
"knex": "^0.21.1",
"moment": "^2.26.0",
"morgan": "^1.10.0",
"node-fetch": "^2.6.1",
"passport": "^0.4.1",
"passport-github2": "^0.1.12",
"passport-gitlab2": "^5.0.0",
@@ -48,6 +47,7 @@
"passport-saml": "^1.3.3",
"uuid": "^8.0.0",
"winston": "^3.2.1",
"cross-fetch": "^3.0.6",
"yn": "^4.0.0"
},
"devDependencies": {
@@ -55,14 +55,12 @@
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/jwt-decode": "2.2.1",
"@types/node-fetch": "^2.5.7",
"@types/passport": "^1.0.3",
"@types/passport-github2": "^1.2.4",
"@types/passport-google-oauth20": "^2.0.3",
"@types/passport-microsoft": "^0.0.0",
"@types/passport-saml": "^1.1.2",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5"
"msw": "^0.21.2"
},
"files": [
"dist",
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import fetch from 'node-fetch';
import fetch from 'cross-fetch';
import { UserEntity } from '@backstage/catalog-model';
import {
ConflictError,
-2
View File
@@ -14,6 +14,4 @@
* limitations under the License.
*/
require('jest-fetch-mock').enableMocks();
export {};
+3 -4
View File
@@ -25,9 +25,9 @@
"@backstage/config": "^0.1.1-alpha.25",
"@octokit/graphql": "^4.5.6",
"@types/express": "^4.17.6",
"@types/node-fetch": "^2.5.7",
"codeowners-utils": "^1.0.2",
"core-js": "^3.6.5",
"cross-fetch": "^3.0.6",
"express": "^4.17.1",
"express-promise-router": "^3.0.3",
"fs-extra": "^9.0.0",
@@ -36,7 +36,6 @@
"ldapjs": "^2.2.0",
"lodash": "^4.17.15",
"morgan": "^1.10.0",
"node-fetch": "^2.6.0",
"p-limit": "^3.0.2",
"sqlite3": "^5.0.0",
"uuid": "^8.0.0",
@@ -47,6 +46,7 @@
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@types/core-js": "^2.5.4",
"@types/git-url-parse": "^9.0.0",
"@types/ldapjs": "^1.0.9",
@@ -54,8 +54,7 @@
"@types/supertest": "^2.0.8",
"@types/uuid": "^8.0.0",
"@types/yup": "^0.29.8",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"msw": "^0.21.2",
"supertest": "^4.0.2"
},
"files": [
@@ -15,8 +15,9 @@
*/
import { LocationSpec } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import fetch, { HeadersInit, RequestInit } from 'node-fetch';
import fetch from 'cross-fetch';
import * as result from './results';
import { CatalogProcessor, CatalogProcessorEmit } from './types';
@@ -44,11 +45,9 @@ export class AzureApiReaderProcessor implements CatalogProcessor {
).toString('base64')}`;
}
const requestOptions: RequestInit = {
return {
headers,
};
return requestOptions;
}
async readLocation(
@@ -67,7 +66,7 @@ export class AzureApiReaderProcessor implements CatalogProcessor {
// for private repos when PAT is not valid, Azure API returns a http status code 203 with sign in page html
if (response.ok && response.status !== 203) {
const data = await response.buffer();
const data = Buffer.from(await response.text());
emit(result.data(location, data));
} else {
const message = `${location.target} could not be read as ${url}, ${response.status} ${response.statusText}`;
@@ -15,9 +15,9 @@
*/
import { LocationSpec } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import fetch, { HeadersInit, RequestInit } from 'node-fetch';
import fetch from 'cross-fetch';
import * as result from './results';
import { Config } from '@backstage/config';
import { CatalogProcessor, CatalogProcessorEmit } from './types';
// ***********************************************************************
@@ -70,8 +70,8 @@ export class BitbucketApiReaderProcessor implements CatalogProcessor {
const response = await fetch(url.toString(), this.getRequestOptions());
if (response.ok) {
const data = await response.buffer();
emit(result.data(location, data));
const data = await response.text();
emit(result.data(location, Buffer.from(data)));
} else {
const message = `${location.target} could not be read as ${url}, ${response.status} ${response.statusText}`;
if (response.status === 404) {
@@ -17,7 +17,7 @@
import { LocationSpec } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import parseGitUri from 'git-url-parse';
import fetch, { HeadersInit, RequestInit } from 'node-fetch';
import fetch from 'cross-fetch';
import { Logger } from 'winston';
import * as result from './results';
import { CatalogProcessor, CatalogProcessorEmit } from './types';
@@ -252,8 +252,8 @@ export class GithubReaderProcessor implements CatalogProcessor {
const response = await fetch(url.toString(), options);
if (response.ok) {
const data = await response.buffer();
emit(result.data(location, data));
const data = await response.text();
emit(result.data(location, Buffer.from(data)));
} else {
const message = `${location.target} could not be read as ${url}, ${response.status} ${response.statusText}`;
if (response.status === 404) {
@@ -15,8 +15,8 @@
*/
import { LocationSpec } from '@backstage/catalog-model';
import fetch from 'cross-fetch';
import { Config } from '@backstage/config';
import fetch, { HeadersInit, RequestInit } from 'node-fetch';
import * as result from './results';
import { CatalogProcessor, CatalogProcessorEmit } from './types';
@@ -61,8 +61,8 @@ export class GitlabApiReaderProcessor implements CatalogProcessor {
const url = this.buildRawUrl(location.target, projectID);
const response = await fetch(url.toString(), this.getRequestOptions());
if (response.ok) {
const data = await response.buffer();
emit(result.data(location, data));
const data = await response.text();
emit(result.data(location, Buffer.from(data)));
} else {
const message = `${location.target} could not be read as ${url}, ${response.status} ${response.statusText}`;
if (response.status === 404) {
@@ -15,7 +15,7 @@
*/
import { LocationSpec } from '@backstage/catalog-model';
import fetch from 'node-fetch';
import fetch from 'cross-fetch';
import * as result from './results';
import { CatalogProcessor, CatalogProcessorEmit } from './types';
@@ -40,8 +40,8 @@ export class GitlabReaderProcessor implements CatalogProcessor {
const response = await fetch(url.toString());
if (response.ok) {
const data = await response.buffer();
emit(result.data(location, data));
const data = await response.text();
emit(result.data(location, Buffer.from(data)));
} else {
const message = `${location.target} could not be read as ${url}, ${response.status} ${response.statusText}`;
if (response.status === 404) {
@@ -14,25 +14,23 @@
* limitations under the License.
*/
import { UrlReaderProcessor } from './UrlReaderProcessor';
import { getVoidLogger, UrlReaders } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
import {
CatalogProcessorDataResult,
CatalogProcessorErrorResult,
CatalogProcessorResult,
} from './types';
import { UrlReaderProcessor } from './UrlReaderProcessor';
describe('UrlReaderProcessor', () => {
const mockApiOrigin = 'http://localhost:23000';
const server = setupServer();
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
msw.setupDefaultHandlers(server);
it('should load from url', async () => {
const logger = getVoidLogger();
const reader = UrlReaders.default({ logger, config: new ConfigReader({}) });
@@ -17,6 +17,7 @@
import { graphql } from '@octokit/graphql';
import { graphql as graphqlMsw } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
import {
getOrganizationTeams,
getOrganizationUsers,
@@ -26,9 +27,7 @@ import {
describe('github', () => {
const server = setupServer();
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
msw.setupDefaultHandlers(server);
describe('getOrganizationUsers', () => {
it('reads members', async () => {
+3 -2
View File
@@ -28,19 +28,20 @@
"graphql": "^15.3.0",
"graphql-tag": "^2.11.0",
"graphql-type-json": "^0.3.2",
"node-fetch": "^2.6.0",
"cross-fetch": "^3.0.6",
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@graphql-codegen/cli": "^1.17.7",
"@graphql-codegen/typescript": "^1.17.7",
"@graphql-codegen/typescript-resolvers": "^1.17.7",
"@types/express": "^4.17.7",
"@types/supertest": "^2.0.8",
"eslint-plugin-graphql": "^4.0.0",
"msw": "^0.20.5",
"supertest": "^4.0.2",
"msw": "^0.21.2",
"ts-node": "^8.10.2"
},
"files": [
@@ -21,6 +21,7 @@ import { setupServer } from 'msw/node';
import { ConfigReader } from '@backstage/config';
import { ReaderEntity } from '../service/client';
import { createLogger } from 'winston';
import { msw } from '@backstage/test-utils';
import { gql } from 'apollo-server';
describe('Catalog Module', () => {
@@ -37,9 +38,7 @@ describe('Catalog Module', () => {
},
]);
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
afterEach(() => worker.resetHandlers());
msw.setupDefaultHandlers(worker);
describe('Default Entity', () => {
beforeEach(() => {
@@ -16,13 +16,11 @@
import { CatalogClient } from './client';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
describe('Catalog GraphQL Module', () => {
const worker = setupServer();
beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));
afterAll(() => worker.close());
afterEach(() => worker.resetHandlers());
msw.setupDefaultHandlers(worker);
const baseUrl = 'http://localhost:1234';
@@ -15,7 +15,7 @@
*/
import { Entity, EntityMeta } from '@backstage/catalog-model';
import fetch from 'node-fetch';
import fetch from 'cross-fetch';
import { JsonObject } from '@backstage/config';
export interface ReaderEntityMeta extends EntityMeta {
+2 -4
View File
@@ -50,11 +50,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1",
"msw": "^0.21.2",
"react-test-renderer": "^16.13.1",
"whatwg-fetch": "^3.4.0"
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
@@ -19,18 +19,17 @@ import { setupServer } from 'msw/node';
import { CatalogClient } from './CatalogClient';
import { Entity } from '@backstage/catalog-model';
import { UrlPatternDiscovery } from '@backstage/core';
import { msw } from '@backstage/test-utils';
const server = setupServer();
const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base';
const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl);
describe('CatalogClient', () => {
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
let client = new CatalogClient({ discoveryApi });
msw.setupDefaultHandlers(server);
beforeEach(() => {
client = new CatalogClient({ discoveryApi });
});
+1 -1
View File
@@ -15,4 +15,4 @@
*/
import '@testing-library/jest-dom';
import 'whatwg-fetch';
import 'cross-fetch/polyfill';
+3 -3
View File
@@ -46,9 +46,9 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/react-lazylog": "^4.5.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom/extend-expect';
require('jest-fetch-mock').enableMocks();
+3 -3
View File
@@ -46,9 +46,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -14,5 +14,3 @@
* limitations under the License.
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+4 -3
View File
@@ -52,9 +52,10 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/yup": "^0.29.8",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"@types/recharts": "^1.8.14",
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+2 -3
View File
@@ -41,9 +41,8 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+3 -3
View File
@@ -38,9 +38,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+3 -3
View File
@@ -47,9 +47,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+3 -3
View File
@@ -39,9 +39,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
@@ -16,7 +16,6 @@
import React from 'react';
import { render } from '@testing-library/react';
import mockFetch from 'jest-fetch-mock';
import ProfileCatalog from './ProfileCatalog';
import { ThemeProvider } from '@material-ui/core';
import { lightTheme } from '@backstage/theme';
@@ -45,7 +44,6 @@ describe('ProfileCatalog', () => {
}),
],
]);
mockFetch.mockResponse(() => new Promise(() => {}));
const rendered = render(
<ThemeProvider theme={lightTheme}>
<ApiProvider apis={apis}>
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+3 -4
View File
@@ -52,10 +52,9 @@
"@types/codemirror": "^0.0.97",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1",
"react-router-dom": "6.0.0-beta.0"
"msw": "^0.21.2",
"react-router-dom": "6.0.0-beta.0",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
-1
View File
@@ -30,7 +30,6 @@
"express-promise-router": "^3.0.3",
"graphql": "^15.3.0",
"helmet": "^4.0.0",
"node-fetch": "^2.6.0",
"reflect-metadata": "^0.1.13",
"winston": "^3.2.1",
"yn": "^4.0.0"
+3 -3
View File
@@ -44,9 +44,9 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/testing-library__jest-dom": "^5.9.1",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
-1
View File
@@ -38,7 +38,6 @@
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"jest-fetch-mock": "^3.0.3",
"supertest": "^4.0.2"
},
"files": [
@@ -14,6 +14,4 @@
* limitations under the License.
*/
require('jest-fetch-mock').enableMocks();
export {};
+2 -3
View File
@@ -43,9 +43,8 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -14,5 +14,3 @@
* limitations under the License.
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+2 -3
View File
@@ -47,9 +47,8 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
@@ -22,7 +22,6 @@ import {
LighthouseRestApi,
WebsiteListResponse,
} from '../../api';
import mockFetch from 'jest-fetch-mock';
import * as data from '../../__fixtures__/website-list-response.json';
import { EntityContext } from '@backstage/plugin-catalog';
@@ -53,7 +52,7 @@ describe('<AuditListTableForEntity />', () => {
[lighthouseApiRef, new LighthouseRestApi('http://lighthouse')],
[errorApiRef, mockErrorApi],
]);
mockFetch.mockResponse(JSON.stringify(entityWebsite));
(useWebsiteForEntity as jest.Mock).mockReturnValue({
value: entityWebsite,
loading: false,
@@ -16,7 +16,7 @@
import React from 'react';
import { render } from '@testing-library/react';
import { wrapInTestApp } from '@backstage/test-utils';
import { wrapInTestApp, msw } from '@backstage/test-utils';
import { ApiRegistry, ApiProvider } from '@backstage/core';
import AuditListTable from './AuditListTable';
@@ -26,7 +26,7 @@ import {
LighthouseRestApi,
} from '../../api';
import { formatTime } from '../../utils';
import mockFetch from 'jest-fetch-mock';
import { setupServer } from 'msw/node';
import * as data from '../../__fixtures__/website-list-response.json';
@@ -35,11 +35,13 @@ const websiteListResponse = data as WebsiteListResponse;
describe('AuditListTable', () => {
let apis: ApiRegistry;
const server = setupServer();
msw.setupDefaultHandlers(server);
beforeEach(() => {
apis = ApiRegistry.from([
[lighthouseApiRef, new LighthouseRestApi('http://lighthouse')],
]);
mockFetch.mockResponse(JSON.stringify(websiteListResponse));
});
const auditList = (websiteList: WebsiteListResponse) => {
@@ -24,10 +24,9 @@ jest.mock('react-router-dom', () => {
});
import React from 'react';
import mockFetch from 'jest-fetch-mock';
import { render, fireEvent } from '@testing-library/react';
import { ApiRegistry, ApiProvider } from '@backstage/core';
import { wrapInTestApp } from '@backstage/test-utils';
import { wrapInTestApp, msw } from '@backstage/test-utils';
import {
lighthouseApiRef,
@@ -40,18 +39,23 @@ import * as data from '../../__fixtures__/website-list-response.json';
const { useNavigate } = jest.requireMock('react-router-dom');
const websiteListResponse = data as WebsiteListResponse;
import { rest } from 'msw';
import { setupServer } from 'msw/node';
describe('AuditList', () => {
let apis: ApiRegistry;
const server = setupServer();
msw.setupDefaultHandlers(server);
beforeEach(() => {
apis = ApiRegistry.from([
[lighthouseApiRef, new LighthouseRestApi('http://lighthouse')],
]);
mockFetch.mockResponse(JSON.stringify(websiteListResponse));
});
it('should render the table', async () => {
server.use(rest.get('*', (_req, res, ctx) => res(ctx.json(data))));
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -76,22 +80,6 @@ describe('AuditList', () => {
});
describe('pagination', () => {
it('requests the correct limit and offset from the api based on the query', () => {
mockFetch.mockClear();
render(
wrapInTestApp(
<ApiProvider apis={apis}>
<AuditList />
</ApiProvider>,
{ routeEntries: ['?page=2'] },
),
);
expect(mockFetch).toHaveBeenLastCalledWith(
'http://lighthouse/v1/websites?limit=10&offset=10',
undefined,
);
});
describe('when only one page is needed', () => {
it('hides pagination elements', () => {
const rendered = render(
@@ -111,7 +99,8 @@ describe('AuditList', () => {
response.limit = 5;
response.offset = 5;
response.total = 7;
mockFetch.mockResponseOnce(JSON.stringify(response));
server.use(rest.get('*', (_req, res, ctx) => res(ctx.json(response))));
server.use(rest.post('*', (_req, res, ctx) => res(ctx.json(response))));
});
it('shows pagination elements', async () => {
@@ -146,7 +135,7 @@ describe('AuditList', () => {
describe('when waiting on the request', () => {
it('should render the loader', async () => {
mockFetch.mockResponseOnce(() => new Promise(() => {}));
server.use(rest.get('*', (_req, res, ctx) => res(ctx.delay(20000))));
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -161,7 +150,11 @@ describe('AuditList', () => {
describe('when the audits fail', () => {
it('should render an error', async () => {
mockFetch.mockRejectOnce(new Error('failed to fetch'));
server.use(
rest.get('*', (_req, res, ctx) =>
res(ctx.status(500, 'something broke')),
),
);
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -27,29 +27,36 @@ jest.mock('react-router-dom', () => {
});
import React from 'react';
import mockFetch from 'jest-fetch-mock';
import { render, fireEvent } from '@testing-library/react';
import { wrapInTestApp } from '@backstage/test-utils';
import { render } from '@testing-library/react';
import { wrapInTestApp, msw } from '@backstage/test-utils';
import { ApiRegistry, ApiProvider } from '@backstage/core';
import AuditView from '.';
import { lighthouseApiRef, LighthouseRestApi, Audit, Website } from '../../api';
import { formatTime } from '../../utils';
import * as data from '../../__fixtures__/website-response.json';
import { act } from 'react-dom/test-utils';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
const { useParams }: { useParams: jest.Mock } = jest.requireMock(
'react-router-dom',
);
const websiteResponse = data as Website;
const { useNavigate } = jest.requireMock('react-router-dom');
describe('AuditView', () => {
let apis: ApiRegistry;
let id: string;
const server = setupServer();
msw.setupDefaultHandlers(server);
beforeEach(() => {
mockFetch.mockResponse(JSON.stringify(websiteResponse));
server.use(
rest.get('https://lighthouse/*', async (_req, res, ctx) =>
res(ctx.json(websiteResponse)),
),
);
apis = ApiRegistry.from([
[lighthouseApiRef, new LighthouseRestApi('https://lighthouse')],
]);
@@ -74,27 +81,6 @@ describe('AuditView', () => {
expect(iframe).toHaveAttribute('src', `https://lighthouse/v1/audits/${id}`);
});
it('renders a button to click to create a new audit for this website', async () => {
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
<AuditView />
</ApiProvider>,
),
);
const button = await rendered.findByText('Create New Audit');
expect(button).toBeInTheDocument();
act(() => {
fireEvent.click(button);
});
expect(useNavigate()).toHaveBeenCalledWith(
`../../create-audit?url=${encodeURIComponent('https://spotify.com')}`,
);
});
describe('sidebar', () => {
it('renders a list of all audits for the website', async () => {
const rendered = render(
@@ -164,7 +150,7 @@ describe('AuditView', () => {
describe('when the request for the website by id is pending', () => {
it('shows the loading', async () => {
mockFetch.mockImplementationOnce(() => new Promise(() => {}));
server.use(rest.get('*', (_req, res, ctx) => res(ctx.delay(20000))));
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -178,7 +164,11 @@ describe('AuditView', () => {
describe('when the request for the website by id fails', () => {
it('shows an error', async () => {
mockFetch.mockRejectOnce(new Error('failed to fetch'));
server.use(
rest.get('*', (_req, res, ctx) =>
res(ctx.status(500), ctx.body('failed to fetch')),
),
);
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -186,7 +176,7 @@ describe('AuditView', () => {
</ApiProvider>,
),
);
expect(await rendered.findByText('failed to fetch')).toBeInTheDocument();
expect(await rendered.findByText(/failed to fetch/)).toBeInTheDocument();
});
});
@@ -24,20 +24,22 @@ jest.mock('react-router-dom', () => {
});
import React from 'react';
import mockFetch from 'jest-fetch-mock';
import { wait, render, fireEvent } from '@testing-library/react';
import { waitFor, render, fireEvent } from '@testing-library/react';
import {
ApiRegistry,
ApiProvider,
ErrorApi,
errorApiRef,
} from '@backstage/core';
import { wrapInTestApp } from '@backstage/test-utils';
import { wrapInTestApp, msw } from '@backstage/test-utils';
import { lighthouseApiRef, LighthouseRestApi, Audit } from '../../api';
import CreateAudit from '.';
import * as data from '../../__fixtures__/create-audit-response.json';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
const { useNavigate }: { useNavigate: jest.Mock } = jest.requireMock(
'react-router-dom',
);
@@ -47,6 +49,8 @@ const createAuditResponse = data as Audit;
describe('CreateAudit', () => {
let apis: ApiRegistry;
let errorApi: ErrorApi;
const server = setupServer();
msw.setupDefaultHandlers(server);
beforeEach(() => {
errorApi = { post: jest.fn(), error$: jest.fn() };
@@ -88,7 +92,7 @@ describe('CreateAudit', () => {
describe('when waiting on the request', () => {
it('disables the form fields', () => {
mockFetch.mockResponseOnce(() => new Promise(() => {}));
server.use(rest.get('*', (_req, res, ctx) => res(ctx.delay(20000))));
const rendered = render(
wrapInTestApp(
@@ -111,7 +115,11 @@ describe('CreateAudit', () => {
describe('when the audit is successfully created', () => {
it('triggers a location change to the table', async () => {
useNavigate.mockClear();
mockFetch.mockResponseOnce(JSON.stringify(createAuditResponse));
server.use(
rest.post('http://lighthouse/v1/audits', (_req, res, ctx) =>
res(ctx.json(createAuditResponse)),
),
);
const rendered = render(
wrapInTestApp(
@@ -126,14 +134,7 @@ describe('CreateAudit', () => {
});
fireEvent.click(rendered.getByText(/Create Audit/));
expect(mockFetch).toHaveBeenCalledWith(
'http://lighthouse/v1/audits',
expect.objectContaining({
method: 'POST',
}),
);
await wait(() => expect(rendered.getByLabelText(/URL/)).toBeEnabled());
await waitFor(() => expect(rendered.getByLabelText(/URL/)).toBeEnabled());
expect(useNavigate()).toHaveBeenCalledWith('..');
});
@@ -141,9 +142,11 @@ describe('CreateAudit', () => {
describe('when the audits fail', () => {
it('should render an error', async () => {
(errorApi.post as jest.Mock).mockClear();
mockFetch.mockRejectOnce(new Error('failed to post'));
server.use(
rest.post('http://lighthouse/v1/audits', (_req, res, ctx) =>
res(ctx.status(500, 'failed to post')),
),
);
const rendered = render(
wrapInTestApp(
<ApiProvider apis={apis}>
@@ -157,8 +160,7 @@ describe('CreateAudit', () => {
});
fireEvent.click(rendered.getByText(/Create Audit/));
await wait(() => expect(rendered.getByLabelText(/URL/)).toBeEnabled());
await new Promise(r => setTimeout(r, 0));
await waitFor(() => expect(rendered.getByLabelText(/URL/)).toBeEnabled());
expect(errorApi.post).toHaveBeenCalledWith(expect.any(Error));
});
+1 -2
View File
@@ -15,5 +15,4 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
import 'cross-fetch/polyfill';
+3 -3
View File
@@ -38,9 +38,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
-3
View File
@@ -26,7 +26,6 @@
"express-promise-router": "^3.0.3",
"http-proxy-middleware": "^0.19.1",
"morgan": "^1.10.0",
"node-fetch": "^2.6.0",
"uuid": "^8.0.0",
"winston": "^3.2.1",
"yaml": "^1.9.2",
@@ -36,11 +35,9 @@
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@types/http-proxy-middleware": "^0.19.3",
"@types/node-fetch": "^2.5.7",
"@types/supertest": "^2.0.8",
"@types/uuid": "^8.0.0",
"@types/yup": "^0.29.8",
"jest-fetch-mock": "^3.0.3",
"supertest": "^4.0.2"
},
"files": [
-2
View File
@@ -14,6 +14,4 @@
* limitations under the License.
*/
require('jest-fetch-mock').enableMocks();
export {};
+3 -3
View File
@@ -43,9 +43,9 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
-1
View File
@@ -39,7 +39,6 @@
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@types/supertest": "^2.0.8",
"jest-fetch-mock": "^3.0.3",
"supertest": "^4.0.2"
},
"files": [
@@ -14,6 +14,4 @@
* limitations under the License.
*/
require('jest-fetch-mock').enableMocks();
export {};
+2 -3
View File
@@ -47,9 +47,8 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/react": "^16.9",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+2 -3
View File
@@ -49,9 +49,8 @@
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+1 -2
View File
@@ -34,8 +34,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"jest-fetch-mock": "^3.0.3"
"@backstage/cli": "^0.1.1-alpha.25"
},
"files": [
"dist"
+3 -3
View File
@@ -38,14 +38,14 @@
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@backstage/dev-utils": "^0.1.1-alpha.25",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^10.4.1",
"@testing-library/user-event": "^12.0.7",
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"cross-fetch": "^3.0.6",
"msw": "^0.21.2"
},
"files": [
"dist"
@@ -16,10 +16,13 @@
import React from 'react';
import { render } from '@testing-library/react';
import mockFetch from 'jest-fetch-mock';
import SentryPluginPage from './SentryPluginPage';
import { ThemeProvider } from '@material-ui/core';
import { lightTheme } from '@backstage/theme';
import { msw } from '@backstage/test-utils';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
import {
ApiProvider,
ApiRegistry,
@@ -31,8 +34,11 @@ const errorApi = { post: () => {} };
const ConfigApi = { getString: () => 'test' };
describe('SentryPluginPage', () => {
const server = setupServer();
msw.setupDefaultHandlers(server);
it('should render header and time switched', () => {
mockFetch.mockResponse('{}');
server.use(rest.get('/', (_req, res, ctx) => res(ctx.json({}))));
const rendered = render(
<ApiProvider
apis={ApiRegistry.from([
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+3 -3
View File
@@ -45,9 +45,9 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"@types/react": "^16.9",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();
+1 -2
View File
@@ -32,13 +32,12 @@
"fs-extra": "^9.0.1",
"git-url-parse": "^11.3.0",
"knex": "^0.21.1",
"node-fetch": "^2.6.0",
"nodegit": "^0.27.0",
"cross-fetch": "^3.0.6",
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.25",
"@types/node-fetch": "^2.5.7",
"supertest": "^4.0.2"
},
"files": [
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fetch, { RequestInit } from 'node-fetch';
import fetch from 'cross-fetch';
import parseGitUrl from 'git-url-parse';
import { Config } from '@backstage/config';
import { getRootLogger, loadBackendConfig } from '@backstage/backend-common';
@@ -1,4 +1,3 @@
import fetch from 'node-fetch';
/*
* Copyright 2020 Spotify AB
*
@@ -15,6 +14,8 @@ import fetch from 'node-fetch';
* limitations under the License.
*/
import fetch from 'cross-fetch';
export class TechDocsMetadata {
private async getMetadataFile(docsUrl: String) {
const metadataURL = `${docsUrl}/techdocs_metadata.json`;
@@ -17,7 +17,7 @@ import { Logger } from 'winston';
import Router from 'express-promise-router';
import express from 'express';
import Knex from 'knex';
import fetch from 'node-fetch';
import fetch from 'cross-fetch';
import { Config } from '@backstage/config';
import Docker from 'dockerode';
import {
@@ -111,7 +111,9 @@ export async function createRouter({
const catalogRes = await fetch(`${catalogUrl}/entities/by-name/${triple}`);
if (!catalogRes.ok) {
catalogRes.body.pipe(res.status(catalogRes.status));
const catalogResText = await catalogRes.text();
res.status(catalogRes.status);
res.send(catalogResText);
return;
}
+3 -3
View File
@@ -48,9 +48,9 @@
"@types/jest": "^26.0.7",
"@types/node": "^12.0.0",
"canvas": "^2.6.1",
"jest-fetch-mock": "^3.0.3",
"msw": "^0.20.5",
"node-fetch": "^2.6.1"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25"
},
"files": [
"dist"
-2
View File
@@ -15,5 +15,3 @@
*/
import '@testing-library/jest-dom';
require('jest-fetch-mock').enableMocks();

Some files were not shown because too many files have changed in this diff Show More