diff --git a/app/soapbox/actions/__tests__/accounts.test.ts b/app/soapbox/actions/__tests__/accounts.test.ts new file mode 100644 index 0000000000..75d0b7a64c --- /dev/null +++ b/app/soapbox/actions/__tests__/accounts.test.ts @@ -0,0 +1,132 @@ +import { Map as ImmutableMap } from 'immutable'; + +import { __stub } from 'soapbox/api'; +import { mockStore } from 'soapbox/jest/test-helpers'; +import rootReducer from 'soapbox/reducers'; + +import { normalizeAccount } from '../../normalizers'; +import { createAccount, fetchAccount } from '../accounts'; + +let store; + +describe('createAccount()', () => { + const params = { + email: 'foo@bar.com', + }; + + describe('with a successful API request', () => { + beforeEach(() => { + const state = rootReducer(undefined, {}); + store = mockStore(state); + + __stub((mock) => { + mock.onPost('/api/v1/accounts').reply(200, { token: '123 ' }); + }); + }); + + it('dispatches the correct actions', async() => { + const expectedActions = [ + { type: 'ACCOUNT_CREATE_REQUEST', params }, + { + type: 'ACCOUNT_CREATE_SUCCESS', + params, + token: { token: '123 ' }, + }, + ]; + await store.dispatch(createAccount(params)); + const actions = store.getActions(); + + expect(actions).toEqual(expectedActions); + }); + }); +}); + +describe('fetchAccount()', () => { + const id = '123'; + + describe('when the account has "should_refetch" set to false', () => { + beforeEach(() => { + const account = normalizeAccount({ + id, + acct: 'justin-username', + display_name: 'Justin L', + avatar: 'test.jpg', + }); + + const state = rootReducer(undefined, {}) + .set('accounts', ImmutableMap({ + [id]: account, + })); + + store = mockStore(state); + + __stub((mock) => { + mock.onGet(`/api/v1/accounts/${id}`).reply(200, account); + }); + }); + + it('should do nothing', async() => { + await store.dispatch(fetchAccount(id)); + const actions = store.getActions(); + + expect(actions).toEqual([]); + }); + }); + + describe('with a successful API request', () => { + const account = require('soapbox/__fixtures__/pleroma-account.json'); + + beforeEach(() => { + const state = rootReducer(undefined, {}); + store = mockStore(state); + + __stub((mock) => { + mock.onGet(`/api/v1/accounts/${id}`).reply(200, account); + }); + }); + + it('should dispatch the correct actions', async() => { + const expectedActions = [ + { type: 'ACCOUNT_FETCH_REQUEST', id: '123' }, + { type: 'ACCOUNTS_IMPORT', accounts: [account] }, + { + type: 'ACCOUNT_FETCH_SUCCESS', + account, + }, + ]; + + await store.dispatch(fetchAccount(id)); + const actions = store.getActions(); + + expect(actions).toEqual(expectedActions); + }); + }); + + describe('with an unsuccessful API request', () => { + beforeEach(() => { + const state = rootReducer(undefined, {}); + store = mockStore(state); + + __stub((mock) => { + mock.onGet(`/api/v1/accounts/${id}`).networkError(); + }); + }); + + it('should dispatch the correct actions', async() => { + const expectedActions = [ + { type: 'ACCOUNT_FETCH_REQUEST', id: '123' }, + { + type: 'ACCOUNT_FETCH_FAIL', + id, + error: new Error('Network Error'), + skipAlert: true, + }, + ]; + + await store.dispatch(fetchAccount(id)); + const actions = store.getActions(); + + expect(actions).toEqual(expectedActions); + }); + }); +}); diff --git a/app/soapbox/actions/accounts.js b/app/soapbox/actions/accounts.js index 4df56417e0..56210c1d07 100644 Binary files a/app/soapbox/actions/accounts.js and b/app/soapbox/actions/accounts.js differ