diff --git a/packages/core/package.json b/packages/core/package.json
index 70c1a9e647..d65f0a16e5 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -60,7 +60,8 @@
"react-sparklines": "^1.7.0",
"react-syntax-highlighter": "^13.5.1",
"react-use": "^15.3.3",
- "remark-gfm": "^1.0.0"
+ "remark-gfm": "^1.0.0",
+ "zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.3.0",
diff --git a/packages/core/src/components/AlertDisplay/AlertDisplay.test.tsx b/packages/core/src/components/AlertDisplay/AlertDisplay.test.tsx
new file mode 100644
index 0000000000..3f85dab9f3
--- /dev/null
+++ b/packages/core/src/components/AlertDisplay/AlertDisplay.test.tsx
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+
+import React from 'react';
+import { AlertDisplay } from './AlertDisplay';
+import {
+ ApiProvider,
+ ApiRegistry,
+ alertApiRef,
+ AlertApiForwarder,
+} from '@backstage/core-api';
+import Observable from 'zen-observable';
+import { renderInTestApp } from '@backstage/test-utils';
+
+const TEST_MESSAGE = 'TEST_MESSAGE';
+
+describe('', () => {
+ it('renders without exploding', async () => {
+ const apiRegistry = ApiRegistry.from([
+ [alertApiRef, new AlertApiForwarder()],
+ ]);
+
+ const { queryByText } = await renderInTestApp(
+
+
+ ,
+ );
+ expect(queryByText(TEST_MESSAGE)).not.toBeInTheDocument();
+ });
+
+ it('renders with message', async () => {
+ const apiRegistry = ApiRegistry.from([
+ [
+ alertApiRef,
+ {
+ post() {},
+ alert$() {
+ return Observable.of({ message: TEST_MESSAGE });
+ },
+ },
+ ],
+ ]);
+
+ const { queryByText } = await renderInTestApp(
+
+
+ ,
+ );
+
+ expect(queryByText(TEST_MESSAGE)).toBeInTheDocument();
+ });
+});
diff --git a/packages/core/src/components/EmptyState/EmptyState.test.tsx b/packages/core/src/components/EmptyState/EmptyState.test.tsx
index c5bc7a9876..32e71f044d 100644
--- a/packages/core/src/components/EmptyState/EmptyState.test.tsx
+++ b/packages/core/src/components/EmptyState/EmptyState.test.tsx
@@ -34,6 +34,6 @@ describe('', () => {
rendered.getByText('Your plugin is missing an annotation'),
).toBeInTheDocument();
expect(rendered.getByLabelText('button')).toBeInTheDocument();
- expect(rendered.getByTestId('missingAnnotation')).toBeInTheDocument();
+ expect(rendered.getByAltText('annotation is missing')).toBeInTheDocument();
});
});
diff --git a/packages/core/src/components/EmptyState/EmptyStateImage.test.tsx b/packages/core/src/components/EmptyState/EmptyStateImage.test.tsx
new file mode 100644
index 0000000000..258eee943d
--- /dev/null
+++ b/packages/core/src/components/EmptyState/EmptyStateImage.test.tsx
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+import React from 'react';
+import { renderWithEffects, wrapInTestApp } from '@backstage/test-utils';
+import { EmptyStateImage } from './EmptyStateImage';
+
+describe('', () => {
+ it('render EmptyStateImage component with missing field', async () => {
+ const { getByAltText } = await renderWithEffects(
+ wrapInTestApp(),
+ );
+ expect(getByAltText('annotation is missing')).toBeInTheDocument();
+ });
+
+ it('render EmptyStateImage component with missing info', async () => {
+ const { getByAltText } = await renderWithEffects(
+ wrapInTestApp(),
+ );
+ expect(getByAltText('no Information')).toBeInTheDocument();
+ });
+
+ it('render EmptyStateImage component with missing content', async () => {
+ const { getByAltText } = await renderWithEffects(
+ wrapInTestApp(),
+ );
+ expect(getByAltText('create Component')).toBeInTheDocument();
+ });
+
+ it('render EmptyStateImage component with missing data', async () => {
+ const { getByAltText } = await renderWithEffects(
+ wrapInTestApp(),
+ );
+ expect(getByAltText('no Build')).toBeInTheDocument();
+ });
+});
diff --git a/packages/core/src/components/EmptyState/EmptyStateImage.tsx b/packages/core/src/components/EmptyState/EmptyStateImage.tsx
index d52a0f7dcf..1973ff9a23 100644
--- a/packages/core/src/components/EmptyState/EmptyStateImage.tsx
+++ b/packages/core/src/components/EmptyState/EmptyStateImage.tsx
@@ -45,7 +45,6 @@ export const EmptyStateImage = ({ missing }: Props) => {
src={missingAnnotation}
className={classes.generalImg}
alt="annotation is missing"
- data-testid="missingAnnotation"
/>
);
case 'info':
diff --git a/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx b/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx
new file mode 100644
index 0000000000..83a31f198d
--- /dev/null
+++ b/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.test.tsx
@@ -0,0 +1,154 @@
+/*
+ * 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.
+ */
+
+import React from 'react';
+import { act, fireEvent } from '@testing-library/react';
+import { renderInTestApp } from '@backstage/test-utils';
+import { FeatureCalloutCircular } from './FeatureCalloutCircular';
+
+const INITIAL_BOUNDING_RECT: DOMRect = {
+ width: 100,
+ height: 100,
+ x: 0,
+ y: 0,
+ bottom: 0,
+ left: 0,
+ right: 0,
+ top: 0,
+ toJSON: () => {},
+};
+
+const UPDATED_BOUNDING_RECT: DOMRect = {
+ width: 200,
+ height: 200,
+ x: 50,
+ y: 50,
+ bottom: 0,
+ left: 0,
+ right: 0,
+ top: 0,
+ toJSON: () => {},
+};
+
+beforeEach(() => {
+ Element.prototype.getBoundingClientRect = jest.fn(
+ () => INITIAL_BOUNDING_RECT,
+ );
+});
+
+describe('', () => {
+ it('renders without exploding', async () => {
+ const rendered = await renderInTestApp(
+ ,
+ );
+ rendered.getByText('description');
+ rendered.getByText('title');
+ });
+
+ it('renders with correct style', async () => {
+ const { getByTestId } = await renderInTestApp(
+ ,
+ );
+ const dot = await getByTestId('dot');
+ const text = await getByTestId('text');
+
+ expect(dot).toBeInTheDocument();
+ expect(text).toBeInTheDocument();
+
+ // Dot style
+ expect(dot.style.left).toBe('-800px');
+ expect(dot.style.top).toBe('-800px');
+ expect(dot.style.width).toBe('1700px');
+ expect(dot.style.height).toBe('1700px');
+
+ // Text style
+ expect(text.style.left).toBe('-400px');
+ expect(text.style.top).toBe('120px');
+ expect(text.style.width).toBe('450px');
+ });
+
+ it('update when the user scrolls', async () => {
+ const { getByTestId } = await renderInTestApp(
+ ,
+ );
+ const dot = await getByTestId('dot');
+ const text = await getByTestId('text');
+
+ act(() => {
+ Element.prototype.getBoundingClientRect = jest.fn(
+ () => UPDATED_BOUNDING_RECT,
+ );
+
+ // Trigger the window resize event.
+ fireEvent(window, new Event('resize'));
+ });
+
+ // Dot style
+ expect(dot.style.left).toBe('-750px');
+ expect(dot.style.top).toBe('-750px');
+ expect(dot.style.width).toBe('1800px');
+ expect(dot.style.height).toBe('1800px');
+
+ // Text style
+ expect(text.style.left).toBe('-300px');
+ expect(text.style.top).toBe('270px');
+ expect(text.style.width).toBe('450px');
+ });
+
+ it('update when the user resizes the window', async () => {
+ const { getByTestId } = await renderInTestApp(
+ ,
+ );
+ const dot = await getByTestId('dot');
+ const text = await getByTestId('text');
+
+ act(() => {
+ Element.prototype.getBoundingClientRect = jest.fn(
+ () => UPDATED_BOUNDING_RECT,
+ );
+
+ // Trigger the window scroll event.
+ fireEvent(window, new Event('scroll'));
+ });
+
+ // Dot style
+ expect(dot.style.left).toBe('-750px');
+ expect(dot.style.top).toBe('-750px');
+ expect(dot.style.width).toBe('1800px');
+ expect(dot.style.height).toBe('1800px');
+
+ // Text style
+ expect(text.style.left).toBe('-300px');
+ expect(text.style.top).toBe('270px');
+ expect(text.style.width).toBe('450px');
+ });
+});
diff --git a/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.tsx b/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.tsx
index 38e422dbcc..9dc0d25681 100644
--- a/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.tsx
+++ b/packages/core/src/components/FeatureDiscovery/FeatureCalloutCircular.tsx
@@ -160,6 +160,7 @@ export const FeatureCalloutCircular: FC = ({
<>
= ({
', () => {
+ it('renders without exploding', async () => {
+ const { getByTitle } = await renderInTestApp();
+ expect(getByTitle('50%')).toBeInTheDocument();
+ });
+
+ it('renders progress and title', async () => {
+ const { container } = await renderInTestApp();
+ expect(container).toBeEmptyDOMElement();
+ });
+
+ it('renders with 100 as max value', async () => {
+ const { getByTitle } = await renderInTestApp();
+ expect(getByTitle('100%')).toBeInTheDocument();
+ });
+});
diff --git a/packages/core/src/components/ProgressBars/LinearGauge.tsx b/packages/core/src/components/ProgressBars/LinearGauge.tsx
index 2b8e77838d..a6aea59f19 100644
--- a/packages/core/src/components/ProgressBars/LinearGauge.tsx
+++ b/packages/core/src/components/ProgressBars/LinearGauge.tsx
@@ -40,12 +40,14 @@ export const LinearGauge: FC = ({ value }) => {
const strokeColor = getProgressColor(theme.palette, percent, false, 100);
return (
-
+
+
+
);
};