diff options
Diffstat (limited to 'spec/javascripts')
86 files changed, 929 insertions, 2569 deletions
diff --git a/spec/javascripts/badges/components/badge_list_spec.js b/spec/javascripts/badges/components/badge_list_spec.js index 2f72c9ed89d..2fa807657de 100644 --- a/spec/javascripts/badges/components/badge_list_spec.js +++ b/spec/javascripts/badges/components/badge_list_spec.js @@ -60,7 +60,7 @@ describe('BadgeList component', () => { Vue.nextTick() .then(() => { - const loadingIcon = vm.$el.querySelector('.spinner'); + const loadingIcon = vm.$el.querySelector('.gl-spinner'); expect(loadingIcon).toBeVisible(); }) diff --git a/spec/javascripts/badges/components/badge_spec.js b/spec/javascripts/badges/components/badge_spec.js index 4e4d1ae2e99..c82a03a628a 100644 --- a/spec/javascripts/badges/components/badge_spec.js +++ b/spec/javascripts/badges/components/badge_spec.js @@ -15,7 +15,7 @@ describe('Badge component', () => { const buttons = vm.$el.querySelectorAll('button'); return { badgeImage: vm.$el.querySelector('img.project-badge'), - loadingIcon: vm.$el.querySelector('.spinner'), + loadingIcon: vm.$el.querySelector('.gl-spinner'), reloadButton: buttons[buttons.length - 1], }; }; diff --git a/spec/javascripts/boards/board_blank_state_spec.js b/spec/javascripts/boards/board_blank_state_spec.js index 8e2a947b0dd..b64859ec32a 100644 --- a/spec/javascripts/boards/board_blank_state_spec.js +++ b/spec/javascripts/boards/board_blank_state_spec.js @@ -1,7 +1,6 @@ import Vue from 'vue'; import boardsStore from '~/boards/stores/boards_store'; import BoardBlankState from '~/boards/components/board_blank_state.vue'; -import { mockBoardService } from './mock_data'; describe('Boards blank state', () => { let vm; @@ -11,9 +10,10 @@ describe('Boards blank state', () => { const Comp = Vue.extend(BoardBlankState); boardsStore.create(); - gl.boardService = mockBoardService(); - spyOn(gl.boardService, 'generateDefaultLists').and.callFake( + spyOn(boardsStore, 'addList').and.stub(); + spyOn(boardsStore, 'removeList').and.stub(); + spyOn(boardsStore, 'generateDefaultLists').and.callFake( () => new Promise((resolve, reject) => { if (fail) { @@ -71,9 +71,14 @@ describe('Boards blank state', () => { vm.$el.querySelector('.btn-success').click(); setTimeout(() => { - expect(boardsStore.state.lists.length).toBe(2); - expect(boardsStore.state.lists[0].title).toEqual('To Do'); - expect(boardsStore.state.lists[1].title).toEqual('Doing'); + expect(boardsStore.addList).toHaveBeenCalledTimes(2); + expect(boardsStore.addList).toHaveBeenCalledWith( + jasmine.objectContaining({ title: 'To Do' }), + ); + + expect(boardsStore.addList).toHaveBeenCalledWith( + jasmine.objectContaining({ title: 'Doing' }), + ); done(); }); @@ -86,7 +91,7 @@ describe('Boards blank state', () => { setTimeout(() => { expect(boardsStore.welcomeIsHidden()).toBeFalsy(); - expect(boardsStore.state.lists.length).toBe(1); + expect(boardsStore.removeList).toHaveBeenCalledWith(undefined, 'label'); done(); }); diff --git a/spec/javascripts/boards/board_list_spec.js b/spec/javascripts/boards/board_list_spec.js index 9c9b435d7fd..6774a46ed58 100644 --- a/spec/javascripts/boards/board_list_spec.js +++ b/spec/javascripts/boards/board_list_spec.js @@ -148,7 +148,7 @@ describe('Board list component', () => { component.list.loadingMore = true; Vue.nextTick(() => { - expect(component.$el.querySelector('.board-list-count .spinner')).not.toBeNull(); + expect(component.$el.querySelector('.board-list-count .gl-spinner')).not.toBeNull(); done(); }); diff --git a/spec/javascripts/boards/components/board_form_spec.js b/spec/javascripts/boards/components/board_form_spec.js new file mode 100644 index 00000000000..e9014156a98 --- /dev/null +++ b/spec/javascripts/boards/components/board_form_spec.js @@ -0,0 +1,56 @@ +import $ from 'jquery'; +import Vue from 'vue'; +import boardsStore from '~/boards/stores/boards_store'; +import boardForm from '~/boards/components/board_form.vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; + +describe('board_form.vue', () => { + const props = { + canAdminBoard: false, + labelsPath: `${gl.TEST_HOST}/labels/path`, + milestonePath: `${gl.TEST_HOST}/milestone/path`, + }; + let vm; + + beforeEach(() => { + spyOn($, 'ajax'); + boardsStore.state.currentPage = 'edit'; + const Component = Vue.extend(boardForm); + vm = mountComponent(Component, props); + }); + + afterEach(() => { + vm.$destroy(); + }); + + describe('methods', () => { + describe('cancel', () => { + it('resets currentPage', done => { + vm.cancel(); + + Vue.nextTick() + .then(() => { + expect(boardsStore.state.currentPage).toBe(''); + }) + .then(done) + .catch(done.fail); + }); + }); + }); + + describe('buttons', () => { + it('cancel button triggers cancel()', done => { + spyOn(vm, 'cancel'); + + Vue.nextTick() + .then(() => { + const cancelButton = vm.$el.querySelector('button[data-dismiss="modal"]'); + cancelButton.click(); + + expect(vm.cancel).toHaveBeenCalled(); + }) + .then(done) + .catch(done.fail); + }); + }); +}); diff --git a/spec/javascripts/boards/components/boards_selector_spec.js b/spec/javascripts/boards/components/boards_selector_spec.js new file mode 100644 index 00000000000..473cc0612ea --- /dev/null +++ b/spec/javascripts/boards/components/boards_selector_spec.js @@ -0,0 +1,206 @@ +import Vue from 'vue'; +import BoardService from '~/boards/services/board_service'; +import BoardsSelector from '~/boards/components/boards_selector.vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import { TEST_HOST } from 'spec/test_constants'; +import boardsStore from '~/boards/stores/boards_store'; + +const throttleDuration = 1; + +function boardGenerator(n) { + return new Array(n).fill().map((board, id) => { + const name = `board${id}`; + + return { + id, + name, + }; + }); +} + +describe('BoardsSelector', () => { + let vm; + let allBoardsResponse; + let recentBoardsResponse; + let fillSearchBox; + const boards = boardGenerator(20); + const recentBoards = boardGenerator(5); + + beforeEach(done => { + setFixtures('<div class="js-boards-selector"></div>'); + window.gl = window.gl || {}; + + boardsStore.setEndpoints({ + boardsEndpoint: '', + recentBoardsEndpoint: '', + listsEndpoint: '', + bulkUpdatePath: '', + boardId: '', + }); + window.gl.boardService = new BoardService(); + + allBoardsResponse = Promise.resolve({ + data: boards, + }); + recentBoardsResponse = Promise.resolve({ + data: recentBoards, + }); + + spyOn(BoardService.prototype, 'allBoards').and.returnValue(allBoardsResponse); + spyOn(BoardService.prototype, 'recentBoards').and.returnValue(recentBoardsResponse); + + const Component = Vue.extend(BoardsSelector); + vm = mountComponent( + Component, + { + throttleDuration, + currentBoard: { + id: 1, + name: 'Development', + milestone_id: null, + weight: null, + assignee_id: null, + labels: [], + }, + milestonePath: `${TEST_HOST}/milestone/path`, + boardBaseUrl: `${TEST_HOST}/board/base/url`, + hasMissingBoards: false, + canAdminBoard: true, + multipleIssueBoardsAvailable: true, + labelsPath: `${TEST_HOST}/labels/path`, + projectId: 42, + groupId: 19, + scopedIssueBoardFeatureEnabled: true, + weights: [], + }, + document.querySelector('.js-boards-selector'), + ); + + // Emits gl-dropdown show event to simulate the dropdown is opened at initialization time + vm.$children[0].$emit('show'); + + Promise.all([allBoardsResponse, recentBoardsResponse]) + .then(() => vm.$nextTick()) + .then(done) + .catch(done.fail); + + fillSearchBox = filterTerm => { + const { searchBox } = vm.$refs; + const searchBoxInput = searchBox.$el.querySelector('input'); + searchBoxInput.value = filterTerm; + searchBoxInput.dispatchEvent(new Event('input')); + }; + }); + + afterEach(() => { + vm.$destroy(); + window.gl.boardService = undefined; + }); + + describe('filtering', () => { + it('shows all boards without filtering', done => { + vm.$nextTick() + .then(() => { + const dropdownItem = vm.$el.querySelectorAll('.js-dropdown-item'); + + expect(dropdownItem.length).toBe(boards.length + recentBoards.length); + }) + .then(done) + .catch(done.fail); + }); + + it('shows only matching boards when filtering', done => { + const filterTerm = 'board1'; + const expectedCount = boards.filter(board => board.name.includes(filterTerm)).length; + + fillSearchBox(filterTerm); + + vm.$nextTick() + .then(() => { + const dropdownItems = vm.$el.querySelectorAll('.js-dropdown-item'); + + expect(dropdownItems.length).toBe(expectedCount); + }) + .then(done) + .catch(done.fail); + }); + + it('shows message if there are no matching boards', done => { + fillSearchBox('does not exist'); + + vm.$nextTick() + .then(() => { + const dropdownItems = vm.$el.querySelectorAll('.js-dropdown-item'); + + expect(dropdownItems.length).toBe(0); + expect(vm.$el).toContainText('No matching boards found'); + }) + .then(done) + .catch(done.fail); + }); + }); + + describe('recent boards section', () => { + it('shows only when boards are greater than 10', done => { + vm.$nextTick() + .then(() => { + const headerEls = vm.$el.querySelectorAll('.dropdown-bold-header'); + + const expectedCount = 2; // Recent + All + + expect(expectedCount).toBe(headerEls.length); + }) + .then(done) + .catch(done.fail); + }); + + it('does not show when boards are less than 10', done => { + spyOn(vm, 'initScrollFade'); + spyOn(vm, 'setScrollFade'); + + vm.$nextTick() + .then(() => { + vm.boards = vm.boards.slice(0, 5); + }) + .then(vm.$nextTick) + .then(() => { + const headerEls = vm.$el.querySelectorAll('.dropdown-bold-header'); + const expectedCount = 0; + + expect(expectedCount).toBe(headerEls.length); + }) + .then(done) + .catch(done.fail); + }); + + it('does not show when recentBoards api returns empty array', done => { + vm.$nextTick() + .then(() => { + vm.recentBoards = []; + }) + .then(vm.$nextTick) + .then(() => { + const headerEls = vm.$el.querySelectorAll('.dropdown-bold-header'); + const expectedCount = 0; + + expect(expectedCount).toBe(headerEls.length); + }) + .then(done) + .catch(done.fail); + }); + + it('does not show when search is active', done => { + fillSearchBox('Random string'); + + vm.$nextTick() + .then(() => { + const headerEls = vm.$el.querySelectorAll('.dropdown-bold-header'); + const expectedCount = 0; + + expect(expectedCount).toBe(headerEls.length); + }) + .then(done) + .catch(done.fail); + }); + }); +}); diff --git a/spec/javascripts/diffs/mock_data/diff_file.js b/spec/javascripts/diffs/mock_data/diff_file.js index 27428197c1c..531686efff1 100644 --- a/spec/javascripts/diffs/mock_data/diff_file.js +++ b/spec/javascripts/diffs/mock_data/diff_file.js @@ -1,3 +1,5 @@ +// Copied to ee/spec/frontend/diffs/mock_data/diff_file.js + export default { submodule: false, submodule_link: null, diff --git a/spec/javascripts/fixtures/.gitignore b/spec/javascripts/fixtures/.gitignore index bed020f5b0a..d6b7ef32c84 100644 --- a/spec/javascripts/fixtures/.gitignore +++ b/spec/javascripts/fixtures/.gitignore @@ -1,5 +1,2 @@ -*.html.raw -*.html -*.json -*.pdf -*.bmpr +* +!.gitignore diff --git a/spec/javascripts/fixtures/abuse_reports.rb b/spec/javascripts/fixtures/abuse_reports.rb deleted file mode 100644 index e0aaecf626a..00000000000 --- a/spec/javascripts/fixtures/abuse_reports.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe Admin::AbuseReportsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let!(:abuse_report) { create(:abuse_report) } - let!(:abuse_report_with_short_message) { create(:abuse_report, message: 'SHORT MESSAGE') } - let!(:abuse_report_with_long_message) { create(:abuse_report, message: "LONG MESSAGE\n" * 50) } - - render_views - - before(:all) do - clean_frontend_fixtures('abuse_reports/') - end - - before do - sign_in(admin) - end - - it 'abuse_reports/abuse_reports_list.html' do - get :index - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/admin_users.rb b/spec/javascripts/fixtures/admin_users.rb deleted file mode 100644 index 22a5de66577..00000000000 --- a/spec/javascripts/fixtures/admin_users.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Admin::UsersController, '(JavaScript fixtures)', type: :controller do - include StubENV - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - - before do - stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') - sign_in(admin) - end - - render_views - - before(:all) do - clean_frontend_fixtures('admin/users') - end - - it 'admin/users/new_with_internal_user_regex.html' do - stub_application_setting(user_default_external: true) - stub_application_setting(user_default_internal_regex: '^(?:(?!\.ext@).)*$\r?') - - get :new - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/application_settings.rb b/spec/javascripts/fixtures/application_settings.rb deleted file mode 100644 index d4651fa6ece..00000000000 --- a/spec/javascripts/fixtures/application_settings.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'spec_helper' - -describe Admin::ApplicationSettingsController, '(JavaScript fixtures)', type: :controller do - include StubENV - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'application-settings') } - - before do - stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') - sign_in(admin) - end - - render_views - - before(:all) do - clean_frontend_fixtures('application_settings/') - end - - after do - remove_repository(project) - end - - it 'application_settings/accounts_and_limit.html' do - stub_application_setting(user_default_external: false) - - get :show - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/autocomplete_sources.rb b/spec/javascripts/fixtures/autocomplete_sources.rb deleted file mode 100644 index b20a0159d7d..00000000000 --- a/spec/javascripts/fixtures/autocomplete_sources.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe Projects::AutocompleteSourcesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - set(:admin) { create(:admin) } - set(:group) { create(:group, name: 'frontend-fixtures') } - set(:project) { create(:project, namespace: group, path: 'autocomplete-sources-project') } - set(:issue) { create(:issue, project: project) } - - before(:all) do - clean_frontend_fixtures('autocomplete_sources/') - end - - before do - sign_in(admin) - end - - it 'autocomplete_sources/labels.json' do - issue.labels << create(:label, project: project, title: 'bug') - issue.labels << create(:label, project: project, title: 'critical') - - create(:label, project: project, title: 'feature') - create(:label, project: project, title: 'documentation') - - get :labels, - format: :json, - params: { - namespace_id: group.path, - project_id: project.path, - type: issue.class.name, - type_id: issue.id - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/blob.rb b/spec/javascripts/fixtures/blob.rb deleted file mode 100644 index 07670552cd5..00000000000 --- a/spec/javascripts/fixtures/blob.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Projects::BlobController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'branches-project') } - - render_views - - before(:all) do - clean_frontend_fixtures('blob/') - end - - before do - sign_in(admin) - allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon') - end - - after do - remove_repository(project) - end - - it 'blob/show.html' do - get(:show, params: { - namespace_id: project.namespace, - project_id: project, - id: 'add-ipython-files/files/ipython/basic.ipynb' - }) - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/boards.rb b/spec/javascripts/fixtures/boards.rb deleted file mode 100644 index 5835721d3d5..00000000000 --- a/spec/javascripts/fixtures/boards.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Projects::BoardsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'boards-project') } - - render_views - - before(:all) do - clean_frontend_fixtures('boards/') - end - - before do - sign_in(admin) - end - - it 'boards/show.html' do - get(:index, params: { - namespace_id: project.namespace, - project_id: project - }) - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/branches.rb b/spec/javascripts/fixtures/branches.rb deleted file mode 100644 index 204aa9b7c7a..00000000000 --- a/spec/javascripts/fixtures/branches.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' - -describe Projects::BranchesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'branches-project') } - - render_views - - before(:all) do - clean_frontend_fixtures('branches/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'branches/new_branch.html' do - get :new, params: { - namespace_id: project.namespace.to_param, - project_id: project - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/clusters.rb b/spec/javascripts/fixtures/clusters.rb deleted file mode 100644 index 1076404e0e3..00000000000 --- a/spec/javascripts/fixtures/clusters.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Projects::ClustersController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace) } - let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } - - render_views - - before(:all) do - clean_frontend_fixtures('clusters/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'clusters/show_cluster.html' do - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: cluster - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/commit.rb b/spec/javascripts/fixtures/commit.rb deleted file mode 100644 index ff9a4bc1adc..00000000000 --- a/spec/javascripts/fixtures/commit.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'spec_helper' - -describe Projects::CommitController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - set(:project) { create(:project, :repository) } - set(:user) { create(:user) } - let(:commit) { project.commit("master") } - - render_views - - before(:all) do - clean_frontend_fixtures('commit/') - end - - before do - project.add_maintainer(user) - sign_in(user) - allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon') - end - - it 'commit/show.html' do - params = { - namespace_id: project.namespace, - project_id: project, - id: commit.id - } - - get :show, params: params - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/deploy_keys.rb b/spec/javascripts/fixtures/deploy_keys.rb deleted file mode 100644 index 38eab853da2..00000000000 --- a/spec/javascripts/fixtures/deploy_keys.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'spec_helper' - -describe Projects::DeployKeysController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - 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(:project, :internal)} - let(:project3) { create(:project, :internal)} - let(:project4) { create(:project, :internal)} - - before(:all) do - clean_frontend_fixtures('deploy_keys/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - render_views - - it 'deploy_keys/keys.json' do - create(:rsa_deploy_key_2048, public: true) - project_key = create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== dummy@gitlab.com') - internal_key = create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== dummy@gitlab.com') - create(:deploy_keys_project, project: project, deploy_key: project_key) - create(:deploy_keys_project, project: project2, deploy_key: internal_key) - create(:deploy_keys_project, project: project3, deploy_key: project_key) - create(:deploy_keys_project, project: project4, deploy_key: project_key) - - get :index, params: { - namespace_id: project.namespace.to_param, - project_id: project - }, format: :json - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/groups.rb b/spec/javascripts/fixtures/groups.rb deleted file mode 100644 index 4d0afc3ce1a..00000000000 --- a/spec/javascripts/fixtures/groups.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' - -describe 'Groups (JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:group) { create(:group, name: 'frontend-fixtures-group', runners_token: 'runnerstoken:intabulasreferre')} - - render_views - - before(:all) do - clean_frontend_fixtures('groups/') - end - - before do - group.add_maintainer(admin) - sign_in(admin) - end - - describe GroupsController, '(JavaScript fixtures)', type: :controller do - it 'groups/edit.html' do - get :edit, params: { id: group } - - expect(response).to be_success - end - end - - describe Groups::Settings::CiCdController, '(JavaScript fixtures)', type: :controller do - it 'groups/ci_cd_settings.html' do - get :show, params: { group_id: group } - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/fixtures/issues.rb b/spec/javascripts/fixtures/issues.rb deleted file mode 100644 index d8d77f767de..00000000000 --- a/spec/javascripts/fixtures/issues.rb +++ /dev/null @@ -1,122 +0,0 @@ -require 'spec_helper' - -describe Projects::IssuesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin, feed_token: 'feedtoken:coldfeed') } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'issues-project') } - - render_views - - before(:all) do - clean_frontend_fixtures('issues/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'issues/open-issue.html' do - render_issue(create(:issue, project: project)) - end - - it 'issues/closed-issue.html' do - render_issue(create(:closed_issue, project: project)) - end - - it 'issues/issue-with-task-list.html' do - issue = create(:issue, project: project, description: '- [ ] Task List Item') - render_issue(issue) - end - - it 'issues/issue_with_comment.html' do - issue = create(:issue, project: project) - create(:note, project: project, noteable: issue, note: '- [ ] Task List Item').save - render_issue(issue) - end - - it 'issues/issue_list.html' do - create(:issue, project: project) - - get :index, params: { - namespace_id: project.namespace.to_param, - project_id: project - } - - expect(response).to be_success - end - - private - - def render_issue(issue) - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: issue.to_param - } - - expect(response).to be_success - end -end - -describe API::Issues, '(JavaScript fixtures)', type: :request do - include ApiHelpers - include JavaScriptFixturesHelpers - - def get_related_merge_requests(project_id, issue_iid, user = nil) - get api("/projects/#{project_id}/issues/#{issue_iid}/related_merge_requests", user) - end - - def create_referencing_mr(user, project, issue) - attributes = { - author: user, - source_project: project, - target_project: project, - source_branch: "master", - target_branch: "test", - assignee: user, - description: "See #{issue.to_reference}" - } - create(:merge_request, attributes).tap do |merge_request| - create(:note, :system, project: issue.project, noteable: issue, author: user, note: merge_request.to_reference(full: true)) - end - end - - it 'issues/related_merge_requests.json' do - user = create(:user) - project = create(:project, :public, creator_id: user.id, namespace: user.namespace) - issue_title = 'foo' - issue_description = 'closed' - milestone = create(:milestone, title: '1.0.0', project: project) - issue = create :issue, - author: user, - assignees: [user], - project: project, - milestone: milestone, - created_at: generate(:past_time), - updated_at: 1.hour.ago, - title: issue_title, - description: issue_description - - project.add_reporter(user) - create_referencing_mr(user, project, issue) - - create(:merge_request, - :simple, - author: user, - source_project: project, - target_project: project, - description: "Some description") - project2 = create(:project, :public, creator_id: user.id, namespace: user.namespace) - create_referencing_mr(user, project2, issue).update!(head_pipeline: create(:ci_pipeline)) - - get_related_merge_requests(project.id, issue.iid, user) - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/jobs.rb b/spec/javascripts/fixtures/jobs.rb deleted file mode 100644 index 46ccd6f8c8a..00000000000 --- a/spec/javascripts/fixtures/jobs.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'builds-project') } - let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.id) } - let!(:build_with_artifacts) { create(:ci_build, :success, :artifacts, :trace_artifact, pipeline: pipeline, stage: 'test', artifacts_expire_at: Time.now + 18.months) } - let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline, stage: 'build') } - let!(:pending_build) { create(:ci_build, :pending, pipeline: pipeline, stage: 'deploy') } - let!(:delayed_job) do - create(:ci_build, :scheduled, - pipeline: pipeline, - name: 'delayed job', - stage: 'test') - end - - render_views - - before(:all) do - clean_frontend_fixtures('builds/') - clean_frontend_fixtures('jobs/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'builds/build-with-artifacts.html' do - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: build_with_artifacts.to_param - } - - expect(response).to be_success - end - - it 'jobs/delayed.json' do - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: delayed_job.to_param - }, format: :json - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/labels.rb b/spec/javascripts/fixtures/labels.rb deleted file mode 100644 index 4d1b7317274..00000000000 --- a/spec/javascripts/fixtures/labels.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'spec_helper' - -describe 'Labels (JavaScript fixtures)' do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:group) { create(:group, name: 'frontend-fixtures-group' )} - let(:project) { create(:project_empty_repo, namespace: group, path: 'labels-project') } - - let!(:project_label_bug) { create(:label, project: project, title: 'bug', color: '#FF0000') } - let!(:project_label_enhancement) { create(:label, project: project, title: 'enhancement', color: '#00FF00') } - let!(:project_label_feature) { create(:label, project: project, title: 'feature', color: '#0000FF') } - - let!(:group_label_roses) { create(:group_label, group: group, title: 'roses', color: '#FF0000') } - let!(:groub_label_space) { create(:group_label, group: group, title: 'some space', color: '#FFFFFF') } - let!(:groub_label_violets) { create(:group_label, group: group, title: 'violets', color: '#0000FF') } - - before(:all) do - clean_frontend_fixtures('labels/') - end - - after do - remove_repository(project) - end - - describe Groups::LabelsController, '(JavaScript fixtures)', type: :controller do - render_views - - before do - sign_in(admin) - end - - it 'labels/group_labels.json' do - get :index, params: { - group_id: group - }, format: 'json' - - expect(response).to be_success - end - end - - describe Projects::LabelsController, '(JavaScript fixtures)', type: :controller do - render_views - - before do - sign_in(admin) - end - - it 'labels/project_labels.json' do - get :index, params: { - namespace_id: group, - project_id: project - }, format: 'json' - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/fixtures/merge_requests.rb b/spec/javascripts/fixtures/merge_requests.rb deleted file mode 100644 index 05860be2291..00000000000 --- a/spec/javascripts/fixtures/merge_requests.rb +++ /dev/null @@ -1,134 +0,0 @@ -require 'spec_helper' - -describe Projects::MergeRequestsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - 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 - create( - :ci_pipeline, - project: merge_request.source_project, - ref: merge_request.source_branch, - sha: merge_request.diff_head_sha - ) - end - let(:path) { "files/ruby/popen.rb" } - let(:position) do - Gitlab::Diff::Position.new( - old_path: path, - new_path: path, - old_line: nil, - new_line: 14, - diff_refs: merge_request.diff_refs - ) - end - - render_views - - before(:all) do - clean_frontend_fixtures('merge_requests/') - end - - before do - sign_in(admin) - allow(Discussion).to receive(:build_discussion_id).and_return(['discussionid:ceterumcenseo']) - end - - after do - remove_repository(project) - end - - it 'merge_requests/merge_request_of_current_user.html' do - merge_request.update(author: admin) - - render_merge_request(merge_request) - end - - it 'merge_requests/merge_request_with_task_list.html' do - create(:ci_build, :pending, pipeline: pipeline) - - render_merge_request(merge_request) - end - - it 'merge_requests/merged_merge_request.html' do - expect_next_instance_of(MergeRequest) do |merge_request| - allow(merge_request).to receive(:source_branch_exists?).and_return(true) - allow(merge_request).to receive(:can_remove_source_branch?).and_return(true) - end - render_merge_request(merged_merge_request) - end - - it 'merge_requests/diff_comment.html' do - create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request) - create(:note_on_merge_request, author: admin, project: project, noteable: merge_request) - render_merge_request(merge_request) - end - - it 'merge_requests/merge_request_with_comment.html' do - create(:note_on_merge_request, author: admin, project: project, noteable: merge_request, note: '- [ ] Task List Item') - render_merge_request(merge_request) - end - - it 'merge_requests/discussions.json' do - create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request) - render_discussions_json(merge_request) - end - - it 'merge_requests/diff_discussion.json' do - create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request) - render_discussions_json(merge_request) - end - - it 'merge_requests/resolved_diff_discussion.json' do - note = create(:discussion_note_on_merge_request, :resolved, project: project, author: admin, position: position, noteable: merge_request) - create(:system_note, project: project, author: admin, noteable: merge_request, discussion_id: note.discussion.id) - - render_discussions_json(merge_request) - end - - context 'with image diff' do - let(:merge_request2) { create(:merge_request_with_diffs, :with_image_diffs, source_project: project, title: "Added images") } - let(:image_path) { "files/images/ee_repo_logo.png" } - let(:image_position) do - Gitlab::Diff::Position.new( - old_path: image_path, - new_path: image_path, - width: 100, - height: 100, - x: 1, - y: 1, - position_type: "image", - diff_refs: merge_request2.diff_refs - ) - end - - it 'merge_requests/image_diff_discussion.json' do - create(:diff_note_on_merge_request, project: project, noteable: merge_request2, position: image_position) - render_discussions_json(merge_request2) - end - end - - private - - def render_discussions_json(merge_request) - get :discussions, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: merge_request.to_param - }, format: :json - end - - def render_merge_request(merge_request) - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: merge_request.to_param - }, format: :html - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/merge_requests_diffs.rb b/spec/javascripts/fixtures/merge_requests_diffs.rb deleted file mode 100644 index 03b9b713fd8..00000000000 --- a/spec/javascripts/fixtures/merge_requests_diffs.rb +++ /dev/null @@ -1,70 +0,0 @@ - -require 'spec_helper' - -describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - 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(:selected_commit) { merge_request.all_commits[0] } - let(:position) do - Gitlab::Diff::Position.new( - old_path: path, - new_path: path, - old_line: nil, - new_line: 14, - diff_refs: merge_request.diff_refs - ) - end - - render_views - - before(:all) do - clean_frontend_fixtures('merge_request_diffs/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'merge_request_diffs/with_commit.json' do - # Create a user that matches the selected commit author - # This is so that the "author" information will be populated - create(:user, email: selected_commit.author_email, name: selected_commit.author_name) - - render_merge_request(merge_request, commit_id: selected_commit.sha) - end - - it 'merge_request_diffs/inline_changes_tab_with_comments.json' do - create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request) - create(:note_on_merge_request, author: admin, project: project, noteable: merge_request) - render_merge_request(merge_request) - end - - it 'merge_request_diffs/parallel_changes_tab_with_comments.json' do - create(:diff_note_on_merge_request, project: project, author: admin, position: position, noteable: merge_request) - create(:note_on_merge_request, author: admin, project: project, noteable: merge_request) - render_merge_request(merge_request, view: 'parallel') - end - - private - - def render_merge_request(merge_request, view: 'inline', **extra_params) - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: merge_request.to_param, - view: view, - **extra_params - }, format: :json - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/pipeline_schedules.rb b/spec/javascripts/fixtures/pipeline_schedules.rb deleted file mode 100644 index aecd56e6198..00000000000 --- a/spec/javascripts/fixtures/pipeline_schedules.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'spec_helper' - -describe Projects::PipelineSchedulesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :public, :repository) } - let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: admin) } - let!(:pipeline_schedule_populated) { create(:ci_pipeline_schedule, project: project, owner: admin) } - let!(:pipeline_schedule_variable1) { create(:ci_pipeline_schedule_variable, key: 'foo', value: 'foovalue', pipeline_schedule: pipeline_schedule_populated) } - let!(:pipeline_schedule_variable2) { create(:ci_pipeline_schedule_variable, key: 'bar', value: 'barvalue', pipeline_schedule: pipeline_schedule_populated) } - - render_views - - before(:all) do - clean_frontend_fixtures('pipeline_schedules/') - end - - before do - sign_in(admin) - end - - it 'pipeline_schedules/edit.html' do - get :edit, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: pipeline_schedule.id - } - - expect(response).to be_success - end - - it 'pipeline_schedules/edit_with_variables.html' do - get :edit, params: { - namespace_id: project.namespace.to_param, - project_id: project, - id: pipeline_schedule_populated.id - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/pipelines.rb b/spec/javascripts/fixtures/pipelines.rb deleted file mode 100644 index 6b6b0eefab9..00000000000 --- a/spec/javascripts/fixtures/pipelines.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Projects::PipelinesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') } - let(:commit) { create(:commit, project: project) } - let(:commit_without_author) { RepoHelpers.another_sample_commit } - let!(:user) { create(:user, developer_projects: [project], email: commit.author_email) } - let!(:pipeline) { create(:ci_pipeline, project: project, sha: commit.id, user: user) } - let!(:pipeline_without_author) { create(:ci_pipeline, project: project, sha: commit_without_author.id) } - let!(:pipeline_without_commit) { create(:ci_pipeline, project: project, sha: '0000') } - - render_views - - before(:all) do - clean_frontend_fixtures('pipelines/') - end - - before do - sign_in(admin) - end - - it 'pipelines/pipelines.json' do - get :index, params: { - namespace_id: namespace, - project_id: project - }, format: :json - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/projects.rb b/spec/javascripts/fixtures/projects.rb deleted file mode 100644 index 94c59207898..00000000000 --- a/spec/javascripts/fixtures/projects.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper' - -describe 'Projects (JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - runners_token = 'runnerstoken:intabulasreferre' - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, namespace: namespace, path: 'builds-project', runners_token: runners_token) } - let(:project_with_repo) { create(:project, :repository, description: 'Code and stuff') } - let(:project_variable_populated) { create(:project, namespace: namespace, path: 'builds-project2', runners_token: runners_token) } - - render_views - - before(:all) do - clean_frontend_fixtures('projects/') - end - - before do - project.add_maintainer(admin) - sign_in(admin) - allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon') - end - - after do - remove_repository(project) - end - - describe ProjectsController, '(JavaScript fixtures)', type: :controller do - it 'projects/dashboard.html' do - get :show, params: { - namespace_id: project.namespace.to_param, - id: project - } - - expect(response).to be_success - end - - it 'projects/overview.html' do - get :show, params: { - namespace_id: project_with_repo.namespace.to_param, - id: project_with_repo - } - - expect(response).to be_success - end - - it 'projects/edit.html' do - get :edit, params: { - namespace_id: project.namespace.to_param, - id: project - } - - expect(response).to be_success - end - end - - describe Projects::Settings::CiCdController, '(JavaScript fixtures)', type: :controller do - it 'projects/ci_cd_settings.html' do - get :show, params: { - namespace_id: project.namespace.to_param, - project_id: project - } - - expect(response).to be_success - end - - it 'projects/ci_cd_settings_with_variables.html' do - create(:ci_variable, project: project_variable_populated) - create(:ci_variable, project: project_variable_populated) - - get :show, params: { - namespace_id: project_variable_populated.namespace.to_param, - project_id: project_variable_populated - } - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/fixtures/prometheus_service.rb b/spec/javascripts/fixtures/prometheus_service.rb deleted file mode 100644 index f3171fdd97b..00000000000 --- a/spec/javascripts/fixtures/prometheus_service.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Projects::ServicesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'services-project') } - let!(:service) { create(:prometheus_service, project: project) } - - render_views - - before(:all) do - clean_frontend_fixtures('services/prometheus') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'services/prometheus/prometheus_service.html' do - get :edit, params: { - namespace_id: namespace, - project_id: project, - id: service.to_param - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/raw.rb b/spec/javascripts/fixtures/raw.rb deleted file mode 100644 index 801c80a0112..00000000000 --- a/spec/javascripts/fixtures/raw.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper' - -describe 'Raw files', '(JavaScript fixtures)' do - include JavaScriptFixturesHelpers - - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'raw-project') } - let(:response) { @blob.data.force_encoding('UTF-8') } - - before(:all) do - clean_frontend_fixtures('blob/balsamiq/') - clean_frontend_fixtures('blob/notebook/') - clean_frontend_fixtures('blob/pdf/') - end - - after do - remove_repository(project) - end - - it 'blob/balsamiq/test.bmpr' do - @blob = project.repository.blob_at('b89b56d79', 'files/images/balsamiq.bmpr') - end - - it 'blob/notebook/basic.json' do - @blob = project.repository.blob_at('6d85bb69', 'files/ipython/basic.ipynb') - end - - it 'blob/notebook/worksheets.json' do - @blob = project.repository.blob_at('6d85bb69', 'files/ipython/worksheets.ipynb') - end - - it 'blob/notebook/math.json' do - @blob = project.repository.blob_at('93ee732', 'files/ipython/math.ipynb') - end - - it 'blob/pdf/test.pdf' do - @blob = project.repository.blob_at('e774ebd33', 'files/pdf/test.pdf') - end -end diff --git a/spec/javascripts/fixtures/search.rb b/spec/javascripts/fixtures/search.rb deleted file mode 100644 index 22fc546d761..00000000000 --- a/spec/javascripts/fixtures/search.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'spec_helper' - -describe SearchController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - render_views - - before(:all) do - clean_frontend_fixtures('search/') - end - - it 'search/show.html' do - get :show - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/services.rb b/spec/javascripts/fixtures/services.rb deleted file mode 100644 index 2237702ccca..00000000000 --- a/spec/javascripts/fixtures/services.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Projects::ServicesController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'services-project') } - let!(:service) { create(:custom_issue_tracker_service, project: project, title: 'Custom Issue Tracker') } - - render_views - - before(:all) do - clean_frontend_fixtures('services/') - end - - before do - sign_in(admin) - end - - after do - remove_repository(project) - end - - it 'services/edit_service.html' do - get :edit, params: { - namespace_id: namespace, - project_id: project, - id: service.to_param - } - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/sessions.rb b/spec/javascripts/fixtures/sessions.rb deleted file mode 100644 index 92b74c01c89..00000000000 --- a/spec/javascripts/fixtures/sessions.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'spec_helper' - -describe 'Sessions (JavaScript fixtures)' do - include JavaScriptFixturesHelpers - - before(:all) do - clean_frontend_fixtures('sessions/') - end - - describe SessionsController, '(JavaScript fixtures)', type: :controller do - include DeviseHelpers - - render_views - - before do - set_devise_mapping(context: @request) - end - - it 'sessions/new.html' do - get :new - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/fixtures/snippet.rb b/spec/javascripts/fixtures/snippet.rb deleted file mode 100644 index ace84b14eb7..00000000000 --- a/spec/javascripts/fixtures/snippet.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'spec_helper' - -describe SnippetsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project, :repository, namespace: namespace, path: 'branches-project') } - let(:snippet) { create(:personal_snippet, title: 'snippet.md', content: '# snippet', file_name: 'snippet.md', author: admin) } - - render_views - - before(:all) do - clean_frontend_fixtures('snippets/') - end - - before do - sign_in(admin) - allow(Discussion).to receive(:build_discussion_id).and_return(['discussionid:ceterumcenseo']) - end - - after do - remove_repository(project) - end - - it 'snippets/show.html' do - create(:discussion_note_on_snippet, noteable: snippet, project: project, author: admin, note: '- [ ] Task List Item') - - get(:show, params: { id: snippet.to_param }) - - expect(response).to be_success - end -end diff --git a/spec/javascripts/fixtures/static/README.md b/spec/javascripts/fixtures/static/README.md deleted file mode 100644 index b5c2f8233bf..00000000000 --- a/spec/javascripts/fixtures/static/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not add new files here! - -Instead use a Ruby file in the fixtures root directory (`spec/javascripts/fixtures/`). diff --git a/spec/javascripts/fixtures/static/ajax_loading_spinner.html b/spec/javascripts/fixtures/static/ajax_loading_spinner.html deleted file mode 100644 index 0e1ebb32b1c..00000000000 --- a/spec/javascripts/fixtures/static/ajax_loading_spinner.html +++ /dev/null @@ -1,3 +0,0 @@ -<a class="js-ajax-loading-spinner" data-remote href="http://goesnowhere.nothing/whereami"> -<i class="fa fa-trash-o"></i> -</a> diff --git a/spec/javascripts/fixtures/static/balsamiq_viewer.html b/spec/javascripts/fixtures/static/balsamiq_viewer.html deleted file mode 100644 index cdd723d1a84..00000000000 --- a/spec/javascripts/fixtures/static/balsamiq_viewer.html +++ /dev/null @@ -1 +0,0 @@ -<div class="file-content balsamiq-viewer" data-endpoint="/test" id="js-balsamiq-viewer"></div> diff --git a/spec/javascripts/fixtures/static/create_item_dropdown.html b/spec/javascripts/fixtures/static/create_item_dropdown.html deleted file mode 100644 index d2d38370092..00000000000 --- a/spec/javascripts/fixtures/static/create_item_dropdown.html +++ /dev/null @@ -1,11 +0,0 @@ -<div class="js-create-item-dropdown-fixture-root"> -<input name="variable[environment]" type="hidden"> -<div class="dropdown "><button class="dropdown-menu-toggle js-dropdown-menu-toggle" type="button" data-toggle="dropdown"><span class="dropdown-toggle-text ">some label</span><i aria-hidden="true" data-hidden="true" class="fa fa-chevron-down"></i></button><div class="dropdown-menu dropdown-select dropdown-menu-selectable"><div class="dropdown-input"><input type="search" id="" class="dropdown-input-field" autocomplete="off" /><i aria-hidden="true" data-hidden="true" class="fa fa-search dropdown-input-search"></i><i aria-hidden="true" data-hidden="true" role="button" class="fa fa-times dropdown-input-clear js-dropdown-input-clear"></i></div><div class="dropdown-content js-dropdown-content"></div><div class="dropdown-footer"><ul class="dropdown-footer-list"> -<li> -<button class="dropdown-create-new-item-button js-dropdown-create-new-item"> -Create wildcard -<code></code> -</button> -</li> -</ul> -</div><div class="dropdown-loading"><i aria-hidden="true" data-hidden="true" class="fa fa-spinner fa-spin"></i></div></div></div></div> diff --git a/spec/javascripts/fixtures/static/environments/table.html b/spec/javascripts/fixtures/static/environments/table.html deleted file mode 100644 index 417af564ff1..00000000000 --- a/spec/javascripts/fixtures/static/environments/table.html +++ /dev/null @@ -1,15 +0,0 @@ -<table> -<thead> -<tr> -<th>Environment</th> -<th>Last deployment</th> -<th>Job</th> -<th>Commit</th> -<th></th> -<th></th> -</tr> -</thead> -<tbody> -<tr id="environment-row"></tr> -</tbody> -</table> diff --git a/spec/javascripts/fixtures/static/event_filter.html b/spec/javascripts/fixtures/static/event_filter.html deleted file mode 100644 index 8e9b6fb1b5c..00000000000 --- a/spec/javascripts/fixtures/static/event_filter.html +++ /dev/null @@ -1,44 +0,0 @@ -<ul class="nav-links event-filter scrolling-tabs nav nav-tabs"> -<li class="active"> -<a class="event-filter-link" href="/dashboard/activity" id="all_event_filter" title="Filter by all"> -<span> -All -</span> -</a> -</li> -<li> -<a class="event-filter-link" href="/dashboard/activity" id="push_event_filter" title="Filter by push events"> -<span> -Push events -</span> -</a> -</li> -<li> -<a class="event-filter-link" href="/dashboard/activity" id="merged_event_filter" title="Filter by merge events"> -<span> -Merge events -</span> -</a> -</li> -<li> -<a class="event-filter-link" href="/dashboard/activity" id="issue_event_filter" title="Filter by issue events"> -<span> -Issue events -</span> -</a> -</li> -<li> -<a class="event-filter-link" href="/dashboard/activity" id="comments_event_filter" title="Filter by comments"> -<span> -Comments -</span> -</a> -</li> -<li> -<a class="event-filter-link" href="/dashboard/activity" id="team_event_filter" title="Filter by team"> -<span> -Team -</span> -</a> -</li> -</ul> diff --git a/spec/javascripts/fixtures/static/gl_dropdown.html b/spec/javascripts/fixtures/static/gl_dropdown.html deleted file mode 100644 index 08f6738414e..00000000000 --- a/spec/javascripts/fixtures/static/gl_dropdown.html +++ /dev/null @@ -1,26 +0,0 @@ -<div> -<div class="dropdown inline"> -<button class="dropdown-menu-toggle" data-toggle="dropdown" id="js-project-dropdown" type="button"> -<div class="dropdown-toggle-text"> -Projects -</div> -<i class="fa fa-chevron-down dropdown-toggle-caret js-projects-dropdown-toggle"></i> -</button> -<div class="dropdown-menu dropdown-select dropdown-menu-selectable"> -<div class="dropdown-title"> -<span>Go to project</span> -<button aria="{:label=>"Close"}" class="dropdown-title-button dropdown-menu-close"> -<i class="fa fa-times dropdown-menu-close-icon"></i> -</button> -</div> -<div class="dropdown-input"> -<input class="dropdown-input-field" placeholder="Filter results" type="search"> -<i class="fa fa-search dropdown-input-search"></i> -</div> -<div class="dropdown-content"></div> -<div class="dropdown-loading"> -<i class="fa fa-spinner fa-spin"></i> -</div> -</div> -</div> -</div> diff --git a/spec/javascripts/fixtures/static/gl_field_errors.html b/spec/javascripts/fixtures/static/gl_field_errors.html deleted file mode 100644 index f8470e02b7c..00000000000 --- a/spec/javascripts/fixtures/static/gl_field_errors.html +++ /dev/null @@ -1,22 +0,0 @@ -<form action="submit" class="gl-show-field-errors" method="post"> -<div class="form-group"> -<input class="required-text" required type="text">Text</input> -</div> -<div class="form-group"> -<input class="email" required title="Please provide a valid email address." type="email">Email</input> -</div> -<div class="form-group"> -<input class="password" required type="password">Password</input> -</div> -<div class="form-group"> -<input class="alphanumeric" pattern="[a-zA-Z0-9]" required type="text">Alphanumeric</input> -</div> -<div class="form-group"> -<input class="hidden" type="hidden"> -</div> -<div class="form-group"> -<input class="custom gl-field-error-ignore" type="text">Custom, do not validate</input> -</div> -<div class="form-group"></div> -<input class="submit" type="submit">Submit</input> -</form> diff --git a/spec/javascripts/fixtures/static/images/green_box.png b/spec/javascripts/fixtures/static/images/green_box.png Binary files differdeleted file mode 100644 index cd1ff9f9ade..00000000000 --- a/spec/javascripts/fixtures/static/images/green_box.png +++ /dev/null diff --git a/spec/javascripts/fixtures/static/images/one_white_pixel.png b/spec/javascripts/fixtures/static/images/one_white_pixel.png Binary files differdeleted file mode 100644 index 073fcf40a18..00000000000 --- a/spec/javascripts/fixtures/static/images/one_white_pixel.png +++ /dev/null diff --git a/spec/javascripts/fixtures/static/images/red_box.png b/spec/javascripts/fixtures/static/images/red_box.png Binary files differdeleted file mode 100644 index 73b2927da0f..00000000000 --- a/spec/javascripts/fixtures/static/images/red_box.png +++ /dev/null diff --git a/spec/javascripts/fixtures/static/issuable_filter.html b/spec/javascripts/fixtures/static/issuable_filter.html deleted file mode 100644 index 06b70fb43f1..00000000000 --- a/spec/javascripts/fixtures/static/issuable_filter.html +++ /dev/null @@ -1,9 +0,0 @@ -<form action="/user/project/issues?scope=all&state=closed" class="js-filter-form"> -<input id="utf8" name="utf8" value="✓"> -<input id="check-all-issues" name="check-all-issues"> -<input id="search" name="search"> -<input id="author_id" name="author_id"> -<input id="assignee_id" name="assignee_id"> -<input id="milestone_title" name="milestone_title"> -<input id="label_name" name="label_name"> -</form> diff --git a/spec/javascripts/fixtures/static/issue_sidebar_label.html b/spec/javascripts/fixtures/static/issue_sidebar_label.html deleted file mode 100644 index ec8fb30f219..00000000000 --- a/spec/javascripts/fixtures/static/issue_sidebar_label.html +++ /dev/null @@ -1,26 +0,0 @@ -<div class="block labels"> -<div class="sidebar-collapsed-icon js-sidebar-labels-tooltip"></div> -<div class="title hide-collapsed"> -<a class="edit-link float-right" href="#"> -Edit -</a> -</div> -<div class="selectbox hide-collapsed" style="display: none;"> -<div class="dropdown"> -<button class="dropdown-menu-toggle js-label-select js-multiselect" data-ability-name="issue" data-field-name="issue[label_names][]" data-issue-update="/root/test/issues/2.json" data-labels="/root/test/labels.json" data-project-id="12" data-show-any="true" data-show-no="true" data-toggle="dropdown" type="button"> -<span class="dropdown-toggle-text"> -Label -</span> -<i class="fa fa-chevron-down"></i> -</button> -<div class="dropdown-menu dropdown-select dropdown-menu-paging dropdown-menu-labels dropdown-menu-selectable"> -<div class="dropdown-page-one"> -<div class="dropdown-content"></div> -<div class="dropdown-loading"> -<i class="fa fa-spinner fa-spin"></i> -</div> -</div> -</div> -</div> -</div> -</div> diff --git a/spec/javascripts/fixtures/static/line_highlighter.html b/spec/javascripts/fixtures/static/line_highlighter.html deleted file mode 100644 index 897a25d6760..00000000000 --- a/spec/javascripts/fixtures/static/line_highlighter.html +++ /dev/null @@ -1,107 +0,0 @@ -<div class="file-holder"> -<div class="file-content"> -<div class="line-numbers"> -<a data-line-number="1" href="#L1" id="L1"> -<i class="fa fa-link"></i> -1 -</a> -<a data-line-number="2" href="#L2" id="L2"> -<i class="fa fa-link"></i> -2 -</a> -<a data-line-number="3" href="#L3" id="L3"> -<i class="fa fa-link"></i> -3 -</a> -<a data-line-number="4" href="#L4" id="L4"> -<i class="fa fa-link"></i> -4 -</a> -<a data-line-number="5" href="#L5" id="L5"> -<i class="fa fa-link"></i> -5 -</a> -<a data-line-number="6" href="#L6" id="L6"> -<i class="fa fa-link"></i> -6 -</a> -<a data-line-number="7" href="#L7" id="L7"> -<i class="fa fa-link"></i> -7 -</a> -<a data-line-number="8" href="#L8" id="L8"> -<i class="fa fa-link"></i> -8 -</a> -<a data-line-number="9" href="#L9" id="L9"> -<i class="fa fa-link"></i> -9 -</a> -<a data-line-number="10" href="#L10" id="L10"> -<i class="fa fa-link"></i> -10 -</a> -<a data-line-number="11" href="#L11" id="L11"> -<i class="fa fa-link"></i> -11 -</a> -<a data-line-number="12" href="#L12" id="L12"> -<i class="fa fa-link"></i> -12 -</a> -<a data-line-number="13" href="#L13" id="L13"> -<i class="fa fa-link"></i> -13 -</a> -<a data-line-number="14" href="#L14" id="L14"> -<i class="fa fa-link"></i> -14 -</a> -<a data-line-number="15" href="#L15" id="L15"> -<i class="fa fa-link"></i> -15 -</a> -<a data-line-number="16" href="#L16" id="L16"> -<i class="fa fa-link"></i> -16 -</a> -<a data-line-number="17" href="#L17" id="L17"> -<i class="fa fa-link"></i> -17 -</a> -<a data-line-number="18" href="#L18" id="L18"> -<i class="fa fa-link"></i> -18 -</a> -<a data-line-number="19" href="#L19" id="L19"> -<i class="fa fa-link"></i> -19 -</a> -<a data-line-number="20" href="#L20" id="L20"> -<i class="fa fa-link"></i> -20 -</a> -<a data-line-number="21" href="#L21" id="L21"> -<i class="fa fa-link"></i> -21 -</a> -<a data-line-number="22" href="#L22" id="L22"> -<i class="fa fa-link"></i> -22 -</a> -<a data-line-number="23" href="#L23" id="L23"> -<i class="fa fa-link"></i> -23 -</a> -<a data-line-number="24" href="#L24" id="L24"> -<i class="fa fa-link"></i> -24 -</a> -<a data-line-number="25" href="#L25" id="L25"> -<i class="fa fa-link"></i> -25 -</a> -</div> -<pre class="code highlight"><code><span class="line" id="LC1">Line 1</span><span class="line" id="LC2">Line 2</span><span class="line" id="LC3">Line 3</span><span class="line" id="LC4">Line 4</span><span class="line" id="LC5">Line 5</span><span class="line" id="LC6">Line 6</span><span class="line" id="LC7">Line 7</span><span class="line" id="LC8">Line 8</span><span class="line" id="LC9">Line 9</span><span class="line" id="LC10">Line 10</span><span class="line" id="LC11">Line 11</span><span class="line" id="LC12">Line 12</span><span class="line" id="LC13">Line 13</span><span class="line" id="LC14">Line 14</span><span class="line" id="LC15">Line 15</span><span class="line" id="LC16">Line 16</span><span class="line" id="LC17">Line 17</span><span class="line" id="LC18">Line 18</span><span class="line" id="LC19">Line 19</span><span class="line" id="LC20">Line 20</span><span class="line" id="LC21">Line 21</span><span class="line" id="LC22">Line 22</span><span class="line" id="LC23">Line 23</span><span class="line" id="LC24">Line 24</span><span class="line" id="LC25">Line 25</span></code></pre> -</div> -</div> diff --git a/spec/javascripts/fixtures/static/linked_tabs.html b/spec/javascripts/fixtures/static/linked_tabs.html deleted file mode 100644 index c25463bf1db..00000000000 --- a/spec/javascripts/fixtures/static/linked_tabs.html +++ /dev/null @@ -1,20 +0,0 @@ -<ul class="nav nav-tabs new-session-tabs linked-tabs"> -<li class="nav-item"> -<a class="nav-link" data-action="tab1" data-target="div#tab1" data-toggle="tab" href="foo/bar/1"> -Tab 1 -</a> -</li> -<li class="nav-item"> -<a class="nav-link" data-action="tab2" data-target="div#tab2" data-toggle="tab" href="foo/bar/1/context"> -Tab 2 -</a> -</li> -</ul> -<div class="tab-content"> -<div class="tab-pane" id="tab1"> -Tab 1 Content -</div> -<div class="tab-pane" id="tab2"> -Tab 2 Content -</div> -</div> diff --git a/spec/javascripts/fixtures/static/merge_requests_show.html b/spec/javascripts/fixtures/static/merge_requests_show.html deleted file mode 100644 index 87e36c9f315..00000000000 --- a/spec/javascripts/fixtures/static/merge_requests_show.html +++ /dev/null @@ -1,15 +0,0 @@ -<a class="btn-close"></a> -<div class="detail-page-description"> -<div class="description js-task-list-container"> -<div class="md"> -<ul class="task-list"> -<li class="task-list-item"> -<input class="task-list-item-checkbox" type="checkbox"> -Task List Item -</li> -</ul> -<textarea class="js-task-list-field">- [ ] Task List Item</textarea> -</div> -</div> -</div> -<form action="/foo" class="js-issuable-update"></form> diff --git a/spec/javascripts/fixtures/static/mini_dropdown_graph.html b/spec/javascripts/fixtures/static/mini_dropdown_graph.html deleted file mode 100644 index cd0b8dec3fc..00000000000 --- a/spec/javascripts/fixtures/static/mini_dropdown_graph.html +++ /dev/null @@ -1,13 +0,0 @@ -<div class="js-builds-dropdown-tests dropdown dropdown js-mini-pipeline-graph"> -<button class="js-builds-dropdown-button" data-toggle="dropdown" data-stage-endpoint="foobar"> -Dropdown -</button> -<ul class="dropdown-menu mini-pipeline-graph-dropdown-menu js-builds-dropdown-container"> -<li class="js-builds-dropdown-list scrollable-menu"> -<ul></ul> -</li> -<li class="js-builds-dropdown-loading hidden"> -<span class="fa fa-spinner"></span> -</li> -</ul> -</div> diff --git a/spec/javascripts/fixtures/static/notebook_viewer.html b/spec/javascripts/fixtures/static/notebook_viewer.html deleted file mode 100644 index 4bbb7bf1094..00000000000 --- a/spec/javascripts/fixtures/static/notebook_viewer.html +++ /dev/null @@ -1 +0,0 @@ -<div class="file-content" data-endpoint="/test" id="js-notebook-viewer"></div> diff --git a/spec/javascripts/fixtures/static/oauth_remember_me.html b/spec/javascripts/fixtures/static/oauth_remember_me.html deleted file mode 100644 index 9ba1ffc72fe..00000000000 --- a/spec/javascripts/fixtures/static/oauth_remember_me.html +++ /dev/null @@ -1,6 +0,0 @@ -<div id="oauth-container"> -<input id="remember_me" type="checkbox"> -<a class="oauth-login twitter" href="http://example.com/"></a> -<a class="oauth-login github" href="http://example.com/"></a> -<a class="oauth-login facebook" href="http://example.com/?redirect_fragment=L1"></a> -</div> diff --git a/spec/javascripts/fixtures/static/pdf_viewer.html b/spec/javascripts/fixtures/static/pdf_viewer.html deleted file mode 100644 index 350d35a262f..00000000000 --- a/spec/javascripts/fixtures/static/pdf_viewer.html +++ /dev/null @@ -1 +0,0 @@ -<div class="file-content" data-endpoint="/test" id="js-pdf-viewer"></div> diff --git a/spec/javascripts/fixtures/static/pipeline_graph.html b/spec/javascripts/fixtures/static/pipeline_graph.html deleted file mode 100644 index 422372bb7d5..00000000000 --- a/spec/javascripts/fixtures/static/pipeline_graph.html +++ /dev/null @@ -1,24 +0,0 @@ -<div class="pipeline-visualization js-pipeline-graph"> -<ul class="stage-column-list"> -<li class="stage-column"> -<div class="stage-name"> -<a href="/"> -Test -<div class="builds-container"> -<ul> -<li class="build"> -<div class="curve"></div> -<a> -<svg></svg> -<div class="ci-status-text"> -stop_review -</div> -</a> -</li> -</ul> -</div> -</a> -</div> -</li> -</ul> -</div> diff --git a/spec/javascripts/fixtures/static/pipelines.html b/spec/javascripts/fixtures/static/pipelines.html deleted file mode 100644 index 42333f94f2f..00000000000 --- a/spec/javascripts/fixtures/static/pipelines.html +++ /dev/null @@ -1,3 +0,0 @@ -<div> -<div data-can-create-pipeline="true" data-ci-lint-path="foo" data-empty-state-svg-path="foo" data-endpoint="foo" data-error-state-svg-path="foo" data-has-ci="foo" data-help-auto-devops-path="foo" data-help-page-path="foo" data-new-pipeline-path="foo" data-reset-cache-path="foo" id="pipelines-list-vue"></div> -</div> diff --git a/spec/javascripts/fixtures/static/project_select_combo_button.html b/spec/javascripts/fixtures/static/project_select_combo_button.html deleted file mode 100644 index 50c826051c0..00000000000 --- a/spec/javascripts/fixtures/static/project_select_combo_button.html +++ /dev/null @@ -1,9 +0,0 @@ -<div class="project-item-select-holder"> -<input class="project-item-select" data-group-id="12345" data-relative-path="issues/new"> -<a class="new-project-item-link" data-label="New issue" data-type="issues" href=""> -<i class="fa fa-spinner spin"></i> -</a> -<a class="new-project-item-select-button"> -<i class="fa fa-caret-down"></i> -</a> -</div> diff --git a/spec/javascripts/fixtures/static/projects.json b/spec/javascripts/fixtures/static/projects.json deleted file mode 100644 index 68a150f602a..00000000000 --- a/spec/javascripts/fixtures/static/projects.json +++ /dev/null @@ -1,445 +0,0 @@ -[{ - "id": 9, - "description": "", - "default_branch": null, - "tag_list": [], - "public": true, - "archived": false, - "visibility_level": 20, - "ssh_url_to_repo": "phil@localhost:root/test.git", - "http_url_to_repo": "http://localhost:3000/root/test.git", - "web_url": "http://localhost:3000/root/test", - "owner": { - "name": "Administrator", - "username": "root", - "id": 1, - "state": "active", - "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon", - "web_url": "http://localhost:3000/u/root" - }, - "name": "test", - "name_with_namespace": "Administrator / test", - "path": "test", - "path_with_namespace": "root/test", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-14T19:08:05.364Z", - "last_activity_at": "2016-01-14T19:08:07.418Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 1, - "name": "root", - "path": "root", - "owner_id": 1, - "created_at": "2016-01-13T20:19:44.439Z", - "updated_at": "2016-01-13T20:19:44.439Z", - "description": "", - "avatar": null - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 0, - "permissions": { - "project_access": null, - "group_access": null - } -}, { - "id": 8, - "description": "Voluptatem quae nulla eius numquam ullam voluptatibus quia modi.", - "default_branch": "master", - "tag_list": [], - "public": false, - "archived": false, - "visibility_level": 0, - "ssh_url_to_repo": "phil@localhost:h5bp/html5-boilerplate.git", - "http_url_to_repo": "http://localhost:3000/h5bp/html5-boilerplate.git", - "web_url": "http://localhost:3000/h5bp/html5-boilerplate", - "name": "Html5 Boilerplate", - "name_with_namespace": "H5bp / Html5 Boilerplate", - "path": "html5-boilerplate", - "path_with_namespace": "h5bp/html5-boilerplate", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:57.525Z", - "last_activity_at": "2016-01-13T20:27:57.280Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 5, - "name": "H5bp", - "path": "h5bp", - "owner_id": null, - "created_at": "2016-01-13T20:19:57.239Z", - "updated_at": "2016-01-13T20:19:57.239Z", - "description": "Tempore accusantium possimus aut libero.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 5, - "permissions": { - "project_access": { - "access_level": 10, - "notification_level": 3 - }, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}, { - "id": 7, - "description": "Modi odio mollitia dolorem qui.", - "default_branch": "master", - "tag_list": [], - "public": false, - "archived": false, - "visibility_level": 0, - "ssh_url_to_repo": "phil@localhost:twitter/typeahead-js.git", - "http_url_to_repo": "http://localhost:3000/twitter/typeahead-js.git", - "web_url": "http://localhost:3000/twitter/typeahead-js", - "name": "Typeahead.Js", - "name_with_namespace": "Twitter / Typeahead.Js", - "path": "typeahead-js", - "path_with_namespace": "twitter/typeahead-js", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:56.212Z", - "last_activity_at": "2016-01-13T20:27:51.496Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 4, - "name": "Twitter", - "path": "twitter", - "owner_id": null, - "created_at": "2016-01-13T20:19:54.480Z", - "updated_at": "2016-01-13T20:19:54.480Z", - "description": "Id voluptatem ipsa maiores omnis repudiandae et et.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": true, - "open_issues_count": 4, - "permissions": { - "project_access": null, - "group_access": { - "access_level": 10, - "notification_level": 3 - } - } -}, { - "id": 6, - "description": "Omnis asperiores ipsa et beatae quidem necessitatibus quia.", - "default_branch": "master", - "tag_list": [], - "public": true, - "archived": false, - "visibility_level": 20, - "ssh_url_to_repo": "phil@localhost:twitter/flight.git", - "http_url_to_repo": "http://localhost:3000/twitter/flight.git", - "web_url": "http://localhost:3000/twitter/flight", - "name": "Flight", - "name_with_namespace": "Twitter / Flight", - "path": "flight", - "path_with_namespace": "twitter/flight", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:54.754Z", - "last_activity_at": "2016-01-13T20:27:50.502Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 4, - "name": "Twitter", - "path": "twitter", - "owner_id": null, - "created_at": "2016-01-13T20:19:54.480Z", - "updated_at": "2016-01-13T20:19:54.480Z", - "description": "Id voluptatem ipsa maiores omnis repudiandae et et.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": true, - "open_issues_count": 4, - "permissions": { - "project_access": null, - "group_access": { - "access_level": 10, - "notification_level": 3 - } - } -}, { - "id": 5, - "description": "Voluptatem commodi voluptate placeat architecto beatae illum dolores fugiat.", - "default_branch": "master", - "tag_list": [], - "public": false, - "archived": false, - "visibility_level": 0, - "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-test.git", - "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-test.git", - "web_url": "http://localhost:3000/gitlab-org/gitlab-test", - "name": "Gitlab Test", - "name_with_namespace": "Gitlab Org / Gitlab Test", - "path": "gitlab-test", - "path_with_namespace": "gitlab-org/gitlab-test", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:53.202Z", - "last_activity_at": "2016-01-13T20:27:41.626Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 3, - "name": "Gitlab Org", - "path": "gitlab-org", - "owner_id": null, - "created_at": "2016-01-13T20:19:48.851Z", - "updated_at": "2016-01-13T20:19:48.851Z", - "description": "Magni mollitia quod quidem soluta nesciunt impedit.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 5, - "permissions": { - "project_access": null, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}, { - "id": 4, - "description": "Aut molestias quas est ut aperiam officia quod libero.", - "default_branch": "master", - "tag_list": [], - "public": true, - "archived": false, - "visibility_level": 20, - "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-shell.git", - "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-shell.git", - "web_url": "http://localhost:3000/gitlab-org/gitlab-shell", - "name": "Gitlab Shell", - "name_with_namespace": "Gitlab Org / Gitlab Shell", - "path": "gitlab-shell", - "path_with_namespace": "gitlab-org/gitlab-shell", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:51.882Z", - "last_activity_at": "2016-01-13T20:27:35.678Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 3, - "name": "Gitlab Org", - "path": "gitlab-org", - "owner_id": null, - "created_at": "2016-01-13T20:19:48.851Z", - "updated_at": "2016-01-13T20:19:48.851Z", - "description": "Magni mollitia quod quidem soluta nesciunt impedit.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 5, - "permissions": { - "project_access": { - "access_level": 20, - "notification_level": 3 - }, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}, { - "id": 3, - "description": "Excepturi molestiae quia repellendus omnis est illo illum eligendi.", - "default_branch": "master", - "tag_list": [], - "public": true, - "archived": false, - "visibility_level": 20, - "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-ci.git", - "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-ci.git", - "web_url": "http://localhost:3000/gitlab-org/gitlab-ci", - "name": "Gitlab Ci", - "name_with_namespace": "Gitlab Org / Gitlab Ci", - "path": "gitlab-ci", - "path_with_namespace": "gitlab-org/gitlab-ci", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:50.346Z", - "last_activity_at": "2016-01-13T20:27:30.115Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 3, - "name": "Gitlab Org", - "path": "gitlab-org", - "owner_id": null, - "created_at": "2016-01-13T20:19:48.851Z", - "updated_at": "2016-01-13T20:19:48.851Z", - "description": "Magni mollitia quod quidem soluta nesciunt impedit.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 3, - "permissions": { - "project_access": null, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}, { - "id": 2, - "description": "Adipisci quaerat dignissimos enim sed ipsam dolorem quia.", - "default_branch": "master", - "tag_list": [], - "public": false, - "archived": false, - "visibility_level": 10, - "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-ce.git", - "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-ce.git", - "web_url": "http://localhost:3000/gitlab-org/gitlab-ce", - "name": "Gitlab Ce", - "name_with_namespace": "Gitlab Org / Gitlab Ce", - "path": "gitlab-ce", - "path_with_namespace": "gitlab-org/gitlab-ce", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:49.065Z", - "last_activity_at": "2016-01-13T20:26:58.454Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 3, - "name": "Gitlab Org", - "path": "gitlab-org", - "owner_id": null, - "created_at": "2016-01-13T20:19:48.851Z", - "updated_at": "2016-01-13T20:19:48.851Z", - "description": "Magni mollitia quod quidem soluta nesciunt impedit.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 5, - "permissions": { - "project_access": { - "access_level": 30, - "notification_level": 3 - }, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}, { - "id": 1, - "description": "Vel voluptatem maxime saepe ex quia.", - "default_branch": "master", - "tag_list": [], - "public": false, - "archived": false, - "visibility_level": 0, - "ssh_url_to_repo": "phil@localhost:documentcloud/underscore.git", - "http_url_to_repo": "http://localhost:3000/documentcloud/underscore.git", - "web_url": "http://localhost:3000/documentcloud/underscore", - "name": "Underscore", - "name_with_namespace": "Documentcloud / Underscore", - "path": "underscore", - "path_with_namespace": "documentcloud/underscore", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "builds_enabled": true, - "snippets_enabled": false, - "created_at": "2016-01-13T20:19:45.862Z", - "last_activity_at": "2016-01-13T20:25:03.106Z", - "shared_runners_enabled": true, - "creator_id": 1, - "namespace": { - "id": 2, - "name": "Documentcloud", - "path": "documentcloud", - "owner_id": null, - "created_at": "2016-01-13T20:19:44.464Z", - "updated_at": "2016-01-13T20:19:44.464Z", - "description": "Aut impedit perferendis fuga et ipsa repellat cupiditate et.", - "avatar": { - "url": null - } - }, - "avatar_url": null, - "star_count": 0, - "forks_count": 0, - "only_allow_merge_if_pipeline_succeeds": false, - "open_issues_count": 5, - "permissions": { - "project_access": null, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - } -}] diff --git a/spec/javascripts/fixtures/static/search_autocomplete.html b/spec/javascripts/fixtures/static/search_autocomplete.html deleted file mode 100644 index 29db9020424..00000000000 --- a/spec/javascripts/fixtures/static/search_autocomplete.html +++ /dev/null @@ -1,15 +0,0 @@ -<div class="search search-form"> -<form class="form-inline"> -<div class="search-input-container"> -<div class="search-input-wrap"> -<div class="dropdown"> -<input class="search-input dropdown-menu-toggle" id="search"> -<div class="dropdown-menu dropdown-select"> -<div class="dropdown-content"></div> -</div> -</div> -</div> -</div> -<input class="js-search-project-options" type="hidden"> -</form> -</div> diff --git a/spec/javascripts/fixtures/static/signin_tabs.html b/spec/javascripts/fixtures/static/signin_tabs.html deleted file mode 100644 index 7e66ab9394b..00000000000 --- a/spec/javascripts/fixtures/static/signin_tabs.html +++ /dev/null @@ -1,8 +0,0 @@ -<ul class="nav-links new-session-tabs"> -<li class="active"> -<a href="#ldap">LDAP</a> -</li> -<li> -<a href="#login-pane">Standard</a> -</li> -</ul> diff --git a/spec/javascripts/fixtures/static/sketch_viewer.html b/spec/javascripts/fixtures/static/sketch_viewer.html deleted file mode 100644 index e25e554e568..00000000000 --- a/spec/javascripts/fixtures/static/sketch_viewer.html +++ /dev/null @@ -1,3 +0,0 @@ -<div class="file-content" data-endpoint="/test_sketch_file.sketch" id="js-sketch-viewer"> -<div class="js-loading-icon"></div> -</div> diff --git a/spec/javascripts/fixtures/todos.rb b/spec/javascripts/fixtures/todos.rb deleted file mode 100644 index d0c8a6eca01..00000000000 --- a/spec/javascripts/fixtures/todos.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe 'Todos (JavaScript fixtures)' do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'todos-project') } - let(:issue_1) { create(:issue, title: 'issue_1', project: project) } - let!(:todo_1) { create(:todo, user: admin, project: project, target: issue_1, created_at: 5.hours.ago) } - let(:issue_2) { create(:issue, title: 'issue_2', project: project) } - let!(:todo_2) { create(:todo, :done, user: admin, project: project, target: issue_2, created_at: 50.hours.ago) } - - before(:all) do - clean_frontend_fixtures('todos/') - end - - after do - remove_repository(project) - end - - describe Dashboard::TodosController, '(JavaScript fixtures)', type: :controller do - render_views - - before do - sign_in(admin) - end - - it 'todos/todos.html' do - get :index - - expect(response).to be_success - end - end - - describe Projects::TodosController, '(JavaScript fixtures)', type: :controller do - render_views - - before do - sign_in(admin) - end - - it 'todos/todos.json' do - post :create, params: { - namespace_id: namespace, - project_id: project, - issuable_type: 'issue', - issuable_id: issue_2.id - }, format: 'json' - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/fixtures/u2f.rb b/spec/javascripts/fixtures/u2f.rb deleted file mode 100644 index f52832b6efb..00000000000 --- a/spec/javascripts/fixtures/u2f.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -context 'U2F' do - include JavaScriptFixturesHelpers - - let(:user) { create(:user, :two_factor_via_u2f, otp_secret: 'otpsecret:coolkids') } - - before(:all) do - clean_frontend_fixtures('u2f/') - end - - describe SessionsController, '(JavaScript fixtures)', type: :controller do - include DeviseHelpers - - render_views - - before do - set_devise_mapping(context: @request) - end - - it 'u2f/authenticate.html' do - allow(controller).to receive(:find_user).and_return(user) - - post :create, params: { user: { login: user.username, password: user.password } } - - expect(response).to be_success - end - end - - describe Profiles::TwoFactorAuthsController, '(JavaScript fixtures)', type: :controller do - render_views - - before do - sign_in(user) - allow_any_instance_of(Profiles::TwoFactorAuthsController).to receive(:build_qr_code).and_return('qrcode:blackandwhitesquares') - end - - it 'u2f/register.html' do - get :show - - expect(response).to be_success - end - end -end diff --git a/spec/javascripts/helpers/vue_test_utils_helper.js b/spec/javascripts/helpers/vue_test_utils_helper.js index 121e99c9783..5b749b11246 100644 --- a/spec/javascripts/helpers/vue_test_utils_helper.js +++ b/spec/javascripts/helpers/vue_test_utils_helper.js @@ -1,21 +1,5 @@ -/* eslint-disable import/prefer-default-export */ +// No new code should be added to this file. Instead, modify the +// file this one re-exports from. For more detail about why, see: +// https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31349 -const vNodeContainsText = (vnode, text) => - (vnode.text && vnode.text.includes(text)) || - (vnode.children && vnode.children.filter(child => vNodeContainsText(child, text)).length); - -/** - * Determines whether a `shallowMount` Wrapper contains text - * within one of it's slots. This will also work on Wrappers - * acquired with `find()`, but only if it's parent Wrapper - * was shallowMounted. - * NOTE: Prefer checking the rendered output of a component - * wherever possible using something like `text()` instead. - * @param {Wrapper} shallowWrapper - Vue test utils wrapper (shallowMounted) - * @param {String} slotName - * @param {String} text - */ -export const shallowWrapperContainsSlotText = (shallowWrapper, slotName, text) => - Boolean( - shallowWrapper.vm.$slots[slotName].filter(vnode => vNodeContainsText(vnode, text)).length, - ); +export * from '../../frontend/helpers/vue_test_utils_helper'; diff --git a/spec/javascripts/helpers/vue_test_utils_helper_spec.js b/spec/javascripts/helpers/vue_test_utils_helper_spec.js deleted file mode 100644 index 41714066da5..00000000000 --- a/spec/javascripts/helpers/vue_test_utils_helper_spec.js +++ /dev/null @@ -1,48 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { shallowWrapperContainsSlotText } from './vue_test_utils_helper'; - -describe('Vue test utils helpers', () => { - describe('shallowWrapperContainsSlotText', () => { - const mockText = 'text'; - const mockSlot = `<div>${mockText}</div>`; - let mockComponent; - - beforeEach(() => { - mockComponent = shallowMount( - { - render(h) { - h(`<div>mockedComponent</div>`); - }, - }, - { - slots: { - default: mockText, - namedSlot: mockSlot, - }, - }, - ); - }); - - it('finds text within shallowWrapper default slot', () => { - expect(shallowWrapperContainsSlotText(mockComponent, 'default', mockText)).toBe(true); - }); - - it('finds text within shallowWrapper named slot', () => { - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', mockText)).toBe(true); - }); - - it('returns false when text is not present', () => { - const searchText = 'absent'; - - expect(shallowWrapperContainsSlotText(mockComponent, 'default', searchText)).toBe(false); - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', searchText)).toBe(false); - }); - - it('searches with case-sensitivity', () => { - const searchText = mockText.toUpperCase(); - - expect(shallowWrapperContainsSlotText(mockComponent, 'default', searchText)).toBe(false); - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', searchText)).toBe(false); - }); - }); -}); diff --git a/spec/javascripts/ide/components/repo_editor_spec.js b/spec/javascripts/ide/components/repo_editor_spec.js index 7dc5cb24981..0701b773e17 100644 --- a/spec/javascripts/ide/components/repo_editor_spec.js +++ b/spec/javascripts/ide/components/repo_editor_spec.js @@ -5,7 +5,7 @@ import axios from '~/lib/utils/axios_utils'; import store from '~/ide/stores'; import repoEditor from '~/ide/components/repo_editor.vue'; import Editor from '~/ide/lib/editor'; -import { activityBarViews } from '~/ide/constants'; +import { activityBarViews, FILE_VIEW_MODE_EDITOR, FILE_VIEW_MODE_PREVIEW } from '~/ide/constants'; import { createComponentWithStore } from '../../helpers/vue_mount_component_helper'; import setTimeoutPromise from '../../helpers/set_timeout_promise_helper'; import { file, resetStore } from '../helpers'; @@ -16,7 +16,7 @@ describe('RepoEditor', () => { beforeEach(done => { const f = { ...file(), - viewMode: 'editor', + viewMode: FILE_VIEW_MODE_EDITOR, }; const RepoEditor = Vue.extend(repoEditor); @@ -370,7 +370,7 @@ describe('RepoEditor', () => { describe('when files view mode is preview', () => { beforeEach(done => { spyOn(vm.editor, 'updateDimensions'); - vm.file.viewMode = 'preview'; + vm.file.viewMode = FILE_VIEW_MODE_PREVIEW; vm.$nextTick(done); }); @@ -392,7 +392,7 @@ describe('RepoEditor', () => { describe('when file view mode changes to editor', () => { beforeEach(done => { - vm.file.viewMode = 'editor'; + vm.file.viewMode = FILE_VIEW_MODE_EDITOR; // one tick to trigger watch vm.$nextTick() diff --git a/spec/javascripts/ide/stores/modules/commit/actions_spec.js b/spec/javascripts/ide/stores/modules/commit/actions_spec.js index 8a3c132972e..14d861f21d2 100644 --- a/spec/javascripts/ide/stores/modules/commit/actions_spec.js +++ b/spec/javascripts/ide/stores/modules/commit/actions_spec.js @@ -245,7 +245,7 @@ describe('IDE commit module actions', () => { master: { workingReference: '1', commit: { - short_id: TEST_COMMIT_SHA, + id: TEST_COMMIT_SHA, }, }, }, @@ -411,7 +411,7 @@ describe('IDE commit module actions', () => { expect(visitUrl).toHaveBeenCalledWith( `webUrl/merge_requests/new?merge_request[source_branch]=${ store.getters['commit/placeholderBranchName'] - }&merge_request[target_branch]=master`, + }&merge_request[target_branch]=master&nav_source=webide`, ); done(); diff --git a/spec/javascripts/ide/stores/mutations/file_spec.js b/spec/javascripts/ide/stores/mutations/file_spec.js index 7714f66c9a4..064e66cef64 100644 --- a/spec/javascripts/ide/stores/mutations/file_spec.js +++ b/spec/javascripts/ide/stores/mutations/file_spec.js @@ -1,5 +1,6 @@ import mutations from '~/ide/stores/mutations/file'; import state from '~/ide/stores/state'; +import { FILE_VIEW_MODE_PREVIEW } from '~/ide/constants'; import { file } from '../../helpers'; describe('IDE store file mutations', () => { @@ -103,6 +104,43 @@ describe('IDE store file mutations', () => { expect(localState.openFiles[0].rawPath).toEqual(rawPath); expect(localFile.rawPath).toEqual(rawPath); }); + + it('does not mutate certain props on the file', () => { + const path = 'New Path'; + const name = 'New Name'; + localFile.path = path; + localFile.name = name; + + localState.stagedFiles = [localFile]; + localState.changedFiles = [localFile]; + localState.openFiles = [localFile]; + + mutations.SET_FILE_DATA(localState, { + data: { + path: 'Old Path', + name: 'Old Name', + raw: 'Old Raw', + base_raw: 'Old Base Raw', + }, + file: localFile, + }); + + [ + localState.stagedFiles[0], + localState.changedFiles[0], + localState.openFiles[0], + localFile, + ].forEach(f => { + expect(f).toEqual( + jasmine.objectContaining({ + path, + name, + raw: null, + baseRaw: null, + }), + ); + }); + }); }); describe('SET_FILE_RAW_DATA', () => { @@ -388,10 +426,10 @@ describe('IDE store file mutations', () => { it('updates file view mode', () => { mutations.SET_FILE_VIEWMODE(localState, { file: localFile, - viewMode: 'preview', + viewMode: FILE_VIEW_MODE_PREVIEW, }); - expect(localFile.viewMode).toBe('preview'); + expect(localFile.viewMode).toBe(FILE_VIEW_MODE_PREVIEW); }); }); diff --git a/spec/javascripts/jobs/components/job_app_spec.js b/spec/javascripts/jobs/components/job_app_spec.js index f28d2c2a882..d3c1cf831bb 100644 --- a/spec/javascripts/jobs/components/job_app_spec.js +++ b/spec/javascripts/jobs/components/job_app_spec.js @@ -3,7 +3,9 @@ import MockAdapter from 'axios-mock-adapter'; import axios from '~/lib/utils/axios_utils'; import jobApp from '~/jobs/components/job_app.vue'; import createStore from '~/jobs/store'; +import * as types from '~/jobs/store/mutation_types'; import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; +import { waitForMutation } from 'spec/helpers/vue_test_utils_helper'; import { resetStore } from '../store/helpers'; import job from '../mock_data'; @@ -19,12 +21,24 @@ describe('Job App ', () => { runnerHelpUrl: 'help/runner', deploymentHelpUrl: 'help/deployment', runnerSettingsUrl: 'settings/ci-cd/runners', + variablesSettingsUrl: 'settings/ci-cd/variables', terminalPath: 'jobs/123/terminal', pagePath: `${gl.TEST_HOST}jobs/123`, + projectPath: 'user-name/project-name', logState: 'eyJvZmZzZXQiOjE3NDUxLCJuX29wZW5fdGFncyI6MCwiZmdfY29sb3IiOm51bGwsImJnX2NvbG9yIjpudWxsLCJzdHlsZV9tYXNrIjowfQ%3D%3D', }; + const waitForJobReceived = () => waitForMutation(store, types.RECEIVE_JOB_SUCCESS); + const setupAndMount = ({ jobData = {}, traceData = {} } = {}) => { + mock.onGet(props.endpoint).replyOnce(200, { ...job, ...jobData }); + mock.onGet(`${props.pagePath}/trace.json`).reply(200, traceData); + + vm = mountComponentWithStore(Component, { props, store }); + + return waitForJobReceived(); + }; + beforeEach(() => { mock = new MockAdapter(axios); store = createStore(); @@ -38,103 +52,81 @@ describe('Job App ', () => { describe('while loading', () => { beforeEach(() => { - mock.onGet(props.endpoint).reply(200, job, {}); - mock.onGet(`${props.pagePath}/trace.json`).reply(200, {}); - vm = mountComponentWithStore(Component, { props, store }); + setupAndMount(); }); - it('renders loading icon', done => { + it('renders loading icon', () => { expect(vm.$el.querySelector('.js-job-loading')).not.toBeNull(); expect(vm.$el.querySelector('.js-job-sidebar')).toBeNull(); expect(vm.$el.querySelector('.js-job-content')).toBeNull(); - - setTimeout(() => { - done(); - }, 0); }); }); describe('with successful request', () => { - beforeEach(() => { - mock.onGet(`${props.pagePath}/trace.json`).replyOnce(200, {}); - }); - describe('Header section', () => { describe('job callout message', () => { it('should not render the reason when reason is absent', done => { - mock.onGet(props.endpoint).replyOnce(200, job); - vm = mountComponentWithStore(Component, { props, store }); - - setTimeout(() => { - expect(vm.shouldRenderCalloutMessage).toBe(false); - - done(); - }, 0); + setupAndMount() + .then(() => { + expect(vm.shouldRenderCalloutMessage).toBe(false); + }) + .then(done) + .catch(done.fail); }); it('should render the reason when reason is present', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { - callout_message: 'There is an unknown failure, please try again', - }), - ); - - vm = mountComponentWithStore(Component, { props, store }); - setTimeout(() => { - expect(vm.shouldRenderCalloutMessage).toBe(true); - done(); - }, 0); + setupAndMount({ + jobData: { + callout_message: 'There is an unkown failure, please try again', + }, + }) + .then(() => { + expect(vm.shouldRenderCalloutMessage).toBe(true); + }) + .then(done) + .catch(done.fail); }); }); describe('triggered job', () => { - beforeEach(() => { + beforeEach(done => { const aYearAgo = new Date(); aYearAgo.setFullYear(aYearAgo.getFullYear() - 1); - mock - .onGet(props.endpoint) - .replyOnce(200, Object.assign({}, job, { started: aYearAgo.toISOString() })); - vm = mountComponentWithStore(Component, { props, store }); + setupAndMount({ jobData: { started: aYearAgo.toISOString() } }) + .then(done) + .catch(done.fail); }); - it('should render provided job information', done => { - setTimeout(() => { - expect( - vm.$el - .querySelector('.header-main-content') - .textContent.replace(/\s+/g, ' ') - .trim(), - ).toContain('passed Job #4757 triggered 1 year ago by Root'); - done(); - }, 0); + it('should render provided job information', () => { + expect( + vm.$el + .querySelector('.header-main-content') + .textContent.replace(/\s+/g, ' ') + .trim(), + ).toContain('passed Job #4757 triggered 1 year ago by Root'); }); - it('should render new issue link', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual( - job.new_issue_path, - ); - done(); - }, 0); + it('should render new issue link', () => { + expect(vm.$el.querySelector('.js-new-issue').getAttribute('href')).toEqual( + job.new_issue_path, + ); }); }); describe('created job', () => { it('should render created key', done => { - mock.onGet(props.endpoint).replyOnce(200, job); - vm = mountComponentWithStore(Component, { props, store }); - - setTimeout(() => { - expect( - vm.$el - .querySelector('.header-main-content') - .textContent.replace(/\s+/g, ' ') - .trim(), - ).toContain('passed Job #4757 created 3 weeks ago by Root'); - done(); - }, 0); + setupAndMount() + .then(() => { + expect( + vm.$el + .querySelector('.header-main-content') + .textContent.replace(/\s+/g, ' ') + .trim(), + ).toContain('passed Job #4757 created 3 weeks ago by Root'); + }) + .then(done) + .catch(done.fail); }); }); }); @@ -142,9 +134,8 @@ describe('Job App ', () => { describe('stuck block', () => { describe('without active runners availabl', () => { it('renders stuck block when there are no runners', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { status: { group: 'pending', icon: 'status_pending', @@ -158,23 +149,23 @@ describe('Job App ', () => { online: false, }, tags: [], - }), - ); - vm = mountComponentWithStore(Component, { props, store }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-stuck')).not.toBeNull(); - expect(vm.$el.querySelector('.js-job-stuck .js-stuck-no-active-runner')).not.toBeNull(); - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-stuck')).not.toBeNull(); + expect( + vm.$el.querySelector('.js-job-stuck .js-stuck-no-active-runner'), + ).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('when available runners can not run specified tag', () => { it('renders tags in stuck block when there are no runners', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { status: { group: 'pending', icon: 'status_pending', @@ -187,27 +178,21 @@ describe('Job App ', () => { available: false, online: false, }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]); - expect(vm.$el.querySelector('.js-job-stuck .js-stuck-with-tags')).not.toBeNull(); - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]); + expect(vm.$el.querySelector('.js-job-stuck .js-stuck-with-tags')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('when runners are offline and build has tags', () => { it('renders message about job being stuck because of no runners with the specified tags', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { status: { group: 'pending', icon: 'status_pending', @@ -220,48 +205,35 @@ describe('Job App ', () => { available: true, online: true, }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]); - expect(vm.$el.querySelector('.js-job-stuck .js-stuck-with-tags')).not.toBeNull(); - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-stuck').textContent).toContain(job.tags[0]); + expect(vm.$el.querySelector('.js-job-stuck .js-stuck-with-tags')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); it('does not renders stuck block when there are no runners', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { runners: { available: true }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-stuck')).toBeNull(); - - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-stuck')).toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('unmet prerequisites block', () => { it('renders unmet prerequisites block when there is an unmet prerequisites failure', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { status: { group: 'failed', icon: 'status_failed', @@ -281,104 +253,81 @@ describe('Job App ', () => { available: true, }, tags: [], - }), - ); - vm = mountComponentWithStore(Component, { props, store }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-failed')).not.toBeNull(); - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-failed')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('environments block', () => { it('renders environment block when job has environment', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { deployment_status: { environment: { environment_path: '/path', name: 'foo', }, }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-environment')).not.toBeNull(); - - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-environment')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); it('does not render environment block when job has environment', done => { - mock.onGet(props.endpoint).replyOnce(200, job); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-environment')).toBeNull(); - done(); - }, 0); + setupAndMount() + .then(() => { + expect(vm.$el.querySelector('.js-job-environment')).toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('erased block', () => { it('renders erased block when `erased` is true', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { erased_by: { username: 'root', web_url: 'gitlab.com/root', }, erased_at: '2016-11-07T11:11:16.525Z', - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-erased-block')).not.toBeNull(); - - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-erased-block')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); it('does not render erased block when `erased` is false', done => { - mock.onGet(props.endpoint).replyOnce(200, Object.assign({}, job, { erased_at: null })); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-erased-block')).toBeNull(); - - done(); - }, 0); + setupAndMount({ + jobData: { + erased_at: null, + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-erased-block')).toBeNull(); + }) + .then(done) + .catch(done.fail); }); }); describe('empty states block', () => { it('renders empty state when job does not have trace and is not running', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { has_trace: false, status: { group: 'pending', @@ -398,25 +347,18 @@ describe('Job App ', () => { path: '/path', }, }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull(); - - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull(); + }) + .then(done) + .catch(done.fail); }); it('does not render empty state when job does not have trace but it is running', done => { - mock.onGet(props.endpoint).replyOnce( - 200, - Object.assign({}, job, { + setupAndMount({ + jobData: { has_trace: false, status: { group: 'running', @@ -425,34 +367,23 @@ describe('Job App ', () => { text: 'running', details_path: 'path', }, - }), - ); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull(); - - done(); - }, 0); + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull(); + }) + .then(done) + .catch(done.fail); }); it('does not render empty state when job has trace but it is not running', done => { - mock.onGet(props.endpoint).replyOnce(200, Object.assign({}, job, { has_trace: true })); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull(); - - done(); - }, 0); + setupAndMount({ jobData: { has_trace: true } }) + .then(() => { + expect(vm.$el.querySelector('.js-job-empty-state')).toBeNull(); + }) + .then(done) + .catch(done.fail); + done(); }); it('displays remaining time for a delayed job', done => { @@ -460,120 +391,114 @@ describe('Job App ', () => { spyOn(Date, 'now').and.callFake( () => new Date(delayedJobFixture.scheduled_at).getTime() - oneHourInMilliseconds, ); - mock.onGet(props.endpoint).replyOnce(200, { ...delayedJobFixture }); + setupAndMount({ jobData: delayedJobFixture }) + .then(() => { + expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull(); - vm = mountComponentWithStore(Component, { - props, - store, - }); - - store.subscribeAction(action => { - if (action.type !== 'receiveJobSuccess') { - return; - } + const title = vm.$el.querySelector('.js-job-empty-state-title'); - Vue.nextTick() - .then(() => { - expect(vm.$el.querySelector('.js-job-empty-state')).not.toBeNull(); - - const title = vm.$el.querySelector('.js-job-empty-state-title'); + expect(title).toContainText('01:00:00'); + }) + .then(done) + .catch(done.fail); + }); + }); - expect(title).toContainText('01:00:00'); - done(); - }) - .catch(done.fail); - }); + describe('sidebar', () => { + it('has no blank blocks', done => { + setupAndMount({ + jobData: { + duration: null, + finished_at: null, + erased_at: null, + queued: null, + runner: null, + coverage: null, + tags: [], + cancel_path: null, + }, + }) + .then(() => { + vm.$el.querySelectorAll('.blocks-container > *').forEach(block => { + expect(block.textContent.trim()).not.toBe(''); + }); + }) + .then(done) + .catch(done.fail); }); }); }); describe('archived job', () => { - beforeEach(() => { - mock.onGet(props.endpoint).reply(200, Object.assign({}, job, { archived: true }), {}); - vm = mountComponentWithStore(Component, { - props, - store, - }); + beforeEach(done => { + setupAndMount({ jobData: { archived: true } }) + .then(done) + .catch(done.fail); }); - it('renders warning about job being archived', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-archived-job ')).not.toBeNull(); - done(); - }, 0); + it('renders warning about job being archived', () => { + expect(vm.$el.querySelector('.js-archived-job ')).not.toBeNull(); }); }); describe('non-archived job', () => { - beforeEach(() => { - mock.onGet(props.endpoint).reply(200, job, {}); - vm = mountComponentWithStore(Component, { - props, - store, - }); + beforeEach(done => { + setupAndMount() + .then(done) + .catch(done.fail); }); - it('does not warning about job being archived', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-archived-job ')).toBeNull(); - done(); - }, 0); + it('does not warning about job being archived', () => { + expect(vm.$el.querySelector('.js-archived-job ')).toBeNull(); }); }); describe('trace output', () => { - beforeEach(() => { - mock.onGet(props.endpoint).reply(200, job, {}); - }); - describe('with append flag', () => { it('appends the log content to the existing one', done => { - mock.onGet(`${props.pagePath}/trace.json`).reply(200, { - html: '<span>More<span>', - status: 'running', - state: 'newstate', - append: true, - complete: true, - }); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - vm.$store.state.trace = 'Update'; - - setTimeout(() => { - expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain('Update'); - - done(); - }, 0); + setupAndMount({ + traceData: { + html: '<span>More<span>', + status: 'running', + state: 'newstate', + append: true, + complete: true, + }, + }) + .then(() => { + vm.$store.state.trace = 'Update'; + + return vm.$nextTick(); + }) + .then(() => { + expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain('Update'); + }) + .then(done) + .catch(done.fail); }); }); describe('without append flag', () => { it('replaces the trace', done => { - mock.onGet(`${props.pagePath}/trace.json`).reply(200, { - html: '<span>Different<span>', - status: 'running', - append: false, - complete: true, - }); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - vm.$store.state.trace = 'Update'; - - setTimeout(() => { - expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).not.toContain( - 'Update', - ); + setupAndMount({ + traceData: { + html: '<span>Different<span>', + status: 'running', + append: false, + complete: true, + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).not.toContain( + 'Update', + ); - expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain('Different'); - done(); - }, 0); + expect(vm.$el.querySelector('.js-build-trace').textContent.trim()).toContain( + 'Different', + ); + }) + .then(done) + .catch(done.fail); }); }); @@ -589,83 +514,76 @@ describe('Job App ', () => { complete: true, }); - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).toContain( - '50 bytes', - ); - done(); - }, 0); + setupAndMount({ + traceData: { + html: '<span>Update</span>', + status: 'success', + append: false, + size: 50, + total: 100, + complete: true, + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).toContain( + '50 bytes', + ); + }) + .then(done) + .catch(done.fail); }); }); describe('when size is equal than total', () => { it('does not show the truncated information', done => { - mock.onGet(`${props.pagePath}/trace.json`).reply(200, { - html: '<span>Update</span>', - status: 'success', - append: false, - size: 100, - total: 100, - complete: true, - }); - - vm = mountComponentWithStore(Component, { - props, - store, - }); - - setTimeout(() => { - expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).not.toContain( - '50 bytes', - ); - done(); - }, 0); + setupAndMount({ + traceData: { + html: '<span>Update</span>', + status: 'success', + append: false, + size: 100, + total: 100, + complete: true, + }, + }) + .then(() => { + expect(vm.$el.querySelector('.js-truncated-info').textContent.trim()).not.toContain( + '50 bytes', + ); + }) + .then(done) + .catch(done.fail); }); }); }); describe('trace controls', () => { - beforeEach(() => { - mock.onGet(`${props.pagePath}/trace.json`).reply(200, { - html: '<span>Update</span>', - status: 'success', - append: false, - size: 50, - total: 100, - complete: true, - }); - - vm = mountComponentWithStore(Component, { - props, - store, - }); + beforeEach(done => { + setupAndMount({ + traceData: { + html: '<span>Update</span>', + status: 'success', + append: false, + size: 50, + total: 100, + complete: true, + }, + }) + .then(done) + .catch(done.fail); }); - it('should render scroll buttons', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-scroll-top')).not.toBeNull(); - expect(vm.$el.querySelector('.js-scroll-bottom')).not.toBeNull(); - done(); - }, 0); + it('should render scroll buttons', () => { + expect(vm.$el.querySelector('.js-scroll-top')).not.toBeNull(); + expect(vm.$el.querySelector('.js-scroll-bottom')).not.toBeNull(); }); - it('should render link to raw ouput', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-raw-link-controller')).not.toBeNull(); - done(); - }, 0); + it('should render link to raw ouput', () => { + expect(vm.$el.querySelector('.js-raw-link-controller')).not.toBeNull(); }); - it('should render link to erase job', done => { - setTimeout(() => { - expect(vm.$el.querySelector('.js-erase-link')).not.toBeNull(); - done(); - }, 0); + it('should render link to erase job', () => { + expect(vm.$el.querySelector('.js-erase-link')).not.toBeNull(); }); }); }); diff --git a/spec/javascripts/jobs/components/manual_variables_form_spec.js b/spec/javascripts/jobs/components/manual_variables_form_spec.js new file mode 100644 index 00000000000..093aa905185 --- /dev/null +++ b/spec/javascripts/jobs/components/manual_variables_form_spec.js @@ -0,0 +1,88 @@ +import { shallowMount } from '@vue/test-utils'; +import { GlButton } from '@gitlab/ui'; +import Form from '~/jobs/components/manual_variables_form.vue'; + +describe('Manual Variables Form', () => { + let wrapper; + const requiredProps = { + action: { + path: '/play', + method: 'post', + button_title: 'Trigger this manual action', + }, + variablesSettingsUrl: '/settings', + }; + + const factory = (props = {}) => { + wrapper = shallowMount(Form, { + propsData: props, + }); + }; + + beforeEach(() => { + factory(requiredProps); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + it('renders empty form with correct placeholders', () => { + expect(wrapper.find({ ref: 'inputKey' }).attributes('placeholder')).toBe('Input variable key'); + expect(wrapper.find({ ref: 'inputSecretValue' }).attributes('placeholder')).toBe( + 'Input variable value', + ); + }); + + it('renders help text with provided link', () => { + expect(wrapper.find('p').text()).toBe( + 'Specify variable values to be used in this run. The values specified in CI/CD settings will be used as default', + ); + + expect(wrapper.find('a').attributes('href')).toBe(requiredProps.variablesSettingsUrl); + }); + + describe('when adding a new variable', () => { + it('creates a new variable when user types a new key and resets the form', done => { + wrapper.vm + .$nextTick() + .then(() => wrapper.find({ ref: 'inputKey' }).setValue('new key')) + .then(() => { + expect(wrapper.vm.variables.length).toBe(1); + expect(wrapper.vm.variables[0].key).toBe('new key'); + expect(wrapper.find({ ref: 'inputKey' }).attributes('value')).toBe(undefined); + }) + .then(done) + .catch(done.fail); + }); + + it('creates a new variable when user types a new value and resets the form', done => { + wrapper.vm + .$nextTick() + .then(() => wrapper.find({ ref: 'inputSecretValue' }).setValue('new value')) + .then(() => { + expect(wrapper.vm.variables.length).toBe(1); + expect(wrapper.vm.variables[0].secret_value).toBe('new value'); + expect(wrapper.find({ ref: 'inputSecretValue' }).attributes('value')).toBe(undefined); + }) + .then(done) + .catch(done.fail); + }); + }); + + describe('when deleting a variable', () => { + it('removes the variable row', () => { + wrapper.vm.variables = [ + { + key: 'new key', + secret_value: 'value', + id: '1', + }, + ]; + + wrapper.find(GlButton).vm.$emit('click'); + + expect(wrapper.vm.variables.length).toBe(0); + }); + }); +}); diff --git a/spec/javascripts/monitoring/charts/empty_chart_spec.js b/spec/javascripts/monitoring/charts/empty_chart_spec.js new file mode 100644 index 00000000000..bbfca27dc5a --- /dev/null +++ b/spec/javascripts/monitoring/charts/empty_chart_spec.js @@ -0,0 +1,29 @@ +import { shallowMount } from '@vue/test-utils'; +import EmptyChart from '~/monitoring/components/charts/empty_chart.vue'; + +describe('Empty Chart component', () => { + let emptyChart; + const graphTitle = 'Memory Usage'; + + beforeEach(() => { + emptyChart = shallowMount(EmptyChart, { + propsData: { + graphTitle, + }, + }); + }); + + afterEach(() => { + emptyChart.destroy(); + }); + + it('render the chart title', () => { + expect(emptyChart.find({ ref: 'graphTitle' }).text()).toBe(graphTitle); + }); + + describe('Computed props', () => { + it('sets the height for the svg container', () => { + expect(emptyChart.vm.svgContainerStyle.height).toBe('300px'); + }); + }); +}); diff --git a/spec/javascripts/monitoring/panel_type_spec.js b/spec/javascripts/monitoring/panel_type_spec.js new file mode 100644 index 00000000000..8ce24041e97 --- /dev/null +++ b/spec/javascripts/monitoring/panel_type_spec.js @@ -0,0 +1,44 @@ +import { shallowMount } from '@vue/test-utils'; +import PanelType from '~/monitoring/components/panel_type.vue'; +import EmptyChart from '~/monitoring/components/charts/empty_chart.vue'; +import { graphDataPrometheusQueryRange } from './mock_data'; + +describe('Panel Type component', () => { + let panelType; + const dashboardWidth = 100; + + describe('When no graphData is available', () => { + let glEmptyChart; + const graphDataNoResult = graphDataPrometheusQueryRange; + graphDataNoResult.queries[0].result = []; + + beforeEach(() => { + panelType = shallowMount(PanelType, { + propsData: { + dashboardWidth, + graphData: graphDataNoResult, + }, + }); + }); + + afterEach(() => { + panelType.destroy(); + }); + + describe('Empty Chart component', () => { + beforeEach(() => { + glEmptyChart = panelType.find(EmptyChart); + }); + + it('is a Vue instance', () => { + expect(glEmptyChart.isVueInstance()).toBe(true); + }); + + it('it receives a graph title', () => { + const props = glEmptyChart.props(); + + expect(props.graphTitle).toBe(panelType.vm.graphData.title); + }); + }); + }); +}); diff --git a/spec/javascripts/notes/components/note_actions/reply_button_spec.js b/spec/javascripts/notes/components/note_actions/reply_button_spec.js index 11fb89808d9..003773d07ea 100644 --- a/spec/javascripts/notes/components/note_actions/reply_button_spec.js +++ b/spec/javascripts/notes/components/note_actions/reply_button_spec.js @@ -25,8 +25,7 @@ describe('ReplyButton', () => { button.trigger('click'); - expect(wrapper.emitted()).toEqual({ - startReplying: [[]], - }); + expect(wrapper.emitted().startReplying).toBeTruthy(); + expect(wrapper.emitted().startReplying.length).toBe(1); }); }); diff --git a/spec/javascripts/notes/mock_data.js b/spec/javascripts/notes/mock_data.js index 1df5cf9ef68..5f81a168498 100644 --- a/spec/javascripts/notes/mock_data.js +++ b/spec/javascripts/notes/mock_data.js @@ -1,3 +1,5 @@ +// Copied to ee/spec/frontend/notes/mock_data.js + export const notesDataMock = { discussionsPath: '/gitlab-org/gitlab-ce/issues/26/discussions.json', lastFetchedAt: 1501862675, diff --git a/spec/javascripts/pdf/page_spec.js b/spec/javascripts/pdf/page_spec.js index 6dea570266b..efeb65acf87 100644 --- a/spec/javascripts/pdf/page_spec.js +++ b/spec/javascripts/pdf/page_spec.js @@ -17,7 +17,7 @@ describe('Page component', () => { pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc; pdfjsLib .getDocument(testPDF) - .then(pdf => pdf.getPage(1)) + .promise.then(pdf => pdf.getPage(1)) .then(page => { testPage = page; }) @@ -31,7 +31,8 @@ describe('Page component', () => { it('renders the page when mounting', done => { const promise = Promise.resolve(); - spyOn(testPage, 'render').and.callFake(() => promise); + spyOn(testPage, 'render').and.returnValue({ promise }); + vm = mountComponent(Component, { page: testPage, number: 1, diff --git a/spec/javascripts/performance_bar/components/detailed_metric_spec.js b/spec/javascripts/performance_bar/components/detailed_metric_spec.js index 8a7aa057186..0486b5fa3db 100644 --- a/spec/javascripts/performance_bar/components/detailed_metric_spec.js +++ b/spec/javascripts/performance_bar/components/detailed_metric_spec.js @@ -44,7 +44,6 @@ describe('detailedMetric', () => { }, metric: 'gitaly', header: 'Gitaly calls', - details: 'details', keys: ['feature', 'request'], }); }); @@ -79,8 +78,32 @@ describe('detailedMetric', () => { }); }); - it('displays the metric name', () => { + it('displays the metric title', () => { expect(vm.$el.innerText).toContain('gitaly'); }); + + describe('when using a custom metric title', () => { + beforeEach(() => { + vm = mountComponent(Vue.extend(detailedMetric), { + currentRequest: { + details: { + gitaly: { + duration: '123ms', + calls: '456', + details: requestDetails, + }, + }, + }, + metric: 'gitaly', + title: 'custom', + header: 'Gitaly calls', + keys: ['feature', 'request'], + }); + }); + + it('displays the custom title', () => { + expect(vm.$el.innerText).toContain('custom'); + }); + }); }); }); diff --git a/spec/javascripts/persistent_user_callout_spec.js b/spec/javascripts/persistent_user_callout_spec.js index 2fdfff3db03..d15758be5d2 100644 --- a/spec/javascripts/persistent_user_callout_spec.js +++ b/spec/javascripts/persistent_user_callout_spec.js @@ -22,6 +22,24 @@ describe('PersistentUserCallout', () => { return fixture; } + function createDeferredLinkFixture() { + const fixture = document.createElement('div'); + fixture.innerHTML = ` + <div + class="container" + data-dismiss-endpoint="${dismissEndpoint}" + data-feature-id="${featureName}" + data-defer-links="true" + > + <button type="button" class="js-close"></button> + <a href="/somewhere-pleasant" target="_blank" class="deferred-link">A link</a> + <a href="/somewhere-else" target="_blank" class="normal-link">Another link</a> + </div> + `; + + return fixture; + } + describe('dismiss', () => { let button; let mockAxios; @@ -74,6 +92,75 @@ describe('PersistentUserCallout', () => { }); }); + describe('deferred links', () => { + let button; + let deferredLink; + let normalLink; + let mockAxios; + let persistentUserCallout; + let windowSpy; + + beforeEach(() => { + const fixture = createDeferredLinkFixture(); + const container = fixture.querySelector('.container'); + button = fixture.querySelector('.js-close'); + deferredLink = fixture.querySelector('.deferred-link'); + normalLink = fixture.querySelector('.normal-link'); + mockAxios = new MockAdapter(axios); + persistentUserCallout = new PersistentUserCallout(container); + spyOn(persistentUserCallout.container, 'remove'); + windowSpy = spyOn(window, 'open').and.callFake(() => {}); + }); + + afterEach(() => { + mockAxios.restore(); + }); + + it('defers loading of a link until callout is dismissed', done => { + const { href, target } = deferredLink; + mockAxios.onPost(dismissEndpoint).replyOnce(200); + + deferredLink.click(); + + setTimeoutPromise() + .then(() => { + expect(windowSpy).toHaveBeenCalledWith(href, target); + expect(persistentUserCallout.container.remove).toHaveBeenCalled(); + expect(mockAxios.history.post[0].data).toBe( + JSON.stringify({ feature_name: featureName }), + ); + }) + .then(done) + .catch(done.fail); + }); + + it('does not dismiss callout on non-deferred links', done => { + normalLink.click(); + + setTimeoutPromise() + .then(() => { + expect(windowSpy).not.toHaveBeenCalled(); + expect(persistentUserCallout.container.remove).not.toHaveBeenCalled(); + }) + .then(done) + .catch(done.fail); + }); + + it('does not follow link when notification is closed', done => { + mockAxios.onPost(dismissEndpoint).replyOnce(200); + + button.click(); + + setTimeoutPromise() + .then(() => { + expect(windowSpy).not.toHaveBeenCalled(); + expect(persistentUserCallout.container.remove).toHaveBeenCalled(); + }) + .then(done) + .catch(done.fail); + }); + }); + describe('factory', () => { it('returns an instance of PersistentUserCallout with the provided container property', () => { const fixture = createFixture(); diff --git a/spec/javascripts/registry/components/app_spec.js b/spec/javascripts/registry/components/app_spec.js index 7b9b8d2b039..e7675669f7a 100644 --- a/spec/javascripts/registry/components/app_spec.js +++ b/spec/javascripts/registry/components/app_spec.js @@ -106,7 +106,7 @@ describe('Registry List', () => { it('should render a loading spinner', done => { Vue.nextTick(() => { - expect(vm.$el.querySelector('.spinner')).not.toBe(null); + expect(vm.$el.querySelector('.gl-spinner')).not.toBe(null); done(); }); }); diff --git a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js index a17494966a3..1f1e626ed33 100644 --- a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js +++ b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js @@ -34,7 +34,7 @@ describe('Grouped Test Reports App', () => { it('renders success summary text', done => { setTimeout(() => { - expect(vm.$el.querySelector('.fa-spinner')).toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary contained no changed test results out of 11 total tests', ); @@ -61,7 +61,7 @@ describe('Grouped Test Reports App', () => { it('renders success summary text', done => { setTimeout(() => { - expect(vm.$el.querySelector('.spinner')).not.toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).not.toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary results are being parsed', ); @@ -81,7 +81,7 @@ describe('Grouped Test Reports App', () => { it('renders failed summary text + new badge', done => { setTimeout(() => { - expect(vm.$el.querySelector('.spinner')).toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary contained 2 failed test results out of 11 total tests', ); @@ -109,7 +109,7 @@ describe('Grouped Test Reports App', () => { it('renders summary text', done => { setTimeout(() => { - expect(vm.$el.querySelector('.spinner')).toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary contained 2 failed test results and 2 fixed test results out of 11 total tests', ); @@ -137,7 +137,7 @@ describe('Grouped Test Reports App', () => { it('renders summary text', done => { setTimeout(() => { - expect(vm.$el.querySelector('.spinner')).toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary contained 2 fixed test results out of 11 total tests', ); @@ -190,7 +190,7 @@ describe('Grouped Test Reports App', () => { }); it('renders loading summary text with loading icon', done => { - expect(vm.$el.querySelector('.spinner')).not.toBeNull(); + expect(vm.$el.querySelector('.gl-spinner')).not.toBeNull(); expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual( 'Test summary results are being parsed', ); diff --git a/spec/javascripts/test_constants.js b/spec/javascripts/test_constants.js index 77c206585fe..c97d47a6406 100644 --- a/spec/javascripts/test_constants.js +++ b/spec/javascripts/test_constants.js @@ -1,6 +1,4 @@ -export const FIXTURES_PATH = `/base/${ - process.env.IS_GITLAB_EE ? 'ee/' : '' -}spec/javascripts/fixtures`; +export const FIXTURES_PATH = `/fixtures`; export const TEST_HOST = 'http://test.host'; export const DUMMY_IMAGE_URL = `${FIXTURES_PATH}/static/images/one_white_pixel.png`; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js index f622f52a7b9..5aac37d28df 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js @@ -18,7 +18,7 @@ describe('MR widget status icon component', () => { it('renders loading icon', () => { vm = mountComponent(Component, { status: 'loading' }); - expect(vm.$el.querySelector('.mr-widget-icon span').classList).toContain('spinner'); + expect(vm.$el.querySelector('.mr-widget-icon span').classList).toContain('gl-spinner'); }); }); diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js index d93badf8cd3..55a11a72551 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_failed_spec.js @@ -38,7 +38,9 @@ describe('MRWidgetAutoMergeFailed', () => { Vue.nextTick(() => { expect(vm.$el.querySelector('button').getAttribute('disabled')).toEqual('disabled'); - expect(vm.$el.querySelector('button .loading-container span').classList).toContain('spinner'); + expect(vm.$el.querySelector('button .loading-container span').classList).toContain( + 'gl-spinner', + ); done(); }); }); diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js index 96e512d222a..70c70eca746 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js @@ -20,7 +20,7 @@ describe('MRWidgetChecking', () => { }); it('renders loading icon', () => { - expect(vm.$el.querySelector('.mr-widget-icon span').classList).toContain('spinner'); + expect(vm.$el.querySelector('.mr-widget-icon span').classList).toContain('gl-spinner'); }); it('renders information about merging', () => { diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_squash_before_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_squash_before_merge_spec.js index d6d8eecfcb9..cb656525f06 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_squash_before_merge_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_squash_before_merge_spec.js @@ -21,7 +21,7 @@ describe('Squash before merge component', () => { }); describe('checkbox', () => { - const findCheckbox = () => wrapper.find('.qa-squash-checkbox'); + const findCheckbox = () => wrapper.find('.js-squash-checkbox'); it('is unchecked if passed value prop is false', () => { createComponent({ diff --git a/spec/javascripts/vue_shared/components/file_icon_spec.js b/spec/javascripts/vue_shared/components/file_icon_spec.js index 5bea8c43da3..1f61e19fa84 100644 --- a/spec/javascripts/vue_shared/components/file_icon_spec.js +++ b/spec/javascripts/vue_shared/components/file_icon_spec.js @@ -72,7 +72,7 @@ describe('File Icon component', () => { const { classList } = vm.$el.querySelector('.loading-container span'); - expect(classList.contains('spinner')).toEqual(true); + expect(classList.contains('gl-spinner')).toEqual(true); }); it('should add a special class and a size class', () => { diff --git a/spec/javascripts/vue_shared/components/header_ci_component_spec.js b/spec/javascripts/vue_shared/components/header_ci_component_spec.js index a9c1a67b39b..2b059e5e9f4 100644 --- a/spec/javascripts/vue_shared/components/header_ci_component_spec.js +++ b/spec/javascripts/vue_shared/components/header_ci_component_spec.js @@ -88,7 +88,7 @@ describe('Header CI Component', () => { vm.actions[0].isLoading = true; Vue.nextTick(() => { - expect(vm.$el.querySelector('.btn .spinner').getAttribute('style')).toBeFalsy(); + expect(vm.$el.querySelector('.btn .gl-spinner').getAttribute('style')).toBeFalsy(); done(); }); }); diff --git a/spec/javascripts/vue_shared/components/markdown/suggestion_diff_spec.js b/spec/javascripts/vue_shared/components/markdown/suggestion_diff_spec.js index ea74cb9eb21..dc929e83eb7 100644 --- a/spec/javascripts/vue_shared/components/markdown/suggestion_diff_spec.js +++ b/spec/javascripts/vue_shared/components/markdown/suggestion_diff_spec.js @@ -60,7 +60,7 @@ describe('Suggestion Diff component', () => { describe('init', () => { it('renders a suggestion header', () => { - expect(vm.$el.querySelector('.qa-suggestion-diff-header')).not.toBeNull(); + expect(vm.$el.querySelector('.js-suggestion-diff-header')).not.toBeNull(); }); it('renders a diff table with syntax highlighting', () => { |