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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-08-16 12:09:05 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-08-16 12:09:05 +0300
commit78e911431fc575ff4f6c9b7e0f95c02b57a5e926 (patch)
tree1f3ff9709f56bfb1b6834eef1275a7c9606c5aaa /spec
parent80f5d0d15f8d7ced767651978fb016072003f376 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin/users_controller_spec.rb1
-rw-r--r--spec/frontend/fixtures/api_markdown.yml16
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js31
-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.rb11
-rw-r--r--spec/models/ci/pipeline_spec.rb36
-rw-r--r--spec/services/projects/update_pages_service_spec.rb95
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