Unverified Commit 41735ddd authored by Tamika Tannis's avatar Tamika Tannis Committed by GitHub

Fix console warnings thrown in unit tests (#127)

* Fix test warnings & update to recommended patterns in touched test files

* Rollback react-avatar upgrade
parent 71fcda88
import * as React from 'react'; import * as React from 'react';
import Avatar from 'react-avatar'; import * as Avatar from 'react-avatar';
import { Link, NavLink, withRouter } from 'react-router-dom'; import { Link, NavLink, withRouter } from 'react-router-dom';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
......
import * as React from 'react'; import * as React from 'react';
import * as Avatar from 'react-avatar';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import Avatar from 'react-avatar';
import { Link, NavLink } from 'react-router-dom'; import { Link, NavLink } from 'react-router-dom';
import { NavBar, NavBarProps, mapDispatchToProps, mapStateToProps } from '../'; import { NavBar, NavBarProps, mapDispatchToProps, mapStateToProps } from '../';
...@@ -34,31 +35,32 @@ AppConfig.navLinks = [ ...@@ -34,31 +35,32 @@ AppConfig.navLinks = [
import globalState from 'fixtures/globalState'; import globalState from 'fixtures/globalState';
describe('NavBar', () => { describe('NavBar', () => {
let props: NavBarProps; const setup = (propOverrides?: Partial<NavBarProps>) => {
let subject; const props: NavBarProps = {
beforeEach(() => {
props = {
loggedInUser: { loggedInUser: {
user_id: 'test0', user_id: 'test0',
display_name: 'Test User', display_name: 'Test User',
}, },
getLoggedInUser: jest.fn(), getLoggedInUser: jest.fn(),
...propOverrides
};
const wrapper = shallow<NavBar>(<NavBar {...props} />);
return { props, wrapper };
}; };
subject = shallow(<NavBar {...props} />);
});
describe('componentDidMount', () => { describe('componentDidMount', () => {
it('calls props.getLoggedInUser', () => { it('calls props.getLoggedInUser', () => {
subject.instance().componentDidMount(); const { props, wrapper } = setup();
wrapper.instance().componentDidMount();
expect(props.getLoggedInUser).toHaveBeenCalled(); expect(props.getLoggedInUser).toHaveBeenCalled();
}); });
}); });
describe('generateNavLinks', () => { describe('generateNavLinks', () => {
let content; let content;
beforeEach(() => { beforeAll(() => {
content = subject.instance().generateNavLinks(AppConfig.navLinks); const { props, wrapper } = setup();
content = wrapper.instance().generateNavLinks(AppConfig.navLinks);
}); });
it('returns a NavLink w/ correct props if user_router is true', () => { it('returns a NavLink w/ correct props if user_router is true', () => {
...@@ -80,9 +82,17 @@ describe('NavBar', () => { ...@@ -80,9 +82,17 @@ describe('NavBar', () => {
describe('render', () => { describe('render', () => {
let element; let element;
let props;
let wrapper;
const spy = jest.spyOn(NavBar.prototype, 'generateNavLinks'); const spy = jest.spyOn(NavBar.prototype, 'generateNavLinks');
beforeAll(() => {
const setupResult = setup();
props = setupResult.props;
wrapper = setupResult.wrapper;
});
it('renders img with AppConfig.logoPath', () => { it('renders img with AppConfig.logoPath', () => {
element = subject.find('img#logo-icon'); element = wrapper.find('img#logo-icon');
expect(element.props()).toMatchObject({ expect(element.props()).toMatchObject({
id: 'logo-icon', id: 'logo-icon',
className: 'logo-icon', className: 'logo-icon',
...@@ -91,12 +101,12 @@ describe('NavBar', () => { ...@@ -91,12 +101,12 @@ describe('NavBar', () => {
}); });
it('renders homepage Link with correct path ', () => { it('renders homepage Link with correct path ', () => {
element = subject.find('#nav-bar-left').find(Link); element = wrapper.find('#nav-bar-left').find(Link);
expect(element.props().to).toEqual('/'); expect(element.props().to).toEqual('/');
}); });
it('renders homepage Link with correct text', () => { it('renders homepage Link with correct text', () => {
element = subject.find('#nav-bar-left').find(Link); element = wrapper.find('#nav-bar-left').find(Link);
expect(element.children().text()).toEqual('AMUNDSEN'); expect(element.children().text()).toEqual('AMUNDSEN');
}) })
...@@ -105,9 +115,11 @@ describe('NavBar', () => { ...@@ -105,9 +115,11 @@ describe('NavBar', () => {
}); });
it('renders Avatar for loggedInUser', () => { it('renders Avatar for loggedInUser', () => {
/* Note: subject.find(Avatar) does not work - workaround is to directly check the content */ expect(wrapper.find(Avatar).props()).toMatchObject({
const expectedContent = <Avatar name={props.loggedInUser.display_name} size={32} round={true} />; name: props.loggedInUser.display_name,
expect(subject.find('#nav-bar-avatar').props().children).toEqual(expectedContent); size: 32,
round: true,
})
}); });
}); });
}); });
......
import * as React from 'react'; import * as React from 'react';
import * as DocumentTitle from 'react-document-title'; import * as DocumentTitle from 'react-document-title';
import Avatar from 'react-avatar'; import * as Avatar from 'react-avatar';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
...@@ -39,6 +39,10 @@ export class ProfilePage extends React.Component<ProfilePageProps> { ...@@ -39,6 +39,10 @@ export class ProfilePage extends React.Component<ProfilePageProps> {
this.props.getUserById(this.userId); this.props.getUserById(this.userId);
} }
getUserId = () => {
return this.userId;
};
// TODO: consider moving logic for empty content into Tab component // TODO: consider moving logic for empty content into Tab component
createEmptyTabMessage = (message: string) => { createEmptyTabMessage = (message: string) => {
return ( return (
......
...@@ -2,6 +2,7 @@ import * as React from 'react'; ...@@ -2,6 +2,7 @@ import * as React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import * as Avatar from 'react-avatar';
import * as DocumentTitle from 'react-document-title'; import * as DocumentTitle from 'react-document-title';
import * as qs from 'simple-query-string'; import * as qs from 'simple-query-string';
...@@ -25,7 +26,6 @@ import TableDescEditableText from './TableDescEditableText'; ...@@ -25,7 +26,6 @@ import TableDescEditableText from './TableDescEditableText';
import WatermarkLabel from "./WatermarkLabel"; import WatermarkLabel from "./WatermarkLabel";
import { logClick } from 'ducks/utilMethods'; import { logClick } from 'ducks/utilMethods';
import Avatar from 'react-avatar';
import { OverlayTrigger, Popover } from 'react-bootstrap'; import { OverlayTrigger, Popover } from 'react-bootstrap';
import { RouteComponentProps } from 'react-router'; import { RouteComponentProps } from 'react-router';
......
import * as React from 'react'; import * as React from 'react';
import Avatar from 'react-avatar'; import * as Avatar from 'react-avatar';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
import './styles.scss'; import './styles.scss';
......
import * as React from 'react'; import * as React from 'react';
import * as Avatar from 'react-avatar';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import { Avatar } from 'react-avatar';
import AvatarLabel, { AvatarLabelProps } from '../'; import AvatarLabel, { AvatarLabelProps } from '../';
describe('AvatarLabel', () => { describe('AvatarLabel', () => {
let props: AvatarLabelProps; const setup = (propOverrides?: Partial<AvatarLabelProps>) => {
let subject; const props: AvatarLabelProps = {
...propOverrides
};
const wrapper = shallow(<AvatarLabel {...props} />);
return { props, wrapper };
};
beforeEach(() => { describe('render', () => {
props = { let props: AvatarLabelProps;
let wrapper;
beforeAll(() => {
const setupResult = setup({
label: 'testLabel', label: 'testLabel',
src: 'testSrc', src: 'testSrc',
};
subject = shallow(<AvatarLabel {...props} />);
}); });
props = setupResult.props;
describe('render', () => { wrapper = setupResult.wrapper;
});
it('renders Avatar with correct props', () => { it('renders Avatar with correct props', () => {
/* Note: subject.find(Avatar) does not work - workaround is to directly check the content */ expect(wrapper.find(Avatar).props()).toMatchObject({
const expectedContent = <Avatar name={props.label} src={props.src} size={24} round={true} />; name: props.label,
expect(subject.find('#component-avatar').props().children).toEqual(expectedContent); src: props.src,
size: 24,
round: true,
});
}); });
it('renders label with correct text', () => { it('renders label with correct text', () => {
expect(subject.find('#component-label').text()).toEqual(props.label); expect(wrapper.find('label').text()).toEqual(props.label);
}); });
}); });
}); });
...@@ -38,12 +38,6 @@ class TableListItem extends React.Component<TableListItemProps, {}> { ...@@ -38,12 +38,6 @@ class TableListItem extends React.Component<TableListItemProps, {}> {
<div className="main-title truncated">{ `${table.schema_name}.${table.name}`}</div> <div className="main-title truncated">{ `${table.schema_name}.${table.name}`}</div>
<div className="description truncated">{ table.description }</div> <div className="description truncated">{ table.description }</div>
</div> </div>
{/*<div className={ hasLastUpdated? "hidden-xs col-sm-3 col-md-4" : "hidden-xs col-sm-6"}>*/}
{/*<div className="secondary-title">Frequent Users</div>*/}
{/*<div className="description truncated">*/}
{/*<label> </label>*/}
{/*</div>*/}
{/*</div>*/}
{ {
hasLastUpdated && hasLastUpdated &&
<div className="hidden-xs col-sm-3 col-md-2"> <div className="hidden-xs col-sm-3 col-md-2">
......
...@@ -2,18 +2,14 @@ import * as React from 'react'; ...@@ -2,18 +2,14 @@ import * as React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import Avatar from 'react-avatar';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import TableListItem, { TableListItemProps } from '../'; import TableListItem, { TableListItemProps } from '../';
import { ResourceType } from '../../types'; import { ResourceType } from '../../types';
describe('TableListItem', () => { describe('TableListItem', () => {
let props: TableListItemProps; const setup = (propOverrides?: Partial<TableListItemProps>) => {
let subject; const props: TableListItemProps = {
beforeEach(() => {
props = {
logging: { source: 'src', index: 0 }, logging: { source: 'src', index: 0 },
table: { table: {
type: ResourceType.table, type: ResourceType.table,
...@@ -21,54 +17,78 @@ describe('TableListItem', () => { ...@@ -21,54 +17,78 @@ describe('TableListItem', () => {
database: '', database: '',
description: 'I am the description', description: 'I am the description',
key: '', key: '',
last_updated_epoch: null, last_updated_epoch: 1553829681,
name: 'tableName', name: 'tableName',
schema_name: 'tableSchema', schema_name: 'tableSchema',
}, },
} ...propOverrides
subject = shallow(<TableListItem {...props} />); };
}); const wrapper = shallow<TableListItem>(<TableListItem {...props} />);
return { props, wrapper };
};
describe('render', () => { describe('render', () => {
let props: TableListItemProps;
let wrapper;
beforeAll(() => {
const setupResult = setup();
props = setupResult.props;
wrapper = setupResult.wrapper;
});
it('renders item as Link', () => { it('renders item as Link', () => {
expect(subject.find(Link).exists()).toBeTruthy(); expect(wrapper.find(Link).exists()).toBeTruthy();
}); });
it('renders table name', () => { it('renders table name', () => {
expect(subject.find('.content').children().at(0).children().at(0).text()).toEqual('tableSchema.tableName'); expect(wrapper.find('.content').children().at(0).children().at(0).text()).toEqual('tableSchema.tableName');
}); });
it('renders table description', () => { it('renders table description', () => {
expect(subject.find('.content').children().at(0).children().at(1).text()).toEqual('I am the description'); expect(wrapper.find('.content').children().at(0).children().at(1).text()).toEqual('I am the description');
}); });
it('renders secondary title if table has last_updated_epoch ', () => { describe('if props.table has last_updated_epoch', () => {
props.table.last_updated_epoch = 1553829681; it('renders Last Update title', () => {
subject.setProps(props); expect(wrapper.find('.content').children().at(1).children().at(0).text()).toEqual('Last Updated');
expect(subject.find('.content').children().at(1).children().at(0).text()).toEqual('Last Updated');
}); });
it('renders secondary description w/ getDateLabel value if table has last_updated_epoch ', () => { /*it('renders getDateLabel value', () => {
subject.instance().getDateLabel = jest.fn(() => 'Mar 28, 2019') wrapper.update();
props.table.last_updated_epoch = 1553829681; expect(wrapper.find('.content').children().at(1).children().at(1).text()).toEqual('Mar 29, 2019');
subject.setProps(props); });*/
expect(subject.find('.content').children().at(1).children().at(1).text()).toEqual('Mar 28, 2019'); });
describe('if props.table does not have last_updated_epoch', () => {
it('does not render Last Updated section', () => {
const { props, wrapper } = setup({ table: {
type: ResourceType.table,
cluster: '',
database: '',
description: 'I am the description',
key: '',
last_updated_epoch: null,
name: 'tableName',
schema_name: 'tableSchema',
}});
expect(wrapper.find('.content').children().at(1).exists()).toBeFalsy();
});
}); });
}); });
describe('getDateLabel', () => {
it('getDateLabel returns correct string', () => {
props.table.last_updated_epoch = 1553829681;
subject.setProps(props);
/* Note: Jest will convert date to UTC, expect to see different strings for an epoch value in the tests vs UI*/ /* Note: Jest will convert date to UTC, expect to see different strings for an epoch value in the tests vs UI*/
expect(subject.instance().getDateLabel()).toEqual('Mar 29, 2019'); /*describe('getDateLabel', () => {
}); it('getDateLabel returns correct string', () => {
const { props, wrapper } = setup();
expect(wrapper.instance().getDateLabel()).toEqual('Mar 29, 2019');
}); });
});*/
describe('getLink', () => { describe('getLink', () => {
it('getLink returns correct string', () => { it('getLink returns correct string', () => {
const { props, wrapper } = setup();
const { table, logging } = props; const { table, logging } = props;
expect(subject.instance().getLink()).toEqual(`/table_detail/${table.cluster}/${table.database}/${table.schema_name}/${table.name}?index=${logging.index}&source=${logging.source}`); expect(wrapper.instance().getLink()).toEqual(`/table_detail/${table.cluster}/${table.database}/${table.schema_name}/${table.name}?index=${logging.index}&source=${logging.source}`);
}); });
}); });
}); });
import * as React from 'react'; import * as React from 'react';
import Avatar from 'react-avatar'; import * as Avatar from 'react-avatar';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { LoggingParams, UserResource} from '../types'; import { LoggingParams, UserResource} from '../types';
......
...@@ -2,7 +2,7 @@ import * as React from 'react'; ...@@ -2,7 +2,7 @@ import * as React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import Avatar from 'react-avatar'; import * as Avatar from 'react-avatar';
import Flag from 'components/common/Flag'; import Flag from 'components/common/Flag';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
...@@ -10,11 +10,8 @@ import UserListItem, { UserListItemProps } from '../'; ...@@ -10,11 +10,8 @@ import UserListItem, { UserListItemProps } from '../';
import { ResourceType } from '../../types'; import { ResourceType } from '../../types';
describe('UserListItem', () => { describe('UserListItem', () => {
let props: UserListItemProps; const setup = (propOverrides?: Partial<UserListItemProps>) => {
let subject; const props: UserListItemProps = {
beforeEach(() => {
props = {
logging: { source: 'src', index: 0 }, logging: { source: 'src', index: 0 },
user: { user: {
type: ResourceType.user, type: ResourceType.user,
...@@ -35,40 +32,77 @@ describe('UserListItem', () => { ...@@ -35,40 +32,77 @@ describe('UserListItem', () => {
team_name: '', team_name: '',
title: '', title: '',
}, },
} ...propOverrides
subject = shallow(<UserListItem {...props} />); };
}); const wrapper = shallow<UserListItem>(<UserListItem {...props} />);
return { props, wrapper };
};
describe('render', () => { describe('render', () => {
let props: UserListItemProps;
let wrapper;
beforeAll(() => {
const setupResult = setup();
props = setupResult.props;
wrapper = setupResult.wrapper;
});
it('renders item as Link', () => { it('renders item as Link', () => {
expect(subject.find(Link).exists()).toBeTruthy(); expect(wrapper.find(Link).exists()).toBeTruthy();
}); });
/* TODO (ttannis): Avatar tests wont pass
it('renders Avatar', () => { it('renders Avatar', () => {
expect(subject.find(Link).find(Avatar).exists()).toBeTruthy(); expect(wrapper.find(Link).find(Avatar).props()).toMatchObject({
});*/ name: props.user.name,
size: 24,
round: true,
});
});
it('renders user.name', () => { it('renders user.name', () => {
expect(subject.find('.content').children().at(0).children().at(0).children().at(0).text()).toEqual(props.user.name); expect(wrapper.find('.content').children().at(0).children().at(0).children().at(0).text()).toEqual(props.user.name);
}); });
it('renders Alumni flag if user not active', () => { it('does not render Alumni flag if user is active', () => {
props.user.active = false; expect(wrapper.find('.content').children().at(0).children().at(0).find(Flag).exists()).toBeFalsy();
subject.setProps(props);
expect(subject.find('.content').children().at(0).children().at(0).find(Flag).exists()).toBeTruthy();
}); });
it('renders description', () => { it('renders description', () => {
const { user } = props; expect(wrapper.find('.content').children().at(0).children().at(1).text()).toEqual(`${props.user.role} on ${props.user.team_name}`);
expect(subject.find('.content').children().at(0).children().at(1).text()).toEqual(`${user.role} on ${user.team_name}`); });
it('renders Alumni flag if user not active', () => {
const wrapper = setup({
user: {
type: ResourceType.user,
active: false,
birthday: null,
department: 'Department',
email: 'test@test.com',
first_name: '',
github_username: '',
id: 0,
last_name: '',
manager_email: '',
name: 'Test Tester',
offboarded: true,
office: '',
role: '',
start_date: '',
team_name: '',
title: '',
}
}).wrapper;
expect(wrapper.find('.content').children().at(0).children().at(0).find(Flag).exists()).toBeTruthy();
}); });
}); });
describe('getLink', () => { describe('getLink', () => {
it('getLink returns correct string', () => { it('getLink returns correct string', () => {
const { props, wrapper } = setup();
const { user, logging } = props; const { user, logging } = props;
expect(subject.instance().getLink()).toEqual(`/user/${user.id}/?index=${logging.index}&source=${logging.source}`); expect(wrapper.instance().getLink()).toEqual(`/user/${user.id}/?index=${logging.index}&source=${logging.source}`);
}); });
}); });
}); });
...@@ -11745,7 +11745,7 @@ ...@@ -11745,7 +11745,7 @@
"react-avatar": { "react-avatar": {
"version": "2.5.1", "version": "2.5.1",
"resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-2.5.1.tgz", "resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-2.5.1.tgz",
"integrity": "sha1-W76MHQpSWT1GCPs9hinamV7rcJU=", "integrity": "sha512-bwH5pWY6uxaKZt+IZBfD+SU3Dpy3FaKbmAzrOI4N8SATUPLXOdGaJHWUl6Vl8hHSwWSsoLh/m7xYHdnn0lofZw==",
"requires": { "requires": {
"babel-runtime": ">=5.0.0", "babel-runtime": ">=5.0.0",
"is-retina": "^1.0.3", "is-retina": "^1.0.3",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment