summaryrefslogtreecommitdiff
path: root/spec/models/project_services/jira_service_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/project_services/jira_service_spec.rb')
-rw-r--r--spec/models/project_services/jira_service_spec.rb428
1 files changed, 232 insertions, 196 deletions
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index 02060699e9a..a976745023b 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -6,10 +6,18 @@ describe JiraService do
include Gitlab::Routing
include AssetsHelpers
+ let(:title) { 'custom title' }
+ let(:description) { 'custom description' }
+ let(:url) { 'http://jira.example.com' }
+ let(:api_url) { 'http://api-jira.example.com' }
+ let(:username) { 'jira-username' }
+ let(:password) { 'jira-password' }
+ let(:transition_id) { 'test27' }
+
describe '#options' do
let(:service) do
- described_class.new(
- project: build_stubbed(:project),
+ described_class.create(
+ project: create(:project),
active: true,
username: 'username',
password: 'test',
@@ -32,78 +40,6 @@ describe JiraService do
describe 'Associations' do
it { is_expected.to belong_to :project }
it { is_expected.to have_one :service_hook }
- it { is_expected.to allow_value(nil).for(:jira_issue_transition_id) }
- it { is_expected.to allow_value('1,2,3').for(:jira_issue_transition_id) }
- it { is_expected.to allow_value('1;2;3').for(:jira_issue_transition_id) }
- it { is_expected.not_to allow_value('a,b,cd').for(:jira_issue_transition_id) }
- end
-
- describe 'Validations' do
- context 'when service is active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of(:url) }
- it_behaves_like 'issue tracker service URL attribute', :url
- end
-
- context 'when service is inactive' do
- before do
- subject.active = false
- end
-
- it { is_expected.not_to validate_presence_of(:url) }
- it { is_expected.not_to validate_presence_of(:username) }
- it { is_expected.not_to validate_presence_of(:password) }
- end
-
- context 'validating urls' do
- let(:service) do
- described_class.new(
- project: create(:project),
- active: true,
- username: 'username',
- password: 'test',
- jira_issue_transition_id: 24,
- url: 'http://jira.test.com'
- )
- end
-
- it 'is valid when all fields have required values' do
- expect(service).to be_valid
- end
-
- it 'is not valid when url is not a valid url' do
- service.url = 'not valid'
-
- expect(service).not_to be_valid
- end
-
- it 'is not valid when api url is not a valid url' do
- service.api_url = 'not valid'
-
- expect(service).not_to be_valid
- end
-
- it 'is not valid when username is missing' do
- service.username = nil
-
- expect(service).not_to be_valid
- end
-
- it 'is not valid when password is missing' do
- service.password = nil
-
- expect(service).not_to be_valid
- end
-
- it 'is valid when api url is a valid url' do
- service.api_url = 'http://jira.test.com/api'
-
- expect(service).to be_valid
- end
- end
end
describe '.reference_pattern' do
@@ -118,55 +54,260 @@ describe JiraService do
describe '#create' do
let(:params) do
{
- project: create(:project), title: 'custom title', description: 'custom description'
+ project: create(:project),
+ title: 'custom title', description: 'custom description',
+ url: url, api_url: api_url,
+ username: username, password: password,
+ jira_issue_transition_id: transition_id
}
end
subject { described_class.create(params) }
- it 'does not store title & description into properties' do
- expect(subject.properties.keys).not_to include('title', 'description')
+ it 'does not store data into properties' do
+ expect(subject.properties).to be_nil
+ end
+
+ it 'sets title correctly' do
+ service = subject
+
+ expect(service.title).to eq('custom title')
end
- it 'sets title & description correctly' do
+ it 'sets service data correctly' do
service = subject
expect(service.title).to eq('custom title')
expect(service.description).to eq('custom description')
end
+
+ it 'stores data in data_fields correcty' do
+ service = subject
+
+ expect(service.jira_tracker_data.url).to eq(url)
+ expect(service.jira_tracker_data.api_url).to eq(api_url)
+ 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)
+ end
end
+ # we need to make sure we are able to read both from properties and jira_tracker_data table
+ # TODO: change this as part of #63084
context 'overriding properties' do
- let(:url) { 'http://issue_tracker.example.com' }
let(:access_params) do
- { url: url, username: 'username', password: 'password' }
+ { url: url, api_url: api_url, username: username, password: password,
+ jira_issue_transition_id: transition_id }
+ end
+ let(:data_params) do
+ {
+ url: url, api_url: api_url,
+ username: username, password: password,
+ jira_issue_transition_id: transition_id
+ }
+ end
+
+ shared_examples 'handles jira fields' do
+ let(:data_params) do
+ {
+ url: url, api_url: api_url,
+ username: username, password: password,
+ jira_issue_transition_id: transition_id
+ }
+ end
+
+ context 'reading data' do
+ it 'reads data correctly' do
+ expect(service.url).to eq(url)
+ expect(service.api_url).to eq(api_url)
+ expect(service.username).to eq(username)
+ expect(service.password).to eq(password)
+ expect(service.jira_issue_transition_id).to eq(transition_id)
+ end
+ end
+
+ context '#update' do
+ context 'basic update' do
+ let(:new_username) { 'new_username' }
+ let(:new_url) { 'http://jira-new.example.com' }
+
+ before do
+ service.update(username: new_username, url: new_url)
+ end
+
+ it 'leaves properties field emtpy' do
+ # expect(service.reload.properties).to be_empty
+ end
+
+ it 'stores updated data in jira_tracker_data table' do
+ data = service.jira_tracker_data.reload
+
+ expect(data.url).to eq(new_url)
+ expect(data.api_url).to eq(api_url)
+ expect(data.username).to eq(new_username)
+ expect(data.password).to eq(password)
+ expect(data.jira_issue_transition_id).to eq(transition_id)
+ end
+ end
+
+ context 'stored password invalidation' do
+ context 'when a password was previously set' do
+ context 'when only web url present' do
+ let(:data_params) do
+ {
+ url: url, api_url: nil,
+ username: username, password: password,
+ jira_issue_transition_id: transition_id
+ }
+ end
+
+ it 'resets password if url changed' do
+ service
+ service.url = 'http://jira_edited.example.com'
+ service.save
+
+ expect(service.reload.url).to eq('http://jira_edited.example.com')
+ expect(service.password).to be_nil
+ end
+
+ it 'does not reset password if url "changed" to the same url as before' do
+ service.title = 'aaaaaa'
+ service.url = 'http://jira.example.com'
+ service.save
+
+ expect(service.reload.url).to eq('http://jira.example.com')
+ expect(service.password).not_to be_nil
+ end
+
+ 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
+
+ expect(service.reload.api_url).to eq('http://jira_edited.example.com/rest/api/2')
+ expect(service.password).to be_nil
+ end
+
+ 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
+
+ expect(service.password).to eq(password)
+ expect(service.url).to eq('http://jira_edited.example.com')
+ end
+
+ 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
+
+ expect(service.password).to be_nil
+ end
+
+ it 'does not reset password if username changed' do
+ service.username = 'some_name'
+ service.save
+
+ expect(service.reload.password).to eq(password)
+ end
+
+ it 'does not reset password if password changed' do
+ service.url = 'http://jira_edited.example.com'
+ service.password = 'new_password'
+ service.save
+
+ expect(service.reload.password).to eq('new_password')
+ end
+
+ 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
+
+ expect(service.reload.password).to eq(password)
+ end
+ end
+
+ context 'when both web and api url present' do
+ let(:data_params) do
+ {
+ url: url, api_url: 'http://jira.example.com/rest/api/2',
+ username: username, password: password,
+ jira_issue_transition_id: transition_id
+ }
+ end
+
+ it 'resets password if api url changed' do
+ service.api_url = 'http://jira_edited.example.com/rest/api/2'
+ 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
+
+ expect(service.password).to eq(password)
+ end
+
+ it 'resets password if api url set to empty' do
+ service.update(api_url: '')
+
+ expect(service.reload.password).to be_nil
+ end
+ end
+ end
+
+ context 'when no password was previously set' do
+ let(:data_params) do
+ {
+ url: url, username: username
+ }
+ end
+
+ 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
+ expect(service.reload.password).to eq('password')
+ expect(service.reload.url).to eq('http://jira_edited.example.com/rest/api/2')
+ end
+ end
+ end
+ end
end
# this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084
context 'when data are stored in properties' do
- let(:properties) { access_params.merge(title: title, description: description) }
- let(:service) do
+ let(:properties) { data_params.merge(title: title, description: description) }
+ let!(:service) do
create(:jira_service, :without_properties_callback, properties: properties)
end
- include_examples 'issue tracker fields'
+ it_behaves_like 'issue tracker fields'
+ it_behaves_like 'handles jira fields'
end
context 'when data are stored in separated fields' do
let(:service) do
- create(:jira_service, title: title, description: description, properties: access_params)
+ create(:jira_service, data_params.merge(properties: {}, title: title, description: description))
end
- include_examples 'issue tracker fields'
+ it_behaves_like 'issue tracker fields'
+ it_behaves_like 'handles jira fields'
end
context 'when data are stored in both properties and separated fields' do
- let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') }
+ let(:properties) { data_params.merge(title: title, description: description) }
let(:service) do
- create(:jira_service, :without_properties_callback, title: title, description: description, properties: properties)
+ create(:jira_service, :without_properties_callback, active: false, properties: properties).tap do |service|
+ create(:jira_tracker_data, data_params.merge(service: service))
+ end
end
- include_examples 'issue tracker fields'
+ it_behaves_like 'issue tracker fields'
+ it_behaves_like 'handles jira fields'
end
context 'when no title & description are set' do
@@ -410,111 +551,6 @@ describe JiraService do
end
end
- describe 'Stored password invalidation' do
- let(:project) { create(:project) }
-
- context 'when a password was previously set' do
- before do
- @jira_service = described_class.create!(
- project: project,
- properties: {
- url: 'http://jira.example.com/web',
- username: 'mic',
- password: 'password'
- }
- )
- end
-
- context 'when only web url present' do
- it 'reset password if url changed' do
- @jira_service.url = 'http://jira_edited.example.com/rest/api/2'
- @jira_service.save
-
- expect(@jira_service.password).to be_nil
- end
-
- it 'reset password if url not changed but api url added' do
- @jira_service.api_url = 'http://jira_edited.example.com/rest/api/2'
- @jira_service.save
-
- expect(@jira_service.password).to be_nil
- end
- end
-
- context 'when both web and api url present' do
- before do
- @jira_service.api_url = 'http://jira.example.com/rest/api/2'
- @jira_service.password = 'password'
-
- @jira_service.save
- end
- it 'reset password if api url changed' do
- @jira_service.api_url = 'http://jira_edited.example.com/rest/api/2'
- @jira_service.save
-
- expect(@jira_service.password).to be_nil
- end
-
- it 'does not reset password if url changed' do
- @jira_service.url = 'http://jira_edited.example.com/rweb'
- @jira_service.save
-
- expect(@jira_service.password).to eq('password')
- end
-
- it 'reset password if api url set to empty' do
- @jira_service.api_url = ''
- @jira_service.save
-
- expect(@jira_service.password).to be_nil
- end
- end
-
- it 'does not reset password if username changed' do
- @jira_service.username = 'some_name'
- @jira_service.save
-
- expect(@jira_service.password).to eq('password')
- end
-
- it 'does not reset password if new url is set together with password, even if it\'s the same password' do
- @jira_service.url = 'http://jira_edited.example.com/rest/api/2'
- @jira_service.password = 'password'
- @jira_service.save
-
- expect(@jira_service.password).to eq('password')
- expect(@jira_service.url).to eq('http://jira_edited.example.com/rest/api/2')
- end
-
- it 'resets password if url changed, even if setter called multiple times' do
- @jira_service.url = 'http://jira1.example.com/rest/api/2'
- @jira_service.url = 'http://jira1.example.com/rest/api/2'
- @jira_service.save
- expect(@jira_service.password).to be_nil
- end
- end
-
- context 'when no password was previously set' do
- before do
- @jira_service = described_class.create(
- project: project,
- properties: {
- url: 'http://jira.example.com/rest/api/2',
- username: 'mic'
- }
- )
- end
-
- it 'saves password if new url is set together with password' do
- @jira_service.url = 'http://jira_edited.example.com/rest/api/2'
- @jira_service.password = 'password'
- @jira_service.save
- expect(@jira_service.password).to eq('password')
- expect(@jira_service.url).to eq('http://jira_edited.example.com/rest/api/2')
- end
- end
- end
-
describe 'description and title' do
let(:title) { 'Jira One' }
let(:description) { 'Jira One issue tracker' }
@@ -539,7 +575,7 @@ describe JiraService do
context 'when it is set in properties' do
it 'values from properties are returned' do
- service = create(:jira_service, properties: properties)
+ service = create(:jira_service, :without_properties_callback, properties: properties)
expect(service.title).to eq(title)
expect(service.description).to eq(description)
@@ -602,8 +638,8 @@ describe JiraService do
project = create(:project)
service = project.create_jira_service(active: true)
- expect(service.properties['url']).to eq('http://jira.sample/projects/project_a')
- expect(service.properties['api_url']).to eq('http://jira.sample/api')
+ expect(service.url).to eq('http://jira.sample/projects/project_a')
+ expect(service.api_url).to eq('http://jira.sample/api')
end
end