Skip to content

Commit 65d8382

Browse files
authored
Clean bridge take 3 (#83)
1 parent 7aab56e commit 65d8382

File tree

9 files changed

+147
-108
lines changed

9 files changed

+147
-108
lines changed

bridge/index.js

Lines changed: 0 additions & 68 deletions
This file was deleted.

bridge/package.json

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/components/Utils/DemoComponent/DemoComponent.md

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,14 @@
22

33
DemoComponent is a demo component to serve as a boilerplate when creating a new component.
44

5-
Simple example:
5+
Examples:
66

7+
A virtual machine with one condition:
78
```js
8-
<DemoComponent namespaced={true} name="vm-example" namespace="default"
9-
/>
9+
<DemoComponent namespaced={true} name="vm-example" namespace="default" errorText="Missing virtual machine data"/>
1010
```
1111

12-
Simple example:
13-
12+
Missing virtual machine:
1413
```js
15-
const name = 'vm-example';
16-
const namespace = 'default';
17-
18-
<DemoComponent namespaced={true} name={name} namespace={namespace}/>
14+
<DemoComponent namespaced={true} name="does-not-exist" namespace="default" errorText="Missing virtual machine data"/>
1915
```

src/components/Utils/DemoComponent/DemoComponent.test.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,30 @@ import * as React from 'react';
33
import { cleanup, render } from '@testing-library/react';
44

55
import { demoMock } from './__mocks__/demoMock';
6-
import { DemoComponent } from './DemoComponent';
6+
import { DemoComponent, DemoComponentDefaults } from './DemoComponent';
77

88
afterEach(cleanup);
99

1010
test('Render DemoComponent (valid vm)', () => {
1111
const { asFragment } = render(
12-
<DemoComponent name={demoMock.name} namespace={demoMock.namespace} />,
12+
<DemoComponent
13+
name={demoMock.name}
14+
namespace={demoMock.namespace}
15+
errorText={DemoComponentDefaults.errorText}
16+
dataTestID={DemoComponentDefaults.dataTestID}
17+
/>,
1318
);
1419
expect(asFragment()).toMatchSnapshot();
1520
});
1621

1722
test('Render DemoComponent (none valid vm)', () => {
18-
const { asFragment } = render(<DemoComponent name="none" namespace="does-not-exist" />);
23+
const { asFragment } = render(
24+
<DemoComponent
25+
name="none"
26+
namespace="does-not-exist"
27+
errorText={DemoComponentDefaults.errorText}
28+
dataTestID={DemoComponentDefaults.dataTestID}
29+
/>,
30+
);
1931
expect(asFragment()).toMatchSnapshot();
2032
});

src/components/Utils/DemoComponent/DemoComponent.tsx

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import * as React from 'react';
22

3+
import { VirtualMachineModelGroupVersionKind } from '@kubevirt-ui/kubevirt-api/console/models';
34
import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt';
45
import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
6+
import { Text, TextVariants } from '@patternfly/react-core';
57

68
import { ConditionLabelList } from '../ConditionLabelList';
79

@@ -16,24 +18,51 @@ export interface DemoComponentProps {
1618
* VirtualMachine namespace.
1719
*/
1820
namespace: string;
21+
/**
22+
* Text to render on missing data
23+
*/
24+
errorText?: string;
25+
/**
26+
* data-test-id for this component
27+
*/
28+
dataTestID?: string;
1929
}
2030

31+
/**
32+
* Default prop values for DemoComponent.
33+
*/
34+
export const DemoComponentDefaults: Partial<DemoComponentProps> = {
35+
errorText: 'Missing virtual machine data',
36+
dataTestID: 'DemoComponent',
37+
};
38+
2139
/**
2240
* DemoComponent renders a demo component.
2341
*
2442
* This component can me usefull to demo the components repo coding style.
2543
* @param {DemoComponentProps} props name and namespace.
2644
* */
27-
export const DemoComponent: React.FC<DemoComponentProps> = ({ name, namespace }) => {
45+
export const DemoComponent: React.FC<DemoComponentProps> = ({
46+
name,
47+
namespace,
48+
errorText,
49+
dataTestID,
50+
}: DemoComponentProps) => {
2851
const [vm, loaded, loadError] = useK8sWatchResource<V1VirtualMachine>({
29-
groupVersionKind: { group: 'kubevirt.io', version: 'v1', kind: 'VirtualMachine' },
52+
groupVersionKind: VirtualMachineModelGroupVersionKind,
3053
name,
3154
namespace,
3255
namespaced: true,
3356
});
3457
const conditions = externalLogic(vm, loaded, loadError);
3558

36-
return conditions ? <ConditionLabelList conditions={conditions} /> : null;
59+
return conditions ? (
60+
<ConditionLabelList data-test-id={dataTestID} conditions={conditions} />
61+
) : (
62+
<Text data-test-id={dataTestID} component={TextVariants.small}>
63+
{errorText}
64+
</Text>
65+
);
3766
};
3867
DemoComponent.displayName = 'DemoComponent';
3968

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt';
2+
3+
export const vmNoConditionsMock: V1VirtualMachine = {
4+
apiVersion: 'kubevirt.io/v1',
5+
kind: 'VirtualMachine',
6+
metadata: {
7+
name: 'vm-example',
8+
namespace: 'default',
9+
},
10+
spec: {
11+
running: false,
12+
template: {
13+
spec: {
14+
domain: {
15+
devices: {
16+
disks: [
17+
{
18+
bootOrder: 1,
19+
disk: {
20+
bus: 'virtio',
21+
},
22+
name: 'containerdisk',
23+
},
24+
],
25+
},
26+
resources: {
27+
requests: {
28+
memory: '1G',
29+
},
30+
},
31+
},
32+
volumes: [
33+
{
34+
containerDisk: {
35+
image: 'quay.io/kubevirt/fedora-cloud-container-disk-demo:latest',
36+
},
37+
name: 'containerdisk',
38+
},
39+
],
40+
},
41+
},
42+
},
43+
status: {
44+
printableStatus: 'Stopped',
45+
volumeSnapshotStatuses: [
46+
{
47+
enabled: false,
48+
name: 'containerdisk',
49+
reason: 'Snapshot is not supported for this volumeSource type [containerdisk]',
50+
},
51+
],
52+
},
53+
};

src/components/Utils/DemoComponent/__snapshots__/DemoComponent.test.tsx.snap

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`Render DemoComponent (none valid vm) 1`] = `<DocumentFragment />`;
3+
exports[`Render DemoComponent (none valid vm) 1`] = `
4+
<DocumentFragment>
5+
<small
6+
class=""
7+
data-ouia-component-id="OUIA-Generated-Text-1"
8+
data-ouia-component-type="PF4/Text"
9+
data-ouia-safe="true"
10+
data-pf-content="true"
11+
data-test-id="DemoComponent"
12+
>
13+
Missing virtual machine data
14+
</small>
15+
</DocumentFragment>
16+
`;
417

518
exports[`Render DemoComponent (valid vm) 1`] = `
619
<DocumentFragment>
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
import { cleanup } from '@testing-library/react';
22

33
import { vmMock } from './__mocks__/vmMock';
4+
import { vmNoConditionsMock } from './__mocks__/vmNoConditionsMock';
45
import { externalLogic } from './extrenalLogic';
56

67
afterEach(cleanup);
78

89
test('externalLogic', () => {
910
const conditions = externalLogic(vmMock, true, null);
1011

11-
expect((conditions || []).length).toBe(1);
12+
expect(conditions && conditions.length).toBe(1);
13+
});
14+
15+
test('externalLogic (no conditions in vm)', () => {
16+
const conditions = externalLogic(vmNoConditionsMock, true, null);
17+
18+
expect(conditions && conditions.length).toBe(0);
1219
});
1320

1421
test('externalLogic (not loaded yet)', () => {
15-
const conditions = externalLogic(vmMock, false, null);
22+
const conditions = externalLogic(null, false, null);
1623
expect(conditions).toBe(null);
1724
});
1825

1926
test('externalLogic (data error)', () => {
20-
const conditions = externalLogic(vmMock, true, 'Error loading data');
27+
const conditions = externalLogic(null, true, 'Error loading data');
2128

2229
expect(conditions).toBe(null);
2330
});
Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt';
22

3-
export const externalLogic = (vm: V1VirtualMachine, loaded: boolean, loadError: string | null) => {
4-
return loaded && !loadError && vm?.status?.conditions ? vm?.status?.conditions : null;
3+
/**
4+
* Do some external logic for DemoComponet.
5+
*
6+
* @param {V1VirtualMachine | null} vm a virtual machine object.
7+
* @param {boolean} loaded indecates the vm data is loaded.
8+
* @param {string | null} loadError an error loading data.
9+
* @returns {V1VirtualMachineCondition[] | null} a list of conditions or null if no vm data available.
10+
*/
11+
export const externalLogic = (
12+
vm: V1VirtualMachine | null,
13+
loaded: boolean,
14+
loadError: string | null,
15+
) => {
16+
if (!loaded || loadError) {
17+
return null;
18+
}
19+
20+
return vm?.status?.conditions || [];
521
};

0 commit comments

Comments
 (0)