Skip to content
This repository was archived by the owner on Jan 16, 2022. It is now read-only.

Commit 9eb698f

Browse files
priscilawebdevjuanpicado
authored andcommitted
fix: install Component - Replaced class by func. comp (#152)
* refactor: convert class to func comp * fix: fixed wrong maintainer type * refactor: created a partials folder * fix: fixed test
1 parent 43a9628 commit 9eb698f

File tree

7 files changed

+6761
-92
lines changed

7 files changed

+6761
-92
lines changed
Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,54 @@
11
import React from 'react';
2-
import { mount } from 'enzyme';
2+
import { render } from '@testing-library/react';
3+
4+
import { DetailContext, DetailContextProps } from '../../pages/Version';
5+
import data from './__partials__/data.json';
36

47
import Install from './Install';
58

6-
describe('<Install /> component', () => {
7-
test('should render the component in default state', () => {
8-
const wrapper = mount(<Install />);
9-
expect(wrapper.html()).toMatchSnapshot();
9+
const detailContextValue: Partial<DetailContextProps> = {
10+
packageName: 'foo',
11+
packageMeta: data,
12+
};
13+
14+
const ComponentToBeRendered: React.FC = () => (
15+
<DetailContext.Provider value={detailContextValue}>
16+
<Install />
17+
</DetailContext.Provider>
18+
);
19+
20+
/* eslint-disable react/jsx-no-bind*/
21+
describe('<Install />', () => {
22+
test('renders correctly', () => {
23+
const { container } = render(<ComponentToBeRendered />);
24+
expect(container.firstChild).toMatchSnapshot();
25+
});
26+
27+
test('should have 3 children', () => {
28+
const { getByTestId } = render(<ComponentToBeRendered />);
29+
const installListItems = getByTestId('installList');
30+
// installitems + subHeader = 4
31+
expect(installListItems.children.length).toBe(4);
32+
});
33+
34+
test('should have the element NPM', () => {
35+
const { getByTestId, queryByText } = render(<ComponentToBeRendered />);
36+
expect(getByTestId('installListItem-npm')).toBeTruthy();
37+
expect(queryByText(`npm install ${detailContextValue.packageName}`)).toBeTruthy();
38+
expect(queryByText('Install using npm')).toBeTruthy();
39+
});
40+
41+
test('should have the element YARN', () => {
42+
const { getByTestId, queryByText } = render(<ComponentToBeRendered />);
43+
expect(getByTestId('installListItem-yarn')).toBeTruthy();
44+
expect(queryByText(`yarn add ${detailContextValue.packageName}`)).toBeTruthy();
45+
expect(queryByText('Install using yarn')).toBeTruthy();
46+
});
47+
48+
test('should have the element PNPM', () => {
49+
const { getByTestId, queryByText } = render(<ComponentToBeRendered />);
50+
expect(getByTestId('installListItem-pnpm')).toBeTruthy();
51+
expect(queryByText(`pnpm install ${detailContextValue.packageName}`)).toBeTruthy();
52+
expect(queryByText('Install using pnpm')).toBeTruthy();
1053
});
1154
});

src/components/Install/Install.tsx

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,34 @@
1+
import React, { useContext } from 'react';
2+
import styled from 'react-emotion';
3+
import Typography from '@material-ui/core/Typography';
14
import List from '@material-ui/core/List';
2-
import React, { Component } from 'react';
35

4-
import { DetailContextConsumer, VersionPageConsumerProps } from '../../pages/Version';
6+
import { DetailContext } from '../../pages/Version';
7+
import { fontWeight } from '../../utils/styles/sizes';
58

6-
import CopyToClipBoard from '../CopyToClipBoard';
9+
import InstallListItem, { DependencyManager } from './InstallListItem';
710

8-
// logos of package managers
9-
import npm from './img/npm.svg';
10-
import pnpm from './img/pnpm.svg';
11-
import yarn from './img/yarn.svg';
11+
const Heading = styled(Typography)({
12+
fontWeight: fontWeight.bold,
13+
textTransform: 'capitalize',
14+
});
1215

13-
import { Heading, InstallItem, PackageMangerAvatar, InstallListItemText } from './styles';
16+
const Install: React.FC = () => {
17+
const detailContext = useContext(DetailContext);
1418

15-
class Install extends Component {
16-
public render(): JSX.Element {
17-
return (
18-
<DetailContextConsumer>
19-
{(context: Partial<VersionPageConsumerProps>) => {
20-
return context && context.packageName && this.renderCopyCLI(context);
21-
}}
22-
</DetailContextConsumer>
23-
);
19+
const { packageMeta, packageName } = detailContext;
20+
21+
if (!packageMeta || !packageName) {
22+
return null;
2423
}
2524

26-
public renderCopyCLI = ({ packageName = '' }: Partial<VersionPageConsumerProps>) => {
27-
return (
28-
<>
29-
<List subheader={<Heading variant={'subtitle1'}>{'Installation'}</Heading>}>{this.renderListItems(packageName)}</List>
30-
</>
31-
);
32-
};
33-
34-
public renderListItems = (packageName: string) => {
35-
return (
36-
<>
37-
<InstallItem button={true}>
38-
<PackageMangerAvatar alt={'npm logo'} src={npm} />
39-
<InstallListItemText primary={<CopyToClipBoard text={`npm install ${packageName}`} />} secondary={'Install using NPM'} />
40-
</InstallItem>
41-
<InstallItem button={true}>
42-
<PackageMangerAvatar alt={'yarn logo'} src={yarn} />
43-
<InstallListItemText primary={<CopyToClipBoard text={`yarn add ${packageName}`} />} secondary={'Install using Yarn'} />
44-
</InstallItem>
45-
<InstallItem button={true}>
46-
<PackageMangerAvatar alt={'pnpm logo'} src={pnpm} />
47-
<InstallListItemText primary={<CopyToClipBoard text={`pnpm install ${packageName}`} />} secondary={'Install using PNPM'} />
48-
</InstallItem>
49-
</>
50-
);
51-
};
52-
}
25+
return (
26+
<List data-testid={'installList'} subheader={<Heading variant={'subtitle1'}>{'Installation'}</Heading>}>
27+
<InstallListItem dependencyManager={DependencyManager.NPM} packageName={packageName} />
28+
<InstallListItem dependencyManager={DependencyManager.YARN} packageName={packageName} />
29+
<InstallListItem dependencyManager={DependencyManager.PNPM} packageName={packageName} />
30+
</List>
31+
);
32+
};
5333

5434
export default Install;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import React from 'react';
2+
import styled from 'react-emotion';
3+
import Avatar from '@material-ui/core/Avatar';
4+
import ListItem from '@material-ui/core/ListItem';
5+
import ListItemText from '@material-ui/core/ListItemText';
6+
7+
import CopyToClipBoard from '../CopyToClipBoard';
8+
9+
// logos of package managers
10+
import npmLogo from './img/npm.svg';
11+
import pnpmLogo from './img/pnpm.svg';
12+
import yarnLogo from './img/yarn.svg';
13+
14+
const InstallItem = styled(ListItem)({
15+
padding: 0,
16+
':hover': {
17+
backgroundColor: 'transparent',
18+
},
19+
});
20+
21+
const InstallListItemText = styled(ListItemText)({
22+
padding: '0 10px',
23+
margin: 0,
24+
});
25+
26+
const PackageMangerAvatar = styled(Avatar)({
27+
borderRadius: '0px',
28+
padding: '0',
29+
});
30+
31+
export enum DependencyManager {
32+
NPM = 'npm',
33+
YARN = 'yarn',
34+
PNPM = 'pnpm',
35+
}
36+
37+
interface Interface {
38+
packageName: string;
39+
dependencyManager: DependencyManager;
40+
}
41+
42+
const InstallListItem: React.FC<Interface> = ({ packageName, dependencyManager }) => {
43+
switch (dependencyManager) {
44+
case DependencyManager.NPM:
45+
return (
46+
<InstallItem button={true} data-testid={'installListItem-npm'}>
47+
<PackageMangerAvatar alt="npm" src={npmLogo} />
48+
<InstallListItemText primary={<CopyToClipBoard text={`npm install ${packageName}`} />} secondary={'Install using npm'} />
49+
</InstallItem>
50+
);
51+
case DependencyManager.YARN:
52+
return (
53+
<InstallItem button={true} data-testid={'installListItem-yarn'}>
54+
<PackageMangerAvatar alt="yarn" src={pnpmLogo} />
55+
<InstallListItemText primary={<CopyToClipBoard text={`yarn add ${packageName}`} />} secondary={'Install using yarn'} />
56+
</InstallItem>
57+
);
58+
case DependencyManager.PNPM:
59+
return (
60+
<InstallItem button={true} data-testid={'installListItem-pnpm'}>
61+
<PackageMangerAvatar alt={'pnpm'} src={yarnLogo} />
62+
<InstallListItemText primary={<CopyToClipBoard text={`pnpm install ${packageName}`} />} secondary={'Install using pnpm'} />
63+
</InstallItem>
64+
);
65+
default:
66+
return null;
67+
}
68+
};
69+
70+
export default InstallListItem;

0 commit comments

Comments
 (0)