From 1d2e28c26f826ec0eb0c6c1c0288db0cc738ee6e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 14:25:00 +0200 Subject: [PATCH 1/8] core-app-api: clean up log output in tests Signed-off-by: Patrik Oldsberg --- .../core-app-api/src/routing/RoutingProvider.compat.test.tsx | 3 +-- .../core-app-api/src/routing/RoutingProvider.stable.test.tsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/core-app-api/src/routing/RoutingProvider.compat.test.tsx b/packages/core-app-api/src/routing/RoutingProvider.compat.test.tsx index 1ff80fcacc..ac54780f7c 100644 --- a/packages/core-app-api/src/routing/RoutingProvider.compat.test.tsx +++ b/packages/core-app-api/src/routing/RoutingProvider.compat.test.tsx @@ -251,7 +251,6 @@ describe.each(['beta', 'stable'])('react-router %s', rrVersion => { await new Promise(r => setTimeout(r, 500)); - rendered.debug(); await expect( rendered.findByText('Path at inside: /foo/bar'), ).resolves.toBeInTheDocument(); @@ -344,7 +343,6 @@ describe.each(['beta', 'stable'])('react-router %s', rrVersion => { await expect( rendered.findByText('Path at inside: /foo/blob/baz'), ).resolves.toBeInTheDocument(); - rendered.debug(); }); it('should throw errors for routing to other routeRefs with unsupported parameters', () => { @@ -352,6 +350,7 @@ describe.each(['beta', 'stable'])('react-router %s', rrVersion => { const root = ( + } /> }> { await expect( rendered.findByText('Path at inside: /foo/blob/baz'), ).resolves.toBeInTheDocument(); - rendered.debug(); }); it('should throw errors for routing to other routeRefs with unsupported parameters', () => { const root = ( + } /> }> Date: Sun, 11 Sep 2022 14:32:30 +0200 Subject: [PATCH 2/8] core-plugin-api: clean up log output in tests Signed-off-by: Patrik Oldsberg --- .../src/extensions/extensions.test.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/core-plugin-api/src/extensions/extensions.test.tsx b/packages/core-plugin-api/src/extensions/extensions.test.tsx index dcc92d9d47..0601c01a17 100644 --- a/packages/core-plugin-api/src/extensions/extensions.test.tsx +++ b/packages/core-plugin-api/src/extensions/extensions.test.tsx @@ -61,11 +61,19 @@ describe('extensions', () => { const Component = () =>
; const routeRef = createRouteRef({ id: 'foo' }); - const extension1 = createComponentExtension({ - component: { - sync: Component, - }, + let extension1: ReturnType; + const { warn } = withLogCollector(['warn'], () => { + extension1 = createComponentExtension({ + component: { + sync: Component, + }, + }); }); + expect(warn).toEqual([ + expect.stringMatching( + /^Declaring extensions without name is DEPRECATED. /, + ), + ]); const extension2 = createRoutableExtension({ name: 'Extension2', @@ -73,7 +81,7 @@ describe('extensions', () => { mountPoint: routeRef, }); - const ExtensionComponent1 = plugin.provide(extension1); + const ExtensionComponent1 = plugin.provide(extension1!); const ExtensionComponent2 = plugin.provide(extension2); const element1 = ; From 5ecca7e44b9f5b67dfcd38b0b390c105f24c3e3d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 15:24:37 +0200 Subject: [PATCH 3/8] config-loader: remove logging from remote config watch Signed-off-by: Patrik Oldsberg --- .changeset/empty-colts-whisper.md | 5 +++++ packages/config-loader/src/loader.ts | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 .changeset/empty-colts-whisper.md diff --git a/.changeset/empty-colts-whisper.md b/.changeset/empty-colts-whisper.md new file mode 100644 index 0000000000..1eabe8c58c --- /dev/null +++ b/.changeset/empty-colts-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/config-loader': patch +--- + +No longer log when reloading remote config. diff --git a/packages/config-loader/src/loader.ts b/packages/config-loader/src/loader.ts index 9537d2d945..f5ce0eb80c 100644 --- a/packages/config-loader/src/loader.ts +++ b/packages/config-loader/src/loader.ts @@ -287,13 +287,10 @@ export async function loadConfig( let handle: NodeJS.Timeout | undefined; try { handle = setInterval(async () => { - console.info(`Checking for config update`); const newRemoteConfigs = await loadRemoteConfigFiles(); if (await hasConfigChanged(remoteConfigs, newRemoteConfigs)) { remoteConfigs = newRemoteConfigs; - console.info(`Remote config change, reloading config ...`); watchProp.onChange([...remoteConfigs, ...fileConfigs, ...envConfigs]); - console.info(`Remote config reloaded`); } }, remoteProp.reloadIntervalSeconds * 1000); } catch (error) { @@ -303,7 +300,6 @@ export async function loadConfig( if (watchProp.stopSignal) { watchProp.stopSignal.then(() => { if (handle !== undefined) { - console.info(`Stopping remote config watch`); clearInterval(handle); handle = undefined; } From 50d6c7e07e23a8b24be93587a122e69a91aaeaed Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 15:51:31 +0200 Subject: [PATCH 4/8] create-app: clean up log output in tests Signed-off-by: Patrik Oldsberg --- packages/create-app/src/lib/tasks.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 6a312436bf..d2efe81b90 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -19,6 +19,7 @@ import mockFs from 'mock-fs'; import child_process from 'child_process'; import path from 'path'; import { + Task, buildAppTask, checkAppExistsTask, checkPathExistsTask, @@ -27,6 +28,13 @@ import { templatingTask, } from './tasks'; +jest.spyOn(Task, 'log').mockReturnValue(undefined); +jest.spyOn(Task, 'error').mockReturnValue(undefined); +jest.spyOn(Task, 'section').mockReturnValue(undefined); +jest + .spyOn(Task, 'forItem') + .mockImplementation((_a, _b, taskFunc) => taskFunc()); + jest.mock('child_process'); // By mocking this the filesystem mocks won't mess with reading all of the package.jsons From 3742ccbfc319b4ff5fb2d7ef232c722d650afb91 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 16:52:07 +0200 Subject: [PATCH 5/8] core-components: avoid logging in GaugeCard test Signed-off-by: Patrik Oldsberg --- .../src/components/ProgressBars/GaugeCard.test.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.test.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.test.tsx index ea29a288e6..e4d84ca059 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.test.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.test.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { renderInTestApp } from '@backstage/test-utils'; +import { renderInTestApp, withLogCollector } from '@backstage/test-utils'; import { GaugeCard } from './GaugeCard'; @@ -40,7 +40,12 @@ describe('', () => { it('handles invalid numbers', async () => { const badProps = { title: 'Tingle upgrade', progress: 'hejjo' } as any; - const { getByText } = await renderInTestApp(); - expect(getByText(/N\/A.*/)).toBeInTheDocument(); + const { error } = await withLogCollector(async () => { + const { getByText } = await renderInTestApp(); + expect(getByText(/N\/A.*/)).toBeInTheDocument(); + }); + expect(error).toEqual([ + expect.stringMatching(/^Warning: `NaN` is an invalid value/), + ]); }); }); From a1a3a5f16a4ce1822e370673fda2f9e3a7d0a5da Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 16:52:18 +0200 Subject: [PATCH 6/8] core-components: avoid logging in HeaderTabs test Signed-off-by: Patrik Oldsberg --- .../core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx index 2501785701..f9348ffa9a 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx @@ -58,6 +58,7 @@ describe('', () => { const TextualBadge = React.forwardRef((props, ref) => ( From 4710e6eeb640edd8f61142a2710bb3020be87255 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 16:54:25 +0200 Subject: [PATCH 7/8] core-components: avoid logging in HomepageTimer test Signed-off-by: Patrik Oldsberg --- .../HomepageTimer/HomepageTimer.test.tsx | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/core-components/src/layout/HomepageTimer/HomepageTimer.test.tsx b/packages/core-components/src/layout/HomepageTimer/HomepageTimer.test.tsx index 3d9dfe70a1..9a7a8ac47d 100644 --- a/packages/core-components/src/layout/HomepageTimer/HomepageTimer.test.tsx +++ b/packages/core-components/src/layout/HomepageTimer/HomepageTimer.test.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ -import { renderWithEffects, TestApiProvider } from '@backstage/test-utils'; +import { + renderWithEffects, + TestApiProvider, + withLogCollector, +} from '@backstage/test-utils'; import { HomepageTimer } from './HomepageTimer'; import React from 'react'; import { lightTheme } from '@backstage/theme'; @@ -35,13 +39,18 @@ it('changes default timezone to GMT', async () => { context: 'test', }); - const rendered = await renderWithEffects( - - - - - , - ); + const { warn } = await withLogCollector(async () => { + const rendered = await renderWithEffects( + + + + + , + ); - expect(rendered.getByText('GMT')).toBeInTheDocument(); + expect(rendered.getByText('GMT')).toBeInTheDocument(); + }); + expect(warn).toEqual([ + 'The timezone America/New_Pork is invalid. Defaulting to GMT', + ]); }); From 87de8ed3f7e6784381f2eab535c3d8399e99c472 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 11 Sep 2022 16:57:35 +0200 Subject: [PATCH 8/8] core-components: fix usage of invalid elements in DependencyGrape tests Signed-off-by: Patrik Oldsberg --- .../components/DependencyGraph/Edge.test.tsx | 27 ++++++++++++++----- .../components/DependencyGraph/Node.test.tsx | 23 +++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/packages/core-components/src/components/DependencyGraph/Edge.test.tsx b/packages/core-components/src/components/DependencyGraph/Edge.test.tsx index 82f0435ebd..db6fbe7552 100644 --- a/packages/core-components/src/components/DependencyGraph/Edge.test.tsx +++ b/packages/core-components/src/components/DependencyGraph/Edge.test.tsx @@ -38,7 +38,7 @@ const id = { const setEdge = jest.fn(); const renderElement = jest.fn((props: RenderLabelProps) => ( - {props.edge.label} +
{props.edge.label}
)); const minProps = { @@ -53,8 +53,7 @@ const edgeWithLabel = { ...edge, label }; describe('', () => { beforeEach(() => { - // jsdom does not support SVG elements so we have to fall back to HTMLUnknownElement - Object.defineProperty(window.HTMLUnknownElement.prototype, 'getBBox', { + Object.defineProperty(window.SVGElement.prototype, 'getBBox', { value: () => ({ width: 100, height: 100 }), configurable: true, }); @@ -63,26 +62,40 @@ describe('', () => { afterEach(jest.clearAllMocks); it('does not render the supplied label element if label is missing', () => { - const { container } = render(); + const { container } = render( + + + , + ); expect(container.getElementsByTagName('g')).toHaveLength(0); }); it('renders the supplied label element if label is present', () => { - const { getByText } = render(); + const { getByText } = render( + + + , + ); expect(getByText(label)).toBeInTheDocument(); }); it('passes down edge properties to the render method if label is present', () => { const edgeWithRandomProp = { ...edge, label, randomProp: true }; render( - , + + + , ); expect(renderElement).toHaveBeenCalledWith({ edge: edgeWithRandomProp }); }); it('calls setEdge with edge ID and actual label size after rendering', () => { - const { getByText } = render(); + const { getByText } = render( + + + , + ); expect(getByText(label)).toBeInTheDocument(); // Updates the edge in the graph diff --git a/packages/core-components/src/components/DependencyGraph/Node.test.tsx b/packages/core-components/src/components/DependencyGraph/Node.test.tsx index aaba09c004..ea69220336 100644 --- a/packages/core-components/src/components/DependencyGraph/Node.test.tsx +++ b/packages/core-components/src/components/DependencyGraph/Node.test.tsx @@ -23,7 +23,7 @@ import { RenderNodeProps } from './types'; const node = { id: 'abc', x: 0, y: 0, width: 0, height: 0 }; const setNode = jest.fn(() => new dagre.graphlib.Graph()); const renderElement = jest.fn((props: RenderNodeProps) => ( - {props.node.id} +
{props.node.id}
)); const minProps = { @@ -34,8 +34,7 @@ const minProps = { describe('', () => { beforeEach(() => { - // jsdom does not support SVG elements so we have to fall back to HTMLUnknownElement - Object.defineProperty(window.HTMLUnknownElement.prototype, 'getBBox', { + Object.defineProperty(window.SVGElement.prototype, 'getBBox', { value: () => ({ width: 100, height: 100 }), configurable: true, }); @@ -44,19 +43,31 @@ describe('', () => { afterEach(jest.clearAllMocks); it('renders the supplied element', () => { - const { getByText } = render(); + const { getByText } = render( + + + , + ); expect(getByText(minProps.node.id)).toBeInTheDocument(); }); it('passes down node properties to the render method', () => { const nodeWithRandomProp = { ...node, randomProp: true }; - render(); + render( + + + , + ); expect(renderElement).toHaveBeenCalledWith({ node: nodeWithRandomProp }); }); it('calls setNode with node ID and actual size after rendering', () => { - const { getByText } = render(); + const { getByText } = render( + + + , + ); expect(getByText(minProps.node.id)).toBeInTheDocument(); // Updates the node in the graph