Skip to content

Commit

Permalink
feature: add patternfly4 react-table
Browse files Browse the repository at this point in the history
  • Loading branch information
priley86 committed Jun 11, 2019
1 parent e429abf commit 058d3dd
Show file tree
Hide file tree
Showing 74 changed files with 5,251 additions and 2,058 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,28 @@ import * as React from 'react';
import { match as RouterMatch } from 'react-router-dom';
import { shallow, ShallowWrapper } from 'enzyme';
import * as _ from 'lodash-es';

import { ClusterServiceVersionResourceList, ClusterServiceVersionResourceListProps, ProvidedAPIsPage, ProvidedAPIsPageProps, ClusterServiceVersionResourceHeaderProps, ClusterServiceVersionResourceRowProps, ClusterServiceVersionResourceHeader, ClusterServiceVersionResourceRow, ClusterServiceVersionResourceDetails, ClusterServiceVersionResourcesDetailsPageProps, ClusterServiceVersionResourcesDetailsProps, ClusterServiceVersionResourcesDetailsPage, ClusterServiceVersionResourceLink, ProvidedAPIPage, ProvidedAPIPageProps } from '../../../public/components/operator-lifecycle-manager/clusterserviceversion-resource';
import { ClusterServiceVersionResourceList, ClusterServiceVersionResourceListProps, ProvidedAPIsPage, ProvidedAPIsPageProps, CSVRTableRowProps, CSVRTableHeader, CSVRTableRow, ClusterServiceVersionResourceDetails, ClusterServiceVersionResourcesDetailsPageProps, ClusterServiceVersionResourcesDetailsProps, ClusterServiceVersionResourcesDetailsPage, ClusterServiceVersionResourceLink, ProvidedAPIPage, ProvidedAPIPageProps } from '../../../public/components/operator-lifecycle-manager/clusterserviceversion-resource';
import { Resources } from '../../../public/components/operator-lifecycle-manager/k8s-resource';
import { ClusterServiceVersionResourceKind, referenceForProvidedAPI } from '../../../public/components/operator-lifecycle-manager';
import { StatusDescriptor } from '../../../public/components/operator-lifecycle-manager/descriptors/status';
import { SpecDescriptor } from '../../../public/components/operator-lifecycle-manager/descriptors/spec';
import { testCRD, testResourceInstance, testClusterServiceVersion, testOwnedResourceInstance, testModel } from '../../../__mocks__/k8sResourcesMocks';
import { List, ColHead, ListHeader, DetailsPage, MultiListPage, ListPage } from '../../../public/components/factory';
import { Table, DetailsPage, MultiListPage, ListPage } from '../../../public/components/factory';
import { Timestamp, LabelList, StatusBox, ResourceKebab } from '../../../public/components/utils';
import { referenceFor, K8sKind, referenceForModel } from '../../../public/module/k8s';
import { ClusterServiceVersionModel } from '../../../public/models';

describe(ClusterServiceVersionResourceHeader.displayName, () => {
let wrapper: ShallowWrapper<ClusterServiceVersionResourceHeaderProps>;

beforeEach(() => {
wrapper = shallow(<ClusterServiceVersionResourceHeader data={[]} />);
});

it('renders column header for resource name', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(0);

expect(colHeader.props().sortField).toEqual('metadata.name');
expect(colHeader.childAt(0).text()).toEqual('Name');
});

it('renders column header for resource labels', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(1);

expect(colHeader.props().sortField).toEqual('metadata.labels');
expect(colHeader.childAt(0).text()).toEqual('Labels');
});

it('renders column header for resource type', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(2);

expect(colHeader.props().sortField).toEqual('kind');
expect(colHeader.childAt(0).text()).toEqual('Type');
});

it('renders column header for resource status', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(3);

expect(colHeader.childAt(0).text()).toEqual('Status');
});

it('renders column header for resource version', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(4);

expect(colHeader.childAt(0).text()).toEqual('Version');
});

