Skip to content
Snippets Groups Projects
Commit e1443690 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent d466ee50
No related branches found
No related tags found
No related merge requests found
Showing
with 416 additions and 30 deletions
Loading
Loading
@@ -7,6 +7,7 @@ module Gitlab
class Url
class << self
include Gitlab::Utils::StrongMemoize
# Matches urls for a metrics dashboard. This could be
# either the /metrics endpoint or the /metrics_dashboard
# endpoint.
Loading
Loading
Loading
Loading
@@ -203,6 +203,41 @@ describe Projects::MergeRequests::DiffsController do
end
end
 
context 'with diff_head param passed' do
before do
allow(merge_request).to receive(:diffable_merge_ref?)
.and_return(diffable_merge_ref)
end
context 'the merge request can be compared with head' do
let(:diffable_merge_ref) { true }
it 'compares diffs with the head' do
MergeRequests::MergeToRefService.new(project, merge_request.author).execute(merge_request)
expect(CompareService).to receive(:new).with(
project, merge_request.merge_ref_head.sha
).and_call_original
go(diff_head: true)
expect(response).to have_gitlab_http_status(:ok)
end
end
context 'the merge request cannot be compared with head' do
let(:diffable_merge_ref) { false }
it 'compares diffs with the base' do
expect(CompareService).not_to receive(:new)
go(diff_head: true)
expect(response).to have_gitlab_http_status(:ok)
end
end
end
context 'with MR regular diff params' do
it 'returns success' do
go
Loading
Loading
Loading
Loading
@@ -45,7 +45,7 @@ FactoryBot.define do
self.when { 'manual' }
end
 
trait :auto_stopped do
trait :auto_stoppable do
auto_stop_at { 1.day.ago }
end
 
Loading
Loading
Loading
Loading
@@ -40,9 +40,6 @@ describe 'Value Stream Analytics', :js do
 
context "when there's value stream analytics data" do
before do
allow_next_instance_of(Gitlab::ReferenceExtractor) do |instance|
allow(instance).to receive(:issues).and_return([issue])
end
project.add_maintainer(user)
 
@build = create_cycle(user, project, issue, mr, milestone, pipeline)
Loading
Loading
@@ -101,9 +98,6 @@ describe 'Value Stream Analytics', :js do
project.add_developer(user)
project.add_guest(guest)
 
allow_next_instance_of(Gitlab::ReferenceExtractor) do |instance|
allow(instance).to receive(:issues).and_return([issue])
end
create_cycle(user, project, issue, mr, milestone, pipeline)
deploy_master(user, project)
 
Loading
Loading
Loading
Loading
@@ -93,10 +93,20 @@ describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidek
# Ensure we identify urls with the appropriate host.
# Configure host to include port in app:
Gitlab.config.gitlab[:url] = root_url.chomp('/')
clear_host_from_memoized_variables
end
 
def restore_host
default_url_options[:host] = @original_default_host
Gitlab.config.gitlab[:url] = @original_gitlab_url
clear_host_from_memoized_variables
end
def clear_host_from_memoized_variables
[:metrics_regex, :grafana_regex].each do |method_name|
Gitlab::Metrics::Dashboard::Url.clear_memoization(method_name)
end
end
end
Loading
Loading
@@ -51,5 +51,20 @@ describe Gitlab::Diff::SuggestionDiff do
expect(diff_lines[index].to_hash).to include(expected_line)
end
end
describe 'when the suggestion is for the last line of a file' do
it 'returns a correct value if there is no newline at the end of the file' do
from_content = "One line test"
to_content = "Successful test!"
suggestion = instance_double(Suggestion, from_line: 1,
from_content: from_content,
to_content: to_content)
diff_lines = described_class.new(suggestion).diff_lines
expect(diff_lines.first.text).to eq("-One line test")
expect(diff_lines.last.text).to eq("+Successful test!")
end
end
end
end
Loading
Loading
@@ -216,8 +216,6 @@ describe Gitlab::ImportExport::FastHashSerializer do
end
 
def setup_project
issue = create(:issue, assignees: [user])
snippet = create(:project_snippet)
release = create(:release)
group = create(:group)
 
Loading
Loading
@@ -228,12 +226,14 @@ describe Gitlab::ImportExport::FastHashSerializer do
:wiki_enabled,
:builds_private,
description: 'description',
issues: [issue],
snippets: [snippet],
releases: [release],
group: group,
approvals_before_merge: 1
)
allow(project).to receive(:commit).and_return(Commit.new(RepoHelpers.sample_commit, project))
issue = create(:issue, assignees: [user], project: project)
snippet = create(:project_snippet, project: project)
project_label = create(:label, project: project)
group_label = create(:group_label, group: group)
create(:label_link, label: project_label, target: issue)
Loading
Loading
Loading
Loading
@@ -334,8 +334,6 @@ describe Gitlab::ImportExport::ProjectTreeSaver do
end
 
