import sinon from 'sinon'; import expect from 'test/unexpected'; import request from 'services/request'; import { setLoadingState, oAuthValidate, oAuthComplete, setClient, setOAuthRequest, setScopes, setOAuthCode, requirePermissionsAccept, login, setLogin, } from 'components/auth/actions'; const oauthData = { clientId: '', redirectUrl: '', responseType: '', scope: '', state: '', }; describe('components/auth/actions', () => { const dispatch = sinon.stub().named('store.dispatch'); const getState = sinon.stub().named('store.getState'); function callThunk(fn, ...args) { const thunk = fn(...args); return thunk(dispatch, getState); } function expectDispatchCalls(calls) { expect( dispatch, 'to have calls satisfying', [[setLoadingState(true)]] .concat(calls) .concat([[setLoadingState(false)]]), ); } beforeEach(() => { dispatch.reset(); getState.reset(); getState.returns({}); sinon.stub(request, 'get').named('request.get'); sinon.stub(request, 'post').named('request.post'); }); afterEach(() => { request.get.restore(); request.post.restore(); }); describe('#oAuthValidate()', () => { let resp; beforeEach(() => { resp = { client: { id: 123 }, oAuth: { state: 123 }, session: { scopes: ['scopes'], }, }; request.get.returns(Promise.resolve(resp)); }); it('should send get request to an api', () => callThunk(oAuthValidate, oauthData).then(() => { expect(request.get, 'to have a call satisfying', [ '/api/oauth2/v1/validate', {}, ]); })); it('should dispatch setClient, setOAuthRequest and setScopes', () => callThunk(oAuthValidate, oauthData).then(() => { expectDispatchCalls([ [setClient(resp.client)], [ setOAuthRequest({ ...resp.oAuth, prompt: 'none', loginHint: undefined, }), ], [setScopes(resp.session.scopes)], ]); })); }); describe('#oAuthComplete()', () => { beforeEach(() => { getState.returns({ auth: { oauth: oauthData, }, }); }); it('should post to api/oauth2/complete', () => { request.post.returns( Promise.resolve({ redirectUri: '', }), ); return callThunk(oAuthComplete).then(() => { expect(request.post, 'to have a call satisfying', [ '/api/oauth2/v1/complete?client_id=&redirect_uri=&response_type=&description=&scope=&prompt=&login_hint=&state=', {}, ]); }); }); it('should dispatch setOAuthCode for static_page redirect', () => { const resp = { success: true, redirectUri: 'static_page?code=123&state=', }; request.post.returns(Promise.resolve(resp)); return callThunk(oAuthComplete).then(() => { expectDispatchCalls([ [ setOAuthCode({ success: true, code: '123', displayCode: false, }), ], ]); }); }); it('should resolve to with success false and redirectUri for access_denied', () => { const resp = { statusCode: 401, error: 'access_denied', redirectUri: 'redirectUri', }; request.post.returns(Promise.reject(resp)); return callThunk(oAuthComplete).then(resp => { expect(resp, 'to equal', { success: false, redirectUri: 'redirectUri', }); }); }); it('should dispatch requirePermissionsAccept if accept_required', () => { const resp = { statusCode: 401, error: 'accept_required', }; request.post.returns(Promise.reject(resp)); return callThunk(oAuthComplete).catch(resp => { expect(resp.acceptRequired, 'to be true'); expectDispatchCalls([[requirePermissionsAccept()]]); }); }); }); describe('#login()', () => { describe('when correct login was entered', () => { beforeEach(() => { request.post.returns( Promise.reject({ errors: { password: 'error.password_required', }, }), ); }); it('should set login', () => callThunk(login, { login: 'foo' }).then(() => { expectDispatchCalls([[setLogin('foo')]]); })); }); }); });