Skip to content

Commit 379cb8b

Browse files
author
Bernabé González
authored
Merge pull request #4 from bernabe9/init_tests
Init tests
2 parents 943a4a1 + 051fe10 commit 379cb8b

File tree

12 files changed

+373
-15
lines changed

12 files changed

+373
-15
lines changed

.eslintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"browser": true,
2020
"node": true,
2121
"jquery": true,
22-
"mocha": true
22+
"jest": true
2323
},
2424
"rules": {
2525
"quotes": 0,

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@ node_modules
1717
#dist folder
1818
dist
1919

20+
#coverage folder
21+
coverage
22+
2023
# Mac files
2124
.DS_Store

.npmignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,11 @@ src
88
# Example folder
99
example
1010

11+
# Mocks folder
12+
__mocks__
13+
14+
# Coverage folder
15+
coverage
16+
1117
# Mac files
1218
.DS_Store

.travis.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
language: node_js
2+
node_js:
3+
- "6"
4+
- "5"
5+
- "4"
6+
script:
7+
- npm run lint
8+
- npm run test
9+
after_success:
10+
- npm run test:cover:CI

__mocks__/localforage.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict';
2+
3+
import { USER_SESSION, USER_DATA } from '../src/constants';
4+
5+
const localforage = jest.genMockFromModule('localforage');
6+
7+
let throwError = false;
8+
let user = undefined;
9+
let session = undefined;
10+
11+
function __setError(error) {
12+
throwError = error;
13+
}
14+
15+
function __setUser(item) {
16+
user = item;
17+
}
18+
19+
function __setSession(item) {
20+
session = item;
21+
}
22+
23+
function setItem(item, data) {
24+
return new Promise((resolve, reject) => {
25+
if (item === USER_SESSION) {
26+
session = data;
27+
} else if (item === USER_DATA) {
28+
user = data;
29+
}
30+
throwError ? reject() : resolve(data);
31+
});
32+
}
33+
34+
function getItem(item) {
35+
return new Promise((resolve) => {
36+
if (item === USER_SESSION) {
37+
return resolve(session);
38+
} else if (item === USER_DATA) {
39+
return resolve(user);
40+
}
41+
});
42+
}
43+
44+
function removeItem(item) {
45+
return new Promise((resolve) => {
46+
if (item === USER_SESSION) {
47+
session = undefined;
48+
} else if (item === USER_DATA) {
49+
user = undefined;
50+
}
51+
resolve();
52+
});
53+
}
54+
55+
localforage.setItem = setItem;
56+
localforage.getItem = getItem;
57+
localforage.removeItem = removeItem;
58+
localforage.__setError = __setError;
59+
localforage.__setUser = __setUser;
60+
localforage.__setSession = __setSession;
61+
62+
module.exports = localforage;

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"main": "dist/index.js",
66
"scripts": {
77
"build": "npm run clean && babel src --out-dir dist",
8-
"test": "echo \"Error: no test specified\" && exit 1",
8+
"test": "jest",
9+
"test:cover": "npm run test -- --coverage",
10+
"test:cover:CI": "npm run test:cover && cat ./coverage/lcov.info | node_modules/coveralls/bin/coveralls.js",
911
"lint": "eslint src",
1012
"clean": "rimraf dist"
1113
},
@@ -31,6 +33,7 @@
3133
"babel-cli": "6.23.0",
3234
"babel-core": "6.23.1",
3335
"babel-eslint": "7.1.1",
36+
"babel-jest": "18.0.0",
3437
"babel-loader": "6.3.0",
3538
"babel-plugin-transform-react-constant-elements": "6.23.0",
3639
"babel-plugin-transform-react-remove-prop-types": "0.3.2",
@@ -40,12 +43,14 @@
4043
"babel-preset-react-hmre": "1.1.1",
4144
"babel-preset-stage-1": "6.22.0",
4245
"babel-register": "6.23.0",
46+
"coveralls": "2.11.16",
4347
"eslint": "3.15.0",
4448
"eslint-plugin-import": "2.2.0",
49+
"jest": "^18.1.0",
4550
"react": "15.4.2",
4651
"react-dom": "15.4.2",
4752
"redux": "3.6.0",
48-
"rimraf": "^2.5.4",
53+
"rimraf": "2.5.4",
4954
"webpack": "2.2.1"
5055
},
5156
"dependencies": {

src/__tests__/index.spec.js

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
'use strict';
2+
3+
import { sessionService, sessionReducer } from '../index';
4+
import { initialState } from '../reducer';
5+
import { createStore } from 'redux';
6+
import { __setError, __setSession, __setUser } from 'localforage';
7+
8+
jest.mock('localforage');
9+
10+
describe('API functions', () => {
11+
let store;
12+
const user = { email: 'test@test.com', firstName: 'test', lastName: 'test' };
13+
const session = { token: '12341234' };
14+
beforeAll((done) => {
15+
store = createStore(sessionReducer, initialState);
16+
17+
// wait for refresh redux store from localStorage
18+
const unsubscribe = store.subscribe(() => {
19+
unsubscribe();
20+
done();
21+
});
22+
sessionService.initSessionService(store);
23+
});
24+
25+
describe('refreshFromLocalStorage', () => {
26+
describe('without any item in the storage', () => {
27+
test('change authenticated flag to false and the user to empty object', (done) => {
28+
// wait for change the redux store
29+
const unsubscribe = store.subscribe(() => {
30+
expect(store.getState().authenticated).toEqual(false);
31+
expect(store.getState().user).toEqual({});
32+
unsubscribe();
33+
done();
34+
});
35+
36+
sessionService.refreshFromLocalStorage();
37+
});
38+
});
39+
40+
describe('with session and user in the storage', () => {
41+
test('change authenticated flag to true and save the user', (done) => {
42+
__setUser(user);
43+
__setSession(session);
44+
45+
// wait for change the redux store
46+
const unsubscribe = store.subscribe(() => {
47+
const state = store.getState();
48+
expect(state.authenticated).toEqual(true);
49+
// wait to change the user
50+
const { user } = state;
51+
if (!(Object.keys(user).length === 0 && user.constructor === Object)) {
52+
expect(state.user).toMatchObject(user);
53+
unsubscribe();
54+
done();
55+
}
56+
});
57+
58+
sessionService.refreshFromLocalStorage(session);
59+
});
60+
});
61+
});
62+
63+
describe('saveSession', () => {
64+
describe('localforage returns success', () => {
65+
test('change authenticated flag to true value', (done) => {
66+
__setError(false);
67+
// wait for change the redux store
68+
const unsubscribe = store.subscribe(() => {
69+
expect(store.getState().authenticated).toEqual(true);
70+
unsubscribe();
71+
done();
72+
});
73+
74+
sessionService.saveSession(session);
75+
});
76+
});
77+
78+
describe('localforage returns error', () => {
79+
test('change authenticated flag to false value', (done) => {
80+
__setError(true);
81+
// wait for change the redux store
82+
const unsubscribe = store.subscribe(() => {
83+
expect(store.getState().authenticated).toEqual(false);
84+
unsubscribe();
85+
done();
86+
});
87+
88+
sessionService.saveSession(session);
89+
});
90+
});
91+
});
92+
93+
describe('loadSession', () => {
94+
describe('localforage returns success', () => {
95+
test('return the correct value of the session stored', () => {
96+
__setSession(session);
97+
return sessionService.loadSession()
98+
.then((currentSession) => {
99+
expect(currentSession).toMatchObject(session);
100+
});
101+
});
102+
});
103+
104+
describe('localforage returns error', () => {
105+
test('return an error', () => {
106+
__setSession(undefined);
107+
return sessionService.loadSession()
108+
.catch((error) => {
109+
expect(error).toEqual('Session not found');
110+
});
111+
});
112+
});
113+
});
114+
115+
describe('deleteSession', () => {
116+
test('change authenticated flag to false value', (done) => {
117+
// wait for change the redux store
118+
const unsubscribe = store.subscribe(() => {
119+
expect(store.getState().authenticated).toEqual(false);
120+
unsubscribe();
121+
done();
122+
});
123+
124+
sessionService.deleteSession();
125+
});
126+
});
127+
128+
describe('saveUser', () => {
129+
describe('localforage returns success', () => {
130+
test('change user in store to the user data', (done) => {
131+
__setError(false);
132+
// wait for change the redux store
133+
const unsubscribe = store.subscribe(() => {
134+
expect(store.getState().user).toMatchObject(user);
135+
unsubscribe();
136+
done();
137+
});
138+
139+
sessionService.saveUser(user);
140+
});
141+
});
142+
143+
describe('localforage returns error', () => {
144+
test('change user in store to an empty object', (done) => {
145+
__setError(true);
146+
// wait for change the redux store
147+
const unsubscribe = store.subscribe(() => {
148+
expect(store.getState().user).toMatchObject({});
149+
unsubscribe();
150+
done();
151+
});
152+
153+
sessionService.saveUser(user);
154+
});
155+
});
156+
});
157+
158+
describe('loadUser', () => {
159+
describe('localforage returns success', () => {
160+
test('return the correct value of the user stored', () => {
161+
__setUser(user);
162+
return sessionService.loadUser()
163+
.then((currentUser) => {
164+
expect(currentUser).toMatchObject(user);
165+
});
166+
});
167+
});
168+
169+
describe('localforage returns error', () => {
170+
test('return an error', () => {
171+
__setUser(undefined);
172+
return sessionService.loadUser()
173+
.catch((error) => {
174+
expect(error).toEqual('User not found');
175+
});
176+
});
177+
});
178+
});
179+
180+
describe('deleteUser', () => {
181+
test('change user in store to an empty object', (done) => {
182+
// wait for change the redux store
183+
const unsubscribe = store.subscribe(() => {
184+
expect(store.getState().user).toEqual({});
185+
unsubscribe();
186+
done();
187+
});
188+
189+
sessionService.deleteUser();
190+
});
191+
});
192+
});

src/__tests__/reducer.spec.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import reducer, { initialState } from '../reducer';
2+
import {
3+
GET_SESSION_SUCCESS,
4+
GET_SESSION_ERROR,
5+
GET_USER_SESSION_SUCCESS,
6+
GET_USER_SESSION_ERROR
7+
} from '../actionTypes';
8+
9+
describe('Reducer', () => {
10+
test('set initial state by default', () => {
11+
const action = { type: 'unknown' };
12+
const expected = initialState;
13+
14+
expect(reducer(undefined, action)).toEqual(expected);
15+
});
16+
17+
describe('GET_SESSION_SUCCESS', () => {
18+
const action = { type: GET_SESSION_SUCCESS };
19+
20+
test('change authenticated to true value', () => {
21+
expect(reducer(initialState, action).authenticated).toEqual(true);
22+
});
23+
24+
test('not change the user object', () => {
25+
expect(reducer(initialState, action).user).toEqual(initialState.user);
26+
});
27+
});
28+
29+
describe('GET_SESSION_ERROR', () => {
30+
const action = { type: GET_SESSION_ERROR };
31+
32+
test('change authenticated to false value', () => {
33+
expect(reducer(initialState, action).authenticated).toEqual(false);
34+
});
35+
36+
test('not change the user object', () => {
37+
expect(reducer(initialState, action).user).toEqual(initialState.user);
38+
});
39+
});
40+
41+
describe('GET_USER_SESSION_SUCCESS', () => {
42+
const user = { email: 'test@test.com', firstName: 'test', lastName: 'test' };
43+
const action = { user, type: GET_USER_SESSION_SUCCESS };
44+
45+
test('save the new user', () => {
46+
expect(reducer(initialState, action).user).toEqual(user);
47+
});
48+
49+
test('not change the authenticated flag', () => {
50+
expect(reducer(initialState, action).authenticated).toEqual(initialState.authenticated);
51+
});
52+
});
53+
54+
describe('GET_USER_SESSION_ERROR', () => {
55+
const user = { email: 'test@test.com', firstName: 'test', lastName: 'test' };
56+
const modificatedState = { user, authenticated: true };
57+
const action = { type: GET_USER_SESSION_ERROR };
58+
59+
test('remove the saved user', () => {
60+
expect(reducer(modificatedState, action).user).toEqual({});
61+
});
62+
63+
test('not change the authenticated flag', () => {
64+
expect(reducer(modificatedState, action).authenticated).toEqual(modificatedState.authenticated);
65+
});
66+
});
67+
});

0 commit comments

Comments
 (0)