def setup_project
issue = create(:issue, assignees: [user])
snippet = create(:project_snippet)
release = create(:release)
group = create(:group)
 
Loading
Loading
@@ -346,12 +344,14 @@ describe Gitlab::ImportExport::ProjectTreeSaver do
:wiki_enabled,
:builds_private,
description: 'description',
issues: [issue],
snippets: [snippet],
releases: [release],
group: group,
approvals_before_merge: 1
)
allow(project).to receive(:commit).and_return(Commit.new(RepoHelpers.sample_commit, project))
issue = create(:issue, assignees: [user], project: project)
snippet = create(:project_snippet, project: project)
project_label = create(:label, project: project)
group_label = create(:group_label, group: group)
create(:label_link, label: project_label, target: issue)
Loading
Loading
Loading
Loading
@@ -3,7 +3,7 @@
require 'spec_helper'
 
describe Gitlab::Metrics::Dashboard::Url do
describe '#regex' do
describe '#metrics_regex' do
let(:url) do
Gitlab::Routing.url_helpers.metrics_namespace_project_environment_url(
'foo',
Loading
Loading
# frozen_string_literal: true
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20200210092405_save_instance_administrators_group_id')
describe SaveInstanceAdministratorsGroupId, :migration do
let(:application_settings_table) { table(:application_settings) }
let(:instance_administrators_group) do
table(:namespaces).create!(
id: 1,
name: 'GitLab Instance Administrators',
path: 'gitlab-instance-administrators-random',
type: 'Group'
)
end
let(:self_monitoring_project) do
table(:projects).create!(
id: 2,
name: 'Self Monitoring',
path: 'self_monitoring',
namespace_id: instance_administrators_group.id
)
end
context 'when project ID is saved but group ID is not' do
let(:application_settings) do
application_settings_table.create!(instance_administration_project_id: self_monitoring_project.id)
end
it 'saves instance administrators group ID' do
expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id)
expect(application_settings.instance_administrators_group_id).to be_nil
migrate!
expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id)
expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id)
end
end
context 'when group ID is saved but project ID is not' do
let(:application_settings) do
application_settings_table.create!(instance_administrators_group_id: instance_administrators_group.id)
end
it 'does not make changes' do
expect(application_settings.instance_administrators_group_id).to eq(instance_administrators_group.id)
expect(application_settings.instance_administration_project_id).to be_nil
migrate!
expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id)
expect(application_settings.instance_administration_project_id).to be_nil
end
end
context 'when group ID and project ID are both saved' do
let(:application_settings) do
application_settings_table.create!(
instance_administrators_group_id: instance_administrators_group.id,
instance_administration_project_id: self_monitoring_project.id
)
end
it 'does not make changes' do
expect(application_settings.instance_administrators_group_id).to eq(instance_administrators_group.id)
expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id)
migrate!
expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id)
expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id)
end
end
context 'when neither group ID nor project ID is saved' do
let(:application_settings) do
application_settings_table.create!
end
it 'does not make changes' do
expect(application_settings.instance_administrators_group_id).to be_nil
expect(application_settings.instance_administration_project_id).to be_nil
migrate!
expect(application_settings.reload.instance_administrators_group_id).to be_nil
expect(application_settings.instance_administration_project_id).to be_nil
end
end
context 'when application_settings table has no rows' do
it 'does not fail' do
migrate!
end
end
end
Loading
Loading
@@ -26,6 +26,42 @@ describe Mentionable do
expect(mentionable.referenced_mentionables).to be_empty
end
end
describe '#any_mentionable_attributes_changed?' do
Message = Struct.new(:text)
let(:mentionable) { Example.new }
let(:changes) do
msg = Message.new('test')
changes = {}
changes[msg] = ['', 'some message']
changes[:random_sym_key] = ['', 'some message']
changes["random_string_key"] = ['', 'some message']
changes
end
it 'returns true with key string' do
changes["message"] = ['', 'some message']
allow(mentionable).to receive(:saved_changes).and_return(changes)
expect(mentionable.send(:any_mentionable_attributes_changed?)).to be true
end
it 'returns false with key symbol' do
changes[:message] = ['', 'some message']
allow(mentionable).to receive(:saved_changes).and_return(changes)
expect(mentionable.send(:any_mentionable_attributes_changed?)).to be false
end
it 'returns false when no attr_mentionable keys' do
allow(mentionable).to receive(:saved_changes).and_return(changes)
expect(mentionable.send(:any_mentionable_attributes_changed?)).to be false
end
end
end
 
