diff options
Diffstat (limited to 'spec/frontend/import_entities/import_groups/services/status_poller_spec.js')
-rw-r--r-- | spec/frontend/import_entities/import_groups/services/status_poller_spec.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/spec/frontend/import_entities/import_groups/services/status_poller_spec.js b/spec/frontend/import_entities/import_groups/services/status_poller_spec.js new file mode 100644 index 00000000000..01f976562c6 --- /dev/null +++ b/spec/frontend/import_entities/import_groups/services/status_poller_spec.js @@ -0,0 +1,97 @@ +import MockAdapter from 'axios-mock-adapter'; +import Visibility from 'visibilityjs'; +import createFlash from '~/flash'; +import { STATUSES } from '~/import_entities/constants'; +import { StatusPoller } from '~/import_entities/import_groups/services/status_poller'; +import axios from '~/lib/utils/axios_utils'; +import Poll from '~/lib/utils/poll'; + +jest.mock('visibilityjs'); +jest.mock('~/flash'); +jest.mock('~/lib/utils/poll'); + +const FAKE_POLL_PATH = '/fake/poll/path'; + +describe('Bulk import status poller', () => { + let poller; + let mockAdapter; + let updateImportStatus; + + const getPollHistory = () => mockAdapter.history.get.filter((x) => x.url === FAKE_POLL_PATH); + + beforeEach(() => { + mockAdapter = new MockAdapter(axios); + mockAdapter.onGet(FAKE_POLL_PATH).reply(200, {}); + updateImportStatus = jest.fn(); + poller = new StatusPoller({ updateImportStatus, pollPath: FAKE_POLL_PATH }); + }); + + it('creates poller with proper config', () => { + expect(Poll.mock.calls).toHaveLength(1); + const [[pollConfig]] = Poll.mock.calls; + expect(typeof pollConfig.method).toBe('string'); + + const pollOperation = pollConfig.resource[pollConfig.method]; + expect(typeof pollOperation).toBe('function'); + }); + + it('invokes axios when polling is performed', async () => { + const [[pollConfig]] = Poll.mock.calls; + const pollOperation = pollConfig.resource[pollConfig.method]; + expect(getPollHistory()).toHaveLength(0); + + pollOperation(); + await axios.waitForAll(); + + expect(getPollHistory()).toHaveLength(1); + }); + + it('subscribes to visibility changes', () => { + expect(Visibility.change).toHaveBeenCalled(); + }); + + it.each` + isHidden | action + ${true} | ${'stop'} + ${false} | ${'restart'} + `('$action polling when hidden is $isHidden', ({ action, isHidden }) => { + const [pollInstance] = Poll.mock.instances; + const [[changeHandler]] = Visibility.change.mock.calls; + Visibility.hidden.mockReturnValue(isHidden); + expect(pollInstance[action]).not.toHaveBeenCalled(); + + changeHandler(); + + expect(pollInstance[action]).toHaveBeenCalled(); + }); + + it('does not perform polling when constructed', async () => { + await axios.waitForAll(); + + expect(getPollHistory()).toHaveLength(0); + }); + + it('immediately start polling when requested', async () => { + const [pollInstance] = Poll.mock.instances; + + poller.startPolling(); + await Promise.resolve(); + + expect(pollInstance.makeRequest).toHaveBeenCalled(); + }); + + it('when error occurs shows flash with error', () => { + const [[pollConfig]] = Poll.mock.calls; + pollConfig.errorCallback(); + expect(createFlash).toHaveBeenCalled(); + }); + + it('when success response arrives updates relevant group status', () => { + const FAKE_ID = 5; + const [[pollConfig]] = Poll.mock.calls; + const FAKE_RESPONSE = { id: FAKE_ID, status_name: STATUSES.FINISHED }; + pollConfig.successCallback({ data: [FAKE_RESPONSE] }); + + expect(updateImportStatus).toHaveBeenCalledWith(FAKE_RESPONSE); + }); +}); |