diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-16 12:09:05 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-16 12:09:05 +0300 |
commit | 78e911431fc575ff4f6c9b7e0f95c02b57a5e926 (patch) | |
tree | 1f3ff9709f56bfb1b6834eef1275a7c9606c5aaa /spec | |
parent | 80f5d0d15f8d7ced767651978fb016072003f376 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/controllers/admin/users_controller_spec.rb | 1 | ||||
-rw-r--r-- | spec/frontend/fixtures/api_markdown.yml | 16 | ||||
-rw-r--r-- | spec/frontend/import_entities/import_groups/components/import_table_spec.js | 31 | ||||
-rw-r--r-- | spec/frontend/import_entities/import_groups/components/import_target_cell_spec.js (renamed from spec/frontend/import_entities/import_groups/components/import_table_row_spec.js) | 23 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/lint_spec.rb | 11 | ||||
-rw-r--r-- | spec/models/ci/pipeline_spec.rb | 36 | ||||
-rw-r--r-- | spec/services/projects/update_pages_service_spec.rb | 95 |
7 files changed, 157 insertions, 56 deletions
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index be21fffb296..6e172f53257 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -416,6 +416,7 @@ RSpec.describe Admin::UsersController do put :unlock, params: { id: user.username } user.reload expect(user.access_locked?).to be_falsey + expect(flash[:notice]).to eq _('Successfully unlocked') end end diff --git a/spec/frontend/fixtures/api_markdown.yml b/spec/frontend/fixtures/api_markdown.yml index 449bbf62080..fd496ab6327 100644 --- a/spec/frontend/fixtures/api_markdown.yml +++ b/spec/frontend/fixtures/api_markdown.yml @@ -72,6 +72,22 @@ 1. list item 1 2. list item 2 3. list item 3 +- name: task_list + markdown: |- + * [x] hello + * [x] world + * [ ] example + * [ ] of nested + * [x] task list + * [ ] items +- name: ordered_task_list + markdown: |- + 1. [x] hello + 2. [x] world + 3. [ ] example + 1. [ ] of nested + 1. [x] task list + 2. [ ] items - name: image markdown: '![alt text](https://gitlab.com/logo.png)' - name: hard_break diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js index 5344afe7aa1..e0f951dca29 100644 --- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js @@ -3,18 +3,18 @@ import { GlEmptyState, GlLoadingIcon, GlSearchBoxByClick, - GlSprintf, GlDropdown, GlDropdownItem, } from '@gitlab/ui'; -import { shallowMount, createLocalVue } from '@vue/test-utils'; +import { mount, createLocalVue } from '@vue/test-utils'; import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; +import stubChildren from 'helpers/stub_children'; import { stubComponent } from 'helpers/stub_component'; import waitForPromises from 'helpers/wait_for_promises'; import { STATUSES } from '~/import_entities/constants'; import ImportTable from '~/import_entities/import_groups/components/import_table.vue'; -import ImportTableRow from '~/import_entities/import_groups/components/import_table_row.vue'; +import ImportTargetCell from '~/import_entities/import_groups/components/import_target_cell.vue'; import importGroupsMutation from '~/import_entities/import_groups/graphql/mutations/import_groups.mutation.graphql'; import setImportTargetMutation from '~/import_entities/import_groups/graphql/mutations/set_import_target.mutation.graphql'; import PaginationLinks from '~/vue_shared/components/pagination_links.vue'; @@ -57,15 +57,17 @@ describe('import table', () => { }, }); - wrapper = shallowMount(ImportTable, { + wrapper = mount(ImportTable, { propsData: { groupPathRegex: /.*/, sourceUrl: SOURCE_URL, groupUrlErrorMessage: 'Please choose a group URL with no special characters or spaces.', }, stubs: { - GlSprintf, + ...stubChildren(ImportTable), + GlSprintf: false, GlDropdown: GlDropdownStub, + GlTable: false, }, localVue, apolloProvider, @@ -115,7 +117,7 @@ describe('import table', () => { }); await waitForPromises(); - expect(wrapper.findAll(ImportTableRow)).toHaveLength(FAKE_GROUPS.length); + expect(wrapper.findAll('tbody tr')).toHaveLength(FAKE_GROUPS.length); }); it('does not render status string when result list is empty', async () => { @@ -142,16 +144,29 @@ describe('import table', () => { event | payload | mutation | variables ${'update-target-namespace'} | ${'new-namespace'} | ${setImportTargetMutation} | ${{ sourceGroupId: FAKE_GROUP.id, targetNamespace: 'new-namespace', newName: 'group1' }} ${'update-new-name'} | ${'new-name'} | ${setImportTargetMutation} | ${{ sourceGroupId: FAKE_GROUP.id, targetNamespace: 'root', newName: 'new-name' }} - ${'import-group'} | ${undefined} | ${importGroupsMutation} | ${{ sourceGroupIds: [FAKE_GROUP.id] }} `('correctly maps $event to mutation', async ({ event, payload, mutation, variables }) => { jest.spyOn(apolloProvider.defaultClient, 'mutate'); - wrapper.find(ImportTableRow).vm.$emit(event, payload); + wrapper.find(ImportTargetCell).vm.$emit(event, payload); await waitForPromises(); expect(apolloProvider.defaultClient.mutate).toHaveBeenCalledWith({ mutation, variables, }); }); + + it('invokes importGroups mutation when row button is clicked', async () => { + jest.spyOn(apolloProvider.defaultClient, 'mutate'); + const triggerImportButton = wrapper + .findAllComponents(GlButton) + .wrappers.find((w) => w.text() === 'Import'); + + triggerImportButton.vm.$emit('click'); + await waitForPromises(); + expect(apolloProvider.defaultClient.mutate).toHaveBeenCalledWith({ + mutation: importGroupsMutation, + variables: { sourceGroupIds: [FAKE_GROUP.id] }, + }); + }); }); describe('pagination', () => { diff --git a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js b/spec/frontend/import_entities/import_groups/components/import_target_cell_spec.js index 6e059d5bc2b..8231297e594 100644 --- a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_target_cell_spec.js @@ -4,7 +4,7 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import ImportGroupDropdown from '~/import_entities/components/group_dropdown.vue'; import { STATUSES } from '~/import_entities/constants'; -import ImportTableRow from '~/import_entities/import_groups/components/import_table_row.vue'; +import ImportTargetCell from '~/import_entities/import_groups/components/import_target_cell.vue'; import { availableNamespacesFixture } from '../graphql/fixtures'; Vue.use(VueApollo); @@ -22,19 +22,18 @@ const getFakeGroup = (status) => ({ progress: { status }, }); -describe('import table row', () => { +describe('import target cell', () => { let wrapper; let group; const findByText = (cmp, text) => { return wrapper.findAll(cmp).wrappers.find((node) => node.text().indexOf(text) === 0); }; - const findImportButton = () => findByText(GlButton, 'Import'); const findNameInput = () => wrapper.find(GlFormInput); const findNamespaceDropdown = () => wrapper.find(ImportGroupDropdown); const createComponent = (props) => { - wrapper = shallowMount(ImportTableRow, { + wrapper = shallowMount(ImportTargetCell, { stubs: { ImportGroupDropdown }, propsData: { availableNamespaces: availableNamespacesFixture, @@ -56,14 +55,10 @@ describe('import table row', () => { createComponent({ group }); }); - it.each` - selector | sourceEvent | payload | event - ${findNameInput} | ${'input'} | ${'demo'} | ${'update-new-name'} - ${findImportButton} | ${'click'} | ${undefined} | ${'import-group'} - `('invokes $event', ({ selector, sourceEvent, payload, event }) => { - selector().vm.$emit(sourceEvent, payload); - expect(wrapper.emitted(event)).toBeDefined(); - expect(wrapper.emitted(event)[0][0]).toBe(payload); + it('invokes $event', () => { + findNameInput().vm.$emit('input', 'demo'); + expect(wrapper.emitted('update-new-name')).toBeDefined(); + expect(wrapper.emitted('update-new-name')[0][0]).toBe('demo'); }); it('emits update-target-namespace when dropdown option is clicked', () => { @@ -83,10 +78,6 @@ describe('import table row', () => { createComponent({ group }); }); - it('renders Import button', () => { - expect(findByText(GlButton, 'Import').exists()).toBe(true); - }); - it('renders namespace dropdown as not disabled', () => { expect(findNamespaceDropdown().attributes('disabled')).toBe(undefined); }); diff --git a/spec/lib/gitlab/ci/lint_spec.rb b/spec/lib/gitlab/ci/lint_spec.rb index 77f6608eb85..1e433d7854a 100644 --- a/spec/lib/gitlab/ci/lint_spec.rb +++ b/spec/lib/gitlab/ci/lint_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Gitlab::Ci::Lint do - let(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } let(:lint) { described_class.new(project: project, current_user: user) } @@ -89,6 +89,15 @@ RSpec.describe Gitlab::Ci::Lint do ) end + after do + project.repository.delete_file( + project.creator, + 'another-gitlab-ci.yml', + message: 'Remove another-gitlab-ci.yml', + branch_name: 'master' + ) + end + it 'sets merged_config' do root_config = YAML.safe_load(content, [Symbol]) included_config = YAML.safe_load(included_content, [Symbol]) diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 1d0b67c6902..da89eccc3b2 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -2277,18 +2277,38 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do end describe '.latest_successful_for_refs' do - let!(:latest_successful_pipeline1) do - create_pipeline(:success, 'ref1', 'D') - end + subject(:latest_successful_for_refs) { described_class.latest_successful_for_refs(refs) } + + context 'when refs are specified' do + let(:refs) { %w(first_ref second_ref third_ref) } + + before do + create(:ci_empty_pipeline, id: 1001, status: :success, ref: 'first_ref', sha: 'sha') + create(:ci_empty_pipeline, id: 1002, status: :success, ref: 'second_ref', sha: 'sha') + end - let!(:latest_successful_pipeline2) do - create_pipeline(:success, 'ref2', 'D') + let!(:latest_successful_pipeline_for_first_ref) do + create(:ci_empty_pipeline, id: 2001, status: :success, ref: 'first_ref', sha: 'sha') + end + + let!(:latest_successful_pipeline_for_second_ref) do + create(:ci_empty_pipeline, id: 2002, status: :success, ref: 'second_ref', sha: 'sha') + end + + it 'returns the latest successful pipeline for both refs' do + expect(latest_successful_for_refs).to eq({ + 'first_ref' => latest_successful_pipeline_for_first_ref, + 'second_ref' => latest_successful_pipeline_for_second_ref + }) + end end - it 'returns the latest successful pipeline for both refs' do - refs = %w(ref1 ref2 ref3) + context 'when no refs are specified' do + let(:refs) { [] } - expect(described_class.latest_successful_for_refs(refs)).to eq({ 'ref1' => latest_successful_pipeline1, 'ref2' => latest_successful_pipeline2 }) + it 'returns an empty relation whenno refs are specified' do + expect(latest_successful_for_refs).to be_empty + end end end end diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index fd858fa9550..aef8244c3d3 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -4,6 +4,8 @@ require "spec_helper" RSpec.describe Projects::UpdatePagesService do let_it_be(:project, refind: true) { create(:project, :repository) } + + let_it_be(:old_pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) } let_it_be(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) } let(:build) { create(:ci_build, pipeline: pipeline, ref: 'HEAD') } @@ -94,6 +96,7 @@ RSpec.describe Projects::UpdatePagesService do expect(deployment.file_count).to eq(3) expect(deployment.file_sha256).to eq(artifacts_archive.file_sha256) expect(project.pages_metadatum.reload.pages_deployment_id).to eq(deployment.id) + expect(deployment.ci_build_id).to eq(build.id) end it 'fails if another deployment is in progress' do @@ -106,19 +109,6 @@ RSpec.describe Projects::UpdatePagesService do end end - it 'fails if sha on branch was updated before deployment was uploaded' do - expect(subject).to receive(:create_pages_deployment).and_wrap_original do |m, *args| - build.update!(ref: 'feature') - m.call(*args) - end - - expect(execute).not_to eq(:success) - expect(project.pages_metadatum).not_to be_deployed - - expect(deploy_status).to be_failed - expect(deploy_status.description).to eq('build SHA is outdated for this ref') - end - it 'does not fail if pages_metadata is absent' do project.pages_metadatum.destroy! project.reload @@ -190,16 +180,6 @@ RSpec.describe Projects::UpdatePagesService do expect(ProjectPagesMetadatum.find_by_project_id(project)).to be_nil end - it 'fails if sha on branch is not latest' do - build.update!(ref: 'feature') - - expect(execute).not_to eq(:success) - expect(project.pages_metadatum).not_to be_deployed - - expect(deploy_status).to be_failed - expect(deploy_status.description).to eq('build SHA is outdated for this ref') - end - context 'when using empty file' do let(:file) { empty_file } @@ -274,6 +254,75 @@ RSpec.describe Projects::UpdatePagesService do expect(execute).to eq(:success) end end + + context "when sha on branch was updated before deployment was uploaded" do + before do + expect(subject).to receive(:create_pages_deployment).and_wrap_original do |m, *args| + build.update!(ref: 'feature') + m.call(*args) + end + end + + shared_examples 'fails with outdated reference message' do + it 'fails' do + expect(execute).not_to eq(:success) + expect(project.reload.pages_metadatum).not_to be_deployed + + expect(deploy_status).to be_failed + expect(deploy_status.description).to eq('build SHA is outdated for this ref') + end + end + + shared_examples 'successfully deploys' do + it 'succeeds' do + expect do + expect(execute).to eq(:success) + end.to change { project.pages_deployments.count }.by(1) + + deployment = project.pages_deployments.last + expect(deployment.ci_build_id).to eq(build.id) + end + end + + include_examples 'successfully deploys' + + context 'when pages_smart_check_outdated_sha feature flag is disabled' do + before do + stub_feature_flags(pages_smart_check_outdated_sha: false) + end + + include_examples 'fails with outdated reference message' + end + + context 'when old deployment present' do + before do + old_build = create(:ci_build, pipeline: old_pipeline, ref: 'HEAD') + old_deployment = create(:pages_deployment, ci_build: old_build, project: project) + project.update_pages_deployment!(old_deployment) + end + + include_examples 'successfully deploys' + + context 'when pages_smart_check_outdated_sha feature flag is disabled' do + before do + stub_feature_flags(pages_smart_check_outdated_sha: false) + end + + include_examples 'fails with outdated reference message' + end + end + + context 'when newer deployment present' do + before do + new_pipeline = create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) + new_build = create(:ci_build, pipeline: new_pipeline, ref: 'HEAD') + new_deployment = create(:pages_deployment, ci_build: new_build, project: project) + project.update_pages_deployment!(new_deployment) + end + + include_examples 'fails with outdated reference message' + end + end end end |