docbrown/app/javascript/CommentSubscription/__tests__/commentSubscriptionUtilities.test.js
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

114 lines
3.2 KiB
JavaScript

import fetch from 'jest-fetch-mock';
import {
getCommentSubscriptionStatus,
setCommentSubscriptionStatus,
} from '../commentSubscriptionUtilities';
/* global globalThis */
describe('Comment Subscription Utilities', () => {
const csrfToken = 'this-is-a-csrf-token';
const articleID = 26; // Just a random article ID.
beforeAll(() => {
globalThis.fetch = fetch;
globalThis.getCsrfToken = async () => csrfToken;
});
afterAll(() => {
delete globalThis.fetch;
delete globalThis.getCsrfToken;
});
afterEach(() => {
jest.restoreAllMocks();
});
describe('getCommentSubscriptionStatus', () => {
it('should return a subscription status', async () => {
const response = '{ "config": "all_comments" }';
fetch.mockResponse(response);
const subscriptionStatus = await getCommentSubscriptionStatus(articleID);
expect(subscriptionStatus).toEqual(JSON.parse(response));
});
it('should return a friendly error message when it fails', async () => {
fetch.mockResponse('<html>...some error page</html>');
const subscriptionStatus = await getCommentSubscriptionStatus(articleID);
expect(subscriptionStatus instanceof Error).toEqual(true);
expect(subscriptionStatus.message).toEqual(
'An error occurred, please try again',
);
});
});
describe('setCommentSubscriptionStatus', () => {
it('should unsubscribe', async () => {
fetch.mockResponse('false');
const subscriptionStatusMessage = await setCommentSubscriptionStatus(
articleID,
'not_subscribed',
);
expect(subscriptionStatusMessage).toEqual(
'You have been unsubscribed from comments for this post',
);
});
it('should subscribe', async () => {
fetch.mockResponse(true);
const subscriptionStatusMessage = await setCommentSubscriptionStatus(
articleID,
'all_comments',
);
expect(subscriptionStatusMessage).toEqual(
'You have been subscribed to all comments',
);
});
it('should return a friendly error message if HTML is returned', async () => {
fetch.mockResponse('<html><body>error</body></html>');
const subscriptionStatusMessage = await setCommentSubscriptionStatus(
articleID,
'all_comments',
);
expect(subscriptionStatusMessage).toEqual(
'An error occurred, please try again',
);
});
it('should return a friendly error message if an error occurs', async () => {
fetch.mockReject(() => new Error('oh no'));
const subscriptionStatusMessage = await setCommentSubscriptionStatus(
articleID,
'all_comments',
);
expect(subscriptionStatusMessage).toEqual(
'An error occurred, please try again',
);
});
it('should return a friendly error message if an HTTP status object is returned', async () => {
fetch.mockResponse('{"status":405,"error":"Method Not Allowed"}');
const subscriptionStatusMessage = await setCommentSubscriptionStatus(
articleID,
'all_comments',
);
expect(subscriptionStatusMessage).toEqual(
'An error occurred, please try again',
);
});
});
});