From 293364c893bd64cf2fe2521c5b4bb2485ab09773 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 19 Apr 2018 09:27:16 +0100 Subject: updated styling changed to include new files added getter spec --- spec/javascripts/ide/stores/getters_spec.js | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'spec') diff --git a/spec/javascripts/ide/stores/getters_spec.js b/spec/javascripts/ide/stores/getters_spec.js index 33733b97dff..dc5b437473e 100644 --- a/spec/javascripts/ide/stores/getters_spec.js +++ b/spec/javascripts/ide/stores/getters_spec.js @@ -72,4 +72,37 @@ describe('IDE store getters', () => { expect(getters.currentMergeRequest(localState)).toBeNull(); }); }); + + describe('getChangesInFolder', () => { + it('returns length of changed files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'testing/123', + name: '123', + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(1); + }); + + it('returns length of changed & tempFiles files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'test/newfile', + name: 'newfile', + tempFile: true, + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(2); + }); + }); }); -- cgit v1.2.1 From dba40985d7318c75f1e09dab29792961f89429dd Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 19 Apr 2018 14:41:51 +0100 Subject: added support for staged files --- spec/javascripts/ide/stores/getters_spec.js | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'spec') diff --git a/spec/javascripts/ide/stores/getters_spec.js b/spec/javascripts/ide/stores/getters_spec.js index ae734805ec8..cfb259c7130 100644 --- a/spec/javascripts/ide/stores/getters_spec.js +++ b/spec/javascripts/ide/stores/getters_spec.js @@ -81,6 +81,36 @@ describe('IDE store getters', () => { expect(getters.getChangesInFolder(localState)('test')).toBe(1); }); + it('returns length of changed & staged files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'testing/123', + name: '123', + }, + ); + + localState.stagedFiles.push( + { + path: 'test/123', + name: '123', + }, + { + path: 'test/index', + name: 'index', + }, + { + path: 'testing/12345', + name: '12345', + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(2); + }); + it('returns length of changed & tempFiles files for a path', () => { localState.changedFiles.push( { -- cgit v1.2.1 From efdd9e1ad41858ed3b90a8f03124a99b5cde67be Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 20 Apr 2018 12:20:00 +0100 Subject: added component spec --- spec/javascripts/ide/components/repo_file_spec.js | 30 +++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'spec') diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js index ff391cb4351..25fc4aac9dd 100644 --- a/spec/javascripts/ide/components/repo_file_spec.js +++ b/spec/javascripts/ide/components/repo_file_spec.js @@ -48,6 +48,33 @@ describe('RepoFile', () => { }); }); + describe('folder', () => { + it('renders changes count inside folder', () => { + const f = { + ...file('folder'), + path: 'testing', + type: 'tree', + branchId: 'master', + projectId: 'project', + }; + + store.state.changedFiles.push({ + ...file('index'), + path: 'testing/index', + }); + + createComponent({ + file: f, + level: 0, + }); + + const treeChangesEl = vm.$el.querySelector('.ide-tree-changes'); + + expect(treeChangesEl).not.toBeNull(); + expect(treeChangesEl.textContent).toContain('1'); + }); + }); + describe('locked file', () => { let f; @@ -72,8 +99,7 @@ describe('RepoFile', () => { it('renders a tooltip', () => { expect( - vm.$el.querySelector('.ide-file-name span:nth-child(2)').dataset - .originalTitle, + vm.$el.querySelector('.ide-file-name span:nth-child(2)').dataset.originalTitle, ).toContain('Locked by testuser'); }); }); -- cgit v1.2.1 From a6ddf230ce32c13cf8ffbddeaaf47cac2350a7b4 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 20 Apr 2018 17:53:55 +0100 Subject: removed horrible getter & instead prefer the state the state now gets updated whenever a file is changed/discard --- spec/javascripts/ide/stores/getters_spec.js | 63 ----------------------------- 1 file changed, 63 deletions(-) (limited to 'spec') diff --git a/spec/javascripts/ide/stores/getters_spec.js b/spec/javascripts/ide/stores/getters_spec.js index cfb259c7130..8d04b83928c 100644 --- a/spec/javascripts/ide/stores/getters_spec.js +++ b/spec/javascripts/ide/stores/getters_spec.js @@ -64,67 +64,4 @@ describe('IDE store getters', () => { expect(getters.currentMergeRequest(localState)).toBeNull(); }); }); - - describe('getChangesInFolder', () => { - it('returns length of changed files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'testing/123', - name: '123', - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(1); - }); - - it('returns length of changed & staged files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'testing/123', - name: '123', - }, - ); - - localState.stagedFiles.push( - { - path: 'test/123', - name: '123', - }, - { - path: 'test/index', - name: 'index', - }, - { - path: 'testing/12345', - name: '12345', - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(2); - }); - - it('returns length of changed & tempFiles files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'test/newfile', - name: 'newfile', - tempFile: true, - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(2); - }); - }); }); -- cgit v1.2.1 From 9a07bc819f137a3077784a33e1b36bf6797d9547 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 1 Mar 2017 13:07:24 +0100 Subject: add misssing scope specs --- spec/models/ci/runner_spec.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index ab170e6351c..529f200b43a 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -49,6 +49,25 @@ describe Ci::Runner do end end + describe 'scopes' do + describe 'owned_or_shared' do + it 'returns the specific project runner' do + specific_project = create :project + other_project = create :project + specific_runner = create :ci_runner, :specific, projects: [specific_project] + other_runner = create :ci_runner, :specific, projects: [other_project] + + expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] + end + + it 'returns the shared projects' do + runner = create :ci_runner, :shared + + expect(described_class.owned_or_shared(0)).to eq [runner] + end + end + end + describe '#display_name' do it 'returns the description if it has a value' do runner = FactoryBot.build(:ci_runner, description: 'Linux/Ruby-1.9.3-p448') -- cgit v1.2.1 From 295184f6a5ff0b98340c32e0cc715dafa4d9b60c Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 1 Mar 2017 17:19:12 +0100 Subject: include group runners in scope --- spec/models/ci/runner_spec.rb | 50 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 529f200b43a..477540fb3b0 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -52,19 +52,61 @@ describe Ci::Runner do describe 'scopes' do describe 'owned_or_shared' do it 'returns the specific project runner' do + # own specific_project = create :project - other_project = create :project specific_runner = create :ci_runner, :specific, projects: [specific_project] - other_runner = create :ci_runner, :specific, projects: [other_project] + + # other + other_project = create :project + create :ci_runner, :specific, projects: [other_project] expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] end - it 'returns the shared projects' do - runner = create :ci_runner, :shared + it 'returns the shared project runner' do + project = create :project + runner = create :ci_runner, :shared, projects: [project] expect(described_class.owned_or_shared(0)).to eq [runner] end + + it 'returns the specific group runner' do + # own + specific_group = create :group + specific_project = create :project, group: specific_group + specific_runner = create :ci_runner, :specific, groups: [specific_group] + + # other + other_group = create :group + create :project, group: other_group + create :ci_runner, :specific, groups: [other_group] + + expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] + end + + it 'returns the shared group runner' do + group = create :group + runner = create :ci_runner, :shared, groups: [group] + + expect(described_class.owned_or_shared(0)).to eq [runner] + end + + it 'returns a globally shared, a project specific and a group specific runner' do + # group specific + group = create :group + project = create :project, group: group + group_runner = create :ci_runner, :specific, groups: [group] + + # project specific + project_runner = create :ci_runner, :specific, projects: [project] + + # globally shared + shared_runner = create :ci_runner, :shared + + expect(described_class.owned_or_shared(project.id)).to match_array [ + group_runner, project_runner, shared_runner + ] + end end end -- cgit v1.2.1 From 14c8dbc66537e59d9a01fe5e8ad64ba559254f14 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 6 Sep 2017 11:26:55 +0200 Subject: drop 'scopes' context from specs --- spec/models/ci/runner_spec.rb | 88 +++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 45 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 477540fb3b0..5a851a3d559 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -49,64 +49,62 @@ describe Ci::Runner do end end - describe 'scopes' do - describe 'owned_or_shared' do - it 'returns the specific project runner' do - # own - specific_project = create :project - specific_runner = create :ci_runner, :specific, projects: [specific_project] + describe '.owned_or_shared' do + it 'returns the specific project runner' do + # own + specific_project = create :project + specific_runner = create :ci_runner, :specific, projects: [specific_project] - # other - other_project = create :project - create :ci_runner, :specific, projects: [other_project] + # other + other_project = create :project + create :ci_runner, :specific, projects: [other_project] - expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] - end + expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] + end - it 'returns the shared project runner' do - project = create :project - runner = create :ci_runner, :shared, projects: [project] + it 'returns the shared project runner' do + project = create :project + runner = create :ci_runner, :shared, projects: [project] - expect(described_class.owned_or_shared(0)).to eq [runner] - end + expect(described_class.owned_or_shared(0)).to eq [runner] + end - it 'returns the specific group runner' do - # own - specific_group = create :group - specific_project = create :project, group: specific_group - specific_runner = create :ci_runner, :specific, groups: [specific_group] + it 'returns the specific group runner' do + # own + specific_group = create :group + specific_project = create :project, group: specific_group + specific_runner = create :ci_runner, :specific, groups: [specific_group] - # other - other_group = create :group - create :project, group: other_group - create :ci_runner, :specific, groups: [other_group] + # other + other_group = create :group + create :project, group: other_group + create :ci_runner, :specific, groups: [other_group] - expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] - end + expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] + end - it 'returns the shared group runner' do - group = create :group - runner = create :ci_runner, :shared, groups: [group] + it 'returns the shared group runner' do + group = create :group + runner = create :ci_runner, :shared, groups: [group] - expect(described_class.owned_or_shared(0)).to eq [runner] - end + expect(described_class.owned_or_shared(0)).to eq [runner] + end - it 'returns a globally shared, a project specific and a group specific runner' do - # group specific - group = create :group - project = create :project, group: group - group_runner = create :ci_runner, :specific, groups: [group] + it 'returns a globally shared, a project specific and a group specific runner' do + # group specific + group = create :group + project = create :project, group: group + group_runner = create :ci_runner, :specific, groups: [group] - # project specific - project_runner = create :ci_runner, :specific, projects: [project] + # project specific + project_runner = create :ci_runner, :specific, projects: [project] - # globally shared - shared_runner = create :ci_runner, :shared + # globally shared + shared_runner = create :ci_runner, :shared - expect(described_class.owned_or_shared(project.id)).to match_array [ - group_runner, project_runner, shared_runner - ] - end + expect(described_class.owned_or_shared(project.id)).to match_array [ + group_runner, project_runner, shared_runner + ] end end -- cgit v1.2.1 From 7fbdd17cbcd19086694f575884191a6d137838dc Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 7 Sep 2017 15:49:29 +0200 Subject: authorize group runners on user --- spec/models/user_spec.rb | 64 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 12 deletions(-) (limited to 'spec') diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 35db7616efb..f384b688889 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1785,14 +1785,12 @@ describe User do describe '#ci_authorized_runners' do let(:user) { create(:user) } - let(:runner) { create(:ci_runner) } + let(:runner_1) { create(:ci_runner) } + let(:runner_2) { create(:ci_runner) } - before do - project.runners << runner - end - - context 'without any projects' do - let(:project) { create(:project) } + context 'without any projects nor groups' do + let!(:project) { create(:project, runners: [runner_1]) } + let!(:group) { create(:group) } it 'does not load' do expect(user.ci_authorized_runners).to be_empty @@ -1801,10 +1799,38 @@ describe User do context 'with personal projects runners' do let(:namespace) { create(:namespace, owner: user) } - let(:project) { create(:project, namespace: namespace) } + let!(:project) { create(:project, namespace: namespace, runners: [runner_1]) } it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner) + expect(user.ci_authorized_runners).to contain_exactly(runner_1) + end + end + + context 'with personal group runner' do + let!(:project) { create(:project, runners: [runner_1]) } + let!(:group) do + create(:group, runners: [runner_2]).tap do |group| + group.add_owner(user) + end + end + + it 'loads' do + expect(user.ci_authorized_runners).to contain_exactly(runner_2) + end + end + + context 'with personal project and group runner' do + let(:namespace) { create(:namespace, owner: user) } + let!(:project) { create(:project, namespace: namespace, runners: [runner_1]) } + + let!(:group) do + create(:group, runners: [runner_2]).tap do |group| + group.add_owner(user) + end + end + + it 'loads' do + expect(user.ci_authorized_runners).to contain_exactly(runner_1, runner_2) end end @@ -1815,7 +1841,7 @@ describe User do end it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner) + expect(user.ci_authorized_runners).to contain_exactly(runner_1) end end @@ -1832,7 +1858,21 @@ describe User do context 'with groups projects runners' do let(:group) { create(:group) } - let(:project) { create(:project, group: group) } + let!(:project) { create(:project, group: group, runners: [runner_1]) } + + def add_user(access) + group.add_user(user, access) + end + + it_behaves_like :member + end + + context 'with groups runners' do + let!(:group) do + create(:group, runners: [runner_1]).tap do |group| + group.add_owner(user) + end + end def add_user(access) group.add_user(user, access) @@ -1842,7 +1882,7 @@ describe User do end context 'with other projects runners' do - let(:project) { create(:project) } + let!(:project) { create(:project, runners: [runner_1]) } def add_user(access) project.add_role(user, access) -- cgit v1.2.1 From b55c3a7bc4c23618860916738702b5d62820c351 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 12 Sep 2017 11:34:34 +0200 Subject: support group runners in existing API endpoints --- spec/requests/api/runner_spec.rb | 15 ++- spec/requests/api/runners_spec.rb | 219 +++++++++++++++++++++++++---------- spec/requests/api/v3/runners_spec.rb | 57 +++++++-- 3 files changed, 218 insertions(+), 73 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index 17c7a511857..5ea110b4d82 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -45,7 +45,7 @@ describe API::Runner do context 'when project token is used' do let(:project) { create(:project) } - it 'creates runner' do + it 'creates project runner' do post api('/runners'), token: project.runners_token expect(response).to have_gitlab_http_status 201 @@ -54,6 +54,19 @@ describe API::Runner do expect(Ci::Runner.first.token).not_to eq(project.runners_token) end end + + context 'when group token is used' do + let(:group) { create(:group) } + + it 'creates a group runner' do + post api('/runners'), token: group.runners_token + + expect(response).to have_http_status 201 + expect(group.runners.size).to eq(1) + expect(Ci::Runner.first.token).not_to eq(registration_token) + expect(Ci::Runner.first.token).not_to eq(group.runners_token) + end + end end context 'when runner description is provided' do diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index d30f0cf36e2..5a2d607960e 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -8,22 +8,29 @@ describe API::Runners do let(:project) { create(:project, creator_id: user.id) } let(:project2) { create(:project, creator_id: user.id) } - let!(:shared_runner) { create(:ci_runner, :shared) } - let!(:unused_specific_runner) { create(:ci_runner) } + let(:group) { create(:group).tap { |group| group.add_owner(user) } } + let(:group2) { create(:group).tap { |group| group.add_owner(user) } } - let!(:specific_runner) do - create(:ci_runner).tap do |runner| + let!(:shared_runner) { create(:ci_runner, :shared, description: 'Shared runner') } + let!(:unused_project_runner) { create(:ci_runner) } + + let!(:project_runner) do + create(:ci_runner, description: 'Project runner').tap do |runner| create(:ci_runner_project, runner: runner, project: project) end end let!(:two_projects_runner) do - create(:ci_runner).tap do |runner| + create(:ci_runner, description: 'Two projects runner').tap do |runner| create(:ci_runner_project, runner: runner, project: project) create(:ci_runner_project, runner: runner, project: project2) end end + let!(:group_runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } + + let!(:two_groups_runner) { create(:ci_runner, description: 'Two groups runner', groups: [group, group2]) } + before do # Set project access for users create(:project_member, :master, user: user, project: project) @@ -37,9 +44,13 @@ describe API::Runners do get api('/runners', user) shared = json_response.any? { |r| r['is_shared'] } + descriptions = json_response.map { |runner| runner['description'] } expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(descriptions).to contain_exactly( + 'Project runner', 'Group runner', 'Two projects runner', 'Two groups runner' + ) expect(shared).to be_falsey end @@ -129,10 +140,26 @@ describe API::Runners do context 'when runner is not shared' do it "returns runner's details" do - get api("/runners/#{specific_runner.id}", admin) + get api("/runners/#{project_runner.id}", admin) expect(response).to have_gitlab_http_status(200) - expect(json_response['description']).to eq(specific_runner.description) + expect(json_response['description']).to eq(project_runner.description) + end + + it "returns the project's details for a project runner" do + get api("/runners/#{project_runner.id}", admin) + + expect(json_response['projects'].first['id']).to eq(project.id) + end + + it "returns the group's details for a group runner" do + get api("/runners/#{group_runner.id}", admin) + + expect(json_response['groups'].first).to eq( + 'id' => group.id, + 'web_url' => group.web_url, + 'name' => group.name + ) end end @@ -146,10 +173,10 @@ describe API::Runners do context "runner project's administrative user" do context 'when runner is not shared' do it "returns runner's details" do - get api("/runners/#{specific_runner.id}", user) + get api("/runners/#{project_runner.id}", user) expect(response).to have_gitlab_http_status(200) - expect(json_response['description']).to eq(specific_runner.description) + expect(json_response['description']).to eq(project_runner.description) end end @@ -163,17 +190,40 @@ describe API::Runners do end end + context "runner group's administrative user" do + context 'when runner is not shared' do + it "returns runner's details" do + get api("/runners/#{group_runner.id}", user) + + expect(response).to have_http_status(200) + expect(json_response['id']).to eq(group_runner.id) + end + end + end + context 'other authorized user' do - it "does not return runner's details" do - get api("/runners/#{specific_runner.id}", user2) + it "does not return project runner's details" do + get api("/runners/#{project_runner.id}", user2) + + expect(response).to have_http_status(403) + end + + it "does not return group runner's details" do + get api("/runners/#{group_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end end context 'unauthorized user' do - it "does not return runner's details" do - get api("/runners/#{specific_runner.id}") + it "does not return project runner's details" do + get api("/runners/#{project_runner.id}") + + expect(response).to have_http_status(401) + end + + it "does not return group runner's details" do + get api("/runners/#{group_runner.id}") expect(response).to have_gitlab_http_status(401) end @@ -212,16 +262,16 @@ describe API::Runners do context 'when runner is not shared' do it 'updates runner' do - description = specific_runner.description - runner_queue_value = specific_runner.ensure_runner_queue_value + description = project_runner.description + runner_queue_value = project_runner.ensure_runner_queue_value - update_runner(specific_runner.id, admin, description: 'test') - specific_runner.reload + update_runner(project_runner.id, admin, description: 'test') + project_runner.reload expect(response).to have_gitlab_http_status(200) - expect(specific_runner.description).to eq('test') - expect(specific_runner.description).not_to eq(description) - expect(specific_runner.ensure_runner_queue_value) + expect(project_runner.description).to eq('test') + expect(project_runner.description).not_to eq(description) + expect(project_runner.ensure_runner_queue_value) .not_to eq(runner_queue_value) end end @@ -247,27 +297,49 @@ describe API::Runners do end context 'when runner is not shared' do - it 'does not update runner without access to it' do - put api("/runners/#{specific_runner.id}", user2), description: 'test' + it 'does not update project runner without access to it' do + put api("/runners/#{project_runner.id}", user2), description: 'test' + + expect(response).to have_http_status(403) + end + + it 'does not update group runner without access to it' do + put api("/runners/#{group_runner.id}", user2), description: 'test' expect(response).to have_gitlab_http_status(403) end - it 'updates runner with access to it' do - description = specific_runner.description - put api("/runners/#{specific_runner.id}", admin), description: 'test' - specific_runner.reload + it 'updates project runner with access to it' do + description = project_runner.description + put api("/runners/#{project_runner.id}", admin), description: 'test' + project_runner.reload + + expect(response).to have_gitlab_http_status(200) + expect(project_runner.description).to eq('test') + expect(project_runner.description).not_to eq(description) + end + + it 'updates group runner with access to it' do + description = group_runner.description + put api("/runners/#{group_runner.id}", admin), description: 'test' + group_runner.reload expect(response).to have_gitlab_http_status(200) - expect(specific_runner.description).to eq('test') - expect(specific_runner.description).not_to eq(description) + expect(group_runner.description).to eq('test') + expect(group_runner.description).not_to eq(description) end end end context 'unauthorized user' do - it 'does not delete runner' do - put api("/runners/#{specific_runner.id}") + it 'does not delete project runner' do + put api("/runners/#{project_runner.id}") + + expect(response).to have_http_status(401) + end + + it 'does not delete group runner' do + put api("/runners/#{group_runner.id}") expect(response).to have_gitlab_http_status(401) end @@ -293,15 +365,23 @@ describe API::Runners do context 'when runner is not shared' do it 'deletes unused runner' do expect do - delete api("/runners/#{unused_specific_runner.id}", admin) + delete api("/runners/#{unused_project_runner.id}", admin) expect(response).to have_gitlab_http_status(204) end.to change { Ci::Runner.specific.count }.by(-1) end - it 'deletes used runner' do + it 'deletes used project runner' do expect do - delete api("/runners/#{specific_runner.id}", admin) + delete api("/runners/#{project_runner.id}", admin) + + expect(response).to have_http_status(204) + end.to change { Ci::Runner.specific.count }.by(-1) + end + + it 'deletes used group runner' do + expect do + delete api("/runners/#{group_runner.id}", admin) expect(response).to have_gitlab_http_status(204) end.to change { Ci::Runner.specific.count }.by(-1) @@ -325,32 +405,51 @@ describe API::Runners do context 'when runner is not shared' do it 'does not delete runner without access to it' do - delete api("/runners/#{specific_runner.id}", user2) + delete api("/runners/#{project_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end - it 'does not delete runner with more than one associated project' do + it 'does not delete project runner with more than one associated project' do delete api("/runners/#{two_projects_runner.id}", user) expect(response).to have_gitlab_http_status(403) end - it 'deletes runner for one owned project' do + it 'deletes project runner for one owned project' do expect do - delete api("/runners/#{specific_runner.id}", user) + delete api("/runners/#{project_runner.id}", user) + + expect(response).to have_http_status(204) + end.to change { Ci::Runner.specific.count }.by(-1) + end + + it 'does not delete group runner with more than one associated group' do + delete api("/runners/#{two_groups_runner.id}", user) + expect(response).to have_http_status(403) + end + + it 'deletes group runner for one owned group' do + expect do + delete api("/runners/#{group_runner.id}", user) expect(response).to have_gitlab_http_status(204) end.to change { Ci::Runner.specific.count }.by(-1) end it_behaves_like '412 response' do - let(:request) { api("/runners/#{specific_runner.id}", user) } + let(:request) { api("/runners/#{project_runner.id}", user) } end end end context 'unauthorized user' do - it 'does not delete runner' do - delete api("/runners/#{specific_runner.id}") + it 'does not delete project runner' do + delete api("/runners/#{project_runner.id}") + + expect(response).to have_http_status(401) + end + + it 'does not delete group runner' do + delete api("/runners/#{group_runner.id}") expect(response).to have_gitlab_http_status(401) end @@ -361,8 +460,8 @@ describe API::Runners do set(:job_1) { create(:ci_build) } let!(:job_2) { create(:ci_build, :running, runner: shared_runner, project: project) } let!(:job_3) { create(:ci_build, :failed, runner: shared_runner, project: project) } - let!(:job_4) { create(:ci_build, :running, runner: specific_runner, project: project) } - let!(:job_5) { create(:ci_build, :failed, runner: specific_runner, project: project) } + let!(:job_4) { create(:ci_build, :running, runner: project_runner, project: project) } + let!(:job_5) { create(:ci_build, :failed, runner: project_runner, project: project) } context 'admin user' do context 'when runner exists' do @@ -380,7 +479,7 @@ describe API::Runners do context 'when runner is specific' do it 'return jobs' do - get api("/runners/#{specific_runner.id}/jobs", admin) + get api("/runners/#{project_runner.id}/jobs", admin) expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers @@ -392,7 +491,7 @@ describe API::Runners do context 'when valid status is provided' do it 'return filtered jobs' do - get api("/runners/#{specific_runner.id}/jobs?status=failed", admin) + get api("/runners/#{project_runner.id}/jobs?status=failed", admin) expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers @@ -405,7 +504,7 @@ describe API::Runners do context 'when invalid status is provided' do it 'return 400' do - get api("/runners/#{specific_runner.id}/jobs?status=non-existing", admin) + get api("/runners/#{project_runner.id}/jobs?status=non-existing", admin) expect(response).to have_gitlab_http_status(400) end @@ -433,7 +532,7 @@ describe API::Runners do context 'when runner is specific' do it 'return jobs' do - get api("/runners/#{specific_runner.id}/jobs", user) + get api("/runners/#{project_runner.id}/jobs", user) expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers @@ -445,7 +544,7 @@ describe API::Runners do context 'when valid status is provided' do it 'return filtered jobs' do - get api("/runners/#{specific_runner.id}/jobs?status=failed", user) + get api("/runners/#{project_runner.id}/jobs?status=failed", user) expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers @@ -458,7 +557,7 @@ describe API::Runners do context 'when invalid status is provided' do it 'return 400' do - get api("/runners/#{specific_runner.id}/jobs?status=non-existing", user) + get api("/runners/#{project_runner.id}/jobs?status=non-existing", user) expect(response).to have_gitlab_http_status(400) end @@ -476,7 +575,7 @@ describe API::Runners do context 'other authorized user' do it 'does not return jobs' do - get api("/runners/#{specific_runner.id}/jobs", user2) + get api("/runners/#{project_runner.id}/jobs", user2) expect(response).to have_gitlab_http_status(403) end @@ -484,7 +583,7 @@ describe API::Runners do context 'unauthorized user' do it 'does not return jobs' do - get api("/runners/#{specific_runner.id}/jobs") + get api("/runners/#{project_runner.id}/jobs") expect(response).to have_gitlab_http_status(401) end @@ -523,7 +622,7 @@ describe API::Runners do describe 'POST /projects/:id/runners' do context 'authorized user' do - let(:specific_runner2) do + let(:project_runner2) do create(:ci_runner).tap do |runner| create(:ci_runner_project, runner: runner, project: project2) end @@ -531,23 +630,23 @@ describe API::Runners do it 'enables specific runner' do expect do - post api("/projects/#{project.id}/runners", user), runner_id: specific_runner2.id + post api("/projects/#{project.id}/runners", user), runner_id: project_runner2.id end.to change { project.runners.count }.by(+1) expect(response).to have_gitlab_http_status(201) end it 'avoids changes when enabling already enabled runner' do expect do - post api("/projects/#{project.id}/runners", user), runner_id: specific_runner.id + post api("/projects/#{project.id}/runners", user), runner_id: project_runner.id end.to change { project.runners.count }.by(0) expect(response).to have_gitlab_http_status(409) end it 'does not enable locked runner' do - specific_runner2.update(locked: true) + project_runner2.update(locked: true) expect do - post api("/projects/#{project.id}/runners", user), runner_id: specific_runner2.id + post api("/projects/#{project.id}/runners", user), runner_id: project_runner2.id end.to change { project.runners.count }.by(0) expect(response).to have_gitlab_http_status(403) @@ -562,7 +661,7 @@ describe API::Runners do context 'user is admin' do it 'enables any specific runner' do expect do - post api("/projects/#{project.id}/runners", admin), runner_id: unused_specific_runner.id + post api("/projects/#{project.id}/runners", admin), runner_id: unused_project_runner.id end.to change { project.runners.count }.by(+1) expect(response).to have_gitlab_http_status(201) end @@ -570,7 +669,7 @@ describe API::Runners do context 'user is not admin' do it 'does not enable runner without access to' do - post api("/projects/#{project.id}/runners", user), runner_id: unused_specific_runner.id + post api("/projects/#{project.id}/runners", user), runner_id: unused_project_runner.id expect(response).to have_gitlab_http_status(403) end @@ -619,7 +718,7 @@ describe API::Runners do context 'when runner have one associated projects' do it "does not disable project's runner" do expect do - delete api("/projects/#{project.id}/runners/#{specific_runner.id}", user) + delete api("/projects/#{project.id}/runners/#{project_runner.id}", user) end.to change { project.runners.count }.by(0) expect(response).to have_gitlab_http_status(403) end @@ -634,7 +733,7 @@ describe API::Runners do context 'authorized user without permissions' do it "does not disable project's runner" do - delete api("/projects/#{project.id}/runners/#{specific_runner.id}", user2) + delete api("/projects/#{project.id}/runners/#{project_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end @@ -642,7 +741,7 @@ describe API::Runners do context 'unauthorized user' do it "does not disable project's runner" do - delete api("/projects/#{project.id}/runners/#{specific_runner.id}") + delete api("/projects/#{project.id}/runners/#{project_runner.id}") expect(response).to have_gitlab_http_status(401) end diff --git a/spec/requests/api/v3/runners_spec.rb b/spec/requests/api/v3/runners_spec.rb index c91b097a3c7..c9a05407857 100644 --- a/spec/requests/api/v3/runners_spec.rb +++ b/spec/requests/api/v3/runners_spec.rb @@ -8,10 +8,16 @@ describe API::V3::Runners do let(:project) { create(:project, creator_id: user.id) } let(:project2) { create(:project, creator_id: user.id) } + let(:group) { create(:group).tap { |group| group.add_owner(user) } } + let(:group2) { create(:group).tap { |group| group.add_owner(user) } } + + let!(:group_runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } + let!(:two_groups_runner) { create(:ci_runner, description: 'Two groups runner', groups: [group, group2]) } + let!(:shared_runner) { create(:ci_runner, :shared) } let!(:unused_specific_runner) { create(:ci_runner) } - let!(:specific_runner) do + let!(:project_runner) do create(:ci_runner).tap do |runner| create(:ci_runner_project, runner: runner, project: project) end @@ -51,9 +57,17 @@ describe API::V3::Runners do end.to change { Ci::Runner.specific.count }.by(-1) end - it 'deletes used runner' do + it 'deletes used project runner' do expect do - delete v3_api("/runners/#{specific_runner.id}", admin) + delete v3_api("/runners/#{project_runner.id}", admin) + + expect(response).to have_http_status(200) + end.to change { Ci::Runner.specific.count }.by(-1) + end + + it 'deletes used group runner' do + expect do + delete v3_api("/runners/#{group_runner.id}", admin) expect(response).to have_gitlab_http_status(200) end.to change { Ci::Runner.specific.count }.by(-1) @@ -77,18 +91,31 @@ describe API::V3::Runners do context 'when runner is not shared' do it 'does not delete runner without access to it' do - delete v3_api("/runners/#{specific_runner.id}", user2) + delete v3_api("/runners/#{project_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end - it 'does not delete runner with more than one associated project' do + it 'does not delete project runner with more than one associated project' do delete v3_api("/runners/#{two_projects_runner.id}", user) expect(response).to have_gitlab_http_status(403) end - it 'deletes runner for one owned project' do + it 'deletes project runner for one owned project' do expect do - delete v3_api("/runners/#{specific_runner.id}", user) + delete v3_api("/runners/#{group_runner.id}", user) + + expect(response).to have_http_status(200) + end.to change { Ci::Runner.specific.count }.by(-1) + end + + it 'does not delete group runner with more than one associated project' do + delete v3_api("/runners/#{two_groups_runner.id}", user) + expect(response).to have_http_status(403) + end + + it 'deletes group runner for one owned project' do + expect do + delete v3_api("/runners/#{project_runner.id}", user) expect(response).to have_gitlab_http_status(200) end.to change { Ci::Runner.specific.count }.by(-1) @@ -97,8 +124,14 @@ describe API::V3::Runners do end context 'unauthorized user' do - it 'does not delete runner' do - delete v3_api("/runners/#{specific_runner.id}") + it 'does not delete project runner' do + delete v3_api("/runners/#{project_runner.id}") + + expect(response).to have_http_status(401) + end + + it 'does not delete group runner' do + delete v3_api("/runners/#{group_runner.id}") expect(response).to have_gitlab_http_status(401) end @@ -120,7 +153,7 @@ describe API::V3::Runners do context 'when runner have one associated projects' do it "does not disable project's runner" do expect do - delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}", user) + delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}", user) end.to change { project.runners.count }.by(0) expect(response).to have_gitlab_http_status(403) end @@ -135,7 +168,7 @@ describe API::V3::Runners do context 'authorized user without permissions' do it "does not disable project's runner" do - delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}", user2) + delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end @@ -143,7 +176,7 @@ describe API::V3::Runners do context 'unauthorized user' do it "does not disable project's runner" do - delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}") + delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}") expect(response).to have_gitlab_http_status(401) end -- cgit v1.2.1 From 32a9c85bd9a320984a17fa29cd6aaa3b45e0bf4c Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 25 Sep 2017 13:34:45 +0200 Subject: revert support for v3 api --- spec/requests/api/v3/runners_spec.rb | 57 ++++++++---------------------------- 1 file changed, 12 insertions(+), 45 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/v3/runners_spec.rb b/spec/requests/api/v3/runners_spec.rb index c9a05407857..c91b097a3c7 100644 --- a/spec/requests/api/v3/runners_spec.rb +++ b/spec/requests/api/v3/runners_spec.rb @@ -8,16 +8,10 @@ describe API::V3::Runners do let(:project) { create(:project, creator_id: user.id) } let(:project2) { create(:project, creator_id: user.id) } - let(:group) { create(:group).tap { |group| group.add_owner(user) } } - let(:group2) { create(:group).tap { |group| group.add_owner(user) } } - - let!(:group_runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } - let!(:two_groups_runner) { create(:ci_runner, description: 'Two groups runner', groups: [group, group2]) } - let!(:shared_runner) { create(:ci_runner, :shared) } let!(:unused_specific_runner) { create(:ci_runner) } - let!(:project_runner) do + let!(:specific_runner) do create(:ci_runner).tap do |runner| create(:ci_runner_project, runner: runner, project: project) end @@ -57,17 +51,9 @@ describe API::V3::Runners do end.to change { Ci::Runner.specific.count }.by(-1) end - it 'deletes used project runner' do + it 'deletes used runner' do expect do - delete v3_api("/runners/#{project_runner.id}", admin) - - expect(response).to have_http_status(200) - end.to change { Ci::Runner.specific.count }.by(-1) - end - - it 'deletes used group runner' do - expect do - delete v3_api("/runners/#{group_runner.id}", admin) + delete v3_api("/runners/#{specific_runner.id}", admin) expect(response).to have_gitlab_http_status(200) end.to change { Ci::Runner.specific.count }.by(-1) @@ -91,31 +77,18 @@ describe API::V3::Runners do context 'when runner is not shared' do it 'does not delete runner without access to it' do - delete v3_api("/runners/#{project_runner.id}", user2) + delete v3_api("/runners/#{specific_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end - it 'does not delete project runner with more than one associated project' do + it 'does not delete runner with more than one associated project' do delete v3_api("/runners/#{two_projects_runner.id}", user) expect(response).to have_gitlab_http_status(403) end - it 'deletes project runner for one owned project' do + it 'deletes runner for one owned project' do expect do - delete v3_api("/runners/#{group_runner.id}", user) - - expect(response).to have_http_status(200) - end.to change { Ci::Runner.specific.count }.by(-1) - end - - it 'does not delete group runner with more than one associated project' do - delete v3_api("/runners/#{two_groups_runner.id}", user) - expect(response).to have_http_status(403) - end - - it 'deletes group runner for one owned project' do - expect do - delete v3_api("/runners/#{project_runner.id}", user) + delete v3_api("/runners/#{specific_runner.id}", user) expect(response).to have_gitlab_http_status(200) end.to change { Ci::Runner.specific.count }.by(-1) @@ -124,14 +97,8 @@ describe API::V3::Runners do end context 'unauthorized user' do - it 'does not delete project runner' do - delete v3_api("/runners/#{project_runner.id}") - - expect(response).to have_http_status(401) - end - - it 'does not delete group runner' do - delete v3_api("/runners/#{group_runner.id}") + it 'does not delete runner' do + delete v3_api("/runners/#{specific_runner.id}") expect(response).to have_gitlab_http_status(401) end @@ -153,7 +120,7 @@ describe API::V3::Runners do context 'when runner have one associated projects' do it "does not disable project's runner" do expect do - delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}", user) + delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}", user) end.to change { project.runners.count }.by(0) expect(response).to have_gitlab_http_status(403) end @@ -168,7 +135,7 @@ describe API::V3::Runners do context 'authorized user without permissions' do it "does not disable project's runner" do - delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}", user2) + delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}", user2) expect(response).to have_gitlab_http_status(403) end @@ -176,7 +143,7 @@ describe API::V3::Runners do context 'unauthorized user' do it "does not disable project's runner" do - delete v3_api("/projects/#{project.id}/runners/#{project_runner.id}") + delete v3_api("/projects/#{project.id}/runners/#{specific_runner.id}") expect(response).to have_gitlab_http_status(401) end -- cgit v1.2.1 From 4b1b2f3b104df455d5d3265adca92dd09e079ee9 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 25 Sep 2017 15:28:33 +0200 Subject: add Ci::Runner#group? method --- spec/models/ci/runner_spec.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 5a851a3d559..b9aafa63493 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -642,4 +642,28 @@ describe Ci::Runner do expect(described_class.search(runner.description.upcase)).to eq([runner]) end end + + describe 'group?' do + it 'returns false when the runner is a project runner' do + project = create :project + runner = create(:ci_runner, description: 'Project runner').tap do |r| + create :ci_runner_project, runner: r, project: project + end + + expect(runner.group?).to be false + end + + it 'returns false when the runner is a shared runner' do + runner = create :ci_runner, :shared, description: 'Shared runner' + + expect(runner.group?).to be false + end + + it 'returns true when the runner is assigned to a group' do + group = create :group + runner = create :ci_runner, description: 'Group runner', groups: [group] + + expect(runner.group?).to be true + end + end end -- cgit v1.2.1 From d0842d20758e2f33d44b41a250d361853abe47f4 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 25 Sep 2017 15:28:49 +0200 Subject: disallow group runners to become project runners --- spec/requests/api/runners_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'spec') diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index 5a2d607960e..ab807e399a4 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -658,6 +658,12 @@ describe API::Runners do expect(response).to have_gitlab_http_status(403) end + it 'does not enable group runner' do + post api("/projects/#{project.id}/runners", user), runner_id: group_runner.id + + expect(response).to have_http_status(403) + end + context 'user is admin' do it 'enables any specific runner' do expect do -- cgit v1.2.1 From 81c0c57acd0f065bc5b80902ee664256d4c3241f Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 25 Sep 2017 16:46:03 +0200 Subject: exclude group runners on projects that disabled it --- spec/models/ci/runner_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index b9aafa63493..933bd6e5f23 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -83,6 +83,14 @@ describe Ci::Runner do expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] end + it 'does not return the group runner if the project has group runners disabled' do + specific_group = create :group + specific_project = create :project, group: specific_group, group_runners_enabled: false + create :ci_runner, :specific, groups: [specific_group] + + expect(described_class.owned_or_shared(specific_project.id)).to be_empty + end + it 'returns the shared group runner' do group = create :group runner = create :ci_runner, :shared, groups: [group] -- cgit v1.2.1 From d6167a9214b3a3c13850cdac9895c9d7577ddf25 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 09:27:27 +0200 Subject: split up Ci::Runner.owned_or_shared scope --- spec/models/ci/runner_spec.rb | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 933bd6e5f23..a073af7c4b2 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -49,7 +49,23 @@ describe Ci::Runner do end end - describe '.owned_or_shared' do + describe '.shared' do + it 'returns the shared group runner' do + group = create :group + runner = create :ci_runner, :shared, groups: [group] + + expect(described_class.shared).to eq [runner] + end + + it 'returns the shared project runner' do + project = create :project + runner = create :ci_runner, :shared, projects: [project] + + expect(described_class.shared).to eq [runner] + end + end + + describe '.belonging_to_project' do it 'returns the specific project runner' do # own specific_project = create :project @@ -59,16 +75,11 @@ describe Ci::Runner do other_project = create :project create :ci_runner, :specific, projects: [other_project] - expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] - end - - it 'returns the shared project runner' do - project = create :project - runner = create :ci_runner, :shared, projects: [project] - - expect(described_class.owned_or_shared(0)).to eq [runner] + expect(described_class.belonging_to_project(specific_project.id)).to eq [specific_runner] end + end + describe '.belonging_to_group' do it 'returns the specific group runner' do # own specific_group = create :group @@ -80,7 +91,7 @@ describe Ci::Runner do create :project, group: other_group create :ci_runner, :specific, groups: [other_group] - expect(described_class.owned_or_shared(specific_project.id)).to eq [specific_runner] + expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner] end it 'does not return the group runner if the project has group runners disabled' do @@ -88,16 +99,11 @@ describe Ci::Runner do specific_project = create :project, group: specific_group, group_runners_enabled: false create :ci_runner, :specific, groups: [specific_group] - expect(described_class.owned_or_shared(specific_project.id)).to be_empty - end - - it 'returns the shared group runner' do - group = create :group - runner = create :ci_runner, :shared, groups: [group] - - expect(described_class.owned_or_shared(0)).to eq [runner] + expect(described_class.belonging_to_group(specific_project.id)).to be_empty end + end + describe '.owned_or_shared' do it 'returns a globally shared, a project specific and a group specific runner' do # group specific group = create :group -- cgit v1.2.1 From 8dad45a82228a6f1c87f919063d96c8b20a567e2 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 13:55:34 +0200 Subject: add method CI::Runner.project? --- spec/models/ci/runner_spec.rb | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index a073af7c4b2..308db9e8e68 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -660,9 +660,7 @@ describe Ci::Runner do describe 'group?' do it 'returns false when the runner is a project runner' do project = create :project - runner = create(:ci_runner, description: 'Project runner').tap do |r| - create :ci_runner_project, runner: r, project: project - end + runner = create :ci_runner, description: 'Project runner', projects: [project] expect(runner.group?).to be false end @@ -680,4 +678,26 @@ describe Ci::Runner do expect(runner.group?).to be true end end + + describe 'project?' do + it 'returns false when the runner is a group prunner' do + group = create :group + runner = create :ci_runner, description: 'Group runner', groups: [group] + + expect(runner.project?).to be false + end + + it 'returns false when the runner is a shared runner' do + runner = create :ci_runner, :shared, description: 'Shared runner' + + expect(runner.project?).to be false + end + + it 'returns true when the runner is assigned to a project' do + project = create :project + runner = create :ci_runner, description: 'Group runner', projects: [project] + + expect(runner.project?).to be true + end + end end -- cgit v1.2.1 From 4ccf734e380d498a2322153c9a4fa09a38447094 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 13:59:51 +0200 Subject: show group runners on runners page --- spec/features/runners_spec.rb | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'spec') diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index df65c2d2f83..f34aeb5bd5e 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -181,4 +181,44 @@ feature 'Runners' do expect(page.find('.shared-runners-description')).to have_content('Disable shared Runners') end end + + context 'group runners' do + background do + project.add_master(user) + end + + context 'project without a group' do + given(:project) { create :project } + + scenario 'group runners are not available' do + visit runners_path(project) + + expect(page).to have_content 'This project does not belong to a group and can therefore not make use of group Runners.' + end + end + + context 'project with a group but no group runner' do + given(:group) { create :group } + given(:project) { create :project, group: group } + + scenario 'group runners are not available' do + visit runners_path(project) + + expect(page).to have_content 'This group does not provide any group Runners yet.' + end + end + + context 'project with a group and a group runner' do + given(:group) { create :group } + given(:project) { create :project, group: group } + given!(:ci_runner) { create :ci_runner, groups: [group], description: 'group-runner' } + + scenario 'group runners are available' do + visit runners_path(project) + + expect(page).to have_content 'Available group Runners : 1' + expect(page).to have_content 'group-runner' + end + end + end end -- cgit v1.2.1 From d588adff1a3ce87355c8b5ac09a77e6fc63fe89a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 15:51:23 +0200 Subject: don't filter group runners by project flag the scope `Ci::Runner.belonging_to_group` does not filter out the runners where the projects has `#group_runners_enabled` set to false anymore. it didn't show up in the runners UI anymore when group runners were disabled. this was confusing. the flag is only relevant when selecting appropriate runner for a build. --- spec/models/ci/runner_spec.rb | 8 -------- 1 file changed, 8 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 308db9e8e68..0cc52acd44d 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -93,14 +93,6 @@ describe Ci::Runner do expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner] end - - it 'does not return the group runner if the project has group runners disabled' do - specific_group = create :group - specific_project = create :project, group: specific_group, group_runners_enabled: false - create :ci_runner, :specific, groups: [specific_group] - - expect(described_class.belonging_to_group(specific_project.id)).to be_empty - end end describe '.owned_or_shared' do -- cgit v1.2.1 From 8d61d33d37f7b8f99eae73e4ba0b48fbe35a80dc Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 17:11:53 +0200 Subject: use .owned_or_shared for #assignable_for? instead of having the explicit logic duplicated from the scope we can use the scope instead. --- spec/models/ci/runner_spec.rb | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 0cc52acd44d..1456c44dbf6 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -236,6 +236,13 @@ describe Ci::Runner do build.project.runners << runner end + context 'a different runner' do + it 'cannot handle builds' do + other_runner = create :ci_runner + expect(other_runner.can_pick?(build)).to be_falsey + end + end + context 'when runner does not have tags' do it 'can handle builds without tags' do expect(runner.can_pick?(build)).to be_truthy @@ -277,7 +284,7 @@ describe Ci::Runner do context 'when runner cannot pick untagged jobs' do before do - runner.run_untagged = false + runner.update_attributes!(run_untagged: false) end it 'cannot handle builds without tags' do @@ -290,7 +297,7 @@ describe Ci::Runner do context 'when runner is shared' do before do - runner.is_shared = true + runner.update_attributes!(is_shared: true) build.project.runners = [] end @@ -300,7 +307,7 @@ describe Ci::Runner do context 'when runner is locked' do before do - runner.locked = true + runner.update_attributes!(locked: true) end it 'can handle builds' do @@ -325,6 +332,17 @@ describe Ci::Runner do expect(runner.can_pick?(build)).to be_falsey end end + + context 'when runner is assigned to a group' do + before do + build.project.runners = [] + runner.groups << create(:group, projects: [build.project]) + end + + it 'can handle builds' do + expect(runner.can_pick?(build)).to be_truthy + end + end end context 'when access_level of runner is not_protected' do -- cgit v1.2.1 From d8675bd45f6f9b5af701343fbff7650f49559048 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 17:37:05 +0200 Subject: select group runners also in build queue service --- .../services/ci/update_build_queue_service_spec.rb | 62 +++++++++++++++++----- 1 file changed, 50 insertions(+), 12 deletions(-) (limited to 'spec') diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb index 0da0e57dbcd..74a23ed2a3f 100644 --- a/spec/services/ci/update_build_queue_service_spec.rb +++ b/spec/services/ci/update_build_queue_service_spec.rb @@ -8,21 +8,19 @@ describe Ci::UpdateBuildQueueService do context 'when updating specific runners' do let(:runner) { create(:ci_runner) } - context 'when there are runner that can pick build' do + context 'when there is a runner that can pick build' do before do build.project.runners << runner end it 'ticks runner queue value' do - expect { subject.execute(build) } - .to change { runner.ensure_runner_queue_value } + expect { subject.execute(build) }.to change { runner.ensure_runner_queue_value } end end - context 'when there are no runners that can pick build' do + context 'when there is no runner that can pick build' do it 'does not tick runner queue value' do - expect { subject.execute(build) } - .not_to change { runner.ensure_runner_queue_value } + expect { subject.execute(build) }.not_to change { runner.ensure_runner_queue_value } end end end @@ -30,21 +28,61 @@ describe Ci::UpdateBuildQueueService do context 'when updating shared runners' do let(:runner) { create(:ci_runner, :shared) } - context 'when there are runner that can pick build' do + context 'when there is no runner that can pick build' do it 'ticks runner queue value' do - expect { subject.execute(build) } - .to change { runner.ensure_runner_queue_value } + expect { subject.execute(build) }.to change { runner.ensure_runner_queue_value } end end - context 'when there are no runners that can pick build' do + context 'when there is no runner that can pick build due to tag mismatch' do before do build.tag_list = [:docker] end it 'does not tick runner queue value' do - expect { subject.execute(build) } - .not_to change { runner.ensure_runner_queue_value } + expect { subject.execute(build) }.not_to change { runner.ensure_runner_queue_value } + end + end + + context 'when there is no runner that can pick build due to being disabled on project' do + before do + build.project.shared_runners_enabled = false + end + + it 'does not tick runner queue value' do + expect { subject.execute(build) }.not_to change { runner.ensure_runner_queue_value } + end + end + end + + context 'when updating group runners' do + let(:group) { create :group } + let(:project) { create :project, group: group } + let(:runner) { create :ci_runner, groups: [group] } + + context 'when there is a runner that can pick build' do + it 'ticks runner queue value' do + expect { subject.execute(build) }.to change { runner.ensure_runner_queue_value } + end + end + + context 'when there is no runner that can pick build due to tag mismatch' do + before do + build.tag_list = [:docker] + end + + it 'does not tick runner queue value' do + expect { subject.execute(build) }.not_to change { runner.ensure_runner_queue_value } + end + end + + context 'when there is no runner that can pick build due to being disabled on project' do + before do + build.project.group_runners_enabled = false + end + + it 'does not tick runner queue value' do + expect { subject.execute(build) }.not_to change { runner.ensure_runner_queue_value } end end end -- cgit v1.2.1 From 7584d03ab12133ab6a64b473ece56b72612abad8 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 09:55:01 +0200 Subject: allow disabling/enabling group runners per project --- spec/features/runners_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'spec') diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index f34aeb5bd5e..dcd06a4015d 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -219,6 +219,20 @@ feature 'Runners' do expect(page).to have_content 'Available group Runners : 1' expect(page).to have_content 'group-runner' end + + scenario 'group runners may be disabled for a project' do + visit runners_path(project) + + click_on 'Disable group Runners' + + expect(page).to have_content 'Enable group Runners' + expect(project.reload.group_runners_enabled).to be false + + click_on 'Enable group Runners' + + expect(page).to have_content 'Disable group Runners' + expect(project.reload.group_runners_enabled).to be true + end end end end -- cgit v1.2.1 From 743c32270e2913a19999bd32d6208e80dd62dc2a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 13:29:21 +0200 Subject: select group runners also in register_job_service --- spec/services/ci/register_job_service_spec.rb | 79 +++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 5 deletions(-) (limited to 'spec') diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 8a537e83d5f..138ef673527 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -2,11 +2,13 @@ require 'spec_helper' module Ci describe RegisterJobService do - let!(:project) { FactoryBot.create :project, shared_runners_enabled: false } - let!(:pipeline) { FactoryBot.create :ci_pipeline, project: project } - let!(:pending_job) { FactoryBot.create :ci_build, pipeline: pipeline } - let!(:shared_runner) { FactoryBot.create(:ci_runner, is_shared: true) } - let!(:specific_runner) { FactoryBot.create(:ci_runner, is_shared: false) } + let!(:project) { create :project, shared_runners_enabled: false } + let!(:group) { create :group } + let!(:pipeline) { create :ci_pipeline, project: project } + let!(:pending_job) { create :ci_build, pipeline: pipeline } + let!(:shared_runner) { create :ci_runner, is_shared: true } + let!(:specific_runner) { create :ci_runner, is_shared: false } + let!(:group_runner) { create :ci_runner, groups: [group] } before do specific_runner.assign_to(project) @@ -167,6 +169,73 @@ module Ci end end + context 'allow group runners' do + before do + project.update!(group_runners_enabled: true, group: group) + end + + context 'for multiple builds' do + let!(:project2) { create :project, group_runners_enabled: true, group: group } + let!(:pipeline2) { create :ci_pipeline, project: project2 } + let!(:project3) { create :project, group_runners_enabled: true, group: group } + let!(:pipeline3) { create :ci_pipeline, project: project3 } + let!(:build1_project1) { pending_job } + let!(:build2_project1) { create :ci_build, pipeline: pipeline } + let!(:build3_project1) { create :ci_build, pipeline: pipeline } + let!(:build1_project2) { create :ci_build, pipeline: pipeline2 } + let!(:build2_project2) { create :ci_build, pipeline: pipeline2 } + let!(:build1_project3) { create :ci_build, pipeline: pipeline3 } + + it 'prefers projects without builds first' do + # it gets for one build from each of the projects + expect(execute(group_runner)).to eq(build1_project1) + expect(execute(group_runner)).to eq(build1_project2) + expect(execute(group_runner)).to eq(build1_project3) + + # then it gets a second build from each of the projects + expect(execute(group_runner)).to eq(build2_project1) + expect(execute(group_runner)).to eq(build2_project2) + + # in the end the third build + expect(execute(group_runner)).to eq(build3_project1) + end + + it 'equalises number of running builds' do + # after finishing the first build for project 1, get a second build from the same project + expect(execute(group_runner)).to eq(build1_project1) + build1_project1.reload.success + expect(execute(group_runner)).to eq(build2_project1) + + expect(execute(group_runner)).to eq(build1_project2) + build1_project2.reload.success + expect(execute(group_runner)).to eq(build2_project2) + expect(execute(group_runner)).to eq(build1_project3) + expect(execute(group_runner)).to eq(build3_project1) + end + end + + context 'group runner' do + let(:build) { execute(group_runner) } + + it { expect(build).to be_kind_of(Build) } + it { expect(build).to be_valid } + it { expect(build).to be_running } + it { expect(build.runner).to eq(group_runner) } + end + end + + context 'disallow group runners' do + before do + project.update(group_runners_enabled: false) + end + + context 'group runner' do + let(:build) { execute(group_runner) } + + it { expect(build).to be_nil } + end + end + context 'when first build is stalled' do before do pending_job.update(lock_version: 0) -- cgit v1.2.1 From a5f5a27df5d3055612fc8c2686ef3b9ab20bd85e Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 13:53:18 +0200 Subject: include group runners in Project#any_runners? --- spec/models/project_spec.rb | 87 +++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 26 deletions(-) (limited to 'spec') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 2675c2f52c1..9657e5011b1 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1139,44 +1139,79 @@ describe Project do end describe '#any_runners' do - let(:project) { create(:project, shared_runners_enabled: shared_runners_enabled) } - let(:specific_runner) { create(:ci_runner) } - let(:shared_runner) { create(:ci_runner, :shared) } + context 'shared runners' do + let(:project) { create :project, shared_runners_enabled: shared_runners_enabled } + let(:specific_runner) { create :ci_runner } + let(:shared_runner) { create :ci_runner, :shared } - context 'for shared runners disabled' do - let(:shared_runners_enabled) { false } + context 'for shared runners disabled' do + let(:shared_runners_enabled) { false } - it 'has no runners available' do - expect(project.any_runners?).to be_falsey - end + it 'has no runners available' do + expect(project.any_runners?).to be_falsey + end - it 'has a specific runner' do - project.runners << specific_runner - expect(project.any_runners?).to be_truthy - end + it 'has a specific runner' do + project.runners << specific_runner + expect(project.any_runners?).to be_truthy + end + + it 'has a shared runner, but they are prohibited to use' do + shared_runner + expect(project.any_runners?).to be_falsey + end - it 'has a shared runner, but they are prohibited to use' do - shared_runner - expect(project.any_runners?).to be_falsey + it 'checks the presence of specific runner' do + project.runners << specific_runner + expect(project.any_runners? { |runner| runner == specific_runner }).to be_truthy + end end - it 'checks the presence of specific runner' do - project.runners << specific_runner - expect(project.any_runners? { |runner| runner == specific_runner }).to be_truthy + context 'for shared runners enabled' do + let(:shared_runners_enabled) { true } + + it 'has a shared runner' do + shared_runner + expect(project.any_runners?).to be_truthy + end + + it 'checks the presence of shared runner' do + shared_runner + expect(project.any_runners? { |runner| runner == shared_runner }).to be_truthy + end end end - context 'for shared runners enabled' do - let(:shared_runners_enabled) { true } + context 'group runners' do + let(:project) { create :project, group_runners_enabled: group_runners_enabled } + let(:group) { create :group, projects: [project] } + let(:group_runner) { create :ci_runner, groups: [group] } + + context 'for group runners disabled' do + let(:group_runners_enabled) { false } - it 'has a shared runner' do - shared_runner - expect(project.any_runners?).to be_truthy + it 'has no runners available' do + expect(project.any_runners?).to be_falsey + end + + it 'has a group runner, but they are prohibited to use' do + group_runner + expect(project.any_runners?).to be_falsey + end end - it 'checks the presence of shared runner' do - shared_runner - expect(project.any_runners? { |runner| runner == shared_runner }).to be_truthy + context 'for group runners enabled' do + let(:group_runners_enabled) { true } + + it 'has a group runner' do + group_runner + expect(project.any_runners?).to be_truthy + end + + it 'checks the presence of group runner' do + group_runner + expect(project.any_runners? { |runner| runner == group_runner }).to be_truthy + end end end end -- cgit v1.2.1 From 6077c569a6cc323c5eab09486e5254c5f96ce601 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 14:25:31 +0200 Subject: denote group runners on admin runners page --- spec/features/admin/admin_runners_spec.rb | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'spec') diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 8de2e3d199b..b0aa2e8b588 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -59,6 +59,47 @@ describe "Admin Runners" do expect(page).to have_text 'No runners found' end end + + context 'group runner' do + it 'shows the label and does not show the project count' do + group = create :group + runner = create :ci_runner, groups: [group] + + visit admin_runners_path + + within "#runner_#{runner.id}" do + expect(page).to have_selector '.label', text: 'group' + expect(page).to have_text 'n/a' + end + end + end + + context 'shared runner' do + it 'shows the label and does not show the project count' do + runner = create :ci_runner, :shared + + visit admin_runners_path + + within "#runner_#{runner.id}" do + expect(page).to have_selector '.label', text: 'shared' + expect(page).to have_text 'n/a' + end + end + end + + context 'specific runner' do + it 'shows the label and the project count' do + project = create :project + runner = create :ci_runner, projects: [project] + + visit admin_runners_path + + within "#runner_#{runner.id}" do + expect(page).to have_selector '.label', text: 'specific' + expect(page).to have_text '1' + end + end + end end describe "Runner show page" do -- cgit v1.2.1 From 9b836b83bcabb4b977afc0e06897c4f1509215b0 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 20:53:24 +0200 Subject: support group hierarchies for group runners --- spec/models/ci/runner_spec.rb | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 1456c44dbf6..ba0db43a1e7 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -93,6 +93,15 @@ describe Ci::Runner do expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner] end + + it 'returns the group runner from a parent group' do + parent_group = create :group + group = create :group, parent: parent_group + project = create :project, group: group + runner = create :ci_runner, :specific, groups: [parent_group] + + expect(described_class.belonging_to_group(project.id)).to eq [runner] + end end describe '.owned_or_shared' do -- cgit v1.2.1 From a2a7ad291f64a5db74c1bc21fb556e6e8862d0f3 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 8 Nov 2017 10:21:54 +0100 Subject: add project_settings (Project#settings) --- spec/factories/project_settings.rb | 5 +++++ spec/models/project_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 spec/factories/project_settings.rb (limited to 'spec') diff --git a/spec/factories/project_settings.rb b/spec/factories/project_settings.rb new file mode 100644 index 00000000000..90240ee6de0 --- /dev/null +++ b/spec/factories/project_settings.rb @@ -0,0 +1,5 @@ +FactoryBot.define do + factory :project_settings do + project + end +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 9657e5011b1..e0f442a334c 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -115,6 +115,26 @@ describe Project do expect(subject.boards.size).to eq 1 end end + + describe '#settings' do + it 'creates lazily a settings record when the project does not have one associated' do + project = create :project + expect(ProjectSettings.count).to eq 0 + + expect(project.settings).to be_a ProjectSettings + + expect(ProjectSettings.count).to eq 1 + end + + it 'returns the associated record when the project has one associated' do + project = create :project, settings: create(:project_settings) + expect(ProjectSettings.count).to eq 1 + + expect(project.settings).to be_a ProjectSettings + + expect(ProjectSettings.count).to eq 1 + end + end end describe 'modules' do -- cgit v1.2.1 From dd785467393610a73da6e9fd8413bca685d9356c Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 8 Nov 2017 13:08:13 +0100 Subject: project#group_runner_enabled -> project_settings --- spec/factories/projects.rb | 9 ++++++++- spec/models/project_spec.rb | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 1761b6e2a3b..ad33d09f78a 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -15,14 +15,18 @@ FactoryBot.define do namespace creator { group ? create(:user) : namespace&.owner } - # Nest Project Feature attributes transient do + # Nest Project Feature attributes wiki_access_level ProjectFeature::ENABLED builds_access_level ProjectFeature::ENABLED snippets_access_level ProjectFeature::ENABLED issues_access_level ProjectFeature::ENABLED merge_requests_access_level ProjectFeature::ENABLED repository_access_level ProjectFeature::ENABLED + + # we can't assign the delegated `#settings` attributes directly, as the + # `#settings` relation needs to be created first + group_runners_enabled nil end after(:create) do |project, evaluator| @@ -47,6 +51,9 @@ FactoryBot.define do end project.group&.refresh_members_authorized_projects + + # assign the delegated `#settings` attributes after create + project.reload.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? end trait :public do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e0f442a334c..ed28cd50e4d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -3640,4 +3640,16 @@ describe Project do it { is_expected.not_to be_valid } end end + + describe '#toggle_settings!' do + it 'toggles the value on #settings' do + project = create :project, group_runners_enabled: false + + expect(project.group_runners_enabled).to be false + + project.toggle_settings!(:group_runners_enabled) + + expect(project.group_runners_enabled).to be true + end + end end -- cgit v1.2.1 From 316ccb64a738d376de57b9df76dbec732f0d9eff Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 9 Nov 2017 15:30:08 +0100 Subject: add `active` scope only once, inline methods --- spec/models/project_spec.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'spec') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index ed28cd50e4d..9c78f7b8bd6 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -63,7 +63,6 @@ describe Project do it { is_expected.to have_many(:build_trace_section_names)} it { is_expected.to have_many(:runner_projects) } it { is_expected.to have_many(:runners) } - it { is_expected.to have_many(:active_runners) } it { is_expected.to have_many(:variables) } it { is_expected.to have_many(:triggers) } it { is_expected.to have_many(:pages_domains) } -- cgit v1.2.1 From 1acd8eb740dd070a5290d8a36c03e1b6f9691dba Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 7 Dec 2017 17:21:16 +0100 Subject: ci runners: assigned to either projects or group --- spec/models/ci/runner_spec.rb | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index ba0db43a1e7..fb724f682a5 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -19,6 +19,63 @@ describe Ci::Runner do end end end + + context 'either_projects_or_group' do + it 'disallows assigning to a group if already assigned to a group' do + group = create(:group) + runner = create(:ci_runner, groups: [group]) + + runner.groups << build(:group) + + expect(runner).not_to be_valid + expect(runner.errors.full_messages).to eq ['Runner can only be assigned to one group'] + end + + it 'disallows assigning to a group if already assigned to a project' do + project = create(:project) + runner = create(:ci_runner, projects: [project]) + + runner.groups << build(:group) + + expect(runner).not_to be_valid + expect(runner.errors.full_messages).to eq ['Runner can only be assigned either to projects or to a group'] + end + + it 'disallows assigning to a project if already assigned to a group' do + group = create(:group) + runner = create(:ci_runner, groups: [group]) + + runner.projects << build(:project) + + expect(runner).not_to be_valid + expect(runner.errors.full_messages).to eq ['Runner can only be assigned either to projects or to a group'] + end + + it 'allows assigning to a group if not assigned to a group nor a project' do + runner = create(:ci_runner) + + runner.groups << build(:group) + + expect(runner).to be_valid + end + + it 'allows assigning to a project if not assigned to a group nor a project' do + runner = create(:ci_runner) + + runner.projects << build(:project) + + expect(runner).to be_valid + end + + it 'allows assigning to a project if already assigned to a project' do + project = create(:project) + runner = create(:ci_runner, projects: [project]) + + runner.projects << build(:project) + + expect(runner).to be_valid + end + end end describe '#access_level' do -- cgit v1.2.1 From 9bed8de9100a394257a4a55e8b87bcfd015f0fbd Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 19 Dec 2017 15:12:21 +0100 Subject: simplify runner selection don't differentiate between the different runner types, instead we rely on the Runner model to provide the available projects. scheduling is now applied to all runners equally. --- spec/models/ci/runner_spec.rb | 67 +++++++++++++++++++++++++++ spec/services/ci/register_job_service_spec.rb | 41 ++++++++++++++-- 2 files changed, 105 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index fb724f682a5..512a490d289 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -776,4 +776,71 @@ describe Ci::Runner do expect(runner.project?).to be true end end + + describe '#accessible_projects' do + let!(:shared_runner) { create(:ci_runner, :shared) } + let!(:shared_project) { create(:project, shared_runners_enabled: true) } + + let!(:project_runner) { create(:ci_runner) } + let!(:project_project) { create(:project, runners: [project_runner], shared_runners_enabled: false) } + + let!(:group_runner) { create(:ci_runner) } + + let!(:parent_group) { create(:group) } + let!(:parent_group_project) do + create(:project, group: parent_group, shared_runners_enabled: false) + end + + let!(:group) { create :group, runners: [group_runner], parent: parent_group } + let!(:group_project) do + create(:project, group: group, shared_runners_enabled: false) + end + + let!(:nested_group_project) do + nested_group = create :group, parent: group + create(:project, group: nested_group, shared_runners_enabled: false) + end + + it 'returns the project with a shared runner' do + expect(shared_runner.reload.accessible_projects).to eq [shared_project] + end + + it 'returns the project with a project runner' do + expect(project_runner.reload.accessible_projects).to eq [project_project] + end + + it 'returns the projects with a group and nested group runner' do + expect(group_runner.reload.accessible_projects).to eq [group_project, nested_group_project] + end + + context 'deleted' do + before do + shared_project.update_attributes!(pending_delete: true) + project_project.update_attributes!(pending_delete: true) + group_project.update_attributes!(pending_delete: true) + nested_group_project.update_attributes!(pending_delete: true) + end + + it 'returns no projects' do + expect(shared_runner.reload.accessible_projects).to be_empty + expect(project_runner.reload.accessible_projects).to be_empty + expect(group_runner.reload.accessible_projects).to be_empty + end + end + + context 'builds disabled' do + before do + shared_project.update_attributes!(builds_enabled: false) + project_project.update_attributes!(builds_enabled: false) + group_project.update_attributes!(builds_enabled: false) + nested_group_project.update_attributes!(builds_enabled: false) + end + + it 'returns no projects' do + expect(shared_runner.reload.accessible_projects).to be_empty + expect(project_runner.reload.accessible_projects).to be_empty + expect(group_runner.reload.accessible_projects).to be_empty + end + end + end end diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 138ef673527..0c343425392 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -179,6 +179,7 @@ module Ci let!(:pipeline2) { create :ci_pipeline, project: project2 } let!(:project3) { create :project, group_runners_enabled: true, group: group } let!(:pipeline3) { create :ci_pipeline, project: project3 } + let!(:build1_project1) { pending_job } let!(:build2_project1) { create :ci_build, pipeline: pipeline } let!(:build3_project1) { create :ci_build, pipeline: pipeline } @@ -186,6 +187,36 @@ module Ci let!(:build2_project2) { create :ci_build, pipeline: pipeline2 } let!(:build1_project3) { create :ci_build, pipeline: pipeline3 } + # these shouldn't influence the scheduling + let!(:unrelated_group) { create :group } + let!(:unrelated_project) { create :project, group_runners_enabled: true, group: unrelated_group } + let!(:unrelated_pipeline) { create :ci_pipeline, project: unrelated_project } + let!(:build1_unrelated_project) { create :ci_build, pipeline: unrelated_pipeline } + let!(:unrelated_group_runner) { create :ci_runner, groups: [unrelated_group] } + + it 'does not consider builds from other group runners' do + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 6 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 5 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 4 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 3 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 2 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 1 + execute(group_runner) + + expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 0 + expect(execute(group_runner)).to be_nil + end + it 'prefers projects without builds first' do # it gets for one build from each of the projects expect(execute(group_runner)).to eq(build1_project1) @@ -198,6 +229,8 @@ module Ci # in the end the third build expect(execute(group_runner)).to eq(build3_project1) + + expect(execute(group_runner)).to be_nil end it 'equalises number of running builds' do @@ -211,6 +244,8 @@ module Ci expect(execute(group_runner)).to eq(build2_project2) expect(execute(group_runner)).to eq(build1_project3) expect(execute(group_runner)).to eq(build3_project1) + + expect(execute(group_runner)).to be_nil end end @@ -247,7 +282,7 @@ module Ci let!(:other_build) { create :ci_build, pipeline: pipeline } before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_specific_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) .and_return(Ci::Build.where(id: [pending_job, other_build])) end @@ -259,7 +294,7 @@ module Ci context 'when single build is in queue' do before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_specific_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) .and_return(Ci::Build.where(id: pending_job)) end @@ -270,7 +305,7 @@ module Ci context 'when there is no build in queue' do before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_specific_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) .and_return(Ci::Build.none) end -- cgit v1.2.1 From c585004b59e5fbd5e925dacb7259916240d1cf5a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 19 Dec 2017 16:40:19 +0100 Subject: restrict projects ci controller to project runners --- .../projects/settings/ci_cd_controller_spec.rb | 11 +++++++++++ spec/models/ci/runner_spec.rb | 15 +++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'spec') diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb index 7dae9b85d78..1cf395b0328 100644 --- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb +++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb @@ -17,6 +17,17 @@ describe Projects::Settings::CiCdController do expect(response).to have_gitlab_http_status(200) expect(response).to render_template(:show) end + + it 'sets assignable project runners' do + group = create(:group, runners: [create(:ci_runner)], parent: create(:group)) + group.add_master(user) + project_runner = create(:ci_runner, projects: [create(:project, group: group)]) + create(:ci_runner, :shared) + + get :show, namespace_id: project.namespace, project_id: project + + expect(assigns(:assignable_runners)).to eq [project_runner] + end end describe '#reset_cache' do diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 512a490d289..3e85e3c92e3 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -136,6 +136,21 @@ describe Ci::Runner do end end + describe '.belonging_to_any_project' do + it 'returns the specific project runner' do + # project + project_project = create :project + project_runner = create :ci_runner, :specific, projects: [project_project] + + # group + group = create :group + create :project, group: group + create :ci_runner, :specific, groups: [group] + + expect(described_class.belonging_to_any_project).to eq [project_runner] + end + end + describe '.belonging_to_group' do it 'returns the specific group runner' do # own -- cgit v1.2.1 From bfc694f5117aa12a2224b567a74f196c320a6d75 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 19 Dec 2017 18:04:33 +0100 Subject: show group runners setup only to group master --- spec/features/runners_spec.rb | 82 ++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 28 deletions(-) (limited to 'spec') diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index dcd06a4015d..b396e103345 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -187,51 +187,77 @@ feature 'Runners' do project.add_master(user) end - context 'project without a group' do - given(:project) { create :project } + given(:group) { create :group } - scenario 'group runners are not available' do - visit runners_path(project) + context 'as project and group master' do + background do + group.add_master(user) + end + + context 'project with a group but no group runner' do + given(:project) { create :project, group: group } + + scenario 'group runners are not available' do + visit runners_path(project) - expect(page).to have_content 'This project does not belong to a group and can therefore not make use of group Runners.' + expect(page).to have_content 'This group does not provide any group Runners yet.' + + expect(page).to have_content 'Setup a group Runner manually' + expect(page).not_to have_content 'Ask your group master to setup a group Runner.' + end end end - context 'project with a group but no group runner' do - given(:group) { create :group } - given(:project) { create :project, group: group } + context 'as project master' do + context 'project without a group' do + given(:project) { create :project } - scenario 'group runners are not available' do - visit runners_path(project) + scenario 'group runners are not available' do + visit runners_path(project) - expect(page).to have_content 'This group does not provide any group Runners yet.' + expect(page).to have_content 'This project does not belong to a group and can therefore not make use of group Runners.' + end end - end - context 'project with a group and a group runner' do - given(:group) { create :group } - given(:project) { create :project, group: group } - given!(:ci_runner) { create :ci_runner, groups: [group], description: 'group-runner' } + context 'project with a group but no group runner' do + given(:group) { create :group } + given(:project) { create :project, group: group } - scenario 'group runners are available' do - visit runners_path(project) + scenario 'group runners are not available' do + visit runners_path(project) + + expect(page).to have_content 'This group does not provide any group Runners yet.' - expect(page).to have_content 'Available group Runners : 1' - expect(page).to have_content 'group-runner' + expect(page).not_to have_content 'Setup a group Runner manually' + expect(page).to have_content 'Ask your group master to setup a group Runner.' + end end - scenario 'group runners may be disabled for a project' do - visit runners_path(project) + context 'project with a group and a group runner' do + given(:group) { create :group } + given(:project) { create :project, group: group } + given!(:ci_runner) { create :ci_runner, groups: [group], description: 'group-runner' } + + scenario 'group runners are available' do + visit runners_path(project) + + expect(page).to have_content 'Available group Runners : 1' + expect(page).to have_content 'group-runner' + end - click_on 'Disable group Runners' + scenario 'group runners may be disabled for a project' do + visit runners_path(project) + + click_on 'Disable group Runners' - expect(page).to have_content 'Enable group Runners' - expect(project.reload.group_runners_enabled).to be false + expect(page).to have_content 'Enable group Runners' + expect(project.reload.group_runners_enabled).to be false - click_on 'Enable group Runners' + click_on 'Enable group Runners' - expect(page).to have_content 'Disable group Runners' - expect(project.reload.group_runners_enabled).to be true + expect(page).to have_content 'Disable group Runners' + expect(project.reload.group_runners_enabled).to be true + end end end end -- cgit v1.2.1 From 1a009f1bdb4d75dd511df5f15705fcf8ee9d20dd Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 20 Dec 2017 09:38:58 +0100 Subject: update MODELS_JSON with new Project#settings attr --- spec/lib/gitlab/import_export/all_models.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index 897a5984782..ad599c8c38a 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -258,7 +258,6 @@ project: - builds - runner_projects - runners -- active_runners - variables - triggers - pipeline_schedules @@ -286,6 +285,7 @@ project: - internal_ids - project_deploy_tokens - deploy_tokens +- settings award_emoji: - awardable - user -- cgit v1.2.1 From cc4bc22ae49582652413d45aa2f5b39dd2a15a82 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 20 Dec 2017 10:08:54 +0100 Subject: runner can't be assigned to more than 1 group therefore we don't need the api check. --- spec/requests/api/runners_spec.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index ab807e399a4..89e21ba9914 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -29,8 +29,6 @@ describe API::Runners do let!(:group_runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } - let!(:two_groups_runner) { create(:ci_runner, description: 'Two groups runner', groups: [group, group2]) } - before do # Set project access for users create(:project_member, :master, user: user, project: project) @@ -49,7 +47,7 @@ describe API::Runners do expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(descriptions).to contain_exactly( - 'Project runner', 'Group runner', 'Two projects runner', 'Two groups runner' + 'Project runner', 'Group runner', 'Two projects runner' ) expect(shared).to be_falsey end @@ -422,11 +420,6 @@ describe API::Runners do end.to change { Ci::Runner.specific.count }.by(-1) end - it 'does not delete group runner with more than one associated group' do - delete api("/runners/#{two_groups_runner.id}", user) - expect(response).to have_http_status(403) - end - it 'deletes group runner for one owned group' do expect do delete api("/runners/#{group_runner.id}", user) -- cgit v1.2.1 From 9447e5c27d8f840eaf4eee9635a5149ab36d93b6 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 26 Feb 2018 16:20:29 +0100 Subject: extract method to adhere to "tell, don't ask" --- spec/models/ci/runner_spec.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 3e85e3c92e3..23e18efea70 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -858,4 +858,30 @@ describe Ci::Runner do end end end + + describe '#invalidate_build_cache!' do + context 'runner can pick the build' do + it 'calls #tick_runner_queue' do + ci_build = build :ci_build + runner = build :ci_runner + allow(runner).to receive(:can_pick?).with(ci_build).and_return(true) + + expect(runner).to receive(:tick_runner_queue) + + runner.invalidate_build_cache!(ci_build) + end + end + + context 'runner cannot pick the build' do + it 'does not call #tick_runner_queue' do + ci_build = build :ci_build + runner = build :ci_runner + allow(runner).to receive(:can_pick?).with(ci_build).and_return(false) + + expect(runner).not_to receive(:tick_runner_queue) + + runner.invalidate_build_cache!(ci_build) + end + end + end end -- cgit v1.2.1 From c645f4edbe6450e7e7d1f15b86038a8094416ffa Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 23 Apr 2018 10:36:46 +0100 Subject: fixed spec --- spec/javascripts/ide/components/repo_file_spec.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'spec') diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js index 25fc4aac9dd..ff30bea7668 100644 --- a/spec/javascripts/ide/components/repo_file_spec.js +++ b/spec/javascripts/ide/components/repo_file_spec.js @@ -56,13 +56,9 @@ describe('RepoFile', () => { type: 'tree', branchId: 'master', projectId: 'project', + changesCount: '1', }; - store.state.changedFiles.push({ - ...file('index'), - path: 'testing/index', - }); - createComponent({ file: f, level: 0, -- cgit v1.2.1 From 92cbf9453a4435976bfe77cafd0f8c5f57833e59 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 26 Apr 2018 10:39:04 +0800 Subject: Switch to using ProjectCiCdSetting for group_runners_enabled and remove ProjectSettings --- spec/models/project_spec.rb | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) (limited to 'spec') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 265941acbe7..7392b75e37c 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -123,26 +123,6 @@ describe Project do expect(subject.boards.size).to eq 1 end end - - describe '#settings' do - it 'creates lazily a settings record when the project does not have one associated' do - project = create :project - expect(ProjectSettings.count).to eq 0 - - expect(project.settings).to be_a ProjectSettings - - expect(ProjectSettings.count).to eq 1 - end - - it 'returns the associated record when the project has one associated' do - project = create :project, settings: create(:project_settings) - expect(ProjectSettings.count).to eq 1 - - expect(project.settings).to be_a ProjectSettings - - expect(ProjectSettings.count).to eq 1 - end - end end describe 'modules' do @@ -3595,13 +3575,13 @@ describe Project do end end - describe '#toggle_settings!' do + describe '#toggle_ci_cd_settings!' do it 'toggles the value on #settings' do project = create :project, group_runners_enabled: false expect(project.group_runners_enabled).to be false - project.toggle_settings!(:group_runners_enabled) + project.toggle_ci_cd_settings!(:group_runners_enabled) expect(project.group_runners_enabled).to be true end -- cgit v1.2.1 From 77c72c688d70104c776bbb76d3490ec53e10a56d Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 26 Apr 2018 13:23:35 +0800 Subject: Increase PipelineSerializer query limit count to support new group runner queries --- spec/serializers/pipeline_serializer_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb index f51c11b141f..e88e86c2998 100644 --- a/spec/serializers/pipeline_serializer_spec.rb +++ b/spec/serializers/pipeline_serializer_spec.rb @@ -118,7 +118,7 @@ describe PipelineSerializer do it 'verifies number of queries', :request_store do recorded = ActiveRecord::QueryRecorder.new { subject } - expect(recorded.count).to be_within(1).of(36) + expect(recorded.count).to be_within(1).of(44) expect(recorded.cached_count).to eq(0) end end -- cgit v1.2.1 From 85e04cde4155cc4d998764a031fe5cea454c2a84 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 26 Apr 2018 13:36:14 +0800 Subject: Remove spec/factories/project_settings.rb since model no longer exists --- spec/factories/project_settings.rb | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 spec/factories/project_settings.rb (limited to 'spec') diff --git a/spec/factories/project_settings.rb b/spec/factories/project_settings.rb deleted file mode 100644 index 90240ee6de0..00000000000 --- a/spec/factories/project_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryBot.define do - factory :project_settings do - project - end -end -- cgit v1.2.1 From 0f9f5e82ad5c4898e7c206ff0d574a3e141f3433 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 26 Apr 2018 14:43:17 +0800 Subject: Fix spec/models/user_spec.rb for #ci_authorized_runners --- spec/models/user_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 79447a65e94..df2e547ce28 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1897,7 +1897,7 @@ describe User do let(:group) { create(:group) } let(:another_user) { create(:user) } let(:subgroup) { create(:group, parent: group) } - let(:project) { create(:project, group: subgroup) } + let!(:project) { create(:project, group: subgroup, runners: [runner_1]) } def add_user(access) group.add_user(user, access) -- cgit v1.2.1 From ff219759303dc03f66bb1a160aafa2fca7ac9308 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Fri, 27 Apr 2018 08:05:46 +0800 Subject: Tag runner_spec tests for subgroups with nested_groups --- spec/models/ci/runner_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 23e18efea70..1df11fdedf4 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -166,7 +166,7 @@ describe Ci::Runner do expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner] end - it 'returns the group runner from a parent group' do + it 'returns the group runner from a parent group', :nested_groups do parent_group = create :group group = create :group, parent: parent_group project = create :project, group: group @@ -824,7 +824,7 @@ describe Ci::Runner do expect(project_runner.reload.accessible_projects).to eq [project_project] end - it 'returns the projects with a group and nested group runner' do + it 'returns the projects with a group and nested group runner', :nested_groups do expect(group_runner.reload.accessible_projects).to eq [group_project, nested_group_project] end -- cgit v1.2.1 From 329d535bbcf8ceafd3b000c5cd224173f441310b Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Fri, 27 Apr 2018 08:56:13 +0800 Subject: Add extra spec for Project#any_runners? to test block properly --- spec/models/project_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'spec') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 7392b75e37c..ab0694e6890 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1165,6 +1165,11 @@ describe Project do project.runners << specific_runner expect(project.any_runners? { |runner| runner == specific_runner }).to be_truthy end + + it 'returns false if match cannot be found' do + project.runners << specific_runner + expect(project.any_runners? { false }).to be_falsey + end end context 'for shared runners enabled' do @@ -1179,6 +1184,11 @@ describe Project do shared_runner expect(project.any_runners? { |runner| runner == shared_runner }).to be_truthy end + + it 'returns false if match cannot be found' do + shared_runner + expect(project.any_runners? { false }).to be_falsey + end end end @@ -1212,6 +1222,11 @@ describe Project do group_runner expect(project.any_runners? { |runner| runner == group_runner }).to be_truthy end + + it 'returns false if match cannot be found' do + group_runner + expect(project.any_runners? { false }).to be_falsey + end end end end -- cgit v1.2.1 From 8d8139862aee97d7fadc0563e7df9842f5bd46ac Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Fri, 27 Apr 2018 09:15:54 +0800 Subject: Rename `runner.belonging_to_group(project.id) -> runner.belonging_to_parent_group_of_project(project.id)` --- spec/models/ci/runner_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 1df11fdedf4..fbf9539e698 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -151,7 +151,7 @@ describe Ci::Runner do end end - describe '.belonging_to_group' do + describe '.belonging_to_parent_group_of_project' do it 'returns the specific group runner' do # own specific_group = create :group @@ -163,7 +163,7 @@ describe Ci::Runner do create :project, group: other_group create :ci_runner, :specific, groups: [other_group] - expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner] + expect(described_class.belonging_to_parent_group_of_project(specific_project.id)).to eq [specific_runner] end it 'returns the group runner from a parent group', :nested_groups do @@ -172,7 +172,7 @@ describe Ci::Runner do project = create :project, group: group runner = create :ci_runner, :specific, groups: [parent_group] - expect(described_class.belonging_to_group(project.id)).to eq [runner] + expect(described_class.belonging_to_parent_group_of_project(project.id)).to eq [runner] end end -- cgit v1.2.1 From 87740df2ba7153439c30544f299b235632717738 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 09:39:47 +0400 Subject: Revert fair scheduling for all builds Per discussion in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9646#note_65730532 this logic is being optimized elsewhere and it will simplify things if we make less changes to this code right now. --- spec/models/ci/runner_spec.rb | 67 --------------------------- spec/services/ci/register_job_service_spec.rb | 51 ++++---------------- 2 files changed, 10 insertions(+), 108 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index fbf9539e698..d6ce97a9b28 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -792,73 +792,6 @@ describe Ci::Runner do end end - describe '#accessible_projects' do - let!(:shared_runner) { create(:ci_runner, :shared) } - let!(:shared_project) { create(:project, shared_runners_enabled: true) } - - let!(:project_runner) { create(:ci_runner) } - let!(:project_project) { create(:project, runners: [project_runner], shared_runners_enabled: false) } - - let!(:group_runner) { create(:ci_runner) } - - let!(:parent_group) { create(:group) } - let!(:parent_group_project) do - create(:project, group: parent_group, shared_runners_enabled: false) - end - - let!(:group) { create :group, runners: [group_runner], parent: parent_group } - let!(:group_project) do - create(:project, group: group, shared_runners_enabled: false) - end - - let!(:nested_group_project) do - nested_group = create :group, parent: group - create(:project, group: nested_group, shared_runners_enabled: false) - end - - it 'returns the project with a shared runner' do - expect(shared_runner.reload.accessible_projects).to eq [shared_project] - end - - it 'returns the project with a project runner' do - expect(project_runner.reload.accessible_projects).to eq [project_project] - end - - it 'returns the projects with a group and nested group runner', :nested_groups do - expect(group_runner.reload.accessible_projects).to eq [group_project, nested_group_project] - end - - context 'deleted' do - before do - shared_project.update_attributes!(pending_delete: true) - project_project.update_attributes!(pending_delete: true) - group_project.update_attributes!(pending_delete: true) - nested_group_project.update_attributes!(pending_delete: true) - end - - it 'returns no projects' do - expect(shared_runner.reload.accessible_projects).to be_empty - expect(project_runner.reload.accessible_projects).to be_empty - expect(group_runner.reload.accessible_projects).to be_empty - end - end - - context 'builds disabled' do - before do - shared_project.update_attributes!(builds_enabled: false) - project_project.update_attributes!(builds_enabled: false) - group_project.update_attributes!(builds_enabled: false) - nested_group_project.update_attributes!(builds_enabled: false) - end - - it 'returns no projects' do - expect(shared_runner.reload.accessible_projects).to be_empty - expect(project_runner.reload.accessible_projects).to be_empty - expect(group_runner.reload.accessible_projects).to be_empty - end - end - end - describe '#invalidate_build_cache!' do context 'runner can pick the build' do it 'calls #tick_runner_queue' do diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 0c343425392..7d3c43eeaf7 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -195,56 +195,25 @@ module Ci let!(:unrelated_group_runner) { create :ci_runner, groups: [unrelated_group] } it 'does not consider builds from other group runners' do - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 6 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 6 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 5 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 5 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 4 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 4 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 3 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 3 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 2 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 2 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 1 + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 1 execute(group_runner) - expect(described_class.new(group_runner).send(:builds_for_runner).count).to eq 0 - expect(execute(group_runner)).to be_nil - end - - it 'prefers projects without builds first' do - # it gets for one build from each of the projects - expect(execute(group_runner)).to eq(build1_project1) - expect(execute(group_runner)).to eq(build1_project2) - expect(execute(group_runner)).to eq(build1_project3) - - # then it gets a second build from each of the projects - expect(execute(group_runner)).to eq(build2_project1) - expect(execute(group_runner)).to eq(build2_project2) - - # in the end the third build - expect(execute(group_runner)).to eq(build3_project1) - - expect(execute(group_runner)).to be_nil - end - - it 'equalises number of running builds' do - # after finishing the first build for project 1, get a second build from the same project - expect(execute(group_runner)).to eq(build1_project1) - build1_project1.reload.success - expect(execute(group_runner)).to eq(build2_project1) - - expect(execute(group_runner)).to eq(build1_project2) - build1_project2.reload.success - expect(execute(group_runner)).to eq(build2_project2) - expect(execute(group_runner)).to eq(build1_project3) - expect(execute(group_runner)).to eq(build3_project1) - + expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 0 expect(execute(group_runner)).to be_nil end end @@ -282,7 +251,7 @@ module Ci let!(:other_build) { create :ci_build, pipeline: pipeline } before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner) .and_return(Ci::Build.where(id: [pending_job, other_build])) end @@ -294,7 +263,7 @@ module Ci context 'when single build is in queue' do before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner) .and_return(Ci::Build.where(id: pending_job)) end @@ -305,7 +274,7 @@ module Ci context 'when there is no build in queue' do before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_runner) + allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner) .and_return(Ci::Build.none) end -- cgit v1.2.1 From 8604dbe9f6768a8bb44bf1e1b144f7fd216f3641 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 10:25:26 +0400 Subject: Fix up db/schema.rb changes leftover and comments out of date --- spec/factories/projects.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 3d2810bfdba..aed5eab8044 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -24,8 +24,8 @@ FactoryBot.define do merge_requests_access_level ProjectFeature::ENABLED repository_access_level ProjectFeature::ENABLED - # we can't assign the delegated `#settings` attributes directly, as the - # `#settings` relation needs to be created first + # we can't assign the delegated `#ci_cd_settings` attributes directly, as the + # `#ci_cd_settings` relation needs to be created first group_runners_enabled nil end @@ -52,7 +52,7 @@ FactoryBot.define do project.group&.refresh_members_authorized_projects - # assign the delegated `#settings` attributes after create + # assign the delegated `#ci_cd_settings` attributes after create project.reload.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? end -- cgit v1.2.1 From 5652ff953cba9773edbcb677908fe3f18b103be3 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 10:43:29 +0400 Subject: Rename Runner#group? -> #assigned_to_group? and Runner#project? -> #assigned_to_project? --- spec/models/ci/runner_spec.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index d6ce97a9b28..fb9dcce9a7c 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -748,47 +748,47 @@ describe Ci::Runner do end end - describe 'group?' do + describe 'assigned_to_group?' do it 'returns false when the runner is a project runner' do project = create :project runner = create :ci_runner, description: 'Project runner', projects: [project] - expect(runner.group?).to be false + expect(runner.assigned_to_group?).to be false end it 'returns false when the runner is a shared runner' do runner = create :ci_runner, :shared, description: 'Shared runner' - expect(runner.group?).to be false + expect(runner.assigned_to_group?).to be false end it 'returns true when the runner is assigned to a group' do group = create :group runner = create :ci_runner, description: 'Group runner', groups: [group] - expect(runner.group?).to be true + expect(runner.assigned_to_group?).to be true end end - describe 'project?' do + describe 'assigned_to_project?' do it 'returns false when the runner is a group prunner' do group = create :group runner = create :ci_runner, description: 'Group runner', groups: [group] - expect(runner.project?).to be false + expect(runner.assigned_to_project?).to be false end it 'returns false when the runner is a shared runner' do runner = create :ci_runner, :shared, description: 'Shared runner' - expect(runner.project?).to be false + expect(runner.assigned_to_project?).to be false end it 'returns true when the runner is assigned to a project' do project = create :project runner = create :ci_runner, description: 'Group runner', projects: [project] - expect(runner.project?).to be true + expect(runner.assigned_to_project?).to be true end end -- cgit v1.2.1 From e98438d4efdf3aebabe5938979f4924cf7cb47a8 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 17:10:07 +0400 Subject: Revert changes to User#ci_authorized_users to defer group runner API changes to later --- spec/models/user_spec.rb | 66 ++++++++++-------------------------------------- 1 file changed, 13 insertions(+), 53 deletions(-) (limited to 'spec') diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index df2e547ce28..3f2eb58f009 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1787,12 +1787,14 @@ describe User do describe '#ci_authorized_runners' do let(:user) { create(:user) } - let(:runner_1) { create(:ci_runner) } - let(:runner_2) { create(:ci_runner) } + let(:runner) { create(:ci_runner) } - context 'without any projects nor groups' do - let!(:project) { create(:project, runners: [runner_1]) } - let!(:group) { create(:group) } + before do + project.runners << runner + end + + context 'without any projects' do + let(:project) { create(:project) } it 'does not load' do expect(user.ci_authorized_runners).to be_empty @@ -1801,38 +1803,10 @@ describe User do context 'with personal projects runners' do let(:namespace) { create(:namespace, owner: user) } - let!(:project) { create(:project, namespace: namespace, runners: [runner_1]) } + let(:project) { create(:project, namespace: namespace) } it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner_1) - end - end - - context 'with personal group runner' do - let!(:project) { create(:project, runners: [runner_1]) } - let!(:group) do - create(:group, runners: [runner_2]).tap do |group| - group.add_owner(user) - end - end - - it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner_2) - end - end - - context 'with personal project and group runner' do - let(:namespace) { create(:namespace, owner: user) } - let!(:project) { create(:project, namespace: namespace, runners: [runner_1]) } - - let!(:group) do - create(:group, runners: [runner_2]).tap do |group| - group.add_owner(user) - end - end - - it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner_1, runner_2) + expect(user.ci_authorized_runners).to contain_exactly(runner) end end @@ -1843,7 +1817,7 @@ describe User do end it 'loads' do - expect(user.ci_authorized_runners).to contain_exactly(runner_1) + expect(user.ci_authorized_runners).to contain_exactly(runner) end end @@ -1860,21 +1834,7 @@ describe User do context 'with groups projects runners' do let(:group) { create(:group) } - let!(:project) { create(:project, group: group, runners: [runner_1]) } - - def add_user(access) - group.add_user(user, access) - end - - it_behaves_like :member - end - - context 'with groups runners' do - let!(:group) do - create(:group, runners: [runner_1]).tap do |group| - group.add_owner(user) - end - end + let(:project) { create(:project, group: group) } def add_user(access) group.add_user(user, access) @@ -1884,7 +1844,7 @@ describe User do end context 'with other projects runners' do - let!(:project) { create(:project, runners: [runner_1]) } + let(:project) { create(:project) } def add_user(access) project.add_role(user, access) @@ -1897,7 +1857,7 @@ describe User do let(:group) { create(:group) } let(:another_user) { create(:user) } let(:subgroup) { create(:group, parent: group) } - let!(:project) { create(:project, group: subgroup, runners: [runner_1]) } + let(:project) { create(:project, group: subgroup) } def add_user(access) group.add_user(user, access) -- cgit v1.2.1 From 1a6d9789db04c3caa4f15ea76399c417f310a6a7 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 18:13:16 +0400 Subject: Remove unnecessary API specs for group runners since we do not have API support yet --- spec/requests/api/runners_spec.rb | 79 +-------------------------------------- 1 file changed, 1 insertion(+), 78 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index 89e21ba9914..f22fec31514 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -47,7 +47,7 @@ describe API::Runners do expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(descriptions).to contain_exactly( - 'Project runner', 'Group runner', 'Two projects runner' + 'Project runner', 'Two projects runner' ) expect(shared).to be_falsey end @@ -149,16 +149,6 @@ describe API::Runners do expect(json_response['projects'].first['id']).to eq(project.id) end - - it "returns the group's details for a group runner" do - get api("/runners/#{group_runner.id}", admin) - - expect(json_response['groups'].first).to eq( - 'id' => group.id, - 'web_url' => group.web_url, - 'name' => group.name - ) - end end it 'returns 404 if runner does not exists' do @@ -188,29 +178,12 @@ describe API::Runners do end end - context "runner group's administrative user" do - context 'when runner is not shared' do - it "returns runner's details" do - get api("/runners/#{group_runner.id}", user) - - expect(response).to have_http_status(200) - expect(json_response['id']).to eq(group_runner.id) - end - end - end - context 'other authorized user' do it "does not return project runner's details" do get api("/runners/#{project_runner.id}", user2) expect(response).to have_http_status(403) end - - it "does not return group runner's details" do - get api("/runners/#{group_runner.id}", user2) - - expect(response).to have_gitlab_http_status(403) - end end context 'unauthorized user' do @@ -219,12 +192,6 @@ describe API::Runners do expect(response).to have_http_status(401) end - - it "does not return group runner's details" do - get api("/runners/#{group_runner.id}") - - expect(response).to have_gitlab_http_status(401) - end end end @@ -301,12 +268,6 @@ describe API::Runners do expect(response).to have_http_status(403) end - it 'does not update group runner without access to it' do - put api("/runners/#{group_runner.id}", user2), description: 'test' - - expect(response).to have_gitlab_http_status(403) - end - it 'updates project runner with access to it' do description = project_runner.description put api("/runners/#{project_runner.id}", admin), description: 'test' @@ -316,16 +277,6 @@ describe API::Runners do expect(project_runner.description).to eq('test') expect(project_runner.description).not_to eq(description) end - - it 'updates group runner with access to it' do - description = group_runner.description - put api("/runners/#{group_runner.id}", admin), description: 'test' - group_runner.reload - - expect(response).to have_gitlab_http_status(200) - expect(group_runner.description).to eq('test') - expect(group_runner.description).not_to eq(description) - end end end @@ -335,12 +286,6 @@ describe API::Runners do expect(response).to have_http_status(401) end - - it 'does not delete group runner' do - put api("/runners/#{group_runner.id}") - - expect(response).to have_gitlab_http_status(401) - end end end @@ -376,14 +321,6 @@ describe API::Runners do expect(response).to have_http_status(204) end.to change { Ci::Runner.specific.count }.by(-1) end - - it 'deletes used group runner' do - expect do - delete api("/runners/#{group_runner.id}", admin) - - expect(response).to have_gitlab_http_status(204) - end.to change { Ci::Runner.specific.count }.by(-1) - end end it 'returns 404 if runner does not exists' do @@ -420,14 +357,6 @@ describe API::Runners do end.to change { Ci::Runner.specific.count }.by(-1) end - it 'deletes group runner for one owned group' do - expect do - delete api("/runners/#{group_runner.id}", user) - - expect(response).to have_gitlab_http_status(204) - end.to change { Ci::Runner.specific.count }.by(-1) - end - it_behaves_like '412 response' do let(:request) { api("/runners/#{project_runner.id}", user) } end @@ -440,12 +369,6 @@ describe API::Runners do expect(response).to have_http_status(401) end - - it 'does not delete group runner' do - delete api("/runners/#{group_runner.id}") - - expect(response).to have_gitlab_http_status(401) - end end end -- cgit v1.2.1 From bec24d15813388440d172cf4f27d936130202a09 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 May 2018 09:29:08 +0100 Subject: use getters to correctly get the counts for both unstaged & staged changes --- spec/javascripts/ide/components/repo_file_spec.js | 1 - spec/javascripts/ide/stores/getters_spec.js | 63 +++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js index ff30bea7668..719d0687140 100644 --- a/spec/javascripts/ide/components/repo_file_spec.js +++ b/spec/javascripts/ide/components/repo_file_spec.js @@ -56,7 +56,6 @@ describe('RepoFile', () => { type: 'tree', branchId: 'master', projectId: 'project', - changesCount: '1', }; createComponent({ diff --git a/spec/javascripts/ide/stores/getters_spec.js b/spec/javascripts/ide/stores/getters_spec.js index b6b4dd28729..bd834443730 100644 --- a/spec/javascripts/ide/stores/getters_spec.js +++ b/spec/javascripts/ide/stores/getters_spec.js @@ -84,4 +84,67 @@ describe('IDE store getters', () => { expect(getters.allBlobs(localState)[0].name).toBe('blob'); }); }); + + describe('getChangesInFolder', () => { + it('returns length of changed files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'app/123', + name: '123', + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(1); + }); + + it('returns length of changed & staged files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'testing/123', + name: '123', + }, + ); + + localState.stagedFiles.push( + { + path: 'test/123', + name: '123', + }, + { + path: 'test/index', + name: 'index', + }, + { + path: 'testing/12345', + name: '12345', + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(2); + }); + + it('returns length of changed & tempFiles files for a path', () => { + localState.changedFiles.push( + { + path: 'test/index', + name: 'index', + }, + { + path: 'test/newfile', + name: 'newfile', + tempFile: true, + }, + ); + + expect(getters.getChangesInFolder(localState)('test')).toBe(2); + }); + }); }); -- cgit v1.2.1 From 36cdd1e7179aedee7af42d100a208fc1c01e6c63 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Tue, 1 May 2018 13:11:57 +0400 Subject: Use group_type? where possible during transition period --- spec/services/ci/register_job_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 7d3c43eeaf7..256d0027d72 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -8,7 +8,7 @@ module Ci let!(:pending_job) { create :ci_build, pipeline: pipeline } let!(:shared_runner) { create :ci_runner, is_shared: true } let!(:specific_runner) { create :ci_runner, is_shared: false } - let!(:group_runner) { create :ci_runner, groups: [group] } + let!(:group_runner) { create :ci_runner, groups: [group], runner_type: :group_type } before do specific_runner.assign_to(project) -- cgit v1.2.1 From 0e5c1a89f0b6ecf88fc340194d292fccbde99782 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Tue, 1 May 2018 13:44:35 +0400 Subject: Fix spec/features/admin/admin_runners_spec.rb + test style improvements --- .../projects/settings/ci_cd_controller_spec.rb | 20 +++++++++++++------- spec/features/admin/admin_runners_spec.rb | 6 +++--- spec/models/ci/runner_spec.rb | 8 ++++---- 3 files changed, 20 insertions(+), 14 deletions(-) (limited to 'spec') diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb index 1cf395b0328..a91c868cbaf 100644 --- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb +++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb @@ -18,15 +18,21 @@ describe Projects::Settings::CiCdController do expect(response).to render_template(:show) end - it 'sets assignable project runners' do - group = create(:group, runners: [create(:ci_runner)], parent: create(:group)) - group.add_master(user) - project_runner = create(:ci_runner, projects: [create(:project, group: group)]) - create(:ci_runner, :shared) + context 'with group runners' do + let(:group_runner) { create(:ci_runner) } + let(:parent_group) { create(:group) } + let(:group) { create(:group, runners: [group_runner], parent: parent_group) } + let(:other_project) { create(:project, group: group) } + let!(:project_runner) { create(:ci_runner, projects: [other_project]) } + let!(:shared_runner) { create(:ci_runner, :shared) } - get :show, namespace_id: project.namespace, project_id: project + it 'sets assignable project runners only' do + group.add_master(user) + + get :show, namespace_id: project.namespace, project_id: project - expect(assigns(:assignable_runners)).to eq [project_runner] + expect(assigns(:assignable_runners)).to eq [project_runner] + end end end diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index b0aa2e8b588..3465ccfc423 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -61,10 +61,10 @@ describe "Admin Runners" do end context 'group runner' do - it 'shows the label and does not show the project count' do - group = create :group - runner = create :ci_runner, groups: [group] + let(:group) { create(:group) } + let!(:runner) { create(:ci_runner, groups: [group], runner_type: :group_type) } + it 'shows the label and does not show the project count' do visit admin_runners_path within "#runner_#{runner.id}" do diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index fb9dcce9a7c..fa540f8d4fd 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -21,8 +21,9 @@ describe Ci::Runner do end context 'either_projects_or_group' do + let(:group) { create(:group) } + it 'disallows assigning to a group if already assigned to a group' do - group = create(:group) runner = create(:ci_runner, groups: [group]) runner.groups << build(:group) @@ -42,7 +43,6 @@ describe Ci::Runner do end it 'disallows assigning to a project if already assigned to a group' do - group = create(:group) runner = create(:ci_runner, groups: [group]) runner.projects << build(:project) @@ -189,9 +189,9 @@ describe Ci::Runner do # globally shared shared_runner = create :ci_runner, :shared - expect(described_class.owned_or_shared(project.id)).to match_array [ + expect(described_class.owned_or_shared(project.id)).to contain_exactly( group_runner, project_runner, shared_runner - ] + ) end end -- cgit v1.2.1 From cac07a46e0bf5bad363f259973e532fc73351a8f Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 1 May 2018 11:00:23 +0100 Subject: fixed file spec --- spec/javascripts/ide/components/repo_file_spec.js | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'spec') diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js index 719d0687140..28ff06e1f80 100644 --- a/spec/javascripts/ide/components/repo_file_spec.js +++ b/spec/javascripts/ide/components/repo_file_spec.js @@ -58,6 +58,11 @@ describe('RepoFile', () => { projectId: 'project', }; + store.state.changedFiles.push({ + ...file('fileName'), + path: 'testing/fileName', + }); + createComponent({ file: f, level: 0, -- cgit v1.2.1 From 2261188f48dff25c5bfbbca739c5f570849155f4 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Wed, 2 May 2018 16:42:12 +0200 Subject: Rename Runner#invalidate_build_cache -> Runner#pick_build --- spec/models/ci/runner_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index fa540f8d4fd..6ad37417623 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -792,7 +792,7 @@ describe Ci::Runner do end end - describe '#invalidate_build_cache!' do + describe '#pick_build!' do context 'runner can pick the build' do it 'calls #tick_runner_queue' do ci_build = build :ci_build @@ -801,7 +801,7 @@ describe Ci::Runner do expect(runner).to receive(:tick_runner_queue) - runner.invalidate_build_cache!(ci_build) + runner.pick_build!(ci_build) end end @@ -813,7 +813,7 @@ describe Ci::Runner do expect(runner).not_to receive(:tick_runner_queue) - runner.invalidate_build_cache!(ci_build) + runner.pick_build!(ci_build) end end end -- cgit v1.2.1 From 1f7f29b7321c9cba5526ab991246f3178330b9cd Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 08:47:41 +0200 Subject: Style changes to spec/models/ci/runner_spec.rb --- spec/models/ci/runner_spec.rb | 70 +++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 35 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 6ad37417623..744972deb4d 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -107,16 +107,17 @@ describe Ci::Runner do end describe '.shared' do + let(:group) { create(:group) } + let(:project) { create(:project) } + it 'returns the shared group runner' do - group = create :group - runner = create :ci_runner, :shared, groups: [group] + runner = create(:ci_runner, :shared, groups: [group]) expect(described_class.shared).to eq [runner] end it 'returns the shared project runner' do - project = create :project - runner = create :ci_runner, :shared, projects: [project] + runner = create(:ci_runner, :shared, projects: [project]) expect(described_class.shared).to eq [runner] end @@ -125,12 +126,12 @@ describe Ci::Runner do describe '.belonging_to_project' do it 'returns the specific project runner' do # own - specific_project = create :project - specific_runner = create :ci_runner, :specific, projects: [specific_project] + specific_project = create(:project) + specific_runner = create(:ci_runner, :specific, projects: [specific_project]) # other - other_project = create :project - create :ci_runner, :specific, projects: [other_project] + other_project = create(:project) + create(:ci_runner, :specific, projects: [other_project]) expect(described_class.belonging_to_project(specific_project.id)).to eq [specific_runner] end @@ -139,55 +140,54 @@ describe Ci::Runner do describe '.belonging_to_any_project' do it 'returns the specific project runner' do # project - project_project = create :project - project_runner = create :ci_runner, :specific, projects: [project_project] + project_project = create(:project) + project_runner = create(:ci_runner, :specific, projects: [project_project]) # group - group = create :group - create :project, group: group - create :ci_runner, :specific, groups: [group] + group = create(:group) + create(:project, group: group) + create(:ci_runner, :specific, groups: [group]) expect(described_class.belonging_to_any_project).to eq [project_runner] end end describe '.belonging_to_parent_group_of_project' do - it 'returns the specific group runner' do - # own - specific_group = create :group - specific_project = create :project, group: specific_group - specific_runner = create :ci_runner, :specific, groups: [specific_group] - - # other - other_group = create :group - create :project, group: other_group - create :ci_runner, :specific, groups: [other_group] + let(:project) { create(:project, group: group) } + let(:group) { create(:group) } + let(:runner) { create(:ci_runner, :specific, groups: [group]) } + let!(:unrelated_group) { create(:group) } + let!(:unrelated_project) { create(:project, group: unrelated_group) } + let!(:unrelated_runner) { create(:ci_runner, :specific, groups: [unrelated_group]) } - expect(described_class.belonging_to_parent_group_of_project(specific_project.id)).to eq [specific_runner] + it 'returns the specific group runner' do + expect(described_class.belonging_to_parent_group_of_project(project.id)).to contain_exactly(runner) end - it 'returns the group runner from a parent group', :nested_groups do - parent_group = create :group - group = create :group, parent: parent_group - project = create :project, group: group - runner = create :ci_runner, :specific, groups: [parent_group] + context 'with a parent group with a runner', :nested_groups do + let(:runner) { create(:ci_runner, :specific, groups: [parent_group]) } + let(:project) { create(:project, group: group) } + let(:group) { create(:group, parent: parent_group) } + let(:parent_group) { create(:group) } - expect(described_class.belonging_to_parent_group_of_project(project.id)).to eq [runner] + it 'returns the group runner from the parent group' do + expect(described_class.belonging_to_parent_group_of_project(project.id)).to contain_exactly(runner) + end end end describe '.owned_or_shared' do it 'returns a globally shared, a project specific and a group specific runner' do # group specific - group = create :group - project = create :project, group: group - group_runner = create :ci_runner, :specific, groups: [group] + group = create(:group) + project = create(:project, group: group) + group_runner = create(:ci_runner, :specific, groups: [group]) # project specific - project_runner = create :ci_runner, :specific, projects: [project] + project_runner = create(:ci_runner, :specific, projects: [project]) # globally shared - shared_runner = create :ci_runner, :shared + shared_runner = create(:ci_runner, :shared) expect(described_class.owned_or_shared(project.id)).to contain_exactly( group_runner, project_runner, shared_runner -- cgit v1.2.1 From a6c9db61779c71fd0a7f0f317fba13f8931ab954 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 09:38:19 +0200 Subject: More style improvements to spec/models/ci/runner_spec.rb --- spec/models/ci/runner_spec.rb | 81 +++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 41 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 744972deb4d..21d7d616a3c 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -309,7 +309,9 @@ describe Ci::Runner do describe '#can_pick?' do let(:pipeline) { create(:ci_pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) } - let(:runner) { create(:ci_runner) } + let(:runner) { create(:ci_runner, tag_list: tag_list, run_untagged: run_untagged) } + let(:tag_list) { [] } + let(:run_untagged) { true } subject { runner.can_pick?(build) } @@ -319,7 +321,7 @@ describe Ci::Runner do context 'a different runner' do it 'cannot handle builds' do - other_runner = create :ci_runner + other_runner = create(:ci_runner) expect(other_runner.can_pick?(build)).to be_falsey end end @@ -337,9 +339,7 @@ describe Ci::Runner do end context 'when runner has tags' do - before do - runner.tag_list = %w(bb cc) - end + let(:tag_list) { %w(bb cc) } shared_examples 'tagged build picker' do it 'can handle build with matching tags' do @@ -364,9 +364,7 @@ describe Ci::Runner do end context 'when runner cannot pick untagged jobs' do - before do - runner.update_attributes!(run_untagged: false) - end + let(:run_untagged) { false } it 'cannot handle builds without tags' do expect(runner.can_pick?(build)).to be_falsey @@ -377,8 +375,9 @@ describe Ci::Runner do end context 'when runner is shared' do + let(:runner) { create(:ci_runner, :shared) } + before do - runner.update_attributes!(is_shared: true) build.project.runners = [] end @@ -387,9 +386,7 @@ describe Ci::Runner do end context 'when runner is locked' do - before do - runner.update_attributes!(locked: true) - end + let(:runner) { create(:ci_runner, :shared, locked: true) } it 'can handle builds' do expect(runner.can_pick?(build)).to be_truthy @@ -748,55 +745,57 @@ describe Ci::Runner do end end - describe 'assigned_to_group?' do - it 'returns false when the runner is a project runner' do - project = create :project - runner = create :ci_runner, description: 'Project runner', projects: [project] + describe '#assigned_to_group?' do + subject { runner.assigned_to_group? } + + context 'when project runner' do + let(:runner) { create(:ci_runner, description: 'Project runner', projects: [project]) } + let(:project) { create(:project) } - expect(runner.assigned_to_group?).to be false + it { is_expected.to be_falsey } end - it 'returns false when the runner is a shared runner' do - runner = create :ci_runner, :shared, description: 'Shared runner' + context 'when shared runner' do + let(:runner) { create(:ci_runner, :shared, description: 'Shared runner') } - expect(runner.assigned_to_group?).to be false + it { is_expected.to be_falsey } end - it 'returns true when the runner is assigned to a group' do - group = create :group - runner = create :ci_runner, description: 'Group runner', groups: [group] + context 'when group runner' do + let(:group) { create(:group) } + let(:runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } - expect(runner.assigned_to_group?).to be true + it { is_expected.to be_truthy } end end - describe 'assigned_to_project?' do - it 'returns false when the runner is a group prunner' do - group = create :group - runner = create :ci_runner, description: 'Group runner', groups: [group] + describe '#assigned_to_project?' do + subject { runner.assigned_to_project? } - expect(runner.assigned_to_project?).to be false + context 'when group runner' do + let(:runner) { create(:ci_runner, description: 'Group runner', groups: [group]) } + let(:group) { create(:group) } + it { is_expected.to be_falsey } end - it 'returns false when the runner is a shared runner' do - runner = create :ci_runner, :shared, description: 'Shared runner' - - expect(runner.assigned_to_project?).to be false + context 'when shared runner' do + let(:runner) { create(:ci_runner, :shared, description: 'Shared runner') } + it { is_expected.to be_falsey } end - it 'returns true when the runner is assigned to a project' do - project = create :project - runner = create :ci_runner, description: 'Group runner', projects: [project] + context 'when project runner' do + let(:runner) { create(:ci_runner, description: 'Group runner', projects: [project]) } + let(:project) { create(:project) } - expect(runner.assigned_to_project?).to be true + it { is_expected.to be_truthy } end end describe '#pick_build!' do context 'runner can pick the build' do it 'calls #tick_runner_queue' do - ci_build = build :ci_build - runner = build :ci_runner + ci_build = build(:ci_build) + runner = build(:ci_runner) allow(runner).to receive(:can_pick?).with(ci_build).and_return(true) expect(runner).to receive(:tick_runner_queue) @@ -807,8 +806,8 @@ describe Ci::Runner do context 'runner cannot pick the build' do it 'does not call #tick_runner_queue' do - ci_build = build :ci_build - runner = build :ci_runner + ci_build = build(:ci_build) + runner = build(:ci_runner) allow(runner).to receive(:can_pick?).with(ci_build).and_return(false) expect(runner).not_to receive(:tick_runner_queue) -- cgit v1.2.1 From 67f25c6259553e30e921de3d4d72d3e97d06d327 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 09:44:45 +0200 Subject: Style improvements to spec/models/project_spec.rb --- spec/models/project_spec.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'spec') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index ab0694e6890..08e42b61910 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1138,7 +1138,7 @@ describe Project do end end - describe '#any_runners' do + describe '#any_runners?' do context 'shared runners' do let(:project) { create :project, shared_runners_enabled: shared_runners_enabled } let(:specific_runner) { create :ci_runner } @@ -1153,21 +1153,25 @@ describe Project do it 'has a specific runner' do project.runners << specific_runner + expect(project.any_runners?).to be_truthy end it 'has a shared runner, but they are prohibited to use' do shared_runner + expect(project.any_runners?).to be_falsey end it 'checks the presence of specific runner' do project.runners << specific_runner + expect(project.any_runners? { |runner| runner == specific_runner }).to be_truthy end it 'returns false if match cannot be found' do project.runners << specific_runner + expect(project.any_runners? { false }).to be_falsey end end @@ -1177,16 +1181,19 @@ describe Project do it 'has a shared runner' do shared_runner + expect(project.any_runners?).to be_truthy end it 'checks the presence of shared runner' do shared_runner + expect(project.any_runners? { |runner| runner == shared_runner }).to be_truthy end it 'returns false if match cannot be found' do shared_runner + expect(project.any_runners? { false }).to be_falsey end end @@ -1206,6 +1213,7 @@ describe Project do it 'has a group runner, but they are prohibited to use' do group_runner + expect(project.any_runners?).to be_falsey end end @@ -1215,16 +1223,19 @@ describe Project do it 'has a group runner' do group_runner + expect(project.any_runners?).to be_truthy end it 'checks the presence of group runner' do group_runner + expect(project.any_runners? { |runner| runner == group_runner }).to be_truthy end it 'returns false if match cannot be found' do group_runner + expect(project.any_runners? { false }).to be_falsey end end @@ -3592,7 +3603,7 @@ describe Project do describe '#toggle_ci_cd_settings!' do it 'toggles the value on #settings' do - project = create :project, group_runners_enabled: false + project = create(:project, group_runners_enabled: false) expect(project.group_runners_enabled).to be false -- cgit v1.2.1 From dcb67951a817db262ddcd3b777fafc4e1995fc04 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 09:45:09 +0200 Subject: Make assertions about runner_type in spec/requests/api/runner_spec.rb --- spec/requests/api/runner_spec.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index 5ea110b4d82..27f5dff7901 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -40,6 +40,7 @@ describe API::Runner do expect(json_response['token']).to eq(runner.token) expect(runner.run_untagged).to be true expect(runner.token).not_to eq(registration_token) + expect(runner).to be_instance_type end context 'when project token is used' do @@ -50,8 +51,10 @@ describe API::Runner do expect(response).to have_gitlab_http_status 201 expect(project.runners.size).to eq(1) - expect(Ci::Runner.first.token).not_to eq(registration_token) - expect(Ci::Runner.first.token).not_to eq(project.runners_token) + runner = Ci::Runner.first + expect(runner.token).not_to eq(registration_token) + expect(runner.token).not_to eq(project.runners_token) + expect(runner).to be_project_type end end @@ -63,8 +66,10 @@ describe API::Runner do expect(response).to have_http_status 201 expect(group.runners.size).to eq(1) - expect(Ci::Runner.first.token).not_to eq(registration_token) - expect(Ci::Runner.first.token).not_to eq(group.runners_token) + runner = Ci::Runner.first + expect(runner.token).not_to eq(registration_token) + expect(runner.token).not_to eq(group.runners_token) + expect(runner).to be_group_type end end end -- cgit v1.2.1 From 49cbe576229b7e4003575e04006cc4132c3c0060 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 10:59:38 +0200 Subject: Remove Runner#belonging_to_any_project since this is no longer needed --- spec/models/ci/runner_spec.rb | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'spec') diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 21d7d616a3c..cc4d4e5e4ae 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -137,21 +137,6 @@ describe Ci::Runner do end end - describe '.belonging_to_any_project' do - it 'returns the specific project runner' do - # project - project_project = create(:project) - project_runner = create(:ci_runner, :specific, projects: [project_project]) - - # group - group = create(:group) - create(:project, group: group) - create(:ci_runner, :specific, groups: [group]) - - expect(described_class.belonging_to_any_project).to eq [project_runner] - end - end - describe '.belonging_to_parent_group_of_project' do let(:project) { create(:project, group: group) } let(:group) { create(:group) } -- cgit v1.2.1 From d2665707c04594a6cea22ebb3b4d89a0577d02c5 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Thu, 3 May 2018 13:01:52 +0530 Subject: Emit `toggleSubscription`, `toggleSidebar` events on component --- spec/javascripts/sidebar/subscriptions_spec.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'spec') diff --git a/spec/javascripts/sidebar/subscriptions_spec.js b/spec/javascripts/sidebar/subscriptions_spec.js index aee8f0acbb9..f0a53e573c3 100644 --- a/spec/javascripts/sidebar/subscriptions_spec.js +++ b/spec/javascripts/sidebar/subscriptions_spec.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import subscriptions from '~/sidebar/components/subscriptions/subscriptions.vue'; +import eventHub from '~/sidebar/event_hub'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; describe('Subscriptions', function () { @@ -39,4 +40,22 @@ describe('Subscriptions', function () { expect(vm.$refs.toggleButton.$el.querySelector('.project-feature-toggle')).toHaveClass('is-checked'); }); + + it('toggleSubscription method emits `toggleSubscription` event on eventHub and Component', () => { + vm = mountComponent(Subscriptions, { subscribed: true }); + spyOn(eventHub, '$emit'); + spyOn(vm, '$emit'); + + vm.toggleSubscription(); + expect(eventHub.$emit).toHaveBeenCalledWith('toggleSubscription', jasmine.any(Object)); + expect(vm.$emit).toHaveBeenCalledWith('toggleSubscription', jasmine.any(Object)); + }); + + it('onClickCollapsedIcon method emits `toggleSidebar` event on component', () => { + vm = mountComponent(Subscriptions, { subscribed: true }); + spyOn(vm, '$emit'); + + vm.onClickCollapsedIcon(); + expect(vm.$emit).toHaveBeenCalledWith('toggleSidebar'); + }); }); -- cgit v1.2.1 From 342fbbdaa2f7bdf2ac9cecdbcce55ae0f3f09485 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Thu, 3 May 2018 13:02:04 +0530 Subject: Consume `toggleSubscription` event directly from Subscriptions component --- spec/javascripts/sidebar/sidebar_subscriptions_spec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'spec') diff --git a/spec/javascripts/sidebar/sidebar_subscriptions_spec.js b/spec/javascripts/sidebar/sidebar_subscriptions_spec.js index 56a2543660b..9e437084224 100644 --- a/spec/javascripts/sidebar/sidebar_subscriptions_spec.js +++ b/spec/javascripts/sidebar/sidebar_subscriptions_spec.js @@ -3,7 +3,6 @@ import sidebarSubscriptions from '~/sidebar/components/subscriptions/sidebar_sub import SidebarMediator from '~/sidebar/sidebar_mediator'; import SidebarService from '~/sidebar/services/sidebar_service'; import SidebarStore from '~/sidebar/stores/sidebar_store'; -import eventHub from '~/sidebar/event_hub'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; import Mock from './mock_data'; @@ -32,7 +31,7 @@ describe('Sidebar Subscriptions', function () { mediator, }); - eventHub.$emit('toggleSubscription'); + vm.onToggleSubscription(); expect(mediator.toggleSubscription).toHaveBeenCalled(); }); -- cgit v1.2.1 From e164447bf1c110f2b0df2589c4a7be1388d07151 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Thu, 3 May 2018 15:05:17 +0530 Subject: Emit `toggleSidebar` event on component when icon is clicked --- spec/javascripts/sidebar/participants_spec.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'spec') diff --git a/spec/javascripts/sidebar/participants_spec.js b/spec/javascripts/sidebar/participants_spec.js index 2a3b60c399c..e796ddee62f 100644 --- a/spec/javascripts/sidebar/participants_spec.js +++ b/spec/javascripts/sidebar/participants_spec.js @@ -170,5 +170,19 @@ describe('Participants', function () { expect(vm.isShowingMoreParticipants).toBe(true); }); + + it('clicking on participants icon emits `toggleSidebar` event', () => { + vm = mountComponent(Participants, { + loading: false, + participants: PARTICIPANT_LIST, + numberOfLessParticipants: 2, + }); + spyOn(vm, '$emit'); + + const participantsIconEl = vm.$el.querySelector('.sidebar-collapsed-icon'); + + participantsIconEl.click(); + expect(vm.$emit).toHaveBeenCalledWith('toggleSidebar'); + }); }); }); -- cgit v1.2.1 From bf790c26c58e214c27132e7a54fdf4a4cc77bdaf Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 13:39:20 +0200 Subject: Use factory in specs for ProjectCiCdSettings --- spec/factories/project_ci_cd_settings.rb | 10 ++++++++++ spec/factories/projects.rb | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 spec/factories/project_ci_cd_settings.rb (limited to 'spec') diff --git a/spec/factories/project_ci_cd_settings.rb b/spec/factories/project_ci_cd_settings.rb new file mode 100644 index 00000000000..2e85b54e245 --- /dev/null +++ b/spec/factories/project_ci_cd_settings.rb @@ -0,0 +1,10 @@ +FactoryBot.define do + factory :project_ci_cd_setting do + project + + initialize_with do + # ci_cd_settings are automatically created when a project is created + project&.ci_cd_settings || new + end + end +end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index aed5eab8044..e0e72e7f2ce 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -14,6 +14,7 @@ FactoryBot.define do # Associations namespace creator { group ? create(:user) : namespace&.owner } + ci_cd_settings strategy: :build, factory: :project_ci_cd_setting, project: nil transient do # Nest Project Feature attributes @@ -23,10 +24,6 @@ FactoryBot.define do issues_access_level ProjectFeature::ENABLED merge_requests_access_level ProjectFeature::ENABLED repository_access_level ProjectFeature::ENABLED - - # we can't assign the delegated `#ci_cd_settings` attributes directly, as the - # `#ci_cd_settings` relation needs to be created first - group_runners_enabled nil end after(:create) do |project, evaluator| @@ -51,9 +48,6 @@ FactoryBot.define do end project.group&.refresh_members_authorized_projects - - # assign the delegated `#ci_cd_settings` attributes after create - project.reload.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? end trait :public do -- cgit v1.2.1 From 6c1a12edfcf54193a839ee0a7d5fe0f824f15cbe Mon Sep 17 00:00:00 2001 From: Lukas Eipert Date: Thu, 3 May 2018 14:31:32 +0200 Subject: ensure users are signed out properly in user_uses_slash_commands_spec.rb See https://gitlab.com/gitlab-org/gitlab-ce/issues/45970 --- spec/features/issues/user_uses_slash_commands_spec.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'spec') diff --git a/spec/features/issues/user_uses_slash_commands_spec.rb b/spec/features/issues/user_uses_slash_commands_spec.rb index ddd64fa1412..fd0aa6cf3a3 100644 --- a/spec/features/issues/user_uses_slash_commands_spec.rb +++ b/spec/features/issues/user_uses_slash_commands_spec.rb @@ -161,6 +161,7 @@ feature 'Issues > User uses quick actions', :js do before do target_project.add_master(user) + gitlab_sign_out sign_in(user) visit project_issue_path(project, issue) end @@ -220,6 +221,7 @@ feature 'Issues > User uses quick actions', :js do before do target_project.add_master(user) + gitlab_sign_out sign_in(user) visit project_issue_path(project, issue) end -- cgit v1.2.1 From af15b6f0e144762a38591c53b970e312c35fe65f Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 14:37:01 +0200 Subject: Fix Project#group_runners_enabled as it was doing nothing --- spec/services/ci/register_job_service_spec.rb | 28 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'spec') diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 256d0027d72..8063bc7e1ac 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -2,13 +2,13 @@ require 'spec_helper' module Ci describe RegisterJobService do - let!(:project) { create :project, shared_runners_enabled: false } - let!(:group) { create :group } - let!(:pipeline) { create :ci_pipeline, project: project } - let!(:pending_job) { create :ci_build, pipeline: pipeline } - let!(:shared_runner) { create :ci_runner, is_shared: true } - let!(:specific_runner) { create :ci_runner, is_shared: false } - let!(:group_runner) { create :ci_runner, groups: [group], runner_type: :group_type } + set(:group) { create(:group) } + set(:project) { create(:project, group: group, shared_runners_enabled: false, group_runners_enabled: false) } + set(:pipeline) { create(:ci_pipeline, project: project) } + let!(:shared_runner) { create(:ci_runner, is_shared: true) } + let!(:specific_runner) { create(:ci_runner, is_shared: false) } + let!(:group_runner) { create(:ci_runner, groups: [group], runner_type: :group_type) } + let!(:pending_job) { create(:ci_build, pipeline: pipeline) } before do specific_runner.assign_to(project) @@ -152,7 +152,7 @@ module Ci context 'disallow when builds are disabled' do before do - project.update(shared_runners_enabled: true) + project.update(shared_runners_enabled: true, group_runners_enabled: true) project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED) end @@ -162,7 +162,13 @@ module Ci it { expect(build).to be_nil } end - context 'and uses specific runner' do + context 'and uses group runner' do + let(:build) { execute(group_runner) } + + it { expect(build).to be_nil } + end + + context 'and uses project runner' do let(:build) { execute(specific_runner) } it { expect(build).to be_nil } @@ -171,7 +177,7 @@ module Ci context 'allow group runners' do before do - project.update!(group_runners_enabled: true, group: group) + project.update!(group_runners_enabled: true) end context 'for multiple builds' do @@ -230,7 +236,7 @@ module Ci context 'disallow group runners' do before do - project.update(group_runners_enabled: false) + project.update!(group_runners_enabled: false) end context 'group runner' do -- cgit v1.2.1 From 794ac6c5421e04056dfd336559786fb166c9fa0a Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 15:38:55 +0200 Subject: Revert "Use factory in specs for ProjectCiCdSettings" This reverts commit bf790c26c58e214c27132e7a54fdf4a4cc77bdaf. --- spec/factories/project_ci_cd_settings.rb | 10 ---------- spec/factories/projects.rb | 8 +++++++- 2 files changed, 7 insertions(+), 11 deletions(-) delete mode 100644 spec/factories/project_ci_cd_settings.rb (limited to 'spec') diff --git a/spec/factories/project_ci_cd_settings.rb b/spec/factories/project_ci_cd_settings.rb deleted file mode 100644 index 2e85b54e245..00000000000 --- a/spec/factories/project_ci_cd_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -FactoryBot.define do - factory :project_ci_cd_setting do - project - - initialize_with do - # ci_cd_settings are automatically created when a project is created - project&.ci_cd_settings || new - end - end -end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index e0e72e7f2ce..aed5eab8044 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -14,7 +14,6 @@ FactoryBot.define do # Associations namespace creator { group ? create(:user) : namespace&.owner } - ci_cd_settings strategy: :build, factory: :project_ci_cd_setting, project: nil transient do # Nest Project Feature attributes @@ -24,6 +23,10 @@ FactoryBot.define do issues_access_level ProjectFeature::ENABLED merge_requests_access_level ProjectFeature::ENABLED repository_access_level ProjectFeature::ENABLED + + # we can't assign the delegated `#ci_cd_settings` attributes directly, as the + # `#ci_cd_settings` relation needs to be created first + group_runners_enabled nil end after(:create) do |project, evaluator| @@ -48,6 +51,9 @@ FactoryBot.define do end project.group&.refresh_members_authorized_projects + + # assign the delegated `#ci_cd_settings` attributes after create + project.reload.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? end trait :public do -- cgit v1.2.1 From 8e7b12aeaed2b67bf4dfafa0c95a09e6a8620a8a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 3 May 2018 10:45:13 -0500 Subject: Remove a warning from spec/features/admin/admin_users_spec.rb --- spec/features/admin/admin_users_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 8f0a3611052..8fc57f4b4c3 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -285,7 +285,7 @@ describe "Admin::Users" do it "lists group projects" do within(:css, '.append-bottom-default + .panel') do expect(page).to have_content 'Group projects' - expect(page).to have_link group.name, admin_group_path(group) + expect(page).to have_link group.name, href: admin_group_path(group) end end -- cgit v1.2.1