Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/pager_spec.js')
-rw-r--r--spec/frontend/pager_spec.js167
1 files changed, 167 insertions, 0 deletions
diff --git a/spec/frontend/pager_spec.js b/spec/frontend/pager_spec.js
new file mode 100644
index 00000000000..d7177a32cde
--- /dev/null
+++ b/spec/frontend/pager_spec.js
@@ -0,0 +1,167 @@
+import $ from 'jquery';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import Pager from '~/pager';
+import { removeParams } from '~/lib/utils/url_utility';
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ removeParams: jest.fn().mockName('removeParams'),
+}));
+
+describe('pager', () => {
+ let axiosMock;
+
+ beforeEach(() => {
+ axiosMock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ axiosMock.restore();
+ });
+
+ describe('init', () => {
+ const originalHref = window.location.href;
+
+ beforeEach(() => {
+ setFixtures('<div class="content_list"></div><div class="loading"></div>');
+ jest.spyOn($.fn, 'endlessScroll').mockImplementation();
+ });
+
+ afterEach(() => {
+ window.history.replaceState({}, null, originalHref);
+ });
+
+ it('should use data-href attribute from list element', () => {
+ const href = `${gl.TEST_HOST}/some_list.json`;
+ setFixtures(`<div class="content_list" data-href="${href}"></div>`);
+ Pager.init();
+
+ expect(Pager.url).toBe(href);
+ });
+
+ it('should use current url if data-href attribute not provided', () => {
+ const href = `${gl.TEST_HOST}/some_list`;
+ removeParams.mockReturnValue(href);
+ Pager.init();
+
+ expect(Pager.url).toBe(href);
+ });
+
+ it('should get initial offset from query parameter', () => {
+ window.history.replaceState({}, null, '?offset=100');
+ Pager.init();
+
+ expect(Pager.offset).toBe(100);
+ });
+
+ it('keeps extra query parameters from url', () => {
+ window.history.replaceState({}, null, '?filter=test&offset=100');
+ const href = `${gl.TEST_HOST}/some_list?filter=test`;
+ removeParams.mockReturnValue(href);
+ Pager.init();
+
+ expect(removeParams).toHaveBeenCalledWith(['limit', 'offset']);
+ expect(Pager.url).toEqual(href);
+ });
+ });
+
+ describe('getOld', () => {
+ const urlRegex = /(.*)some_list(.*)$/;
+
+ function mockSuccess(count = 0) {
+ axiosMock.onGet(urlRegex).reply(200, {
+ count,
+ html: '',
+ });
+ }
+
+ function mockError() {
+ axiosMock.onGet(urlRegex).networkError();
+ }
+
+ beforeEach(() => {
+ setFixtures(
+ '<div class="content_list" data-href="/some_list"></div><div class="loading"></div>',
+ );
+ jest.spyOn(axios, 'get');
+
+ Pager.init();
+ });
+
+ it('shows loader while loading next page', done => {
+ mockSuccess();
+
+ jest.spyOn(Pager.loading, 'show').mockImplementation(() => {});
+ Pager.getOld();
+
+ setImmediate(() => {
+ expect(Pager.loading.show).toHaveBeenCalled();
+
+ done();
+ });
+ });
+
+ it('hides loader on success', done => {
+ mockSuccess();
+
+ jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ Pager.getOld();
+
+ setImmediate(() => {
+ expect(Pager.loading.hide).toHaveBeenCalled();
+
+ done();
+ });
+ });
+
+ it('hides loader on error', done => {
+ mockError();
+
+ jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ Pager.getOld();
+
+ setImmediate(() => {
+ expect(Pager.loading.hide).toHaveBeenCalled();
+
+ done();
+ });
+ });
+
+ it('sends request to url with offset and limit params', done => {
+ Pager.offset = 100;
+ Pager.limit = 20;
+ Pager.getOld();
+
+ setImmediate(() => {
+ const [url, params] = axios.get.mock.calls[0];
+
+ expect(params).toEqual({
+ params: {
+ limit: 20,
+ offset: 100,
+ },
+ });
+
+ expect(url).toBe('/some_list');
+
+ done();
+ });
+ });
+
+ it('disables if return count is less than limit', done => {
+ Pager.offset = 0;
+ Pager.limit = 20;
+
+ mockSuccess(1);
+ jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ Pager.getOld();
+
+ setImmediate(() => {
+ expect(Pager.loading.hide).toHaveBeenCalled();
+ expect(Pager.disable).toBe(true);
+
+ done();
+ });
+ });
+ });
+});