Fix hide/unhide user and setVerifiedStatus
* add tests for user store
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
import { mockStore } from '@app/testUtils/mockStore';
|
import { mockStore } from '@app/testUtils/mockStore';
|
||||||
|
import { LS_SORT_KEY } from '@app/common/constants';
|
||||||
|
|
||||||
import { updateSorting } from './actions';
|
import { updateSorting } from './actions';
|
||||||
import { COMMENTS_SET_SORT } from './types';
|
import { COMMENTS_SET_SORT } from './types';
|
||||||
import { LS_SORT_KEY } from '@app/common/constants';
|
|
||||||
|
|
||||||
describe('Store comments actions', () => {
|
describe('Store comments actions', () => {
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"comments": {
|
||||||
|
"allComments": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"user": {
|
||||||
|
"id": "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"user": {
|
||||||
|
"id": "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"user": {
|
||||||
|
"id": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import { mockStore } from '@app/testUtils/mockStore';
|
||||||
|
import { User } from '@app/common/types';
|
||||||
|
import { LS_HIDDEN_USERS_KEY } from '@app/common/constants';
|
||||||
|
import { COMMENTS_PATCH } from '@app/store/comments/types';
|
||||||
|
|
||||||
|
import INITIAL_STORE from './__mocks__/comments-store.json';
|
||||||
|
import { setVerifiedStatus, hideUser, unhideUser, unblockUser } from './actions';
|
||||||
|
import { USER_UNHIDE, USER_HIDE, USER_UNBAN } from './types';
|
||||||
|
|
||||||
|
describe('store user actions', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
require('jest-fetch-mock').enableMocks();
|
||||||
|
});
|
||||||
|
afterAll(() => {
|
||||||
|
require('jest-fetch-mock').resetMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('setVerifiedStatus', async () => {
|
||||||
|
const store = mockStore(INITIAL_STORE);
|
||||||
|
|
||||||
|
await store.dispatch(setVerifiedStatus('1', true));
|
||||||
|
|
||||||
|
const actions = store.getActions();
|
||||||
|
|
||||||
|
expect(actions[0]).toEqual({
|
||||||
|
type: COMMENTS_PATCH,
|
||||||
|
ids: ['1', '3'],
|
||||||
|
patch: { user: { id: '1', verified: true } },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('unblockUser', async () => {
|
||||||
|
const store = mockStore(INITIAL_STORE);
|
||||||
|
|
||||||
|
await store.dispatch(unblockUser('1'));
|
||||||
|
|
||||||
|
const actions = store.getActions();
|
||||||
|
|
||||||
|
expect(actions[0]).toEqual({ type: USER_UNBAN, id: '1' });
|
||||||
|
expect(actions[1]).toEqual({ type: COMMENTS_PATCH, ids: ['1', '3'], patch: { user: { id: '1', block: false } } });
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('hide/unhide comments of user', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
const store = mockStore(INITIAL_STORE);
|
||||||
|
test('hideUser', async () => {
|
||||||
|
await store.dispatch(hideUser({ id: '1' } as User));
|
||||||
|
|
||||||
|
const actions = store.getActions();
|
||||||
|
|
||||||
|
expect(actions[0]).toEqual({ type: USER_HIDE, user: { id: '1' } });
|
||||||
|
expect(actions[1]).toEqual({ type: COMMENTS_PATCH, ids: ['1', '3'], patch: { hidden: true } });
|
||||||
|
expect(localStorage.getItem).toHaveBeenCalledWith(LS_HIDDEN_USERS_KEY);
|
||||||
|
expect(localStorage.setItem).toHaveBeenCalledWith(LS_HIDDEN_USERS_KEY, JSON.stringify({ '1': { id: '1' } }));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('unhideUser', async () => {
|
||||||
|
localStorage.setItem(LS_HIDDEN_USERS_KEY, JSON.stringify({ '1': { id: '1' } }));
|
||||||
|
await store.dispatch(unhideUser('1'));
|
||||||
|
|
||||||
|
const actions = store.getActions();
|
||||||
|
|
||||||
|
expect(actions[2]).toEqual({ type: USER_UNHIDE, id: '1' });
|
||||||
|
expect(localStorage.getItem).toHaveBeenCalledWith(LS_HIDDEN_USERS_KEY);
|
||||||
|
expect(localStorage.setItem).toHaveBeenCalledWith(LS_HIDDEN_USERS_KEY, JSON.stringify({}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -16,7 +16,7 @@ import {
|
|||||||
} from './types';
|
} from './types';
|
||||||
import { unsetCommentMode, fetchComments } from '../comments/actions';
|
import { unsetCommentMode, fetchComments } from '../comments/actions';
|
||||||
import { IS_STORAGE_AVAILABLE, LS_HIDDEN_USERS_KEY } from '@app/common/constants';
|
import { IS_STORAGE_AVAILABLE, LS_HIDDEN_USERS_KEY } from '@app/common/constants';
|
||||||
import { getItem } from '@app/common/local-storage';
|
import { setItem, getItem } from '@app/common/local-storage';
|
||||||
import { updateProvider } from '../provider/actions';
|
import { updateProvider } from '../provider/actions';
|
||||||
import { COMMENTS_PATCH } from '../comments/types';
|
import { COMMENTS_PATCH } from '../comments/types';
|
||||||
|
|
||||||
@@ -76,18 +76,16 @@ export const blockUser = (
|
|||||||
|
|
||||||
export const unblockUser = (id: User['id']): StoreAction<Promise<void>> => async (dispatch, getState) => {
|
export const unblockUser = (id: User['id']): StoreAction<Promise<void>> => async (dispatch, getState) => {
|
||||||
await api.unblockUser(id);
|
await api.unblockUser(id);
|
||||||
dispatch({
|
dispatch({ type: USER_UNBAN, id });
|
||||||
type: USER_UNBAN,
|
const comments = Object.values(getState().comments.allComments);
|
||||||
id,
|
const userComments = comments.filter(comment => comment.user.id === id);
|
||||||
});
|
|
||||||
const comments = Object.values(getState().comments).filter(c => c.user.id === id);
|
|
||||||
|
|
||||||
if (!comments.length) return;
|
if (!userComments.length) return;
|
||||||
const user = comments[0].user;
|
const user = comments[0].user;
|
||||||
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: COMMENTS_PATCH,
|
type: COMMENTS_PATCH,
|
||||||
ids: comments.map(c => c.id),
|
ids: userComments.map(c => c.id),
|
||||||
patch: { user: { ...user, block: false } },
|
patch: { user: { ...user, block: false } },
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -100,30 +98,26 @@ export const fetchHiddenUsers = (): StoreAction<void> => dispatch => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const hideUser = (user: User): StoreAction<void> => (dispatch, getState) => {
|
export const hideUser = (user: User): StoreAction<void> => (dispatch, getState) => {
|
||||||
if (IS_STORAGE_AVAILABLE) {
|
const hiddenUsers = JSON.parse(getItem(LS_HIDDEN_USERS_KEY) || '{}');
|
||||||
const hiddenUsers = JSON.parse(getItem(LS_HIDDEN_USERS_KEY) || '{}');
|
|
||||||
hiddenUsers[user.id] = user;
|
|
||||||
localStorage.setItem(LS_HIDDEN_USERS_KEY, JSON.stringify(hiddenUsers));
|
|
||||||
}
|
|
||||||
dispatch({ type: USER_HIDE, user });
|
|
||||||
|
|
||||||
dispatch({
|
hiddenUsers[user.id] = user;
|
||||||
type: COMMENTS_PATCH,
|
setItem(LS_HIDDEN_USERS_KEY, JSON.stringify(hiddenUsers));
|
||||||
ids: Object.values(getState().comments)
|
|
||||||
.filter(c => c.user.id === user.id)
|
const ids = Object.values(getState().comments.allComments)
|
||||||
.map(c => c.id),
|
.filter(c => c.user.id === user.id)
|
||||||
patch: { hidden: true },
|
.map(c => c.id);
|
||||||
});
|
|
||||||
|
dispatch({ type: USER_HIDE, user });
|
||||||
|
dispatch({ type: COMMENTS_PATCH, ids, patch: { hidden: true } });
|
||||||
};
|
};
|
||||||
|
|
||||||
export const unhideUser = (userId: string): StoreAction<void> => (dispatch, _getState) => {
|
export const unhideUser = (userId: string): StoreAction<void> => (dispatch, _getState) => {
|
||||||
if (IS_STORAGE_AVAILABLE) {
|
const hiddenUsers = JSON.parse(getItem(LS_HIDDEN_USERS_KEY) || '{}');
|
||||||
const hiddenUsers = JSON.parse(getItem(LS_HIDDEN_USERS_KEY) || '{}');
|
|
||||||
if (Object.prototype.hasOwnProperty.call(hiddenUsers, userId)) {
|
if (Object.prototype.hasOwnProperty.call(hiddenUsers, userId)) {
|
||||||
delete hiddenUsers[userId];
|
delete hiddenUsers[userId];
|
||||||
}
|
|
||||||
localStorage.setItem(LS_HIDDEN_USERS_KEY, JSON.stringify(hiddenUsers));
|
|
||||||
}
|
}
|
||||||
|
setItem(LS_HIDDEN_USERS_KEY, JSON.stringify(hiddenUsers));
|
||||||
|
|
||||||
dispatch({ type: USER_UNHIDE, id: userId });
|
dispatch({ type: USER_UNHIDE, id: userId });
|
||||||
|
|
||||||
@@ -139,13 +133,15 @@ export const setVerifiedStatus = (id: User['id'], status: boolean): StoreAction<
|
|||||||
} else {
|
} else {
|
||||||
await api.removeVerifiedStatus(id);
|
await api.removeVerifiedStatus(id);
|
||||||
}
|
}
|
||||||
const comments = Object.values(getState().comments).filter(c => c.user.id === id);
|
const comments = Object.values(getState().comments.allComments);
|
||||||
if (!comments.length) return;
|
const userComments = comments.filter(c => c.user.id === id);
|
||||||
const user = comments[0].user;
|
|
||||||
|
if (!userComments.length) return;
|
||||||
|
const user = userComments[0].user;
|
||||||
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: COMMENTS_PATCH,
|
type: COMMENTS_PATCH,
|
||||||
ids: comments.map(c => c.id),
|
ids: userComments.map(c => c.id),
|
||||||
patch: { user: { ...user, verified: status } },
|
patch: { user: { ...user, verified: status } },
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user