it('renders column header for last updated timestamp', () => {
const colHeader = wrapper.find(ListHeader).find(ColHead).at(5);

expect(colHeader.childAt(0).text()).toEqual('Last Updated');
describe(CSVRTableHeader.displayName, () => {
it('returns column header definition for resource', () => {
expect(Array.isArray(CSVRTableHeader()));
});
});

describe(ClusterServiceVersionResourceRow.displayName, () => {
let wrapper: ShallowWrapper<ClusterServiceVersionResourceRowProps>;
describe(CSVRTableRow.displayName, () => {
let wrapper: ShallowWrapper<CSVRTableRowProps>;

beforeEach(() => {
wrapper = shallow(<ClusterServiceVersionResourceRow obj={testResourceInstance} />);
wrapper = shallow(<CSVRTableRow obj={testResourceInstance} index={0} style={{}} />);
});

it('renders column for resource name', () => {
Expand Down Expand Up @@ -95,13 +53,13 @@ describe(ClusterServiceVersionResourceRow.displayName, () => {
it('renders column for resource type', () => {
const col = wrapper.childAt(2);

expect(col.text()).toEqual(testResourceInstance.kind);
expect(col.shallow().text()).toEqual(testResourceInstance.kind);
});

it('renders column for resource status', () => {
const col = wrapper.childAt(3);

expect(col.text()).toEqual('Unknown');
expect(col.shallow().text()).toEqual('Unknown');
});

it('renders column for resource status if unknown', () => {
Expand All @@ -110,13 +68,13 @@ describe(ClusterServiceVersionResourceRow.displayName, () => {
wrapper.setProps({obj});
const col = wrapper.childAt(3);

expect(col.text()).toEqual('Unknown');
expect(col.shallow().text()).toEqual('Unknown');
});

it('renders column for resource version', () => {
const col = wrapper.childAt(4);

expect(col.text()).toEqual(testResourceInstance.spec.version || 'Unknown');
expect(col.shallow().text()).toEqual(testResourceInstance.spec.version || 'Unknown');
});

it('renders column for last updated timestamp', () => {
Expand All @@ -136,12 +94,11 @@ describe(ClusterServiceVersionResourceList.displayName, () => {
wrapper = shallow(<ClusterServiceVersionResourceList loaded={true} data={resources} filters={{}} />);
});

it('renders a `List` of the custom resource instances of the given kind', () => {
const list: ShallowWrapper<any> = wrapper.find(List);

expect(Object.keys(wrapper.props()).reduce((k, prop) => list.prop(prop) === wrapper.prop(prop), false)).toBe(true);
expect(list.props().Header).toEqual(ClusterServiceVersionResourceHeader);
expect(list.props().Row).toEqual(ClusterServiceVersionResourceRow);
it('renders a `Table` of the custom resource instances of the given kind', () => {
const table: ShallowWrapper<any> = wrapper.find(Table);
expect(Object.keys(wrapper.props()).reduce((k, prop) => table.prop(prop) === wrapper.prop(prop), false)).toBe(true);
expect(table.props().Header).toEqual(CSVRTableHeader);
expect(table.props().Row).toEqual(CSVRTableRow);
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,103 +3,80 @@ import { shallow, ShallowWrapper, mount, ReactWrapper } from 'enzyme';
import { Link } from 'react-router-dom';
import * as _ from 'lodash-es';

import { ClusterServiceVersionsDetailsPage, ClusterServiceVersionsDetailsPageProps, ClusterServiceVersionDetails, ClusterServiceVersionDetailsProps, ClusterServiceVersionsPage, ClusterServiceVersionsPageProps, ClusterServiceVersionList, ClusterServiceVersionHeader, ClusterServiceVersionRow, ClusterServiceVersionRowProps, CRDCard, CRDCardRow } from '../../../public/components/operator-lifecycle-manager/clusterserviceversion';
import { ClusterServiceVersionsDetailsPage, ClusterServiceVersionsDetailsPageProps, ClusterServiceVersionDetails, ClusterServiceVersionDetailsProps, ClusterServiceVersionsPage, ClusterServiceVersionsPageProps, ClusterServiceVersionList, ClusterServiceVersionTableHeader, ClusterServiceVersionTableRow, ClusterServiceVersionTableRowProps, CRDCard, CRDCardRow } from '../../../public/components/operator-lifecycle-manager/clusterserviceversion';
import { ClusterServiceVersionKind, ClusterServiceVersionLogo, ClusterServiceVersionLogoProps, referenceForProvidedAPI, CSVConditionReason } from '../../../public/components/operator-lifecycle-manager';
import { DetailsPage, ListPage, ListHeader, ColHead, List, ListInnerProps } from '../../../public/components/factory';
import { DetailsPage, ListPage, TableInnerProps, Table, TableRow } from '../../../public/components/factory';
import { testClusterServiceVersion } from '../../../__mocks__/k8sResourcesMocks';
import { Timestamp, MsgBox, ResourceLink, ResourceKebab, ErrorBoundary, LoadingBox, ScrollToTopOnMount, SectionHeading } from '../../../public/components/utils';
import { referenceForModel } from '../../../public/module/k8s';
import { ClusterServiceVersionModel } from '../../../public/models';

import * as operatorLogo from '../../../public/imgs/operator.svg';

describe(ClusterServiceVersionHeader.displayName, () => {
let wrapper: ShallowWrapper;

beforeEach(() => {
wrapper = shallow(<ClusterServiceVersionHeader />);
});

it('renders `ListHeader`', () => {
expect(wrapper.find(ListHeader).exists()).toBe(true);
});

it('renders column header for app name and logo', () => {
expect(wrapper.find(ColHead).at(0).childAt(0).text()).toEqual('Name');
expect(wrapper.find(ColHead).at(0).props().sortField).toEqual('metadata.name');
});

it('renders column header for app namespace', () => {
expect(wrapper.find(ColHead).at(1).childAt(0).text()).toEqual('Namespace');
});

it('renders column header for Operator deployment', () => {
expect(wrapper.find(ColHead).at(2).childAt(0).text()).toEqual('Deployment');
});

it('renders column header for app status', () => {
expect(wrapper.find(ColHead).at(3).childAt(0).text()).toEqual('Status');
describe(ClusterServiceVersionTableHeader.displayName, () => {
it('returns column header definition for cluster service version table header', () => {
expect(Array.isArray(ClusterServiceVersionTableHeader()));
});
});

describe(ClusterServiceVersionRow.displayName, () => {
let wrapper: ShallowWrapper<ClusterServiceVersionRowProps>;
describe(ClusterServiceVersionTableRow.displayName, () => {
let wrapper: ShallowWrapper<ClusterServiceVersionTableRowProps>;

beforeEach(() => {
wrapper = shallow(<ClusterServiceVersionRow obj={testClusterServiceVersion} />).childAt(0).shallow();
wrapper = shallow(<ClusterServiceVersionTableRow obj={testClusterServiceVersion} index={0} style={{}} />).childAt(0).shallow();
});

it('renders a component wrapped in an `ErrorBoundary', () => {
wrapper = shallow(<ClusterServiceVersionRow obj={testClusterServiceVersion} />);
wrapper = shallow(<ClusterServiceVersionTableRow obj={testClusterServiceVersion} index={0} style={{}} />);

expect(wrapper.find(ErrorBoundary).exists()).toBe(true);
});

it('renders `ResourceKebab` with actions', () => {
const col = wrapper.find('.row');
const col = wrapper.find(TableRow);

expect(col.find(ResourceKebab).props().resource).toEqual(testClusterServiceVersion);
expect(col.find(ResourceKebab).props().kind).toEqual(referenceForModel(ClusterServiceVersionModel));
expect(col.find(ResourceKebab).props().actions.length).toEqual(1);
});

it('renders clickable column for app logo and name', () => {
const col = wrapper.find('.row').childAt(0);
const col = wrapper.find(TableRow).childAt(0);

expect(col.find(Link).props().to).toEqual(`/k8s/ns/${testClusterServiceVersion.metadata.namespace}/${ClusterServiceVersionModel.plural}/${testClusterServiceVersion.metadata.name}`);
expect(col.find(Link).find(ClusterServiceVersionLogo).exists()).toBe(true);
});

it('renders column for app namespace link', () => {
const link = wrapper.find('.row').childAt(1).find(ResourceLink);
const link = wrapper.find(TableRow).childAt(1).find(ResourceLink);

expect(link.props().kind).toEqual('Namespace');
expect(link.props().title).toEqual(testClusterServiceVersion.metadata.namespace);
expect(link.props().name).toEqual(testClusterServiceVersion.metadata.namespace);
});

it('renders column with link to Operator deployment', () => {
const col = wrapper.find('.row').childAt(2);
const col = wrapper.find(TableRow).childAt(2);

expect(col.find(ResourceLink).props().kind).toEqual('Deployment');
expect(col.find(ResourceLink).props().name).toEqual(testClusterServiceVersion.spec.install.spec.deployments[0].name);
});

it('renders column for app status', () => {
const col = wrapper.find('.row').childAt(3);
const col = wrapper.find(TableRow).childAt(3);

expect(col.childAt(0).text()).toEqual(CSVConditionReason.CSVReasonInstallSuccessful);
});

it('renders "disabling" status if CSV has `deletionTimestamp`', () => {
wrapper = wrapper.setProps({obj: _.cloneDeepWith(testClusterServiceVersion, (v, k) => k === 'metadata' ? {...v, deletionTimestamp: Date.now()} : undefined)});
const col = wrapper.find('.row').childAt(3);
const col = wrapper.find(TableRow).childAt(3);

expect(col.childAt(0).text()).toEqual('Disabling');
});

it('renders column with each CRD provided by the Operator', () => {
const col = wrapper.find('.row').childAt(4);
const col = wrapper.find(TableRow).childAt(4);
testClusterServiceVersion.spec.customresourcedefinitions.owned.forEach((desc, i) => {
expect(col.find(Link).at(i).props().title).toEqual(desc.name);
expect(col.find(Link).at(i).props().to).toEqual(`/k8s/ns/default/clusterserviceversions/testapp/${referenceForProvidedAPI(desc)}`);
Expand Down Expand Up @@ -138,9 +115,8 @@ describe(ClusterServiceVersionList.displayName, () => {

it('renders `List` with correct props', () => {
const wrapper = shallow(<ClusterServiceVersionList data={[]} loaded={true} />);

expect(wrapper.find<ListInnerProps>(List).props().Row).toEqual(ClusterServiceVersionRow);
expect(wrapper.find<ListInnerProps>(List).props().Header).toEqual(ClusterServiceVersionHeader);
expect(wrapper.find<TableInnerProps>(Table).props().Row).toEqual(ClusterServiceVersionTableRow);
expect(wrapper.find<TableInnerProps>(Table).props().Header).toEqual(ClusterServiceVersionTableHeader);
});
});

Expand Down
Loading

0 comments on commit 058d3dd

Please sign in to comment.