Skip to content

Commit

Permalink
[feature #165412889 && #165412878] add article rating && article read…
Browse files Browse the repository at this point in the history
… time
  • Loading branch information
kagaramag committed Jul 18, 2019
1 parent 0001d37 commit b837925
Show file tree
Hide file tree
Showing 40 changed files with 859 additions and 32 deletions.
12 changes: 12 additions & 0 deletions src/__tests__/actions/articles/getPublished.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { getPublished } from '../../../actions/articles';
import article from '../../../__mocks__/article';

const dispatch = jest.fn(action => action);

describe('published article articles', () => {
it('returns publish information', async () => {
const result = getPublished()(dispatch);
expect(result).toHaveProperty('type');
expect(result).toHaveProperty('payload');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`<RatingComponent /> should render a <CreateRatingComponent /> component 1`] = `ShallowWrapper {}`;
35 changes: 35 additions & 0 deletions src/__tests__/actions/rating/createRate.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import React from 'react';
import configureMockStore from 'redux-mock-store';
import thunk from 'react-thunk';
import { Provider } from 'react-redux';
// import article from '../../../__mocks__/article';
import { createRate } from '../../../actions/rating';
import { Rating as RatingComponent } from '../../../components/Articles/Article/Rating';
import { shallow, mount } from '../../../../config/enzymeConfig';

describe('<RatingComponent />', () => {
const props = {
slug: 'slug-slug',
rating: 1,
errors: { error: ['12'] },
createRate: jest.fn(),
fetchOneArticle: jest.fn()
};
const rating = {
slug: 'slug-slug',
rating: 1
};
const component = shallow(<RatingComponent {...props} />);
it('should render a <CreateRatingComponent /> component ', () => {
expect(component).toMatchSnapshot();
});
const dispatch = jest.fn(action => action);

describe('Create rating', () => {
test('returns rating information', async () => {
const result = createRate(rating)(dispatch);
expect(result).toHaveProperty('type');
expect(result).toHaveProperty('payload');
});
});
});
87 changes: 87 additions & 0 deletions src/__tests__/components/Articles/Rating.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import React from 'react';
import configureMockStore from 'redux-mock-store';
import thunk from 'react-thunk';
import { Provider } from 'react-redux';
import { MemoryRouter } from 'react-router-dom';
import { mockStore, initialState } from '../../../__mocks__/store';
import {
Rating as RatingComponent,
mapStateToProps
} from '../../../components/Articles/Article/Rating';
import { shallow, mount } from '../../../../config/enzymeConfig';

describe('<Article />', () => {
const props = {
message: 'Thank you for rating this article',
errors: { token: 'Failed to authenticate token' },
submitRate: jest.fn(),
createRate: jest.fn(),
closeMessage: jest.fn(),
ratingStars: jest.fn(),
fetchOneArticle: jest.fn(),
getSpecificArticle: jest.fn(),
isAuth: true,
slug: 'slug-article-12fg51x',
article: {
title: 'yes man',
rating: 1,
description: 'yes'
},
loading: false
};
const component = shallow(<RatingComponent {...props} />);
it('should create <RatingComponent /> snapshot ', () => {
expect(component).toMatchSnapshot();
});
it('should trigger submit rate ', () => {
component.setProps({ message: props.message, slug: props.slug, isAuth: true });
component.instance().submitRate(4);
});
it('should trigger close message ', () => {
component.setState({ message: { rating: 'updated' } });
component
.find('.rating-errors i')
.at(1)
.simulate('click');
component.instance().closeMessage();
});
it('should trigger close message ', () => {
component.setState({ message: { rating: 'updated' } });
component
.find('.rating-errors i')
.at(0)
.simulate('click');
component.instance().closeMessage();
});
it('should trigger submit rate ', () => {
component.setProps({ message: props.message, slug: props.slug, isAuth: false });
component.setState({ errors: { token: 'some' } });
component.instance().submitRate(4);
});
it('should trigger submit rate ', () => {
component.setProps({ message: props.message, slug: props.slug, isAuth: false });
component.setState({ errors: { token: 'token' } });
component.instance().submitRate(4);
});
it('should trigger submit rate ', () => {
component
.find('.one-star')
.at(1)
.simulate('click', 5);
});

it('should test map state', () => {
mapStateToProps({
user: { isAuth: true },
articles: { article: props.article },
rating: {
createRate: {
loading: false,
message: 'yes',
errors: { token: 'token' }
}
}
});
expect(mapStateToProps).toBeDefined();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`<Article /> should create <RatingComponent /> snapshot 1`] = `ShallowWrapper {}`;

exports[`<Article /> should render a <RatingComponent /> component 1`] = `ShallowWrapper {}`;
100 changes: 100 additions & 0 deletions src/__tests__/components/Profile/MyArticles/Published.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import React from 'react';
import configureMockStore from 'redux-mock-store';
import thunk from 'react-thunk';
import { Provider } from 'react-redux';
import { MemoryRouter } from 'react-router-dom';
import URL from '../../../../__mocks__/URL';
import articles from '../../../../__mocks__/articles';
import { mockStore, initialState } from '../../../../__mocks__/store';
import { PublishedArticles as PublishedArticlesComponent } from '../../../../components/Profile/Articles/MyArticles/Published';
import { mount, shallow } from '../../../../../config/enzymeConfig';

const props = {
errors: {},
article: {
title: 'Hello John Doe',
description: 'John Doe, Mocker',
body: 'body of the article',
slug: 'slug-slug-slug'
},
message: { message: 'Published' },
fetchOneArticle: jest.fn(),
history: {},
match: { params: { slug: 'slug-slug-slug' } },
publishArticle: jest.fn(),
unpublishArticle: jest.fn(),
deleteArticle: jest.fn(),
fileSelectedHandler: jest.fn(),
createObjectURL: jest.fn(),
getPublished: jest.fn()
};
const store = mockStore({
...initialState,
articles: { articles },
getPublished: jest.fn(true)
});
const state = {
article: {
title: 'Hello John Doe',
description: 'John Doe, Mocker',
body: JSON.stringify({
blocks: [
{
key: 'cnu26',
text: 'test componentWillReceiveProps failedtest componentWillReceiveProps failed',
type: 'unstyled',
depth: 0,
inlineStyleRanges: [
{ offset: 0, length: 74, style: 'color-rgb(36,41,46)' },
{ offset: 0, length: 74, style: 'bgcolor-rgb(255,255,255)' },
{ offset: 0, length: 74, style: 'fontsize-32' },
{
offset: 0,
length: 74,
style:
'fontfamily--apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol'
}
],
entityRanges: [],
data: { 'text-align': 'start' }
},
{
key: 'emuik',
text: 'Okey',
type: 'unstyled',
depth: 0,
inlineStyleRanges: [
{ offset: 0, length: 4, style: 'color-rgb(36,41,46)' },
{ offset: 0, length: 4, style: 'bgcolor-rgb(255,255,255)' },
{ offset: 0, length: 4, style: 'fontsize-32' },
{
offset: 0,
length: 4,
style:
'fontfamily--apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol'
}
],
entityRanges: [],
data: {}
}
],
entityMap: {}
}),
slug: 'slug-slug-slug'
},
message: { message: 'Published' },
getPublished: jest.fn()
};
describe('<PublishedArticlesComponent />', () => {
const component = shallow(<PublishedArticlesComponent {...props} />);
it('should render a <PublishedArticlesComponent /> component ', () => {
const component = mount(<Provider store={store}>
<MemoryRouter>
<PublishedArticlesComponent {...props} />
</MemoryRouter>
</Provider>);
});
it('should trigger publish ', () => {
component.setProps({ articles });
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`<PublishedArticlesComponent /> should render a <PublishedArticlesComponent /> component 1`] = `ShallowWrapper {}`;
9 changes: 9 additions & 0 deletions src/__tests__/components/Routes.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Article from '../../components/Articles/Article/Article';
import CreateArticle from '../../components/Profile/Articles/CreateArticle';
import EditArticle from '../../components/Profile/Articles/EditArticle';
import PreviewArticle from '../../components/Profile/Articles/PreviewArticle';
import PublishedArticles from '../../components/Profile/Articles/MyArticles/Published';

describe('<Routes />', () => {
test('renders <Home /> without crashing', () => {
Expand Down Expand Up @@ -147,4 +148,12 @@ describe('<Routes />', () => {
</Provider>);
expect(component.find(PreviewArticle).length).toBe(1);
});
test('renders <PublishedArticles/> without crashing', () => {
const component = mount(<Provider store={store}>
<MemoryRouter initialEntries={['/profile/articles']}>
<Routes />
</MemoryRouter>
</Provider>);
expect(component.find(PublishedArticles).length).toBe(1);
});
});
22 changes: 21 additions & 1 deletion src/__tests__/reducers/articlesReducers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,27 @@ describe('Articles reducers', () => {
});
expect(reducer.errors).toBeInstanceOf(Object);
});

it('FETCH_MY_PUBLISHED_ARTICLES_START', () => {
const reducer = articlesReducer(initialState, {
type: articlesType.FETCH_MY_PUBLISHED_ARTICLES_START,
payload: []
});
expect(reducer.errors).toBeInstanceOf(Object);
});
it('FETCH_MY_PUBLISHED_ARTICLES_SUCCESS', () => {
const reducer = articlesReducer(initialState, {
type: articlesType.FETCH_MY_PUBLISHED_ARTICLES_SUCCESS,
payload: { articles }
});
expect(reducer.articles).toBeInstanceOf(Array);
});
it('FETCH_MY_PUBLISHED_ARTICLES_FAILURE', () => {
const reducer = articlesReducer(initialState, {
type: articlesType.FETCH_MY_PUBLISHED_ARTICLES_FAILURE,
payload: { errors }
});
expect(reducer.errors).toBeInstanceOf(Object);
});
it('DEFAULT', () => {
articlesReducer(initialState, {
type: null,
Expand Down
42 changes: 42 additions & 0 deletions src/__tests__/reducers/rating/ratingReducers.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import createRatingReducer from '../../../reducers/rating/createRatingReducer';
import initialState from '../../../store/initialStates/ratingInitialState';
import { ratingActionsTypes } from '../../../actions-types';
// import articles from '../../__mocks__/articles';
// import article from '../../__mocks__/article';
// import message from '../../__mocks__/articleMessage';
// import errors from '../../__mocks__/errors';

const rating = {
slug: 'slug-slug',
rating: 1
};

describe('Rating reducers', () => {
it('CREATE_RATING_START', () => {
const reducer = createRatingReducer(initialState, {
type: ratingActionsTypes.CREATE_RATING_START,
payload: {}
});
expect(reducer.createRate).toBeInstanceOf(Object);
});
it('CREATE_RATING_SUCCESS', () => {
const reducer = createRatingReducer(initialState, {
type: ratingActionsTypes.CREATE_RATING_SUCCESS,
payload: { rating }
});
expect(reducer.createRate).toHaveProperty('errors');
});
it('CREATE_RATING_FAILURE', () => {
const reducer = createRatingReducer(initialState, {
type: ratingActionsTypes.CREATE_RATING_FAILURE,
payload: {}
});
expect(reducer.createRate).toHaveProperty('errors');
});
it('DEFAULT', () => {
createRatingReducer(initialState, {
type: null,
payload: null
});
});
});
5 changes: 5 additions & 0 deletions src/actions-types/articlesActionTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,8 @@ export const PUBLISH_ARTICLE_START = 'PUBLISH_ARTICLE_START';
export const PUBLISH_ARTICLE_END = 'PUBLISH_ARTICLE_END';
export const PUBLISH_ARTICLE_SUCCESS = 'PUBLISH_ARTICLE_SUCCESS';
export const PUBLISH_ARTICLE_FAILURE = 'PUBLISH_ARTICLE_FAILURE';

export const FETCH_MY_PUBLISHED_ARTICLES_START = 'FETCH_MY_ARTICLES_START';
export const FETCH_MY_PUBLISHED_ARTICLES_END = 'FETCH_MY_ARTICLES_END';
export const FETCH_MY_PUBLISHED_ARTICLES_SUCCESS = 'FETCH_MY_ARTICLES_SUCCESS';
export const FETCH_MY_PUBLISHED_ARTICLES_FAILURE = 'FETCH_MY_ARTICLES_FAILURE';
11 changes: 9 additions & 2 deletions src/actions-types/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@ import * as apiActionsTypes from './apiActionsTypes';
import * as notificationActionTypes from './notificationActionTypes';
import * as articlesType from './articlesActionTypes';
import * as imagesTypes from './imagesActionTypes';
import * as ratingActionsTypes from './ratingActionsTypes';

export { articlesType, imagesTypes };
export { apiActionsTypes, userActionsTypes, notificationActionTypes };
export {
articlesType,
imagesTypes,
apiActionsTypes,
userActionsTypes,
notificationActionTypes,
ratingActionsTypes
};
4 changes: 4 additions & 0 deletions src/actions-types/ratingActionsTypes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const CREATE_RATING_START = 'CREATE_RATING_START';
export const CREATE_RATING_END = 'CREATE_RATING_END';
export const CREATE_RATING_SUCCESS = 'CREATE_RATING_SUCCESS';
export const CREATE_RATING_FAILURE = 'CREATE_RATING_FAILURE';
11 changes: 11 additions & 0 deletions src/actions/articles/getPublished.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { articlesType } from '../../actions-types';
import { apiAction } from '../../helpers';

export const getPublished = () => dispatch => dispatch(apiAction({
method: 'get',
url: '/articles/published',
onStart: articlesType.FETCH_MY_PUBLISHED_ARTICLES_START,
onEnd: articlesType.FETCH_MY_PUBLISHED_ARTICLES_END,
onSuccess: articlesType.FETCH_MY_PUBLISHED_ARTICLES_SUCCESS,
onFailure: articlesType.FETCH_MY_PUBLISHED_ARTICLES_FAILURE
}));
Loading

0 comments on commit b837925

Please sign in to comment.