describe Issue, "Mentionable" do
Loading
Loading
Loading
Loading
@@ -22,10 +22,6 @@ describe CycleAnalytics::GroupLevel do
 
describe '#stats' do
before do
allow_next_instance_of(Gitlab::ReferenceExtractor) do |instance|
allow(instance).to receive(:issues).and_return([issue])
end
create_cycle(user, project, issue, mr, milestone, pipeline)
deploy_master(user, project)
end
Loading
Loading
Loading
Loading
@@ -51,6 +51,22 @@ describe Deployment do
end
end
 
describe '.stoppable' do
subject { described_class.stoppable }
context 'when deployment is stoppable' do
let!(:deployment) { create(:deployment, :success, on_stop: 'stop-review') }
it { is_expected.to eq([deployment]) }
end
context 'when deployment is not stoppable' do
let!(:deployment) { create(:deployment, :failed) }
it { is_expected.to be_empty }
end
end
describe '.success' do
subject { described_class.success }
 
Loading
Loading
Loading
Loading
@@ -7,6 +7,7 @@ describe Environment, :use_clean_rails_memory_store_caching do
using RSpec::Parameterized::TableSyntax
include RepoHelpers
include StubENV
include CreateEnvironmentsHelpers
 
let(:project) { create(:project, :repository) }
 
Loading
Loading
@@ -114,6 +115,72 @@ describe Environment, :use_clean_rails_memory_store_caching do
end
end
 
describe '.auto_stoppable' do
subject { described_class.auto_stoppable(limit) }
let(:limit) { 100 }
context 'when environment is auto-stoppable' do
let!(:environment) { create(:environment, :auto_stoppable) }
it { is_expected.to eq([environment]) }
end
context 'when environment is not auto-stoppable' do
let!(:environment) { create(:environment) }
it { is_expected.to be_empty }
end
end
describe '.stop_actions' do
subject { environments.stop_actions }
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
let(:environments) { Environment.all }
before_all do
project.add_developer(user)
project.repository.add_branch(user, 'review/feature-1', 'master')
project.repository.add_branch(user, 'review/feature-2', 'master')
end
shared_examples_for 'correct filtering' do
it 'returns stop actions for available environments only' do
expect(subject.count).to eq(1)
expect(subject.first.name).to eq('stop_review_app')
expect(subject.first.ref).to eq('review/feature-1')
end
end
before do
create_review_app(user, project, 'review/feature-1')
create_review_app(user, project, 'review/feature-2')
end
it 'returns stop actions for environments' do
expect(subject.count).to eq(2)
expect(subject).to match_array(Ci::Build.where(name: 'stop_review_app'))
end
context 'when one of the stop actions has already been executed' do
before do
Ci::Build.where(ref: 'review/feature-2').find_by_name('stop_review_app').enqueue!
end
it_behaves_like 'correct filtering'
end
context 'when one of the deployments does not have stop action' do
before do
Deployment.where(ref: 'review/feature-2').update_all(on_stop: nil)
end
it_behaves_like 'correct filtering'
end
end
describe '.pluck_names' do
subject { described_class.pluck_names }
 
Loading
Loading
@@ -449,7 +516,7 @@ describe Environment, :use_clean_rails_memory_store_caching do
describe '#reset_auto_stop' do
subject { environment.reset_auto_stop }
 
let(:environment) { create(:environment, :auto_stopped) }
let(:environment) { create(:environment, :auto_stoppable) }
 
it 'nullifies the auto_stop_at' do
expect { subject }.to change(environment, :auto_stop_at).from(Time).to(nil)
Loading
Loading
Loading
Loading
@@ -173,6 +173,7 @@ describe Event do
end
 
context 'commit note event' do
let(:project) { create(:project, :public, :repository) }
let(:target) { note_on_commit }
 
it do
Loading
Loading
@@ -185,7 +186,7 @@ describe Event do
end
 
context 'private project' do
let(:project) { create(:project, :private) }
let(:project) { create(:project, :private, :repository) }
 
