docbrown/app/javascript/CommentSubscription/__tests__/CommentSubscription.test.jsx
Nick Taylor a71d78df6e
[deploy] Add comment subscription component to article page (#7205)
* wip

* Right aligned the comment subscription panel.

* Cleaned up the comment area on the article page so it uses crayon margin classes.

* Updated tests

* Removed old UI for comment subscriptions.

* Made Discussion text bigger and bolder.

* Fixed some layout issues as per PR comments.

* Fixed some layout issues as per PR comments.

* Updated Storybook stories, tests and snapshots

* wip

* Everything works now, just need to integrate snackbar.

* Removed setTimeout I was debugging with.

* Using the new utilities/http/request utility now.

* Added the <SnackbarPoller />

* Now when unsubscribed, the subscription type resets to all comments.

* Removed overflow hidden from .home CSS class so comment subscription component displays properly.

* Now unsuccessful subscribes/unsubscribes error properly.

* Changed button text from Done to Subscribe

* Merged the <SnackbarPoller /> component into the <Snackbar /> component.

* Fixed a propType issue.

* Fixed a test.

* Removed snackbar tests for now. Need to figure out polling in tests.

* Now comment subscription component is only loaded for logged on users.

* Added a comment.

* Updated some storybook stories.

* Fixed a small formatting issue.

* Reduced snackbar item lifespans to 3 seconds.

* Extracted <CogIcon /> to it's own file because other features are going to need it.

* Added some Storybook stories and tests for the <CogIcon /> component.

* Revert "Extracted <CogIcon /> to it's own file because other features are going to need it."

This reverts commit b30406a50e491c53c3dce5be03bcdf8112b043df.

* Put back <CogIcon /> component.

* Added some error handling if the component doesn't load.

* Moving some things around.

* Rename the article pack file.

* Changed wording from "article" to "post".

* Fixed false negative CSS issue. It was a dangling div tag.

* Add the option to add an optional close button to snackbar items.

* Fixed z-index of subscription type options panel so it is always visible on mobile.

* Reworked the comment subsciption utilities a bit.

* Added test for comment subscription utilities.

* Fixed a broken test from a refactor.

* Added more tests for comment subscription utiltities.

* Fixed comments footer bottom padding.

* Fixed issue with stale find in comment subscription test.

* Update app/javascript/packs/articlePage.jsx

Co-authored-by: ludwiczakpawel <ludwiczakpawel@gmail.com>

* Update app/assets/stylesheets/article-show.scss

Co-authored-by: ludwiczakpawel <ludwiczakpawel@gmail.com>

* Changed close button wording to Dismiss.

* Fixed padding to use utility variable instead.

* Added missing import for SASS file.

Co-authored-by: ludwiczakpawel <ludwiczakpawel@gmail.com>
2020-05-05 12:50:30 -04:00

155 lines
5.1 KiB
JavaScript

import { h } from 'preact';
import render from 'preact-render-to-json';
import { deep } from 'preact-render-spy';
import {
CommentSubscription,
COMMENT_SUBSCRIPTION_TYPE,
} from '../CommentSubscription';
describe('<CommentSubscription />', () => {
it('should render as a plain subscribe button if not currently subscribed', () => {
const tree = render(<CommentSubscription />);
expect(tree).toMatchSnapshot();
});
it('should render as subscribed with the given subscription type', () => {
const tree = render(
<CommentSubscription
subscriptionType={COMMENT_SUBSCRIPTION_TYPE.AUTHOR}
/>,
);
expect(tree).toMatchSnapshot();
});
it('should subscribe when the subscribe button is pressed', () => {
const onSubscribe = jest.fn();
const wrapper = deep(<CommentSubscription onSubscribe={onSubscribe} />);
wrapper.find('ButtonGroup').find('Button').first().simulate('click');
expect(onSubscribe).toHaveBeenCalled();
});
it('should unsubscribe from all comments when the Unsubscribe button is pressed', () => {
const onSubscribe = jest.fn();
const onUnsubscribe = jest.fn();
const wrapper = deep(
<CommentSubscription
onSubscribe={onSubscribe}
onUnsubscribe={onUnsubscribe}
/>,
);
// Need to subscribe first so that we can unsubscribe.
wrapper.find('ButtonGroup').find('Button').first().simulate('click'); // Subscribe button
wrapper.find('ButtonGroup').find('Button').first().simulate('click'); // Unsubscribe button
expect(onUnsubscribe).toHaveBeenCalled();
});
it('should show subscription options once subscribed if the cog button is clicked', () => {
const onSubscribe = jest.fn();
const onUnsubscribe = jest.fn();
const wrapper = deep(
<CommentSubscription
subscriptionType={COMMENT_SUBSCRIPTION_TYPE.AUTHOR}
onSubscribe={onSubscribe}
onUnsubscribe={onUnsubscribe}
/>,
);
wrapper.find('ButtonGroup').find('Button').last().simulate('click'); // Cog icon button
const dropdown = wrapper.find('Dropdown');
expect(dropdown.attr('className')).toEqual(
'inline-block z-30 right-4 left-4 s:right-0 s:left-auto w-full',
);
// 3 options for comment subscription
expect(dropdown.find('RadioButton').length).toEqual(3);
// The done button
expect(dropdown.find('Button').length).toEqual(1);
});
it('should not have full width for options when positionType is anything but "relative"', () => {
const onSubscribe = jest.fn();
const onUnsubscribe = jest.fn();
const wrapper = deep(
<CommentSubscription
onSubscribe={onSubscribe}
onUnsubscribe={onUnsubscribe}
positionType="static"
subscriptionType={COMMENT_SUBSCRIPTION_TYPE.AUTHOR}
/>,
);
wrapper.find('ButtonGroup').find('Button').last().simulate('click'); // Cog icon button to open subscription options panel
expect(wrapper.find('Dropdown').attr('className')).toEqual(
'inline-block z-30 right-4 left-4 s:right-0 s:left-auto',
);
});
it('should hide subscription options when the Done button is clicked', () => {
const onSubscribe = jest.fn();
const onUnsubscribe = jest.fn();
const wrapper = deep(
<CommentSubscription
onSubscribe={onSubscribe}
onUnsubscribe={onUnsubscribe}
/>,
);
wrapper.find('ButtonGroup').find('Button').first().simulate('click'); // Subscribe button
wrapper.find('ButtonGroup').find('Button').last().simulate('click'); // Cog icon button to open subscription options panel
wrapper.find('ButtonGroup').find('Button').last().simulate('click'); // Cog icon button to close subscription options panel
const dropdown = wrapper.find('Dropdown');
expect(dropdown.attr('className')).toBeNull();
});
it('should update comment subscription when the done button is clicked in the subscription options panel', () => {
const onSubscribe = jest.fn();
const onUnsubscribe = jest.fn();
const wrapper = deep(
<CommentSubscription
subscriptionType={COMMENT_SUBSCRIPTION_TYPE.TOP}
onSubscribe={onSubscribe}
onUnsubscribe={onUnsubscribe}
/>,
);
wrapper.find('ButtonGroup').find('button').last().simulate('click'); // Subscribe button
expect(wrapper.state('subscriptionType')).toEqual(
COMMENT_SUBSCRIPTION_TYPE.TOP,
);
wrapper.find('ButtonGroup').find('Button').last().simulate('click'); // Cog icon button
// Select the author comments only.
const authorCommentsOnlyRadioButton = wrapper
.find('Dropdown')
.find('RadioButton')
.last();
expect(authorCommentsOnlyRadioButton.attr('value')).toEqual(
COMMENT_SUBSCRIPTION_TYPE.AUTHOR,
);
authorCommentsOnlyRadioButton.simulate('click', {
target: { value: COMMENT_SUBSCRIPTION_TYPE.AUTHOR },
});
const done = wrapper.find('Dropdown').find('Button');
done.simulate('click');
expect(wrapper.state('subscriptionType')).toEqual(
COMMENT_SUBSCRIPTION_TYPE.AUTHOR,
);
// a second time by clicking on the Done button.
expect(onSubscribe).toHaveBeenCalled();
});
});