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
+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();
+2 -2
View File
@@ -40,8 +40,8 @@
"@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"
+4 -4
View File
@@ -38,10 +38,10 @@
"@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"
"msw": "^0.21.2",
"cross-fetch": "^3.0.6",
"@backstage/test-utils": "^0.1.1-alpha.25",
"@types/node": "^12.0.0"
},
"files": [
"dist"