Skip to content

React testing library #109

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 31 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
4043947
add new config to jest
rady-ben Sep 3, 2021
3f2a646
configure enzyme and test the render of FileForm
rady-ben Sep 3, 2021
b7b0960
remove unused componenent
rady-ben Sep 5, 2021
75f927e
test the render of the element inside FileForm component
rady-ben Sep 6, 2021
c05a2ec
add propTypes tests
rady-ben Sep 7, 2021
dfb0c78
add default propos
rady-ben Sep 8, 2021
24846a9
add text input behaviour tests
rady-ben Sep 8, 2021
2ffcbde
refractor the Enzyme utils in separate file to not repeat the config …
rady-ben Sep 9, 2021
6390bb4
add some messing propTypes to FileCard
rady-ben Sep 9, 2021
99bf78d
replace the authentication props by is authenticated
rady-ben Sep 10, 2021
afbd3d7
add the render tests fot the FileCard
rady-ben Sep 10, 2021
b9e0e77
add prop types test for theFileCard
rady-ben Sep 10, 2021
6a0dd50
add unit test for the useState on FileCard
rady-ben Sep 10, 2021
4b3cdd4
use deferents initials states on jest tests
rady-ben Sep 13, 2021
fb37448
allow useing the destructuring import of useState without breaking tests
rady-ben Sep 14, 2021
0aadb90
return the tests removed by mistake
rady-ben Sep 14, 2021
1313723
reset useState to its initial value befor run rendering tests
rady-ben Sep 14, 2021
fe79d01
test the conditionel rendering of Pageview icon
rady-ben Sep 14, 2021
4bc8d2f
config react testing library and add input changes tests
rady-ben Sep 16, 2021
f1a6f26
check if all inputs are inside the compoenent
rady-ben Sep 17, 2021
3f3854a
add some refractoring
rady-ben Sep 17, 2021
38a50b7
add submit button tests
rady-ben Sep 17, 2021
e6a728f
bompete the submit button test
rady-ben Sep 17, 2021
d315b4f
test block editable and preview button of the fileCard componenent
rady-ben Sep 22, 2021
7bc1e4c
add the unit tests of the save button
rady-ben Sep 22, 2021
2560b2d
fix duplicated disable attribute
rady-ben Sep 22, 2021
57cb5be
test if save button is enable/disable according to the given permition
rady-ben Sep 22, 2021
d71089b
add delete button unit test
rady-ben Sep 23, 2021
ac8269d
test the closeButton
rady-ben Sep 23, 2021
9182c90
add the File.context.test
rady-ben Sep 26, 2021
becd75d
update the script of lunching react testing library
rady-ben Sep 26, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions __mocks__/File.context.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import React, {useContext} from "react";
import { render, screen, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import { AuthenticationContextProvider, FileContextProvider, RepositoryContextProvider } from "../src";
import { FileContext } from '../src/components/file/File.context';



const FileContextCustomer = () => {
const fileContextValues = useContext(FileContext);
const fileContextKeysArray = Object.keys(fileContextValues);

return(
<div
data-testid="test"
>
{
fileContextKeysArray.map((key)=>(`${key}/`))
}
</div>
)
}




describe('FileContextProvider', () => {
test('FileContextProvider renders correctly', () => {
render(
<AuthenticationContextProvider>
<RepositoryContextProvider
onRepository={()=>{}}
>
<FileContextProvider>
<FileContextCustomer text="text" data-testid="test"/>
</FileContextProvider>
</RepositoryContextProvider>
</AuthenticationContextProvider>
);
const test = screen.getByTestId('test');
expect(test).toHaveTextContent('state/stateValues/actions/component/components/config');
});
})
270 changes: 270 additions & 0 deletions __mocks__/FileCard.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
import React from "react";
import { render, screen, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import FileCard from '../src/components/file/FileCard';
import { checkProps } from './testUtils';




jest.mock('markdown-translatable/dist/components/block-editable/BlockEditable', () =>
({markdown, onEdit, editable}) => (
<input
data-testid="blockEditable"
value={markdown}
onChange={(event) => {
if(editable){
onEdit(event.target.value)
}
}}
readOnly
/>
));




const defaultProps = {
repository: {
owner: {
username: 'username',
avatar_url: 'avatar_url',
},
name: 'name',
avatar_url: 'avatar_url',
permissions: {
push: true,
},
full_name: 'full_name',
default_branch: 'default_branch'
},
file:{
name: 'file.name',
path: 'file.path',
sha: 'file.sha',
content: 'file.content',
branch: 'file.branch',
filepath: 'filepath',
save: () => {},
dangerouslyDelete: () => {},
close: () => {}
},
isAuthenticated: true
}


test('FileForm PropTypes', () => {
const conformingProps = {
repository: {
owner: {
username: 'username',
avatar_url: 'avatar_url',
},
name: 'name',
avatar_url: 'avatar_url',
permissions: {
push: true,
},
full_name: 'full_name',
default_branch: 'default_branch'
},
file:{
name: 'file.name',
path: 'file.path',
sha: 'file.sha',
content: 'file.content',
branch: 'file.branch',
filepath: 'filepath',
save: () => {},
dangerouslyDelete: () => {},
close: () => {}
},
isAuthenticated: true,
}
checkProps(FileCard, conformingProps);
});

describe('cardHeader',() => {
test('cardHeader is inside the document and visible', () => {
render(<FileCard {...defaultProps} />);
const cardHeader = screen.getByTestId('cardHeader');
expect(cardHeader).toBeInTheDocument();
expect(cardHeader).toBeVisible();
});
})

describe('blockEditable', () => {
test('blockEditable is inside the document', () => {
render(<FileCard {...defaultProps} />);
const blockEditable = screen.getByTestId('blockEditable');
expect(blockEditable).toBeInTheDocument();
});

test('blockEditable is editable when user is authenticated', () => {
render(<FileCard {...defaultProps} />);
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
expect(blockEditable.value).toBe('changed text');
});

test('blockEditable is not editable when user is not authenticated', () => {
const updatedProps = {...defaultProps, isAuthenticated: false}
render(<FileCard {...updatedProps} />);
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
expect(blockEditable.value).toBe(defaultProps.file.content);
});
})

describe('previewButton', () => {
test('previewButton is inside the document and visible', () => {
render(<FileCard {...defaultProps} />);
const previewButton = screen.getByTestId('previewButton');
expect(previewButton).toBeInTheDocument();
expect(previewButton).toBeVisible();
});
})

describe('previewIcon', () => {
test('Initially previewIconOutlined is inside the document and visible and previewIcon is not', () => {
render(<FileCard {...defaultProps} />);
const previewIconOutlined = screen.queryByTestId('previewIconOutlined');
expect(previewIconOutlined).toBeInTheDocument();
expect(previewIconOutlined).toBeVisible();
const previewIcon = screen.queryByTestId('previewIcon');
expect(previewIcon).toBeNull();
});

test('switch from previewIconOutlined to previewIcon and vice versa', () => {
render(<FileCard {...defaultProps} />);
const previewButton = screen.getByTestId('previewButton');
fireEvent.click(previewButton)
let previewIconOutlined = screen.queryByTestId('previewIconOutlined');
expect(previewIconOutlined).toBeNull();
let previewIcon = screen.queryByTestId('previewIcon');
expect(previewIcon).toBeInTheDocument();
expect(previewIcon).toBeVisible();
fireEvent.click(previewButton)
previewIconOutlined = screen.queryByTestId('previewIconOutlined');
expect(previewIconOutlined).toBeInTheDocument();
expect(previewIconOutlined).toBeVisible();
previewIcon = screen.queryByTestId('previewIcon');
expect(previewIcon).toBeNull();
});
})

describe('saveButton', () => {
test('saveButton is inside the document and visible and disabled initialy', () => {
render(<FileCard {...defaultProps} />);
const saveButton = screen.getByTestId('saveButton');
expect(saveButton).toBeInTheDocument();
expect(saveButton).toBeVisible();
expect(saveButton).toBeDisabled();
});

test('switch saveButton from enable to disable and vice versa', () => {
render(<FileCard {...defaultProps} />);
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
let saveButton = screen.getByTestId('saveButton');
expect(saveButton).toBeEnabled();
fireEvent.change(blockEditable, {target: {value: defaultProps.file.content}});
saveButton = screen.getByTestId('saveButton');
expect(saveButton).toBeDisabled();
});

test('saveButton is enabled when the text change and the push permission is granted', () => {
render(<FileCard {...defaultProps} />);
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
const saveButton = screen.getByTestId('saveButton');
expect(saveButton).toBeEnabled();
});

test('saveButton is disabled whenpush permission is not granted event it the text change or not', () => {
const updatedProps = {
...defaultProps,
repository: {...defaultProps.repository,
permissions: {
...defaultProps.repository.permissions, push: false
}
}
}
render(<FileCard {...updatedProps} />);
const saveButton = screen.getByTestId('saveButton');
expect(saveButton).toBeDisabled();
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
expect(saveButton).toBeDisabled();
});


})

describe('saveIcon', () => {
test('Initially saveIconOutlined is inside the document and visible and saveIcon is not', () => {
render(<FileCard {...defaultProps} />);
const saveIconOutlined = screen.queryByTestId('saveIconOutlined');
expect(saveIconOutlined).toBeInTheDocument();
expect(saveIconOutlined).toBeVisible();
const saveIcon = screen.queryByTestId('saveIcon');
expect(saveIcon).toBeNull();
});

test('switch from saveIconOutlined to saveIcon and vice versa', () => {
render(<FileCard {...defaultProps} />);
const blockEditable = screen.getByTestId('blockEditable');
fireEvent.change(blockEditable, {target: {value: 'changed text'}});
let saveIconOutlined = screen.queryByTestId('saveIconOutlined');
expect(saveIconOutlined).toBeNull();
let saveIcon = screen.queryByTestId('saveIcon');
expect(saveIcon).toBeInTheDocument();
expect(saveIcon).toBeVisible();
fireEvent.change(blockEditable, {target: {value: defaultProps.file.content}});
saveIconOutlined = screen.queryByTestId('saveIconOutlined');
expect(saveIconOutlined).toBeInTheDocument();
expect(saveIconOutlined).toBeVisible();
saveIcon = screen.queryByTestId('saveIcon');
expect(saveIcon).toBeNull();
});
})


describe('Delete button', () => {
test('Delete button is inside the document and visible', () => {
render(<FileCard {...defaultProps} />);
const deleteButton = screen.queryByTestId('deleteButton');
expect(deleteButton).toBeInTheDocument();
expect(deleteButton).toBeVisible();
});

test('Delete button is enabled when push permissions is granted', () => {
render(<FileCard {...defaultProps} />);
const deleteButton = screen.queryByTestId('deleteButton');
expect(deleteButton).toBeEnabled();
});

test('Delete button is disabled when push permissions is not granted', () => {
const updatedProps = {
...defaultProps,
repository: {...defaultProps.repository,
permissions: {
...defaultProps.repository.permissions, push: false
}
}
}
render(<FileCard {...updatedProps} />);
const deleteButton = screen.queryByTestId('deleteButton');
expect(deleteButton).toBeDisabled();
});
})

describe('closeButton', () => {
test('closeButton is inside the document and visible and enabled', () => {
render(<FileCard {...defaultProps} />);
const closeButton = screen.queryByTestId('closeButton');
expect(closeButton).toBeInTheDocument();
expect(closeButton).toBeVisible();
expect(closeButton).toBeEnabled();
});
})
Loading