diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-28 03:09:33 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-28 03:09:33 +0300 |
commit | 56df7f06f1e57d66efcff5d8ad0026252cc91192 (patch) | |
tree | 3e0ffb97bf20b9125cb04c18735e0df5f7570b55 /spec | |
parent | 579e85eb029c4ee66e8b8cd537a94b9e6cb0e58b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
7 files changed, 202 insertions, 80 deletions
diff --git a/spec/controllers/groups/registry/repositories_controller_spec.rb b/spec/controllers/groups/registry/repositories_controller_spec.rb index a84664c6c04..7b78aeadbd8 100644 --- a/spec/controllers/groups/registry/repositories_controller_spec.rb +++ b/spec/controllers/groups/registry/repositories_controller_spec.rb @@ -6,12 +6,13 @@ describe Groups::Registry::RepositoriesController do let_it_be(:user) { create(:user) } let_it_be(:guest) { create(:user) } let_it_be(:group, reload: true) { create(:group) } + let(:additional_parameters) { {} } subject do - get :index, params: { + get :index, params: additional_parameters.merge({ group_id: group, format: format - } + }) end before do @@ -36,6 +37,25 @@ describe Groups::Registry::RepositoriesController do end end + shared_examples 'with name parameter' do + let_it_be(:project) { create(:project, group: test_group) } + let_it_be(:repo) { create(:container_repository, project: project, name: 'my_searched_image') } + let_it_be(:another_repo) { create(:container_repository, project: project, name: 'bar') } + + let(:additional_parameters) { { name: 'my_searched_image' } } + + it 'returns the searched repo' do + subject + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response.length).to eq 1 + expect(json_response.first).to include( + 'id' => repo.id, + 'name' => repo.name + ) + end + end + shared_examples 'renders correctly' do context 'when user has access to registry' do let_it_be(:test_group) { group } @@ -64,6 +84,8 @@ describe Groups::Registry::RepositoriesController do it_behaves_like 'renders a list of repositories' + it_behaves_like 'with name parameter' + it_behaves_like 'a gitlab tracking event', described_class.name, 'list_repositories' context 'with project in subgroup' do @@ -71,6 +93,8 @@ describe Groups::Registry::RepositoriesController do it_behaves_like 'renders a list of repositories' + it_behaves_like 'with name parameter' + context 'with project in subgroup and group' do let_it_be(:repo_in_test_group) { create_project_with_repo(test_group) } let_it_be(:repo_in_group) { create_project_with_repo(group) } @@ -81,6 +105,8 @@ describe Groups::Registry::RepositoriesController do expect(json_response).to be_kind_of(Array) expect(json_response.length).to eq 2 end + + it_behaves_like 'with name parameter' end end end diff --git a/spec/controllers/projects/registry/repositories_controller_spec.rb b/spec/controllers/projects/registry/repositories_controller_spec.rb index c641a45a216..badb84f9b50 100644 --- a/spec/controllers/projects/registry/repositories_controller_spec.rb +++ b/spec/controllers/projects/registry/repositories_controller_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Projects::Registry::RepositoriesController do - let(:user) { create(:user) } - let(:project) { create(:project, :private) } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :private) } before do sign_in(user) @@ -16,6 +16,22 @@ describe Projects::Registry::RepositoriesController do project.add_developer(user) end + shared_examples 'with name parameter' do + let_it_be(:repo) { create(:container_repository, project: project, name: 'my_searched_image') } + let_it_be(:another_repo) { create(:container_repository, project: project, name: 'bar') } + + it 'returns the searched repo' do + go_to_index(format: :json, params: { name: 'my_searched_image' }) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response.length).to eq 1 + expect(json_response.first).to include( + 'id' => repo.id, + 'name' => repo.name + ) + end + end + shared_examples 'renders a list of repositories' do context 'when root container repository exists' do before do @@ -60,6 +76,8 @@ describe Projects::Registry::RepositoriesController do expect(response).to match_response_schema('registry/repositories') expect(response).to include_pagination_headers end + + it_behaves_like 'with name parameter' end context 'when there are no tags for this repository' do @@ -138,11 +156,11 @@ describe Projects::Registry::RepositoriesController do end end - def go_to_index(format: :html) - get :index, params: { + def go_to_index(format: :html, params: {} ) + get :index, params: params.merge({ namespace_id: project.namespace, project_id: project - }, + }), format: format end diff --git a/spec/finders/container_repositories_finder_spec.rb b/spec/finders/container_repositories_finder_spec.rb index 08c241186d6..d0c91a8f734 100644 --- a/spec/finders/container_repositories_finder_spec.rb +++ b/spec/finders/container_repositories_finder_spec.rb @@ -6,18 +6,35 @@ describe ContainerRepositoriesFinder do let_it_be(:reporter) { create(:user) } let_it_be(:guest) { create(:user) } - let(:group) { create(:group) } - let(:project) { create(:project, group: group) } - let!(:project_repository) { create(:container_repository, project: project) } + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, group: group) } + let_it_be(:project_repository) { create(:container_repository, name: 'my_image', project: project) } + let(:params) { {} } before do group.add_reporter(reporter) project.add_reporter(reporter) end + shared_examples 'with name search' do + let_it_be(:not_searched_repository) do + create(:container_repository, name: 'foo_bar_baz', project: project) + end + + %w[my_image my_imag _image _imag].each do |name| + context "with name set to #{name}" do + let(:params) { { name: name } } + + it { is_expected.to contain_exactly(project_repository)} + + it { is_expected.not_to include(not_searched_repository)} + end + end + end + describe '#execute' do context 'with authorized user' do - subject { described_class.new(user: reporter, subject: subject_object).execute } + subject { described_class.new(user: reporter, subject: subject_object, params: params).execute } context 'when subject_type is group' do let(:subject_object) { group } @@ -28,12 +45,16 @@ describe ContainerRepositoriesFinder do end it { is_expected.to match_array([project_repository, other_repository]) } + + it_behaves_like 'with name search' end context 'when subject_type is project' do let(:subject_object) { project } it { is_expected.to match_array([project_repository]) } + + it_behaves_like 'with name search' end context 'with invalid subject_type' do diff --git a/spec/frontend/helpers/filtered_search_spec_helper.js b/spec/frontend/helpers/filtered_search_spec_helper.js new file mode 100644 index 00000000000..ceb7982bbc3 --- /dev/null +++ b/spec/frontend/helpers/filtered_search_spec_helper.js @@ -0,0 +1,69 @@ +export default class FilteredSearchSpecHelper { + static createFilterVisualTokenHTML(name, operator, value, isSelected) { + return FilteredSearchSpecHelper.createFilterVisualToken(name, operator, value, isSelected) + .outerHTML; + } + + static createFilterVisualToken(name, operator, value, isSelected = false) { + const li = document.createElement('li'); + li.classList.add('js-visual-token', 'filtered-search-token', `search-token-${name}`); + + li.innerHTML = ` + <div class="selectable ${isSelected ? 'selected' : ''}" role="button"> + <div class="name">${name}</div> + <div class="operator">${operator}</div> + <div class="value-container"> + <div class="value">${value}</div> + <div class="remove-token" role="button"> + <i class="fa fa-close"></i> + </div> + </div> + </div> + `; + + return li; + } + + static createNameFilterVisualTokenHTML(name) { + return ` + <li class="js-visual-token filtered-search-token"> + <div class="name">${name}</div> + </li> + `; + } + + static createNameOperatorFilterVisualTokenHTML(name, operator) { + return ` + <li class="js-visual-token filtered-search-token"> + <div class="name">${name}</div> + <div class="operator">${operator}</div> + </li> + `; + } + + static createSearchVisualToken(name) { + const li = document.createElement('li'); + li.classList.add('js-visual-token', 'filtered-search-term'); + li.innerHTML = `<div class="name">${name}</div>`; + return li; + } + + static createSearchVisualTokenHTML(name) { + return FilteredSearchSpecHelper.createSearchVisualToken(name).outerHTML; + } + + static createInputHTML(placeholder = '', value = '') { + return ` + <li class="input-token"> + <input type='text' class='filtered-search' placeholder='${placeholder}' value='${value}'/> + </li> + `; + } + + static createTokensContainerHTML(html, inputPlaceholder) { + return ` + ${html} + ${FilteredSearchSpecHelper.createInputHTML(inputPlaceholder)} + `; + } +} diff --git a/spec/javascripts/helpers/filtered_search_spec_helper.js b/spec/javascripts/helpers/filtered_search_spec_helper.js index ceb7982bbc3..de17518ea51 100644 --- a/spec/javascripts/helpers/filtered_search_spec_helper.js +++ b/spec/javascripts/helpers/filtered_search_spec_helper.js @@ -1,69 +1 @@ -export default class FilteredSearchSpecHelper { - static createFilterVisualTokenHTML(name, operator, value, isSelected) { - return FilteredSearchSpecHelper.createFilterVisualToken(name, operator, value, isSelected) - .outerHTML; - } - - static createFilterVisualToken(name, operator, value, isSelected = false) { - const li = document.createElement('li'); - li.classList.add('js-visual-token', 'filtered-search-token', `search-token-${name}`); - - li.innerHTML = ` - <div class="selectable ${isSelected ? 'selected' : ''}" role="button"> - <div class="name">${name}</div> - <div class="operator">${operator}</div> - <div class="value-container"> - <div class="value">${value}</div> - <div class="remove-token" role="button"> - <i class="fa fa-close"></i> - </div> - </div> - </div> - `; - - return li; - } - - static createNameFilterVisualTokenHTML(name) { - return ` - <li class="js-visual-token filtered-search-token"> - <div class="name">${name}</div> - </li> - `; - } - - static createNameOperatorFilterVisualTokenHTML(name, operator) { - return ` - <li class="js-visual-token filtered-search-token"> - <div class="name">${name}</div> - <div class="operator">${operator}</div> - </li> - `; - } - - static createSearchVisualToken(name) { - const li = document.createElement('li'); - li.classList.add('js-visual-token', 'filtered-search-term'); - li.innerHTML = `<div class="name">${name}</div>`; - return li; - } - - static createSearchVisualTokenHTML(name) { - return FilteredSearchSpecHelper.createSearchVisualToken(name).outerHTML; - } - - static createInputHTML(placeholder = '', value = '') { - return ` - <li class="input-token"> - <input type='text' class='filtered-search' placeholder='${placeholder}' value='${value}'/> - </li> - `; - } - - static createTokensContainerHTML(html, inputPlaceholder) { - return ` - ${html} - ${FilteredSearchSpecHelper.createInputHTML(inputPlaceholder)} - `; - } -} +export { default } from '../../frontend/helpers/filtered_search_spec_helper'; diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb index d450d2953cc..46181038445 100644 --- a/spec/lib/gitlab/database/migration_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers_spec.rb @@ -790,6 +790,25 @@ describe Gitlab::Database::MigrationHelpers do model.rename_column_concurrently(:users, :old, :new) end + it 'passes the batch_column_name' do + expect(model).to receive(:column_exists?).with(:users, :other_batch_column).and_return(true) + expect(model).to receive(:check_trigger_permissions!).and_return(true) + + expect(model).to receive(:create_column_from).with( + :users, :old, :new, type: nil, batch_column_name: :other_batch_column + ).and_return(true) + + expect(model).to receive(:install_rename_triggers).and_return(true) + + model.rename_column_concurrently(:users, :old, :new, batch_column_name: :other_batch_column) + end + + it 'raises an error with invalid batch_column_name' do + expect do + model.rename_column_concurrently(:users, :old, :new, batch_column_name: :invalid) + end.to raise_error(RuntimeError, /Column invalid does not exist on users/) + end + context 'when default is false' do let(:old_column) do double(:column, @@ -904,6 +923,25 @@ describe Gitlab::Database::MigrationHelpers do model.undo_cleanup_concurrent_column_rename(:users, :old, :new) end + it 'passes the batch_column_name' do + expect(model).to receive(:column_exists?).with(:users, :other_batch_column).and_return(true) + expect(model).to receive(:check_trigger_permissions!).and_return(true) + + expect(model).to receive(:create_column_from).with( + :users, :new, :old, type: nil, batch_column_name: :other_batch_column + ).and_return(true) + + expect(model).to receive(:install_rename_triggers).and_return(true) + + model.undo_cleanup_concurrent_column_rename(:users, :old, :new, batch_column_name: :other_batch_column) + end + + it 'raises an error with invalid batch_column_name' do + expect do + model.undo_cleanup_concurrent_column_rename(:users, :old, :new, batch_column_name: :invalid) + end.to raise_error(RuntimeError, /Column invalid does not exist on users/) + end + context 'when default is false' do let(:new_column) do double(:column, @@ -1373,6 +1411,14 @@ describe Gitlab::Database::MigrationHelpers do end end + it 'returns zero when nothing gets queued' do + Sidekiq::Testing.fake! do + final_delay = model.queue_background_migration_jobs_by_range_at_intervals(User.none, 'FooJob', 10.minutes) + + expect(final_delay).to eq(0) + end + end + context 'with batch_size option' do it 'queues jobs correctly' do Sidekiq::Testing.fake! do diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb index 5bcd9dfd396..59bade3c841 100644 --- a/spec/models/container_repository_spec.rb +++ b/spec/models/container_repository_spec.rb @@ -309,4 +309,14 @@ describe ContainerRepository do it { is_expected.to eq([]) } end end + + describe '.search_by_name' do + let!(:another_repository) do + create(:container_repository, name: 'my_foo_bar', project: project) + end + + subject { described_class.search_by_name('my_image') } + + it { is_expected.to contain_exactly(repository) } + end end |