it do
aggregate_failures do
Loading
Loading
Loading
Loading
@@ -3576,4 +3576,44 @@ describe MergeRequest do
expect(merge_request.recent_visible_deployments.count).to eq(10)
end
end
describe '#diffable_merge_ref?' do
context 'diff_compare_with_head enabled' do
context 'merge request can be merged' do
context 'merge_to_ref is not calculated' do
it 'returns true' do
expect(subject.diffable_merge_ref?).to eq(false)
end
end
context 'merge_to_ref is calculated' do
before do
MergeRequests::MergeToRefService.new(subject.project, subject.author).execute(subject)
end
it 'returns true' do
expect(subject.diffable_merge_ref?).to eq(true)
end
end
end
context 'merge request cannot be merged' do
it 'returns false' do
subject.mark_as_unchecked!
expect(subject.diffable_merge_ref?).to eq(false)
end
end
end
context 'diff_compare_with_head disabled' do
before do
stub_feature_flags(diff_compare_with_head: { enabled: false, thing: subject.target_project })
end
it 'returns false' do
expect(subject.diffable_merge_ref?).to eq(false)
end
end
end
end
Loading
Loading
@@ -1299,8 +1299,8 @@ describe Project do
 
describe '.trending' do
let(:group) { create(:group, :public) }
let(:project1) { create(:project, :public, group: group) }
let(:project2) { create(:project, :public, group: group) }
let(:project1) { create(:project, :public, :repository, group: group) }
let(:project2) { create(:project, :public, :repository, group: group) }
 
before do
create_list(:note_on_commit, 2, project: project1)
Loading
Loading
Loading
Loading
@@ -4,11 +4,11 @@ require 'spec_helper'
 
describe TrendingProject do
let(:user) { create(:user) }
let(:public_project1) { create(:project, :public) }
let(:public_project2) { create(:project, :public) }
let(:public_project3) { create(:project, :public) }
let(:private_project) { create(:project, :private) }
let(:internal_project) { create(:project, :internal) }
let(:public_project1) { create(:project, :public, :repository) }
let(:public_project2) { create(:project, :public, :repository) }
let(:public_project3) { create(:project, :public, :repository) }
let(:private_project) { create(:project, :private, :repository) }
let(:internal_project) { create(:project, :internal, :repository) }
 
before do
create_list(:note_on_commit, 3, project: public_project1)
Loading
Loading
Loading
Loading
@@ -3,7 +3,7 @@
require 'spec_helper'
 
describe MergeRequestDiffEntity do
let(:project) { create(:project, :repository) }
let_it_be(:project) { create(:project, :repository) }
let(:request) { EntityRequest.new(project: project) }
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
let(:merge_request_diffs) { merge_request.merge_request_diffs }
Loading
Loading
@@ -36,4 +36,29 @@ describe MergeRequestDiffEntity do
expect(subject[:short_commit_sha]).to eq(nil)
end
end
describe '#head_version_path' do
before do
allow(merge_request).to receive(:diffable_merge_ref?)
.and_return(diffable_merge_ref)
end
context 'merge request can be merged' do
let(:diffable_merge_ref) { true }
it 'returns diff path with diff_head param set' do
expect(subject[:head_version_path]).to eq(
"/#{project.full_path}/-/merge_requests/#{merge_request.iid}/diffs?diff_head=true"
)
end
end
context 'merge request cannot be merged' do
let(:diffable_merge_ref) { false }
it 'returns diff path with diff_head param set' do
expect(subject[:head_version_path]).to be_nil
end
end
end
end
Loading
Loading
@@ -3,6 +3,8 @@
require 'spec_helper'
 
describe Ci::StopEnvironmentsService do
include CreateEnvironmentsHelpers
let(:project) { create(:project, :private, :repository) }
let(:user) { create(:user) }
 
Loading
Loading
@@ -181,6 +183,55 @@ describe Ci::StopEnvironmentsService do
end
end
 
describe '.execute_in_batch' do
subject { described_class.execute_in_batch(environments) }
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
let(:environments) { Environment.available }
before_all do
project.add_developer(user)
project.repository.add_branch(user, 'review/feature-1', 'master')
project.repository.add_branch(user, 'review/feature-2', 'master')
end
before do
create_review_app(user, project, 'review/feature-1')
create_review_app(user, project, 'review/feature-2')
end
it 'stops environments' do
expect { subject }
.to change { project.environments.all.map(&:state).uniq }
.from(['available']).to(['stopped'])
expect(project.environments.all.map(&:auto_stop_at).uniq).to eq([nil])
end
it 'plays stop actions' do
expect { subject }
.to change { Ci::Build.where(name: 'stop_review_app').map(&:status).uniq }
.from(['manual']).to(['pending'])
end
context 'when user does not have a permission to play the stop action' do
before do
Ci::Build.find_by_ref('review/feature-2').update_column(:user_id, nil)
end
it 'tracks the exception' do
deployable = Ci::Build.find_by_ref('review/feature-2')
expect(Gitlab::ErrorTracking)
.to receive(:track_error)
.with(Gitlab::Access::AccessDeniedError, deployable_id: deployable.id).once
subject
end
end
end
def expect_environment_stopped_on(branch)
expect_any_instance_of(Environment)
.to receive(:stop!)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment