#181: fix logout for guests. Increase logout speed

This commit is contained in:
SleepWalker 2016-08-07 20:26:29 +03:00
parent 3d8c646a94
commit 322325d4ad
2 changed files with 87 additions and 56 deletions

View File

@ -49,14 +49,24 @@ export function setUser(payload) {
} }
export function logout() { export function logout() {
return (dispatch, getState) => return (dispatch, getState) => {
authentication.logout().then(() => { if (getState().user.token) {
authentication.logout();
}
return new Promise((resolve) => {
setTimeout(() => { // a tiny timeout to allow logout before user's token will be removed
dispatch(setUser({ dispatch(setUser({
lang: getState().user.lang, lang: getState().user.lang,
isGuest: true isGuest: true
})); }));
dispatch(routeActions.push('/login')); dispatch(routeActions.push('/login'));
resolve();
}, 0);
}); });
};
} }
export function fetchUserData() { export function fetchUserData() {

View File

@ -34,13 +34,23 @@ describe('components/user/actions', () => {
}); });
describe('#logout()', () => { describe('#logout()', () => {
it('should post to /api/authentication/logout with user jwt', () => { beforeEach(() => {
request.post.returns(Promise.resolve());
});
describe('user with jwt', () => {
beforeEach(() => {
getState.returns({ getState.returns({
user: { user: {
token: 'iLoveRockNRoll',
lang: 'foo' lang: 'foo'
} }
}); });
});
it('should post to /api/authentication/logout with user jwt', () => {
// TODO: need an integration test with a middleware, because this
// test is not reliable to check, whether logout request will have token inside
request.post.returns(new Promise((resolve) => { request.post.returns(new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
// we must not overwrite user's token till request starts // we must not overwrite user's token till request starts
@ -57,39 +67,50 @@ describe('components/user/actions', () => {
}); });
}); });
it('should change user to guest', () => { testChangedToGuest();
testRedirectedToLogin();
});
describe('user without jwt', () => { // (a guest with partially filled user's state)
beforeEach(() => {
getState.returns({ getState.returns({
user: { user: {
lang: 'foo' lang: 'foo'
} }
}); });
});
request.post.returns(Promise.resolve()); it('should not post to /api/authentication/logout', () =>
callThunk(logout).then(() => {
expect(request.post, 'was not called');
})
);
return callThunk(logout).then(() => { testChangedToGuest();
testRedirectedToLogin();
});
function testChangedToGuest() {
it('should change user to guest', () =>
callThunk(logout).then(() => {
expect(dispatch, 'to have a call satisfying', [ expect(dispatch, 'to have a call satisfying', [
setUser({ setUser({
lang: 'foo', lang: 'foo',
isGuest: true isGuest: true
}) })
]); ]);
}); })
}); );
it('should redirect to /login', () => {
getState.returns({
user: {
lang: 'foo'
} }
});
request.post.returns(Promise.resolve()); function testRedirectedToLogin() {
it('should redirect to /login', () =>
return callThunk(logout).then(() => { callThunk(logout).then(() => {
expect(dispatch, 'to have a call satisfying', [ expect(dispatch, 'to have a call satisfying', [
routeActions.push('/login') routeActions.push('/login')
]); ]);
}); })
}); );
}
}); });
}); });