From 7505417478011e489e011c3cabf71c11a75e5da2 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 19 Jul 2017 10:36:08 +0100 Subject: moved JS & only run when new_nav cookie exists --- spec/javascripts/fly_out_nav_spec.js | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 spec/javascripts/fly_out_nav_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js new file mode 100644 index 00000000000..bbf3eb6f582 --- /dev/null +++ b/spec/javascripts/fly_out_nav_spec.js @@ -0,0 +1,37 @@ +import { calculateTop, createArrowStyles } from '~/fly_out_nav'; + +describe('Fly out sidebar navigation', () => { + describe('calculateTop', () => { + it('returns boundingRect top', () => { + const boundingRect = { + top: 100, + }; + + expect( + calculateTop(boundingRect, 100), + ).toBe(100); + }); + + it('returns boundingRect - bottomOverflow', () => { + const boundingRect = { + top: window.innerHeight, + }; + + expect( + calculateTop(boundingRect, 100), + ).toBe(window.innerHeight - 100); + }); + }); + + describe('createArrowStyles', () => { + it('returns translate3d styles', () => { + const boundingRect = { + top: 100, + }; + + expect( + createArrowStyles(boundingRect, 50), + ).toContain('translate3d(0, 50px, 0)'); + }); + }); +}); -- cgit v1.2.1 From 0925edb4ff4ae8c12648be7a59866340c81b9eff Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 19 Jul 2017 16:57:00 +0100 Subject: updated styles --- spec/javascripts/fly_out_nav_spec.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index bbf3eb6f582..0e71e2a87e5 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -1,4 +1,4 @@ -import { calculateTop, createArrowStyles } from '~/fly_out_nav'; +import { calculateTop } from '~/fly_out_nav'; describe('Fly out sidebar navigation', () => { describe('calculateTop', () => { @@ -22,16 +22,4 @@ describe('Fly out sidebar navigation', () => { ).toBe(window.innerHeight - 100); }); }); - - describe('createArrowStyles', () => { - it('returns translate3d styles', () => { - const boundingRect = { - top: 100, - }; - - expect( - createArrowStyles(boundingRect, 50), - ).toContain('translate3d(0, 50px, 0)'); - }); - }); }); -- cgit v1.2.1 From 72538b5f9f6f1be0ba421a76c2a24da4dd23db0e Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 24 Jul 2017 16:14:29 +0100 Subject: improvements to positioning of the dropdown --- spec/javascripts/fly_out_nav_spec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index 0e71e2a87e5..d3c6dafe460 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -5,6 +5,7 @@ describe('Fly out sidebar navigation', () => { it('returns boundingRect top', () => { const boundingRect = { top: 100, + height: 100, }; expect( @@ -14,12 +15,13 @@ describe('Fly out sidebar navigation', () => { it('returns boundingRect - bottomOverflow', () => { const boundingRect = { - top: window.innerHeight, + top: window.innerHeight - 50, + height: 100, }; expect( calculateTop(boundingRect, 100), - ).toBe(window.innerHeight - 100); + ).toBe(window.innerHeight - 50); }); }); }); -- cgit v1.2.1 From 9aa2205a15c72394234892ef3babe94ce7eb1828 Mon Sep 17 00:00:00 2001 From: Tim Zallmann Date: Wed, 26 Jul 2017 09:31:17 +0000 Subject: Resolve "Memory usage notice doesn't link anywhere" --- spec/javascripts/vue_mr_widget/components/mr_widget_deployment_spec.js | 1 + .../javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js | 2 ++ 2 files changed, 3 insertions(+) (limited to 'spec/javascripts') diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_deployment_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_deployment_spec.js index d4b200875df..ab8a3f6c64c 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_deployment_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_deployment_spec.js @@ -10,6 +10,7 @@ const deploymentMockData = [ url: '/root/acets-review-apps/environments/15', stop_url: '/root/acets-review-apps/environments/15/stop', metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics', + metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics', external_url: 'http://diplo.', external_url_formatted: 'diplo.', deployed_at: '2017-03-22T22:44:42.258Z', diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js index 2c3d0ddff28..6adcbc73ed7 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js @@ -3,6 +3,7 @@ import memoryUsageComponent from '~/vue_merge_request_widget/components/mr_widge import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; const url = '/root/acets-review-apps/environments/15/deployments/1/metrics'; +const monitoringUrl = '/root/acets-review-apps/environments/15/metrics'; const metricsMockData = { success: true, @@ -39,6 +40,7 @@ const createComponent = () => { el: document.createElement('div'), propsData: { metricsUrl: url, + metricsMonitoringUrl: monitoringUrl, memoryMetrics: [], deploymentTime: 0, hasMetrics: false, -- cgit v1.2.1 From aa2b3ff1e4c8bb725a96ed55906d142300ccf017 Mon Sep 17 00:00:00 2001 From: Jarka Kadlecova Date: Wed, 26 Jul 2017 09:57:56 +0200 Subject: Display specific error message when JIRA test fails --- spec/javascripts/integrations/integration_settings_form_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/integrations/integration_settings_form_spec.js b/spec/javascripts/integrations/integration_settings_form_spec.js index 45909d4e70e..3daeb91b1e2 100644 --- a/spec/javascripts/integrations/integration_settings_form_spec.js +++ b/spec/javascripts/integrations/integration_settings_form_spec.js @@ -135,10 +135,10 @@ describe('IntegrationSettingsForm', () => { integrationSettingsForm.testSettings(formData); - deferred.resolve({ error: true, message: errorMessage }); + deferred.resolve({ error: true, message: errorMessage, service_response: 'some error' }); const $flashContainer = $('.flash-container'); - expect($flashContainer.find('.flash-text').text()).toEqual(errorMessage); + expect($flashContainer.find('.flash-text').text()).toEqual('Test failed. some error'); expect($flashContainer.find('.flash-action')).toBeDefined(); expect($flashContainer.find('.flash-action').text()).toEqual('Save anyway'); }); -- cgit v1.2.1 From 339469099d64e9f87cccb375cc31c0158a99480f Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Mon, 31 Jul 2017 16:05:06 +0530 Subject: Update tests --- spec/javascripts/groups/groups_spec.js | 15 +++++++++++++++ spec/javascripts/groups/mock_data.js | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/groups/groups_spec.js b/spec/javascripts/groups/groups_spec.js index aaffb56fa94..7e38b49c792 100644 --- a/spec/javascripts/groups/groups_spec.js +++ b/spec/javascripts/groups/groups_spec.js @@ -2,6 +2,7 @@ import Vue from 'vue'; import eventHub from '~/groups/event_hub'; import groupFolderComponent from '~/groups/components/group_folder.vue'; import groupItemComponent from '~/groups/components/group_item.vue'; +import groupIdenticonComponent from '~/groups/components/group_identicon.vue'; import groupsComponent from '~/groups/components/groups.vue'; import GroupsStore from '~/groups/stores/groups_store'; import { groupsData } from './mock_data'; @@ -14,6 +15,7 @@ describe('Groups Component', () => { beforeEach((done) => { Vue.component('group-folder', groupFolderComponent); + Vue.component('group-identicon', groupIdenticonComponent); Vue.component('group-item', groupItemComponent); store = new GroupsStore(); @@ -64,6 +66,19 @@ describe('Groups Component', () => { expect(lists[2].querySelector('#group-1120').textContent).toContain(groups.id1119.subGroups.id1120.name); }); + it('should render group identicon when group avatar is not present', () => { + const avatar = component.$el.querySelector('#group-12 .avatar-container .avatar'); + expect(avatar.nodeName).toBe('DIV'); + expect(avatar.classList.contains('identicon')).toBeTruthy(); + expect(avatar.getAttribute('style').indexOf('background-color') > -1).toBeTruthy(); + }); + + it('should render group avatar when group avatar is present', () => { + const avatar = component.$el.querySelector('#group-1120 .avatar-container .avatar'); + expect(avatar.nodeName).toBe('IMG'); + expect(avatar.classList.contains('identicon')).toBeFalsy(); + }); + it('should remove prefix of parent group', () => { expect(component.$el.querySelector('#group-12 #group-1128 .title').textContent).toContain('level2 / level3 / level4'); }); diff --git a/spec/javascripts/groups/mock_data.js b/spec/javascripts/groups/mock_data.js index b3f5d791b89..9e1f414514a 100644 --- a/spec/javascripts/groups/mock_data.js +++ b/spec/javascripts/groups/mock_data.js @@ -71,7 +71,7 @@ const group21 = { path: 'chef', description: 'foo', visibility: 'public', - avatar_url: null, + avatar_url: '/uploads/-/system/group/avatar/2/GitLab.png', web_url: 'http://localhost:3000/groups/devops/chef', group_path: '/devops/chef', full_name: 'devops / chef', -- cgit v1.2.1 From 20bfc4f679bd63f71af716d4910c5c22e33180c0 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 Aug 2017 08:49:03 +0100 Subject: added mouseleave timeout with JS --- spec/javascripts/fly_out_nav_spec.js | 133 ++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index d3c6dafe460..0fdaa2d8663 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -1,6 +1,22 @@ -import { calculateTop } from '~/fly_out_nav'; +import { + calculateTop, + setMouseOutTimeout, + getHideTimeoutInterval, + hideSubLevelItems, + showSubLevelItems, +} from '~/fly_out_nav'; describe('Fly out sidebar navigation', () => { + let el; + beforeEach(() => { + el = document.createElement('div'); + document.body.appendChild(el); + }); + + afterEach(() => { + el.remove(); + }); + describe('calculateTop', () => { it('returns boundingRect top', () => { const boundingRect = { @@ -24,4 +40,119 @@ describe('Fly out sidebar navigation', () => { ).toBe(window.innerHeight - 50); }); }); + + describe('setMouseOutTimeout', () => { + it('sets hideTimeoutInterval to 150 when inside sub items', () => { + el.innerHTML = ''; + + setMouseOutTimeout(el.querySelector('.js-test')); + + expect( + getHideTimeoutInterval(), + ).toBe(150); + }); + + it('resets hideTimeoutInterval when not inside sub items', () => { + setMouseOutTimeout(el); + + expect( + getHideTimeoutInterval(), + ).toBe(0); + }); + }); + + describe('hideSubLevelItems', () => { + beforeEach(() => { + el.innerHTML = ''; + }); + + it('hides subitems', () => { + hideSubLevelItems(el); + + expect( + el.querySelector('.sidebar-sub-level-items').style.display, + ).toBe('none'); + }); + + it('removes is-over class', () => { + spyOn(el.classList, 'remove'); + + hideSubLevelItems(el); + + expect( + el.classList.remove, + ).toHaveBeenCalledWith('is-over'); + }); + + it('removes is-above class from sub-items', () => { + const subItems = el.querySelector('.sidebar-sub-level-items'); + + spyOn(subItems.classList, 'remove'); + + hideSubLevelItems(el); + + expect( + subItems.classList.remove, + ).toHaveBeenCalledWith('is-above'); + }); + + it('does nothing if el has no sub-items', () => { + el.innerHTML = ''; + + spyOn(el.classList, 'remove'); + + hideSubLevelItems(el); + + expect( + el.classList.remove, + ).not.toHaveBeenCalledWith(); + }); + }); + + describe('showSubLevelItems', () => { + beforeEach(() => { + el.innerHTML = ''; + }); + + it('adds is-over class to el', () => { + spyOn(el.classList, 'add'); + + showSubLevelItems(el); + + expect( + el.classList.add, + ).toHaveBeenCalledWith('is-over'); + }); + + it('shows sub-items', () => { + showSubLevelItems(el); + + expect( + el.querySelector('.sidebar-sub-level-items').style.display, + ).toBe('block'); + }); + + it('sets transform of sub-items', () => { + showSubLevelItems(el); + + expect( + el.querySelector('.sidebar-sub-level-items').style.transform, + ).toBe(`translate3d(0px, ${el.offsetTop}px, 0px)`); + }); + + it('sets is-above when element is above', () => { + const subItems = el.querySelector('.sidebar-sub-level-items'); + subItems.style.height = '5000px'; + el.style.position = 'relative'; + el.style.top = '1000px'; + + spyOn(el.classList, 'add'); + + showSubLevelItems(el); + + expect( + el.classList.add, + ).toHaveBeenCalledWith('is-above'); + }); + }); }); -- cgit v1.2.1 From d03ea6d40a923f233c71000808e333809791bc26 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Tue, 1 Aug 2017 14:36:17 +0530 Subject: Change ID type to number --- spec/javascripts/groups/mock_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/groups/mock_data.js b/spec/javascripts/groups/mock_data.js index 9e1f414514a..5bb84b591f4 100644 --- a/spec/javascripts/groups/mock_data.js +++ b/spec/javascripts/groups/mock_data.js @@ -1,5 +1,5 @@ const group1 = { - id: '12', + id: 12, name: 'level1', path: 'level1', description: 'foo', -- cgit v1.2.1 From 53fb22bcc3458598de9cebd60ae64a5f96937d5e Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Tue, 1 Aug 2017 14:36:30 +0530 Subject: Remove unnecessary imports --- spec/javascripts/groups/groups_spec.js | 2 -- 1 file changed, 2 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/groups/groups_spec.js b/spec/javascripts/groups/groups_spec.js index 7e38b49c792..b14153dbbfa 100644 --- a/spec/javascripts/groups/groups_spec.js +++ b/spec/javascripts/groups/groups_spec.js @@ -2,7 +2,6 @@ import Vue from 'vue'; import eventHub from '~/groups/event_hub'; import groupFolderComponent from '~/groups/components/group_folder.vue'; import groupItemComponent from '~/groups/components/group_item.vue'; -import groupIdenticonComponent from '~/groups/components/group_identicon.vue'; import groupsComponent from '~/groups/components/groups.vue'; import GroupsStore from '~/groups/stores/groups_store'; import { groupsData } from './mock_data'; @@ -15,7 +14,6 @@ describe('Groups Component', () => { beforeEach((done) => { Vue.component('group-folder', groupFolderComponent); - Vue.component('group-identicon', groupIdenticonComponent); Vue.component('group-item', groupItemComponent); store = new GroupsStore(); -- cgit v1.2.1 From 59377d54e91ba9acb309fe3cb1d4f942dbf43e54 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Tue, 1 Aug 2017 14:38:09 +0530 Subject: Tests for `group_identicon` component --- spec/javascripts/groups/group_identicon_spec.js | 82 +++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 spec/javascripts/groups/group_identicon_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/groups/group_identicon_spec.js b/spec/javascripts/groups/group_identicon_spec.js new file mode 100644 index 00000000000..d9615646982 --- /dev/null +++ b/spec/javascripts/groups/group_identicon_spec.js @@ -0,0 +1,82 @@ +import Vue from 'vue'; +import groupIdenticonComponent from '~/groups/components/group_identicon.vue'; +import GroupsStore from '~/groups/stores/groups_store'; +import { group1 } from './mock_data'; + +const createComponent = () => { + const Component = Vue.extend(groupIdenticonComponent); + const store = new GroupsStore(); + const group = store.decorateGroup(group1); + + return new Component({ + el: document.createElement('div'), + propsData: { + entityId: group.id, + entityName: group.name, + }, + }); +}; + +describe('GroupIdenticonComponent', () => { + let vm; + let el; + + beforeEach(() => { + vm = createComponent(); + el = vm.$el; + }); + + describe('props', () => { + it('should have props with defined data types', (done) => { + const identiconProps = groupIdenticonComponent.props; + const EntityIdTypeClass = identiconProps.entityId.type; + const EntityNameTypeClass = identiconProps.entityName.type; + + Vue.nextTick(() => { + expect(identiconProps.entityId).toBeDefined(); + expect(new EntityIdTypeClass() instanceof Number).toBeTruthy(); + expect(identiconProps.entityId.required).toBeTruthy(); + + expect(identiconProps.entityName).toBeDefined(); + expect(new EntityNameTypeClass() instanceof String).toBeTruthy(); + expect(identiconProps.entityName.required).toBeTruthy(); + done(); + }); + }); + }); + + describe('computed', () => { + describe('identiconStyles', () => { + it('should return styles attribute value with `background-color` property', () => { + vm.entityId = 4; + + expect(vm.identiconStyles).toBeDefined(); + expect(vm.identiconStyles.indexOf('background-color: #E0F2F1;') > -1).toBeTruthy(); + }); + + it('should return styles attribute value with `color` property', () => { + vm.entityId = 4; + + expect(vm.identiconStyles).toBeDefined(); + expect(vm.identiconStyles.indexOf('color: #555;') > -1).toBeTruthy(); + }); + }); + + describe('identiconTitle', () => { + it('should return first letter of entity title in uppercase', () => { + vm.entityName = 'dummy-group'; + + expect(vm.identiconTitle).toBeDefined(); + expect(vm.identiconTitle).toBe('D'); + }); + }); + }); + + describe('template', () => { + it('should render identicon', () => { + expect(el.nodeName).toBe('DIV'); + expect(el.classList.contains('identicon')).toBeTruthy(); + expect(el.getAttribute('style').indexOf('background-color') > -1).toBeTruthy(); + }); + }); +}); -- cgit v1.2.1 From 48ec70250cd63f5558f30698723555656eceff64 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 Aug 2017 11:55:37 +0100 Subject: reverted the JS timeout code improved specs so that they pass --- spec/javascripts/fly_out_nav_spec.js | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index 0fdaa2d8663..61e6c9f1fdb 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -1,7 +1,5 @@ import { calculateTop, - setMouseOutTimeout, - getHideTimeoutInterval, hideSubLevelItems, showSubLevelItems, } from '~/fly_out_nav'; @@ -41,26 +39,6 @@ describe('Fly out sidebar navigation', () => { }); }); - describe('setMouseOutTimeout', () => { - it('sets hideTimeoutInterval to 150 when inside sub items', () => { - el.innerHTML = ''; - - setMouseOutTimeout(el.querySelector('.js-test')); - - expect( - getHideTimeoutInterval(), - ).toBe(150); - }); - - it('resets hideTimeoutInterval when not inside sub items', () => { - setMouseOutTimeout(el); - - expect( - getHideTimeoutInterval(), - ).toBe(0); - }); - }); - describe('hideSubLevelItems', () => { beforeEach(() => { el.innerHTML = ''; @@ -142,16 +120,17 @@ describe('Fly out sidebar navigation', () => { it('sets is-above when element is above', () => { const subItems = el.querySelector('.sidebar-sub-level-items'); - subItems.style.height = '5000px'; + subItems.style.height = `${window.innerHeight + el.offsetHeight}px`; + subItems.style.position = 'absolute'; el.style.position = 'relative'; - el.style.top = '1000px'; + el.style.top = `${window.innerHeight - el.offsetHeight}px`; - spyOn(el.classList, 'add'); + spyOn(subItems.classList, 'add'); showSubLevelItems(el); expect( - el.classList.add, + subItems.classList.add, ).toHaveBeenCalledWith('is-above'); }); }); -- cgit v1.2.1 From 8de14be21e4ee9ddf5d5c699a6299387318fd0bd Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 Aug 2017 12:41:55 +0100 Subject: fixed translate3d test --- spec/javascripts/fly_out_nav_spec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index 61e6c9f1fdb..7c530606d61 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -8,6 +8,7 @@ describe('Fly out sidebar navigation', () => { let el; beforeEach(() => { el = document.createElement('div'); + el.style.position = 'relative'; document.body.appendChild(el); }); @@ -89,7 +90,7 @@ describe('Fly out sidebar navigation', () => { describe('showSubLevelItems', () => { beforeEach(() => { - el.innerHTML = ''; + el.innerHTML = ''; }); it('adds is-over class to el', () => { @@ -111,18 +112,17 @@ describe('Fly out sidebar navigation', () => { }); it('sets transform of sub-items', () => { + const subItems = el.querySelector('.sidebar-sub-level-items'); showSubLevelItems(el); expect( - el.querySelector('.sidebar-sub-level-items').style.transform, - ).toBe(`translate3d(0px, ${el.offsetTop}px, 0px)`); + subItems.style.transform, + ).toBe(`translate3d(0px, ${el.getBoundingClientRect().top}px, 0px)`); }); it('sets is-above when element is above', () => { const subItems = el.querySelector('.sidebar-sub-level-items'); subItems.style.height = `${window.innerHeight + el.offsetHeight}px`; - subItems.style.position = 'absolute'; - el.style.position = 'relative'; el.style.top = `${window.innerHeight - el.offsetHeight}px`; spyOn(subItems.classList, 'add'); -- cgit v1.2.1 From b808fdf16b4799e0d2e5b41d70d04f6dd10c040d Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 Aug 2017 13:13:27 +0100 Subject: Math.floor the value in the tests --- spec/javascripts/fly_out_nav_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index 7c530606d61..74775911505 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -117,7 +117,7 @@ describe('Fly out sidebar navigation', () => { expect( subItems.style.transform, - ).toBe(`translate3d(0px, ${el.getBoundingClientRect().top}px, 0px)`); + ).toBe(`translate3d(0px, ${Math.floor(el.getBoundingClientRect().top)}px, 0px)`); }); it('sets is-above when element is above', () => { -- cgit v1.2.1 From 4546ecd67ab2497af51144120667737e773e2dcc Mon Sep 17 00:00:00 2001 From: Winnie Hellmann Date: Tue, 1 Aug 2017 18:06:06 +0000 Subject: Derive project path from import URL --- spec/javascripts/projects/project_new_spec.js | 127 ++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 spec/javascripts/projects/project_new_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/projects/project_new_spec.js b/spec/javascripts/projects/project_new_spec.js new file mode 100644 index 00000000000..850768f0e4f --- /dev/null +++ b/spec/javascripts/projects/project_new_spec.js @@ -0,0 +1,127 @@ +import projectNew from '~/projects/project_new'; + +describe('New Project', () => { + let $projectImportUrl; + let $projectPath; + + beforeEach(() => { + setFixtures(` + + + `); + + $projectImportUrl = $('#project_import_url'); + $projectPath = $('#project_path'); + }); + + describe('deriveProjectPathFromUrl', () => { + const dummyImportUrl = `${gl.TEST_HOST}/dummy/import/url.git`; + + beforeEach(() => { + projectNew.bindEvents(); + $projectPath.val('').keyup().val(dummyImportUrl); + }); + + it('does not change project path for disabled $projectImportUrl', () => { + $projectImportUrl.attr('disabled', true); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual(dummyImportUrl); + }); + + describe('for enabled $projectImportUrl', () => { + beforeEach(() => { + $projectImportUrl.attr('disabled', false); + }); + + it('does not change project path if it is set by user', () => { + $projectPath.keyup(); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual(dummyImportUrl); + }); + + it('does not change project path for empty $projectImportUrl', () => { + $projectImportUrl.val(''); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual(dummyImportUrl); + }); + + it('does not change project path for whitespace $projectImportUrl', () => { + $projectImportUrl.val(' '); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual(dummyImportUrl); + }); + + it('does not change project path for $projectImportUrl without slashes', () => { + $projectImportUrl.val('has-no-slash'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual(dummyImportUrl); + }); + + it('changes project path to last $projectImportUrl component', () => { + $projectImportUrl.val('/this/is/last'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('last'); + }); + + it('ignores trailing slashes in $projectImportUrl', () => { + $projectImportUrl.val('/has/trailing/slash/'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('slash'); + }); + + it('ignores fragment identifier in $projectImportUrl', () => { + $projectImportUrl.val('/this/has/a#fragment-identifier/'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('a'); + }); + + it('ignores query string in $projectImportUrl', () => { + $projectImportUrl.val('/url/with?query=string'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('with'); + }); + + it('ignores trailing .git in $projectImportUrl', () => { + $projectImportUrl.val('/repository.git'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('repository'); + }); + + it('changes project path for HTTPS URL in $projectImportUrl', () => { + $projectImportUrl.val('https://username:password@gitlab.company.com/group/project.git'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('project'); + }); + + it('changes project path for SSH URL in $projectImportUrl', () => { + $projectImportUrl.val('git@gitlab.com:gitlab-org/gitlab-ce.git'); + + projectNew.deriveProjectPathFromUrl($projectImportUrl, $projectPath); + + expect($projectPath.val()).toEqual('gitlab-ce'); + }); + }); + }); +}); -- cgit v1.2.1 From 9513bd18c43b749c8856d6ad89635d97c8fb73b5 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 1 Aug 2017 14:51:52 -0400 Subject: Ensure all project factories use `:repository` trait or `:empty_project` --- spec/javascripts/fixtures/balsamiq.rb | 2 +- spec/javascripts/fixtures/dashboard.rb | 2 +- spec/javascripts/fixtures/merge_requests.rb | 2 +- spec/javascripts/fixtures/merge_requests_diffs.rb | 2 +- spec/javascripts/fixtures/pdf.rb | 2 +- spec/javascripts/fixtures/projects.rb | 2 +- spec/javascripts/fixtures/raw.rb | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fixtures/balsamiq.rb b/spec/javascripts/fixtures/balsamiq.rb index b5372821bf5..234e246119a 100644 --- a/spec/javascripts/fixtures/balsamiq.rb +++ b/spec/javascripts/fixtures/balsamiq.rb @@ -4,7 +4,7 @@ describe 'Balsamiq file', '(JavaScript fixtures)', type: :controller do include JavaScriptFixturesHelpers let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'balsamiq-project') } + let(:project) { create(:project, :repository, namespace: namespace, path: 'balsamiq-project') } before(:all) do clean_frontend_fixtures('blob/balsamiq/') diff --git a/spec/javascripts/fixtures/dashboard.rb b/spec/javascripts/fixtures/dashboard.rb index e83db8daaf2..b2114e65d27 100644 --- a/spec/javascripts/fixtures/dashboard.rb +++ b/spec/javascripts/fixtures/dashboard.rb @@ -5,7 +5,7 @@ describe Dashboard::ProjectsController, '(JavaScript fixtures)', type: :controll let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'builds-project') } + let(:project) { create(:empty_project, namespace: namespace, path: 'builds-project') } render_views diff --git a/spec/javascripts/fixtures/merge_requests.rb b/spec/javascripts/fixtures/merge_requests.rb index 7e2f364ffa4..f9d8b5c569c 100644 --- a/spec/javascripts/fixtures/merge_requests.rb +++ b/spec/javascripts/fixtures/merge_requests.rb @@ -5,7 +5,7 @@ describe Projects::MergeRequestsController, '(JavaScript fixtures)', type: :cont let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'merge-requests-project') } + let(:project) { create(:project, :repository, namespace: namespace, path: 'merge-requests-project') } let(:merge_request) { create(:merge_request, :with_diffs, source_project: project, target_project: project, description: '- [ ] Task List Item') } let(:merged_merge_request) { create(:merge_request, :merged, source_project: project, target_project: project) } let(:pipeline) do diff --git a/spec/javascripts/fixtures/merge_requests_diffs.rb b/spec/javascripts/fixtures/merge_requests_diffs.rb index ac5b06ace6d..4481a187f63 100644 --- a/spec/javascripts/fixtures/merge_requests_diffs.rb +++ b/spec/javascripts/fixtures/merge_requests_diffs.rb @@ -6,7 +6,7 @@ describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'merge-requests-project') } + let(:project) { create(:project, :repository, namespace: namespace, path: 'merge-requests-project') } let(:merge_request) { create(:merge_request, :with_diffs, source_project: project, target_project: project, description: '- [ ] Task List Item') } let(:path) { "files/ruby/popen.rb" } let(:position) do diff --git a/spec/javascripts/fixtures/pdf.rb b/spec/javascripts/fixtures/pdf.rb index 6b2422a7986..ef9976b9fd3 100644 --- a/spec/javascripts/fixtures/pdf.rb +++ b/spec/javascripts/fixtures/pdf.rb @@ -4,7 +4,7 @@ describe 'PDF file', '(JavaScript fixtures)', type: :controller do include JavaScriptFixturesHelpers let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'pdf-project') } + let(:project) { create(:project, :repository, namespace: namespace, path: 'pdf-project') } before(:all) do clean_frontend_fixtures('blob/pdf/') diff --git a/spec/javascripts/fixtures/projects.rb b/spec/javascripts/fixtures/projects.rb index 6c33b240e5c..b828eee6629 100644 --- a/spec/javascripts/fixtures/projects.rb +++ b/spec/javascripts/fixtures/projects.rb @@ -5,7 +5,7 @@ describe ProjectsController, '(JavaScript fixtures)', type: :controller do let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'builds-project') } + let(:project) { create(:empty_project, namespace: namespace, path: 'builds-project') } render_views diff --git a/spec/javascripts/fixtures/raw.rb b/spec/javascripts/fixtures/raw.rb index 17533443d76..25f5a3b0bb3 100644 --- a/spec/javascripts/fixtures/raw.rb +++ b/spec/javascripts/fixtures/raw.rb @@ -4,7 +4,7 @@ describe 'Raw files', '(JavaScript fixtures)', type: :controller do include JavaScriptFixturesHelpers let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'raw-project') } + let(:project) { create(:project, :repository, namespace: namespace, path: 'raw-project') } before(:all) do clean_frontend_fixtures('blob/notebook/') -- cgit v1.2.1 From 9636da306ce93f4a07020db169881367a78404cd Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 2 Aug 2017 14:45:30 +0530 Subject: Use `$mount` for component rendering, remove tests for `props` datatype as unnecessary --- spec/javascripts/groups/group_identicon_spec.js | 30 ++++--------------------- 1 file changed, 4 insertions(+), 26 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/groups/group_identicon_spec.js b/spec/javascripts/groups/group_identicon_spec.js index d9615646982..66772327503 100644 --- a/spec/javascripts/groups/group_identicon_spec.js +++ b/spec/javascripts/groups/group_identicon_spec.js @@ -9,40 +9,18 @@ const createComponent = () => { const group = store.decorateGroup(group1); return new Component({ - el: document.createElement('div'), propsData: { entityId: group.id, entityName: group.name, }, - }); + }).$mount(); }; describe('GroupIdenticonComponent', () => { let vm; - let el; beforeEach(() => { vm = createComponent(); - el = vm.$el; - }); - - describe('props', () => { - it('should have props with defined data types', (done) => { - const identiconProps = groupIdenticonComponent.props; - const EntityIdTypeClass = identiconProps.entityId.type; - const EntityNameTypeClass = identiconProps.entityName.type; - - Vue.nextTick(() => { - expect(identiconProps.entityId).toBeDefined(); - expect(new EntityIdTypeClass() instanceof Number).toBeTruthy(); - expect(identiconProps.entityId.required).toBeTruthy(); - - expect(identiconProps.entityName).toBeDefined(); - expect(new EntityNameTypeClass() instanceof String).toBeTruthy(); - expect(identiconProps.entityName.required).toBeTruthy(); - done(); - }); - }); }); describe('computed', () => { @@ -74,9 +52,9 @@ describe('GroupIdenticonComponent', () => { describe('template', () => { it('should render identicon', () => { - expect(el.nodeName).toBe('DIV'); - expect(el.classList.contains('identicon')).toBeTruthy(); - expect(el.getAttribute('style').indexOf('background-color') > -1).toBeTruthy(); + expect(vm.$el.nodeName).toBe('DIV'); + expect(vm.$el.classList.contains('identicon')).toBeTruthy(); + expect(vm.$el.getAttribute('style').indexOf('background-color') > -1).toBeTruthy(); }); }); }); -- cgit v1.2.1 From 25d6a6c4b528159c288995de4909e6a8da431d0b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 2 Aug 2017 10:22:13 +0100 Subject: stop mobile from showing the sub-items --- spec/javascripts/fly_out_nav_spec.js | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fly_out_nav_spec.js b/spec/javascripts/fly_out_nav_spec.js index 74775911505..ab74f3e00ec 100644 --- a/spec/javascripts/fly_out_nav_spec.js +++ b/spec/javascripts/fly_out_nav_spec.js @@ -1,19 +1,26 @@ +/* global bp */ import { calculateTop, hideSubLevelItems, showSubLevelItems, + canShowSubItems, } from '~/fly_out_nav'; describe('Fly out sidebar navigation', () => { let el; + let breakpointSize = 'lg'; + beforeEach(() => { el = document.createElement('div'); el.style.position = 'relative'; document.body.appendChild(el); + + spyOn(bp, 'getBreakpointSize').and.callFake(() => breakpointSize); }); afterEach(() => { el.remove(); + breakpointSize = 'lg'; }); describe('calculateTop', () => { @@ -53,6 +60,16 @@ describe('Fly out sidebar navigation', () => { ).toBe('none'); }); + it('does not hude subitems on mobile', () => { + breakpointSize = 'sm'; + + hideSubLevelItems(el); + + expect( + el.querySelector('.sidebar-sub-level-items').style.display, + ).not.toBe('none'); + }); + it('removes is-over class', () => { spyOn(el.classList, 'remove'); @@ -103,7 +120,17 @@ describe('Fly out sidebar navigation', () => { ).toHaveBeenCalledWith('is-over'); }); - it('shows sub-items', () => { + it('does not show sub-items on mobile', () => { + breakpointSize = 'sm'; + + showSubLevelItems(el); + + expect( + el.querySelector('.sidebar-sub-level-items').style.display, + ).not.toBe('block'); + }); + + it('does not shows sub-items', () => { showSubLevelItems(el); expect( @@ -134,4 +161,20 @@ describe('Fly out sidebar navigation', () => { ).toHaveBeenCalledWith('is-above'); }); }); + + describe('canShowSubItems', () => { + it('returns true if on desktop size', () => { + expect( + canShowSubItems(), + ).toBeTruthy(); + }); + + it('returns false if on mobile size', () => { + breakpointSize = 'sm'; + + expect( + canShowSubItems(), + ).toBeFalsy(); + }); + }); }); -- cgit v1.2.1 From 974a04026dd1043981c25e64c9827c3b8d15a927 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Wed, 2 Aug 2017 09:27:24 +0000 Subject: Add filtered search to group issue dashboard --- spec/javascripts/droplab/plugins/ajax_spec.js | 36 ++++++++ .../filtered_search/dropdown_utils_spec.js | 96 ++++++++++++++++++++++ .../filtered_search_visual_tokens_spec.js | 63 ++++++++++++++ spec/javascripts/lib/utils/ajax_cache_spec.js | 9 ++ 4 files changed, 204 insertions(+) create mode 100644 spec/javascripts/droplab/plugins/ajax_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/droplab/plugins/ajax_spec.js b/spec/javascripts/droplab/plugins/ajax_spec.js new file mode 100644 index 00000000000..085f25764fe --- /dev/null +++ b/spec/javascripts/droplab/plugins/ajax_spec.js @@ -0,0 +1,36 @@ +import AjaxCache from '~/lib/utils/ajax_cache'; +import Ajax from '~/droplab/plugins/ajax'; + +describe('Ajax', () => { + describe('preprocessing', () => { + const config = {}; + + describe('is not configured', () => { + it('passes the data through', () => { + const data = ['data']; + expect(Ajax.preprocessing(config, data)).toEqual(data); + }); + }); + + describe('is configured', () => { + const processedArray = ['processed']; + + beforeEach(() => { + config.preprocessing = () => processedArray; + spyOn(config, 'preprocessing').and.callFake(() => processedArray); + }); + + it('calls preprocessing', () => { + Ajax.preprocessing(config, []); + expect(config.preprocessing.calls.count()).toBe(1); + }); + + it('overrides AjaxCache', () => { + spyOn(AjaxCache, 'override').and.callFake((endpoint, results) => expect(results).toEqual(processedArray)); + + Ajax.preprocessing(config, []); + expect(AjaxCache.override.calls.count()).toBe(1); + }); + }); + }); +}); diff --git a/spec/javascripts/filtered_search/dropdown_utils_spec.js b/spec/javascripts/filtered_search/dropdown_utils_spec.js index f55726379f3..244f170ab7a 100644 --- a/spec/javascripts/filtered_search/dropdown_utils_spec.js +++ b/spec/javascripts/filtered_search/dropdown_utils_spec.js @@ -191,6 +191,102 @@ describe('Dropdown Utils', () => { }); }); + describe('mergeDuplicateLabels', () => { + const dataMap = { + label: { + title: 'label', + color: '#FFFFFF', + }, + }; + + it('should add label to dataMap if it is not a duplicate', () => { + const newLabel = { + title: 'new-label', + color: '#000000', + }; + + const updated = gl.DropdownUtils.mergeDuplicateLabels(dataMap, newLabel); + expect(updated[newLabel.title]).toEqual(newLabel); + }); + + it('should merge colors if label is a duplicate', () => { + const duplicate = { + title: 'label', + color: '#000000', + }; + + const updated = gl.DropdownUtils.mergeDuplicateLabels(dataMap, duplicate); + expect(updated.label.multipleColors).toEqual([dataMap.label.color, duplicate.color]); + }); + }); + + describe('duplicateLabelColor', () => { + it('should linear-gradient 2 colors', () => { + const gradient = gl.DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000']); + expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 50%, #000000 50%, #000000 100%)'); + }); + + it('should linear-gradient 3 colors', () => { + const gradient = gl.DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333']); + expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 33%, #000000 33%, #000000 66%, #333333 66%, #333333 100%)'); + }); + + it('should linear-gradient 4 colors', () => { + const gradient = gl.DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333', '#DDDDDD']); + expect(gradient).toEqual('linear-gradient(#FFFFFF 0%, #FFFFFF 25%, #000000 25%, #000000 50%, #333333 50%, #333333 75%, #DDDDDD 75%, #DDDDDD 100%)'); + }); + + it('should not linear-gradient more than 4 colors', () => { + const gradient = gl.DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000', '#333333', '#DDDDDD', '#EEEEEE']); + expect(gradient.indexOf('#EEEEEE') === -1).toEqual(true); + }); + }); + + describe('duplicateLabelPreprocessing', () => { + it('should set preprocessed to true', () => { + const results = gl.DropdownUtils.duplicateLabelPreprocessing([]); + expect(results.preprocessed).toEqual(true); + }); + + it('should not mutate existing data if there are no duplicates', () => { + const data = [{ + title: 'label1', + color: '#FFFFFF', + }, { + title: 'label2', + color: '#000000', + }]; + const results = gl.DropdownUtils.duplicateLabelPreprocessing(data); + + expect(results.length).toEqual(2); + expect(results[0]).toEqual(data[0]); + expect(results[1]).toEqual(data[1]); + }); + + describe('duplicate labels', () => { + const data = [{ + title: 'label', + color: '#FFFFFF', + }, { + title: 'label', + color: '#000000', + }]; + const results = gl.DropdownUtils.duplicateLabelPreprocessing(data); + + it('should merge duplicate labels', () => { + expect(results.length).toEqual(1); + }); + + it('should convert multiple colored labels into linear-gradient', () => { + expect(results[0].color).toEqual(gl.DropdownUtils.duplicateLabelColor(['#FFFFFF', '#000000'])); + }); + + it('should set multiple colored label text color to black', () => { + expect(results[0].text_color).toEqual('#000000'); + }); + }); + }); + describe('setDataValueIfSelected', () => { beforeEach(() => { spyOn(gl.FilteredSearchDropdownManager, 'addWordToInput') diff --git a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js index fa4343ffbc8..67166802c70 100644 --- a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js +++ b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js @@ -797,6 +797,69 @@ describe('Filtered Search Visual Tokens', () => { }); }); + describe('setTokenStyle', () => { + let originalTextColor; + + beforeEach(() => { + originalTextColor = bugLabelToken.style.color; + }); + + it('should set backgroundColor', () => { + const originalBackgroundColor = bugLabelToken.style.backgroundColor; + const token = subject.setTokenStyle(bugLabelToken, 'blue', 'white'); + expect(token.style.backgroundColor).toEqual('blue'); + expect(token.style.backgroundColor).not.toEqual(originalBackgroundColor); + }); + + it('should not set backgroundColor when it is a linear-gradient', () => { + const token = subject.setTokenStyle(bugLabelToken, 'linear-gradient(135deg, red, blue)', 'white'); + expect(token.style.backgroundColor).toEqual(bugLabelToken.style.backgroundColor); + }); + + it('should set textColor', () => { + const token = subject.setTokenStyle(bugLabelToken, 'white', 'black'); + expect(token.style.color).toEqual('black'); + expect(token.style.color).not.toEqual(originalTextColor); + }); + + it('should add inverted class when textColor is #FFFFFF', () => { + const token = subject.setTokenStyle(bugLabelToken, 'black', '#FFFFFF'); + expect(token.style.color).toEqual('rgb(255, 255, 255)'); + expect(token.style.color).not.toEqual(originalTextColor); + expect(token.querySelector('.remove-token').classList.contains('inverted')).toEqual(true); + }); + }); + + describe('preprocessLabel', () => { + const endpoint = 'endpoint'; + + it('does not preprocess more than once', () => { + let labels = []; + + spyOn(gl.DropdownUtils, 'duplicateLabelPreprocessing').and.callFake(() => []); + + labels = gl.FilteredSearchVisualTokens.preprocessLabel(endpoint, labels); + gl.FilteredSearchVisualTokens.preprocessLabel(endpoint, labels); + + expect(gl.DropdownUtils.duplicateLabelPreprocessing.calls.count()).toEqual(1); + }); + + describe('not preprocessed before', () => { + it('returns preprocessed labels', () => { + let labels = []; + expect(labels.preprocessed).not.toEqual(true); + labels = gl.FilteredSearchVisualTokens.preprocessLabel(endpoint, labels); + expect(labels.preprocessed).toEqual(true); + }); + + it('overrides AjaxCache with preprocessed results', () => { + spyOn(AjaxCache, 'override').and.callFake(() => {}); + gl.FilteredSearchVisualTokens.preprocessLabel(endpoint, []); + expect(AjaxCache.override.calls.count()).toEqual(1); + }); + }); + }); + describe('updateLabelTokenColor', () => { const jsonFixtureName = 'labels/project_labels.json'; const dummyEndpoint = '/dummy/endpoint'; diff --git a/spec/javascripts/lib/utils/ajax_cache_spec.js b/spec/javascripts/lib/utils/ajax_cache_spec.js index 2c946802dcd..49971bd91e2 100644 --- a/spec/javascripts/lib/utils/ajax_cache_spec.js +++ b/spec/javascripts/lib/utils/ajax_cache_spec.js @@ -77,6 +77,15 @@ describe('AjaxCache', () => { }); }); + describe('override', () => { + it('overrides existing cache', () => { + AjaxCache.internalStorage.endpoint = 'existing-endpoint'; + AjaxCache.override('endpoint', 'new-endpoint'); + + expect(AjaxCache.internalStorage.endpoint).toEqual('new-endpoint'); + }); + }); + describe('retrieve', () => { let ajaxSpy; -- cgit v1.2.1 From 72a7b30c9f363063449b28aa9efc3a26a1752f9f Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 2 Aug 2017 15:55:11 -0400 Subject: Change all `:empty_project` to `:project` --- spec/javascripts/fixtures/dashboard.rb | 2 +- spec/javascripts/fixtures/deploy_keys.rb | 2 +- spec/javascripts/fixtures/projects.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/fixtures/dashboard.rb b/spec/javascripts/fixtures/dashboard.rb index b2114e65d27..e83db8daaf2 100644 --- a/spec/javascripts/fixtures/dashboard.rb +++ b/spec/javascripts/fixtures/dashboard.rb @@ -5,7 +5,7 @@ describe Dashboard::ProjectsController, '(JavaScript fixtures)', type: :controll let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:empty_project, namespace: namespace, path: 'builds-project') } + let(:project) { create(:project, namespace: namespace, path: 'builds-project') } render_views diff --git a/spec/javascripts/fixtures/deploy_keys.rb b/spec/javascripts/fixtures/deploy_keys.rb index 16e598a4b29..fca3f5b1bfe 100644 --- a/spec/javascripts/fixtures/deploy_keys.rb +++ b/spec/javascripts/fixtures/deploy_keys.rb @@ -6,7 +6,7 @@ describe Projects::DeployKeysController, '(JavaScript fixtures)', type: :control let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} let(:project) { create(:project_empty_repo, namespace: namespace, path: 'todos-project') } - let(:project2) { create(:empty_project, :internal)} + let(:project2) { create(:project, :internal)} before(:all) do clean_frontend_fixtures('deploy_keys/') diff --git a/spec/javascripts/fixtures/projects.rb b/spec/javascripts/fixtures/projects.rb index b828eee6629..6c33b240e5c 100644 --- a/spec/javascripts/fixtures/projects.rb +++ b/spec/javascripts/fixtures/projects.rb @@ -5,7 +5,7 @@ describe ProjectsController, '(JavaScript fixtures)', type: :controller do let(:admin) { create(:admin) } let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:empty_project, namespace: namespace, path: 'builds-project') } + let(:project) { create(:project, namespace: namespace, path: 'builds-project') } render_views -- cgit v1.2.1 From 30777178e3311c8aa7f4ecae82bd970fda63d85c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 28 Jul 2017 11:54:51 +0100 Subject: fixed jumping when bar gets stuck added specs to sticky util file added `No files found.` text when results are empty --- spec/javascripts/lib/utils/sticky_spec.js | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 spec/javascripts/lib/utils/sticky_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/lib/utils/sticky_spec.js b/spec/javascripts/lib/utils/sticky_spec.js new file mode 100644 index 00000000000..c3ee3ef9825 --- /dev/null +++ b/spec/javascripts/lib/utils/sticky_spec.js @@ -0,0 +1,52 @@ +import { isSticky } from '~/lib/utils/sticky'; + +describe('sticky', () => { + const el = { + offsetTop: 0, + classList: {}, + }; + + beforeEach(() => { + el.offsetTop = 0; + el.classList.add = jasmine.createSpy('spy'); + el.classList.remove = jasmine.createSpy('spy'); + }); + + describe('classList.remove', () => { + it('does not call classList.remove when stuck', () => { + isSticky(el, 0, 0); + + expect( + el.classList.remove, + ).not.toHaveBeenCalled(); + }); + + it('calls classList.remove when not stuck', () => { + el.offsetTop = 10; + isSticky(el, 0, 0); + + expect( + el.classList.remove, + ).toHaveBeenCalledWith('is-stuck'); + }); + }); + + describe('classList.add', () => { + it('calls classList.add when stuck', () => { + isSticky(el, 0, 0); + + expect( + el.classList.add, + ).toHaveBeenCalledWith('is-stuck'); + }); + + it('does not call classList.add when not stuck', () => { + el.offsetTop = 10; + isSticky(el, 0, 0); + + expect( + el.classList.add, + ).not.toHaveBeenCalled(); + }); + }); +}); -- cgit v1.2.1 From 7256626d6023869fac7ffdcfe3d291b76fb19e64 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Fri, 4 Aug 2017 08:07:05 +0000 Subject: Remove monkey-patched Array.prototype.first() and last() methods --- spec/javascripts/abuse_reports_spec.js | 6 +++--- spec/javascripts/ajax_loading_spinner_spec.js | 1 - spec/javascripts/extensions/array_spec.js | 22 ---------------------- .../filtered_search/dropdown_utils_spec.js | 1 - .../filtered_search_dropdown_manager_spec.js | 1 - .../filtered_search_token_keys_spec.js | 1 - .../filtered_search_tokenizer_spec.js | 1 - 7 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 spec/javascripts/extensions/array_spec.js (limited to 'spec/javascripts') diff --git a/spec/javascripts/abuse_reports_spec.js b/spec/javascripts/abuse_reports_spec.js index 069d857eab6..13cab81dd60 100644 --- a/spec/javascripts/abuse_reports_spec.js +++ b/spec/javascripts/abuse_reports_spec.js @@ -6,10 +6,10 @@ import '~/abuse_reports'; const FIXTURE = 'abuse_reports/abuse_reports_list.html.raw'; const MAX_MESSAGE_LENGTH = 500; - let messages; + let $messages; const assertMaxLength = $message => expect($message.text().length).toEqual(MAX_MESSAGE_LENGTH); - const findMessage = searchText => messages.filter( + const findMessage = searchText => $messages.filter( (index, element) => element.innerText.indexOf(searchText) > -1, ).first(); @@ -18,7 +18,7 @@ import '~/abuse_reports'; beforeEach(function () { loadFixtures(FIXTURE); this.abuseReports = new global.AbuseReports(); - messages = $('.abuse-reports .message'); + $messages = $('.abuse-reports .message'); }); it('should truncate long messages', () => { diff --git a/spec/javascripts/ajax_loading_spinner_spec.js b/spec/javascripts/ajax_loading_spinner_spec.js index 1518ae68b0d..46e072a8ebb 100644 --- a/spec/javascripts/ajax_loading_spinner_spec.js +++ b/spec/javascripts/ajax_loading_spinner_spec.js @@ -1,4 +1,3 @@ -import '~/extensions/array'; import 'jquery'; import 'jquery-ujs'; import '~/ajax_loading_spinner'; diff --git a/spec/javascripts/extensions/array_spec.js b/spec/javascripts/extensions/array_spec.js deleted file mode 100644 index b1b81b4efc2..00000000000 --- a/spec/javascripts/extensions/array_spec.js +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable space-before-function-paren, no-var */ - -import '~/extensions/array'; - -(function() { - describe('Array extensions', function() { - describe('first', function() { - return it('returns the first item', function() { - var arr; - arr = [0, 1, 2, 3, 4, 5]; - return expect(arr.first()).toBe(0); - }); - }); - describe('last', function() { - return it('returns the last item', function() { - var arr; - arr = [0, 1, 2, 3, 4, 5]; - return expect(arr.last()).toBe(5); - }); - }); - }); -}).call(window); diff --git a/spec/javascripts/filtered_search/dropdown_utils_spec.js b/spec/javascripts/filtered_search/dropdown_utils_spec.js index 244f170ab7a..b1b3d43f241 100644 --- a/spec/javascripts/filtered_search/dropdown_utils_spec.js +++ b/spec/javascripts/filtered_search/dropdown_utils_spec.js @@ -1,4 +1,3 @@ -import '~/extensions/array'; import '~/filtered_search/dropdown_utils'; import '~/filtered_search/filtered_search_tokenizer'; import '~/filtered_search/filtered_search_dropdown_manager'; diff --git a/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js b/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js index 9e2076dc383..5c7e9115aac 100644 --- a/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js +++ b/spec/javascripts/filtered_search/filtered_search_dropdown_manager_spec.js @@ -1,4 +1,3 @@ -import '~/extensions/array'; import '~/filtered_search/filtered_search_visual_tokens'; import '~/filtered_search/filtered_search_tokenizer'; import '~/filtered_search/filtered_search_dropdown_manager'; diff --git a/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js b/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js index 1a7631994b4..69b424c3af5 100644 --- a/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js +++ b/spec/javascripts/filtered_search/filtered_search_token_keys_spec.js @@ -1,4 +1,3 @@ -import '~/extensions/array'; import '~/filtered_search/filtered_search_token_keys'; describe('Filtered Search Token Keys', () => { diff --git a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js index e4a15c83c23..585bea9b499 100644 --- a/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js +++ b/spec/javascripts/filtered_search/filtered_search_tokenizer_spec.js @@ -1,4 +1,3 @@ -import '~/extensions/array'; import '~/filtered_search/filtered_search_token_keys'; import '~/filtered_search/filtered_search_tokenizer'; -- cgit v1.2.1 From d93527805569e9462b5f142d807b14eaaf179876 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Mon, 7 Aug 2017 07:47:29 +0000 Subject: Fix issues with pdf-js dependencies --- spec/javascripts/pdf/index_spec.js | 4 ++-- spec/javascripts/pdf/page_spec.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'spec/javascripts') diff --git a/spec/javascripts/pdf/index_spec.js b/spec/javascripts/pdf/index_spec.js index f661fae5fe2..bebed432f91 100644 --- a/spec/javascripts/pdf/index_spec.js +++ b/spec/javascripts/pdf/index_spec.js @@ -1,8 +1,8 @@ /* eslint-disable import/no-unresolved */ import Vue from 'vue'; -import { PDFJS } from 'pdfjs-dist'; -import workerSrc from 'vendor/pdf.worker'; +import { PDFJS } from 'vendor/pdf'; +import workerSrc from 'vendor/pdf.worker.min'; import PDFLab from '~/pdf/index.vue'; import pdf from '../fixtures/blob/pdf/test.pdf'; diff --git a/spec/javascripts/pdf/page_spec.js b/spec/javascripts/pdf/page_spec.js index ac76ebbfbe6..ac5b21e8f6c 100644 --- a/spec/javascripts/pdf/page_spec.js +++ b/spec/javascripts/pdf/page_spec.js @@ -1,8 +1,8 @@ /* eslint-disable import/no-unresolved */ import Vue from 'vue'; -import pdfjsLib from 'pdfjs-dist'; -import workerSrc from 'vendor/pdf.worker'; +import pdfjsLib from 'vendor/pdf'; +import workerSrc from 'vendor/pdf.worker.min'; import PageComponent from '~/pdf/page/index.vue'; import testPDF from '../fixtures/blob/pdf/test.pdf'; -- cgit v1.2.1