diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/models/project_services | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'spec/models/project_services')
8 files changed, 269 insertions, 82 deletions
diff --git a/spec/models/project_services/bamboo_service_spec.rb b/spec/models/project_services/bamboo_service_spec.rb index 4d2474cc56a..45afbcca96d 100644 --- a/spec/models/project_services/bamboo_service_spec.rb +++ b/spec/models/project_services/bamboo_service_spec.rb @@ -11,7 +11,7 @@ RSpec.describe BambooService, :use_clean_rails_memory_store_caching do let_it_be(:project) { create(:project) } subject(:service) do - described_class.create( + described_class.create!( project: project, properties: { bamboo_url: bamboo_url, @@ -85,7 +85,7 @@ RSpec.describe BambooService, :use_clean_rails_memory_store_caching do bamboo_service = service bamboo_service.bamboo_url = 'http://gitlab1.com' - bamboo_service.save + bamboo_service.save! expect(bamboo_service.password).to be_nil end @@ -94,7 +94,7 @@ RSpec.describe BambooService, :use_clean_rails_memory_store_caching do bamboo_service = service bamboo_service.username = 'some_name' - bamboo_service.save + bamboo_service.save! expect(bamboo_service.password).to eq('password') end @@ -104,7 +104,7 @@ RSpec.describe BambooService, :use_clean_rails_memory_store_caching do bamboo_service.bamboo_url = 'http://gitlab_edited.com' bamboo_service.password = 'password' - bamboo_service.save + bamboo_service.save! expect(bamboo_service.password).to eq('password') expect(bamboo_service.bamboo_url).to eq('http://gitlab_edited.com') @@ -117,7 +117,7 @@ RSpec.describe BambooService, :use_clean_rails_memory_store_caching do bamboo_service.bamboo_url = 'http://gitlab_edited.com' bamboo_service.password = 'password' - bamboo_service.save + bamboo_service.save! expect(bamboo_service.password).to eq('password') expect(bamboo_service.bamboo_url).to eq('http://gitlab_edited.com') diff --git a/spec/models/project_services/buildkite_service_spec.rb b/spec/models/project_services/buildkite_service_spec.rb index 3d0c2cc1006..f6bf1551bf0 100644 --- a/spec/models/project_services/buildkite_service_spec.rb +++ b/spec/models/project_services/buildkite_service_spec.rb @@ -9,7 +9,7 @@ RSpec.describe BuildkiteService, :use_clean_rails_memory_store_caching do let(:project) { create(:project) } subject(:service) do - described_class.create( + described_class.create!( project: project, properties: { service_hook: true, diff --git a/spec/models/project_services/chat_message/merge_message_spec.rb b/spec/models/project_services/chat_message/merge_message_spec.rb index 45be5212508..02b266e4fae 100644 --- a/spec/models/project_services/chat_message/merge_message_spec.rb +++ b/spec/models/project_services/chat_message/merge_message_spec.rb @@ -29,23 +29,6 @@ RSpec.describe ChatMessage::MergeMessage do } end - # Integration point in EE - context 'when state is overridden' do - it 'respects the overridden state' do - allow(subject).to receive(:state_or_action_text) { 'devoured' } - - aggregate_failures do - expect(subject.summary).not_to include('opened') - expect(subject.summary).to include('devoured') - - activity_title = subject.activity[:title] - - expect(activity_title).not_to include('opened') - expect(activity_title).to include('devoured') - end - end - end - context 'without markdown' do let(:color) { '#345' } @@ -106,4 +89,56 @@ RSpec.describe ChatMessage::MergeMessage do end end end + + context 'approved' do + before do + args[:object_attributes][:action] = 'approved' + end + + it 'returns a message regarding completed approval of merge requests' do + expect(subject.pretext).to eq( + 'Test User (test.user) approved merge request <http://somewhere.com/-/merge_requests/100|!100 *Merge Request title*> '\ + 'in <http://somewhere.com|project_name>') + expect(subject.attachments).to be_empty + end + end + + context 'unapproved' do + before do + args[:object_attributes][:action] = 'unapproved' + end + + it 'returns a message regarding revocation of completed approval of merge requests' do + expect(subject.pretext).to eq( + 'Test User (test.user) unapproved merge request <http://somewhere.com/-/merge_requests/100|!100 *Merge Request title*> '\ + 'in <http://somewhere.com|project_name>') + expect(subject.attachments).to be_empty + end + end + + context 'approval' do + before do + args[:object_attributes][:action] = 'approval' + end + + it 'returns a message regarding added approval of merge requests' do + expect(subject.pretext).to eq( + 'Test User (test.user) added their approval to merge request <http://somewhere.com/-/merge_requests/100|!100 *Merge Request title*> '\ + 'in <http://somewhere.com|project_name>') + expect(subject.attachments).to be_empty + end + end + + context 'unapproval' do + before do + args[:object_attributes][:action] = 'unapproval' + end + + it 'returns a message regarding revoking approval of merge requests' do + expect(subject.pretext).to eq( + 'Test User (test.user) removed their approval from merge request <http://somewhere.com/-/merge_requests/100|!100 *Merge Request title*> '\ + 'in <http://somewhere.com|project_name>') + expect(subject.attachments).to be_empty + end + end end diff --git a/spec/models/project_services/ewm_service_spec.rb b/spec/models/project_services/ewm_service_spec.rb new file mode 100644 index 00000000000..311c456569e --- /dev/null +++ b/spec/models/project_services/ewm_service_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe EwmService do + describe 'Associations' do + it { is_expected.to belong_to :project } + it { is_expected.to have_one :service_hook } + end + + describe 'Validations' do + context 'when service is active' do + before do + subject.active = true + end + + it { is_expected.to validate_presence_of(:project_url) } + it { is_expected.to validate_presence_of(:issues_url) } + it { is_expected.to validate_presence_of(:new_issue_url) } + it_behaves_like 'issue tracker service URL attribute', :project_url + it_behaves_like 'issue tracker service URL attribute', :issues_url + it_behaves_like 'issue tracker service URL attribute', :new_issue_url + end + + context 'when service is inactive' do + before do + subject.active = false + end + + it { is_expected.not_to validate_presence_of(:project_url) } + it { is_expected.not_to validate_presence_of(:issues_url) } + it { is_expected.not_to validate_presence_of(:new_issue_url) } + end + end + + describe "ReferencePatternValidation" do + it "extracts bug" do + expect(described_class.reference_pattern.match("This is bug 123")[:issue]).to eq("bug 123") + end + + it "extracts task" do + expect(described_class.reference_pattern.match("This is task 123.")[:issue]).to eq("task 123") + end + + it "extracts work item" do + expect(described_class.reference_pattern.match("This is work item 123 now")[:issue]).to eq("work item 123") + end + + it "extracts workitem" do + expect(described_class.reference_pattern.match("workitem 123 at the beginning")[:issue]).to eq("workitem 123") + end + + it "extracts defect" do + expect(described_class.reference_pattern.match("This is defect 123 defect")[:issue]).to eq("defect 123") + end + + it "extracts rtcwi" do + expect(described_class.reference_pattern.match("This is rtcwi 123")[:issue]).to eq("rtcwi 123") + end + end +end diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 28bba893be4..7741fea8717 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -10,6 +10,11 @@ RSpec.describe JiraService do let(:username) { 'jira-username' } let(:password) { 'jira-password' } let(:transition_id) { 'test27' } + let(:server_info_results) { { 'deploymentType' => 'Cloud' } } + + before do + WebMock.stub_request(:get, /serverInfo/).to_return(body: server_info_results.to_json ) + end describe '#options' do let(:options) do @@ -23,7 +28,7 @@ RSpec.describe JiraService do } end - let(:service) { described_class.create(options) } + let(:service) { described_class.create!(options) } it 'sets the URL properly' do # jira-ruby gem parses the URI and handles trailing slashes fine: @@ -97,13 +102,13 @@ RSpec.describe JiraService do } end - subject { described_class.create(params) } + subject { described_class.create!(params) } it 'does not store data into properties' do expect(subject.properties).to be_nil end - it 'stores data in data_fields correcty' do + it 'stores data in data_fields correctly' do service = subject expect(service.jira_tracker_data.url).to eq(url) @@ -111,6 +116,35 @@ RSpec.describe JiraService do expect(service.jira_tracker_data.username).to eq(username) expect(service.jira_tracker_data.password).to eq(password) expect(service.jira_tracker_data.jira_issue_transition_id).to eq(transition_id) + expect(service.jira_tracker_data.deployment_cloud?).to be_truthy + end + + context 'when loading serverInfo' do + let!(:jira_service) { subject } + + context 'Cloud instance' do + let(:server_info_results) { { 'deploymentType' => 'Cloud' } } + + it 'is detected' do + expect(jira_service.jira_tracker_data.deployment_cloud?).to be_truthy + end + end + + context 'Server instance' do + let(:server_info_results) { { 'deploymentType' => 'Server' } } + + it 'is detected' do + expect(jira_service.jira_tracker_data.deployment_server?).to be_truthy + end + end + + context 'Unknown instance' do + let(:server_info_results) { { 'deploymentType' => 'FutureCloud' } } + + it 'is detected' do + expect(jira_service.jira_tracker_data.deployment_unknown?).to be_truthy + end + end end end @@ -151,11 +185,11 @@ RSpec.describe JiraService do describe '#update' do context 'basic update' do - let(:new_username) { 'new_username' } - let(:new_url) { 'http://jira-new.example.com' } + let_it_be(:new_username) { 'new_username' } + let_it_be(:new_url) { 'http://jira-new.example.com' } before do - service.update(username: new_username, url: new_url) + service.update!(username: new_username, url: new_url) end it 'leaves properties field emtpy' do @@ -173,6 +207,63 @@ RSpec.describe JiraService do end end + context 'when updating the url, api_url, username, or password' do + it 'updates deployment type' do + service.update!(url: 'http://first.url') + service.jira_tracker_data.update!(deployment_type: 'server') + + expect(service.jira_tracker_data.deployment_server?).to be_truthy + + service.update!(api_url: 'http://another.url') + service.jira_tracker_data.reload + + expect(service.jira_tracker_data.deployment_cloud?).to be_truthy + expect(WebMock).to have_requested(:get, /serverInfo/).twice + end + + it 'calls serverInfo for url' do + service.update!(url: 'http://first.url') + + expect(WebMock).to have_requested(:get, /serverInfo/) + end + + it 'calls serverInfo for api_url' do + service.update!(api_url: 'http://another.url') + + expect(WebMock).to have_requested(:get, /serverInfo/) + end + + it 'calls serverInfo for username' do + service.update!(username: 'test-user') + + expect(WebMock).to have_requested(:get, /serverInfo/) + end + + it 'calls serverInfo for password' do + service.update!(password: 'test-password') + + expect(WebMock).to have_requested(:get, /serverInfo/) + end + end + + context 'when not updating the url, api_url, username, or password' do + it 'does not update deployment type' do + expect {service.update!(jira_issue_transition_id: 'jira_issue_transition_id')}.to raise_error(ActiveRecord::RecordInvalid) + + expect(WebMock).not_to have_requested(:get, /serverInfo/) + end + end + + context 'when not allowed to test an instance or group' do + it 'does not update deployment type' do + allow(service).to receive(:can_test?).and_return(false) + + service.update!(url: 'http://first.url') + + expect(WebMock).not_to have_requested(:get, /serverInfo/) + end + end + context 'stored password invalidation' do context 'when a password was previously set' do context 'when only web url present' do @@ -187,7 +278,7 @@ RSpec.describe JiraService do it 'resets password if url changed' do service service.url = 'http://jira_edited.example.com' - service.save + service.save! expect(service.reload.url).to eq('http://jira_edited.example.com') expect(service.password).to be_nil @@ -195,7 +286,7 @@ RSpec.describe JiraService do it 'does not reset password if url "changed" to the same url as before' do service.url = 'http://jira.example.com' - service.save + service.save! expect(service.reload.url).to eq('http://jira.example.com') expect(service.password).not_to be_nil @@ -203,7 +294,7 @@ RSpec.describe JiraService do it 'resets password if url not changed but api url added' do service.api_url = 'http://jira_edited.example.com/rest/api/2' - service.save + service.save! expect(service.reload.api_url).to eq('http://jira_edited.example.com/rest/api/2') expect(service.password).to be_nil @@ -212,7 +303,7 @@ RSpec.describe JiraService do it 'does not reset password if new url is set together with password, even if it\'s the same password' do service.url = 'http://jira_edited.example.com' service.password = password - service.save + service.save! expect(service.password).to eq(password) expect(service.url).to eq('http://jira_edited.example.com') @@ -221,14 +312,14 @@ RSpec.describe JiraService do it 'resets password if url changed, even if setter called multiple times' do service.url = 'http://jira1.example.com/rest/api/2' service.url = 'http://jira1.example.com/rest/api/2' - service.save + service.save! expect(service.password).to be_nil end it 'does not reset password if username changed' do service.username = 'some_name' - service.save + service.save! expect(service.reload.password).to eq(password) end @@ -236,7 +327,7 @@ RSpec.describe JiraService do it 'does not reset password if password changed' do service.url = 'http://jira_edited.example.com' service.password = 'new_password' - service.save + service.save! expect(service.reload.password).to eq('new_password') end @@ -244,7 +335,7 @@ RSpec.describe JiraService do it 'does not reset password if the password is touched and same as before' do service.url = 'http://jira_edited.example.com' service.password = password - service.save + service.save! expect(service.reload.password).to eq(password) end @@ -261,20 +352,20 @@ RSpec.describe JiraService do it 'resets password if api url changed' do service.api_url = 'http://jira_edited.example.com/rest/api/2' - service.save + service.save! expect(service.password).to be_nil end it 'does not reset password if url changed' do service.url = 'http://jira_edited.example.com' - service.save + service.save! expect(service.password).to eq(password) end it 'resets password if api url set to empty' do - service.update(api_url: '') + service.update!(api_url: '') expect(service.reload.password).to be_nil end @@ -291,7 +382,7 @@ RSpec.describe JiraService do it 'saves password if new url is set together with password' do service.url = 'http://jira_edited.example.com/rest/api/2' service.password = 'password' - service.save + service.save! expect(service.reload.password).to eq('password') expect(service.reload.url).to eq('http://jira_edited.example.com/rest/api/2') end @@ -360,7 +451,7 @@ RSpec.describe JiraService do allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return('JIRA-123') allow(JIRA::Resource::Remotelink).to receive(:all).and_return([]) - @jira_service.save + @jira_service.save! project_issues_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123' @transitions_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/transitions' @@ -627,32 +718,32 @@ RSpec.describe JiraService do end describe '#test' do + let(:server_info_results) { { 'url' => 'http://url', 'deploymentType' => 'Cloud' } } + let_it_be(:project) { create(:project, :repository) } let(:jira_service) do described_class.new( url: url, + project: project, username: username, password: password ) end - def test_settings(url = 'jira.example.com') - test_url = "http://#{url}/rest/api/2/serverInfo" - - WebMock.stub_request(:get, test_url).with(basic_auth: [username, password]) - .to_return(body: { url: 'http://url' }.to_json ) - + def server_info jira_service.test(nil) end context 'when the test succeeds' do it 'gets Jira project with URL when API URL not set' do - expect(test_settings).to eq(success: true, result: { 'url' => 'http://url' }) + expect(server_info).to eq(success: true, result: server_info_results) + expect(WebMock).to have_requested(:get, /jira.example.com/) end it 'gets Jira project with API URL if set' do - jira_service.update(api_url: 'http://jira.api.com') + jira_service.update!(api_url: 'http://jira.api.com') - expect(test_settings('jira.api.com')).to eq(success: true, result: { 'url' => 'http://url' }) + expect(server_info).to eq(success: true, result: server_info_results) + expect(WebMock).to have_requested(:get, /jira.api.com/) end end diff --git a/spec/models/project_services/packagist_service_spec.rb b/spec/models/project_services/packagist_service_spec.rb index f710385b6e2..33b5c9809c7 100644 --- a/spec/models/project_services/packagist_service_spec.rb +++ b/spec/models/project_services/packagist_service_spec.rb @@ -3,20 +3,6 @@ require 'spec_helper' RSpec.describe PackagistService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - let(:project) { create(:project) } - - let(:packagist_server) { 'https://packagist.example.com' } - let(:packagist_username) { 'theUser' } - let(:packagist_token) { 'verySecret' } - let(:packagist_hook_url) do - "#{packagist_server}/api/update-package?username=#{packagist_username}&apiToken=#{packagist_token}" - end - let(:packagist_params) do { active: true, @@ -29,11 +15,25 @@ RSpec.describe PackagistService do } end + let(:packagist_hook_url) do + "#{packagist_server}/api/update-package?username=#{packagist_username}&apiToken=#{packagist_token}" + end + + let(:packagist_token) { 'verySecret' } + let(:packagist_username) { 'theUser' } + let(:packagist_server) { 'https://packagist.example.com' } + let(:project) { create(:project) } + + describe "Associations" do + it { is_expected.to belong_to :project } + it { is_expected.to have_one :service_hook } + end + describe '#execute' do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:push_sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) } - let(:packagist_service) { described_class.create(packagist_params) } + let(:packagist_service) { described_class.create!(packagist_params) } before do stub_request(:post, packagist_hook_url) diff --git a/spec/models/project_services/pipelines_email_service_spec.rb b/spec/models/project_services/pipelines_email_service_spec.rb index 9a8386c619e..21cc5d44558 100644 --- a/spec/models/project_services/pipelines_email_service_spec.rb +++ b/spec/models/project_services/pipelines_email_service_spec.rb @@ -81,7 +81,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'when pipeline is succeeded' do before do data[:object_attributes][:status] = 'success' - pipeline.update(status: 'success') + pipeline.update!(status: 'success') end it_behaves_like 'sending email' @@ -91,7 +91,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'on default branch' do before do data[:object_attributes][:ref] = project.default_branch - pipeline.update(ref: project.default_branch) + pipeline.update!(ref: project.default_branch) end context 'notifications are enabled only for default branch' do @@ -115,7 +115,7 @@ RSpec.describe PipelinesEmailService, :mailer do before do create(:protected_branch, project: project, name: 'a-protected-branch') data[:object_attributes][:ref] = 'a-protected-branch' - pipeline.update(ref: 'a-protected-branch') + pipeline.update!(ref: 'a-protected-branch') end context 'notifications are enabled only for default branch' do @@ -138,7 +138,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'on a neither protected nor default branch' do before do data[:object_attributes][:ref] = 'a-random-branch' - pipeline.update(ref: 'a-random-branch') + pipeline.update!(ref: 'a-random-branch') end context 'notifications are enabled only for default branch' do @@ -177,7 +177,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'with succeeded pipeline' do before do data[:object_attributes][:status] = 'success' - pipeline.update(status: 'success') + pipeline.update!(status: 'success') end it_behaves_like 'not sending email' @@ -195,7 +195,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'with succeeded pipeline' do before do data[:object_attributes][:status] = 'success' - pipeline.update(status: 'success') + pipeline.update!(status: 'success') end it_behaves_like 'not sending email' @@ -206,7 +206,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'on default branch' do before do data[:object_attributes][:ref] = project.default_branch - pipeline.update(ref: project.default_branch) + pipeline.update!(ref: project.default_branch) end context 'notifications are enabled only for default branch' do @@ -230,7 +230,7 @@ RSpec.describe PipelinesEmailService, :mailer do before do create(:protected_branch, project: project, name: 'a-protected-branch') data[:object_attributes][:ref] = 'a-protected-branch' - pipeline.update(ref: 'a-protected-branch') + pipeline.update!(ref: 'a-protected-branch') end context 'notifications are enabled only for default branch' do @@ -253,7 +253,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'on a neither protected nor default branch' do before do data[:object_attributes][:ref] = 'a-random-branch' - pipeline.update(ref: 'a-random-branch') + pipeline.update!(ref: 'a-random-branch') end context 'notifications are enabled only for default branch' do @@ -281,7 +281,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'with failed pipeline' do before do data[:object_attributes][:status] = 'failed' - pipeline.update(status: 'failed') + pipeline.update!(status: 'failed') end it_behaves_like 'not sending email' @@ -295,7 +295,7 @@ RSpec.describe PipelinesEmailService, :mailer do context 'with failed pipeline' do before do data[:object_attributes][:status] = 'failed' - pipeline.update(status: 'failed') + pipeline.update!(status: 'failed') end it_behaves_like 'sending email' diff --git a/spec/models/project_services/teamcity_service_spec.rb b/spec/models/project_services/teamcity_service_spec.rb index a3fda33664a..f71dad86a08 100644 --- a/spec/models/project_services/teamcity_service_spec.rb +++ b/spec/models/project_services/teamcity_service_spec.rb @@ -11,7 +11,7 @@ RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do let(:project) { create(:project) } subject(:service) do - described_class.create( + described_class.create!( project: project, properties: { teamcity_url: teamcity_url, @@ -85,7 +85,7 @@ RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do teamcity_service = service teamcity_service.teamcity_url = 'http://gitlab1.com' - teamcity_service.save + teamcity_service.save! expect(teamcity_service.password).to be_nil end @@ -94,7 +94,7 @@ RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do teamcity_service = service teamcity_service.username = 'some_name' - teamcity_service.save + teamcity_service.save! expect(teamcity_service.password).to eq('password') end @@ -104,7 +104,7 @@ RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do teamcity_service.teamcity_url = 'http://gitlab_edited.com' teamcity_service.password = 'password' - teamcity_service.save + teamcity_service.save! expect(teamcity_service.password).to eq('password') expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com') @@ -117,7 +117,7 @@ RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do teamcity_service.teamcity_url = 'http://gitlab_edited.com' teamcity_service.password = 'password' - teamcity_service.save + teamcity_service.save! expect(teamcity_service.password).to eq('password') expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com') |