Skip to content

Commit

Permalink
feat: increase coverage to 100% (#91)
Browse files Browse the repository at this point in the history
* feat: improve tests

* feat: increase coverage to 100%

* fix: add typscript parser

* feat: add codecov report

Co-authored-by: Adrián Insua Yañez <[email protected]>
  • Loading branch information
AdrianInsua and adrianiy authored May 3, 2020
1 parent 1cba82b commit c566240
Show file tree
Hide file tree
Showing 39 changed files with 2,460 additions and 232 deletions.
621 changes: 558 additions & 63 deletions package-lock.json

Large diffs are not rendered by default.

24 changes: 21 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@
"@babel/preset-env": "^7.1.0",
"@babel/preset-react": "^7.0.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.5.0",
"@testing-library/react": "^10.0.4",
"@testing-library/user-event": "^7.2.1",
"@typescript-eslint/parser": "^2.28.0",
"canvg": "^3.0.6",
"codemirror": "^5.52.2",
"cypher-codemirror": "^1.1.6",
Expand Down Expand Up @@ -41,7 +40,8 @@
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --coverage --watchAll=false",
"test": "react-scripts test --coverage --watchAll=false --env=jest-environment-jsdom-sixteen --silent && codecov",
"test:nocov": "react-scripts test --watchAll=false --env=jest-environment-jsdom-sixteen --silent",
"eject": "react-scripts eject",
"lint": "eslint . --ext js"
},
Expand Down Expand Up @@ -72,6 +72,22 @@
"last 1 safari version"
]
},
"jest": {
"collectCoverageFrom": [
"src/**/**",
"!**/index.js",
"!**/serviceWorker.js",
"!**/**/*.json",
"!**/global/utils/hooks/**",
"!**/global/components/chart/**",
"!**/**/autosuggest.js",
"!**/tests/**",
"!**/assets/**",
"!**/CypherCodeMirror.js",
"!**/cypher/**",
"!**/Download/utils/**"
]
},
"release": {
"plugins": [
"@semantic-release/commit-analyzer",
Expand All @@ -97,6 +113,8 @@
"@semantic-release/github": "^7.0.5",
"@semantic-release/npm": "^7.0.5",
"@semantic-release/release-notes-generator": "^9.0.1",
"@typescript-eslint/parser": "^2.30.0",
"jest-environment-jsdom-sixteen": "^1.0.3",
"semantic-release": "^17.0.6"
}
}
9 changes: 5 additions & 4 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ import Sidebar from './components/sidebar/Sidebar';

import { doLogout } from './service/neo.service';
import { getDBSchema } from './service/schema.service';

import { cls } from './global/utils';
import { useAsyncDispatch } from './global/utils/hooks/dispatch';
import actions from './global/utils/store/actions';

import './App.css';
import actions from './global/utils/store/actions';
import { useAsyncDispatch } from './global/utils/hooks/dispatch';

function App() {
const [cookies, setCookie] = useCookies(["neo4jDash.sess"]);
Expand Down Expand Up @@ -53,15 +54,15 @@ function App() {

const render = () => {
if (loading) {
return <em className={cls('AppLoading', "material-icons")}>share</em>
return <em data-testid="loading" className={cls('AppLoading', "material-icons")}>share</em>
} else {
if (!user.loggedIn) {
return (
<Login callback={ loginHandler }></Login>
)
} else {
return (
<div className="AppContainer">
<div data-testid="app" className="AppContainer">
<Header toggleMenu={toggleMenu}></Header>
<Comander></Comander>
{menu ? <Sidebar className="animated fadeInLeft" /> : null}
Expand Down
106 changes: 99 additions & 7 deletions src/App.test.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,110 @@
import React from 'react';
import { render } from '@testing-library/react';
import App from './App';
import { setup } from './global/utils/tests/store.mock';
import { getMockProvider } from './global/utils/tests/store.mock';
import * as service from './service/neo.service';
import actions from './global/utils/store/actions';
import { Cookies } from 'react-cookie';
import { cleanup } from '@testing-library/react';
import { Simulate } from 'react-dom/test-utils';

jest.mock('./components/comander/Comander.js', () => {
return function MockComander() {
return <div></div>
}
});

service.doLogout = jest.fn();
service.getQuery = jest.fn();

describe('App test suite', () => {
beforeAll(() => {
let rendered;

beforeEach(() => {
const cookies = new Cookies();
cookies.set('neo4jDash.sess', { sessionId: 'test' });
({ rendered } = getMockProvider(<App/>, { user: { loggedIn: false } }));
})

afterEach(() => {
jest.restoreAllMocks();
cleanup();
});

test("renders App if user is logged in", async () => {
const { findByTestId } = rendered;

const linkElement = await findByTestId("app");
expect(linkElement).toBeDefined();
});
});

describe('App user loggedIn test suite', () => {
let rendered;
let store;
let act;

beforeEach(() => {
({ rendered, store, act } = getMockProvider(<App/>, { user: { loggedIn: true }}));
});

afterEach(() => {
jest.restoreAllMocks();
cleanup();
});

test("renders App if user is logged in", async () => {
const { getByTestId } = rendered;
const appElement = getByTestId('app');
expect(appElement).toBeDefined();
});

test("trigger logout if user click logout button", async () => {
const { findByTestId } = rendered;
act(() => {
store.dispatch(actions.user.logOut());
})
const linkElement = await findByTestId("login");
expect(linkElement).toBeDefined();
})
});

describe("App user not logged test suite", () => {
let rendered;

beforeEach(() => {
({ rendered } = getMockProvider(<App/>, { theme: {}, user: { loggedIn: false } }));
});

afterEach(() => {
jest.restoreAllMocks();
cleanup();
});

test('renders login button if user is not logged in', () => {
const { MockProvider } = setup({ theme: {}, user: { loggedIn: false } });
const { getByText } = render(<MockProvider><App /></MockProvider>);
test("renders login button if user is not logged in", async () => {
const { getByText } = rendered;
const linkElement = getByText("Login");
expect(linkElement).toBeDefined();
});
})
});

describe("App sidebar test suite", () => {
let rendered;

beforeEach(() => {
({ rendered } = getMockProvider(<App/>, { theme: {}, user: { loggedIn: true } }));
});

afterEach(() => {
jest.restoreAllMocks();
cleanup();
})

test("sidebar render test", async () => {
const { getByTestId, findByTestId } = rendered;
const trigger = getByTestId('menu-trigger');
Simulate.click(trigger);
const element = await findByTestId('sidebar');
expect(element).toBeDefined();
})
});

27 changes: 21 additions & 6 deletions src/components/card/Card.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ function Card(props) {
}, [props.query, user.sessionId])

useEffect(() => {
/* istanbul ignore else */
if (query.current !== props.query) {
query.current = props.query;
setResults(null);
Expand Down Expand Up @@ -90,32 +91,44 @@ function Card(props) {

return (
<ColumnLayout
data-testid="card"
className={cls(styles.card, expanded ? styles.expanded : "", fullscreen ? styles.fullscreen : "")}
>
<header className="row middle spaced">
<span className={styles.cardTitle}>QUERY</span>
<div className={styles.cardQuery} onClick={() => props.restoreQuery(null, props.query)}>
<div
data-testid="restore-trigger"
className={styles.cardQuery}
onClick={() => props.restoreQuery(null, props.query)}>
{props.query}
</div>
<RowLayout dist="middle right" className={styles.iconContainer}>
<em className="material-icons" title="download" onClick={toggleDownload}>
<em
data-testid="toggle-download"
className="material-icons"
title="download"
onClick={toggleDownload}
>
save_alt
</em>
<em
data-testid="toggle-fullscreen"
className="material-icons"
title={fullscreen ? "minimize" : "maximize"}
onClick={toggleFullScreen}
>
{fullscreen ? "fullscreen_exit" : "fullscreen"}
</em>
<em
data-testid="toggle-expand"
className={cls(styles.expand, "material-icons", fullscreen ? "disabled" : "")}
title={expanded ? "contract" : "expand"}
onClick={fullscreen ? null : toggleExpand}
>
{expanded ? "unfold_less" : "unfold_more"}
</em>
<em className="material-icons" title="close" onClick={() => props.deleteQuery(props.query)}>
<em className="material-icons" data-testid="delete-query"
title="close" onClick={() => props.deleteQuery(props.query)}>
close
</em>
{download ? (
Expand All @@ -132,6 +145,7 @@ function Card(props) {
</ColumnLayout>
</ColumnLayout>
<Chart
data-testid="chart"
style={{ width: "100%" }}
result={results}
maxNeighbours={30}
Expand All @@ -143,13 +157,14 @@ function Card(props) {
autoComplete={false}
zoomEnabled={true}
fullscreen={fullscreen}
assignVisElement={(svgElement, graphElement) =>
(visElement.current = { svgElement, graphElement, type: "graph" })
assignVisElement={
/* istanbul ignore next */
(svgElement, graphElement) => (visElement.current = { svgElement, graphElement, type: "graph" })
}
/>
</RowLayout>
) : (
<ColumnLayout dist="center middle" className={cls(styles.cardBody, styles.loading)}>
<ColumnLayout data-testid="error" dist="center middle" className={cls(styles.cardBody, styles.loading)}>
{error ? error : <em className={cls("AppLoading", "material-icons")}>share</em>}
</ColumnLayout>
)}
Expand Down
Loading

0 comments on commit c566240

Please sign in to comment.