2013-02-25 14:21:38 -05:00
require 'spec_helper'
2015-12-09 05:55:49 -05:00
describe GitPushService , services : true do
2014-08-01 08:11:27 -04:00
include RepoHelpers
2017-03-27 17:14:01 -04:00
let ( :user ) { create ( :user ) }
let ( :project ) { create ( :project , :repository ) }
2013-02-25 14:21:38 -05:00
before do
2016-07-27 03:03:50 -04:00
project . team << [ user , :master ]
2014-11-03 14:35:06 -05:00
@blankrev = Gitlab :: Git :: BLANK_SHA
2014-08-01 08:11:27 -04:00
@oldrev = sample_commit . parent_id
@newrev = sample_commit . id
2013-02-25 14:21:38 -05:00
@ref = 'refs/heads/master'
end
2014-09-26 05:55:57 -04:00
describe 'Push branches' do
2016-02-17 12:29:43 -05:00
let ( :oldrev ) { @oldrev }
let ( :newrev ) { @newrev }
subject do
execute_service ( project , user , oldrev , newrev , @ref )
end
2014-09-26 05:55:57 -04:00
context 'new branch' do
2016-02-17 12:29:43 -05:00
let ( :oldrev ) { @blankrev }
2014-09-26 05:55:57 -04:00
2015-02-12 13:17:35 -05:00
it { is_expected . to be_truthy }
2016-02-08 06:50:55 -05:00
2016-11-18 08:04:18 -05:00
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-02-08 06:50:55 -05:00
subject
end
2016-11-18 08:04:18 -05:00
it 'calls the after_create_branch hook' do
expect ( project . repository ) . to receive ( :after_create_branch )
2016-06-28 05:39:29 -04:00
subject
end
2014-09-26 05:55:57 -04:00
end
context 'existing branch' do
2015-02-12 13:17:35 -05:00
it { is_expected . to be_truthy }
2016-02-08 06:50:55 -05:00
2016-11-18 08:04:18 -05:00
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-06-28 05:39:29 -04:00
subject
end
2014-09-26 05:55:57 -04:00
end
context 'rm branch' do
2016-02-17 12:29:43 -05:00
let ( :newrev ) { @blankrev }
2014-09-26 05:55:57 -04:00
2015-02-12 13:17:35 -05:00
it { is_expected . to be_truthy }
2016-02-08 06:50:55 -05:00
2016-11-18 08:04:18 -05:00
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-06-28 05:39:29 -04:00
subject
end
2016-11-18 08:04:18 -05:00
it 'calls the after_remove_branch hook' do
expect ( project . repository ) . to receive ( :after_remove_branch )
2016-02-08 06:50:55 -05:00
subject
end
2014-09-26 05:55:57 -04:00
end
end
2013-02-25 14:21:38 -05:00
describe " Git Push Data " do
before do
2016-02-17 04:42:59 -05:00
service = execute_service ( project , user , @oldrev , @newrev , @ref )
2013-02-25 14:21:38 -05:00
@push_data = service . push_data
2015-04-21 09:13:40 -04:00
@commit = project . commit ( @newrev )
2013-02-25 14:21:38 -05:00
end
subject { @push_data }
2015-02-19 00:02:57 -05:00
it { is_expected . to include ( object_kind : 'push' ) }
2015-02-12 13:17:35 -05:00
it { is_expected . to include ( before : @oldrev ) }
it { is_expected . to include ( after : @newrev ) }
it { is_expected . to include ( ref : @ref ) }
it { is_expected . to include ( user_id : user . id ) }
it { is_expected . to include ( user_name : user . name ) }
it { is_expected . to include ( project_id : project . id ) }
2013-02-25 14:21:38 -05:00
context " with repository data " do
subject { @push_data [ :repository ] }
2015-02-12 13:17:35 -05:00
it { is_expected . to include ( name : project . name ) }
it { is_expected . to include ( url : project . url_to_repo ) }
it { is_expected . to include ( description : project . description ) }
it { is_expected . to include ( homepage : project . web_url ) }
2013-02-25 14:21:38 -05:00
end
context " with commits " do
subject { @push_data [ :commits ] }
2015-02-12 13:17:35 -05:00
it { is_expected . to be_an ( Array ) }
it 'has 1 element' do
expect ( subject . size ) . to eq ( 1 )
end
2013-02-25 14:21:38 -05:00
context " the commit " do
subject { @push_data [ :commits ] . first }
2015-02-12 13:17:35 -05:00
it { is_expected . to include ( id : @commit . id ) }
it { is_expected . to include ( message : @commit . safe_message ) }
it { is_expected . to include ( timestamp : @commit . date . xmlschema ) }
2015-01-24 13:02:58 -05:00
it do
is_expected . to include (
url : [
Gitlab . config . gitlab . url ,
project . namespace . to_param ,
project . to_param ,
'commit' ,
@commit . id
] . join ( '/' )
)
end
2013-02-25 14:21:38 -05:00
context " with a author " do
subject { @push_data [ :commits ] . first [ :author ] }
2015-02-12 13:17:35 -05:00
it { is_expected . to include ( name : @commit . author_name ) }
it { is_expected . to include ( email : @commit . author_email ) }
2013-02-25 14:21:38 -05:00
end
end
end
end
describe " Push Event " do
before do
2016-02-17 04:42:59 -05:00
service = execute_service ( project , user , @oldrev , @newrev , @ref )
2016-07-27 03:03:50 -04:00
@event = Event . find_by_action ( Event :: PUSHED )
2016-02-11 06:50:27 -05:00
@push_data = service . push_data
2013-02-25 14:21:38 -05:00
end
2015-02-12 13:17:35 -05:00
it { expect ( @event ) . not_to be_nil }
it { expect ( @event . project ) . to eq ( project ) }
it { expect ( @event . action ) . to eq ( Event :: PUSHED ) }
2016-02-11 06:50:27 -05:00
it { expect ( @event . data ) . to eq ( @push_data ) }
2015-10-15 04:41:46 -04:00
context " Updates merge requests " do
it " when pushing a new branch for the first time " do
2016-10-10 03:40:14 -04:00
expect ( UpdateMergeRequestsWorker ) . to receive ( :perform_async ) .
with ( project . id , user . id , @blankrev , 'newrev' , 'refs/heads/master' )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2015-10-15 04:41:46 -04:00
end
end
2017-03-07 07:59:20 -05:00
context " Sends System Push data " do
it " when pushing on a branch " do
expect ( SystemHookPushWorker ) . to receive ( :perform_async ) . with ( @push_data , :push_hooks )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
end
2013-02-25 14:21:38 -05:00
end
2016-03-14 19:33:00 -04:00
describe " Updates git attributes " do
context " for default branch " do
it " calls the copy attributes method for the first push to the default branch " do
expect ( project . repository ) . to receive ( :copy_gitattributes ) . with ( 'master' )
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
end
it " calls the copy attributes method for changes to the default branch " do
expect ( project . repository ) . to receive ( :copy_gitattributes ) . with ( 'refs/heads/master' )
execute_service ( project , user , 'oldrev' , 'newrev' , 'refs/heads/master' )
end
end
context " for non-default branch " do
before do
# Make sure the "default" branch is different
allow ( project ) . to receive ( :default_branch ) . and_return ( 'not-master' )
end
it " does not call copy attributes method " do
expect ( project . repository ) . not_to receive ( :copy_gitattributes )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
end
end
2016-03-03 10:40:05 -05:00
2016-03-10 14:48:29 -05:00
describe " Webhooks " do
context " execute webhooks " do
2013-02-25 14:21:38 -05:00
it " when pushing a branch for the first time " do
2015-02-12 13:17:35 -05:00
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-07-08 05:15:29 -04:00
expect ( project . protected_branches ) . not_to be_empty
2016-08-16 12:49:49 -04:00
expect ( project . protected_branches . first . push_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: MASTER ] )
expect ( project . protected_branches . first . merge_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: MASTER ] )
2015-01-31 03:10:17 -05:00
end
it " when pushing a branch for the first time with default branch protection disabled " do
2015-07-01 17:21:51 -04:00
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_NONE )
2015-01-31 03:10:17 -05:00
2015-02-12 13:17:35 -05:00
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-07-08 05:15:29 -04:00
expect ( project . protected_branches ) . to be_empty
2015-01-31 03:10:17 -05:00
end
it " when pushing a branch for the first time with default branch protection set to 'developers can push' " do
2015-07-01 17:21:51 -04:00
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_DEV_CAN_PUSH )
2015-01-31 03:10:17 -05:00
2015-02-12 13:17:35 -05:00
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-07-18 04:16:56 -04:00
2016-07-08 05:15:29 -04:00
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
expect ( project . protected_branches ) . not_to be_empty
2016-08-16 12:49:49 -04:00
expect ( project . protected_branches . last . push_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: DEVELOPER ] )
expect ( project . protected_branches . last . merge_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: MASTER ] )
2016-07-18 04:16:56 -04:00
end
2016-09-17 23:33:41 -04:00
it " when pushing a branch for the first time with an existing branch permission configured " do
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_DEV_CAN_PUSH )
create ( :protected_branch , :no_one_can_push , :developers_can_merge , project : project , name : 'master' )
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
expect_any_instance_of ( ProtectedBranches :: CreateService ) . not_to receive ( :execute )
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
expect ( project . protected_branches ) . not_to be_empty
expect ( project . protected_branches . last . push_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: NO_ACCESS ] )
expect ( project . protected_branches . last . merge_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: DEVELOPER ] )
end
2016-07-18 04:16:56 -04:00
it " when pushing a branch for the first time with default branch protection set to 'developers can merge' " do
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_DEV_CAN_MERGE )
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-07-08 05:15:29 -04:00
expect ( project . protected_branches ) . not_to be_empty
2016-08-16 12:49:49 -04:00
expect ( project . protected_branches . first . push_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: MASTER ] )
expect ( project . protected_branches . first . merge_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: DEVELOPER ] )
2013-02-25 14:21:38 -05:00
end
2013-12-03 04:34:06 -05:00
it " when pushing new commits to existing branch " do
2015-02-12 13:17:35 -05:00
expect ( project ) . to receive ( :execute_hooks )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , 'oldrev' , 'newrev' , 'refs/heads/master' )
2013-12-03 04:34:06 -05:00
end
2013-02-25 14:21:38 -05:00
end
end
2013-05-30 19:16:49 -04:00
describe " cross-reference notes " do
let ( :issue ) { create :issue , project : project }
let ( :commit_author ) { create :user }
2015-04-21 09:13:40 -04:00
let ( :commit ) { project . commit }
2013-05-30 19:16:49 -04:00
before do
2016-03-17 16:39:50 -04:00
project . team << [ commit_author , :developer ]
project . team << [ user , :developer ]
2015-05-21 17:49:06 -04:00
allow ( commit ) . to receive_messages (
2015-10-13 05:37:42 -04:00
safe_message : " this commit \n mentions #{ issue . to_reference } " ,
2013-05-30 19:16:49 -04:00
references : [ issue ] ,
author_name : commit_author . name ,
author_email : commit_author . email
2015-05-21 17:49:06 -04:00
)
2016-03-17 16:39:50 -04:00
2016-11-24 09:07:44 -05:00
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
2016-10-07 09:20:57 -04:00
and_return ( commit )
2015-05-21 17:49:06 -04:00
allow ( project . repository ) . to receive ( :commits_between ) . and_return ( [ commit ] )
2013-05-30 19:16:49 -04:00
end
it " creates a note if a pushed commit mentions an issue " do
2015-06-17 20:59:19 -04:00
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2013-05-30 19:16:49 -04:00
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2013-05-30 19:16:49 -04:00
end
it " only creates a cross-reference note if one doesn't already exist " do
2015-06-17 20:59:19 -04:00
SystemNoteService . cross_reference ( issue , commit , user )
2013-05-30 19:16:49 -04:00
2015-06-17 20:59:19 -04:00
expect ( SystemNoteService ) . not_to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2013-05-30 19:16:49 -04:00
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2013-05-30 19:16:49 -04:00
end
it " defaults to the pushing user if the commit's author is not known " do
2015-05-21 17:49:06 -04:00
allow ( commit ) . to receive_messages (
author_name : 'unknown name' ,
author_email : 'unknown@email.com'
)
2015-06-17 20:59:19 -04:00
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , user )
2013-05-30 19:16:49 -04:00
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2013-05-30 19:16:49 -04:00
end
it " finds references in the first push to a non-default branch " do
2015-02-12 13:17:35 -05:00
allow ( project . repository ) . to receive ( :commits_between ) . with ( @blankrev , @newrev ) . and_return ( [ ] )
allow ( project . repository ) . to receive ( :commits_between ) . with ( " master " , @newrev ) . and_return ( [ commit ] )
2013-05-30 19:16:49 -04:00
2015-06-17 20:59:19 -04:00
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2013-05-30 19:16:49 -04:00
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , @newrev , 'refs/heads/other' )
2013-05-30 19:16:49 -04:00
end
end
2016-09-19 03:26:25 -04:00
describe " issue metrics " do
let ( :issue ) { create :issue , project : project }
let ( :commit_author ) { create :user }
let ( :commit ) { project . commit }
let ( :commit_time ) { Time . now }
before do
project . team << [ commit_author , :developer ]
project . team << [ user , :developer ]
allow ( commit ) . to receive_messages (
safe_message : " this commit \n mentions #{ issue . to_reference } " ,
references : [ issue ] ,
author_name : commit_author . name ,
author_email : commit_author . email ,
committed_date : commit_time
)
2016-11-24 09:07:44 -05:00
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
2016-10-07 09:20:57 -04:00
and_return ( commit )
2016-09-19 03:26:25 -04:00
allow ( project . repository ) . to receive ( :commits_between ) . and_return ( [ commit ] )
end
context " while saving the 'first_mentioned_in_commit_at' metric for an issue " do
it 'sets the metric for referenced issues' do
execute_service ( project , user , @oldrev , @newrev , @ref )
2016-10-17 08:40:02 -04:00
expect ( issue . reload . metrics . first_mentioned_in_commit_at ) . to be_like_time ( commit_time )
2016-09-19 03:26:25 -04:00
end
it 'does not set the metric for non-referenced issues' do
non_referenced_issue = create ( :issue , project : project )
execute_service ( project , user , @oldrev , @newrev , @ref )
2016-09-20 17:21:43 -04:00
expect ( non_referenced_issue . reload . metrics . first_mentioned_in_commit_at ) . to be_nil
2016-09-19 03:26:25 -04:00
end
end
end
2015-08-21 09:05:43 -04:00
describe " closing issues from pushed commits containing a closing reference " do
2013-05-30 19:16:49 -04:00
let ( :issue ) { create :issue , project : project }
let ( :other_issue ) { create :issue , project : project }
let ( :commit_author ) { create :user }
2015-04-21 09:13:40 -04:00
let ( :closing_commit ) { project . commit }
2013-05-30 19:16:49 -04:00
before do
2015-05-21 17:49:06 -04:00
allow ( closing_commit ) . to receive_messages (
2013-05-30 19:16:49 -04:00
issue_closing_regex : / ^([Cc]loses|[Ff]ixes) # \ d+ / ,
safe_message : " this is some work. \n \n closes # #{ issue . iid } " ,
author_name : commit_author . name ,
author_email : commit_author . email
2015-05-21 17:49:06 -04:00
)
2013-05-30 19:16:49 -04:00
2015-05-21 17:49:06 -04:00
allow ( project . repository ) . to receive ( :commits_between ) .
and_return ( [ closing_commit ] )
2016-03-09 07:49:05 -05:00
2016-11-24 09:07:44 -05:00
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
2016-10-07 09:20:57 -04:00
and_return ( closing_commit )
2016-03-09 07:49:05 -05:00
project . team << [ commit_author , :master ]
2013-05-30 19:16:49 -04:00
end
2015-08-21 09:05:43 -04:00
context " to default branches " do
it " closes issues " do
2016-03-09 07:49:05 -05:00
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-08-21 09:05:43 -04:00
expect ( Issue . find ( issue . id ) ) . to be_closed
end
2013-05-30 19:16:49 -04:00
2015-08-21 09:05:43 -04:00
it " adds a note indicating that the issue is now closed " do
expect ( SystemNoteService ) . to receive ( :change_status ) . with ( issue , project , commit_author , " closed " , closing_commit )
2016-03-09 07:49:05 -05:00
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-08-21 09:05:43 -04:00
end
2013-05-30 19:16:49 -04:00
2015-08-21 09:05:43 -04:00
it " doesn't create additional cross-reference notes " do
expect ( SystemNoteService ) . not_to receive ( :cross_reference )
2016-03-09 07:49:05 -05:00
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-08-21 09:05:43 -04:00
end
2013-05-30 19:16:49 -04:00
2015-08-21 09:05:43 -04:00
it " doesn't close issues when external issue tracker is in use " do
2016-06-01 11:39:12 -04:00
allow_any_instance_of ( Project ) . to receive ( :default_issues_tracker? ) .
and_return ( false )
2016-10-06 18:05:27 -04:00
external_issue_tracker = double ( title : 'My Tracker' , issue_path : issue . iid , reference_pattern : project . issue_reference_pattern )
2016-06-29 22:25:44 -04:00
allow_any_instance_of ( Project ) . to receive ( :external_issue_tracker ) . and_return ( external_issue_tracker )
2013-05-30 19:16:49 -04:00
2015-08-21 09:05:43 -04:00
# The push still shouldn't create cross-reference notes.
expect do
2016-03-09 07:49:05 -05:00
execute_service ( project , commit_author , @oldrev , @newrev , 'refs/heads/hurf' )
2015-08-21 09:05:43 -04:00
end . not_to change { Note . where ( project_id : project . id , system : true ) . count }
end
2013-05-30 19:16:49 -04:00
end
2015-06-12 01:39:50 -04:00
2015-08-21 09:05:43 -04:00
context " to non-default branches " do
before do
# Make sure the "default" branch is different
allow ( project ) . to receive ( :default_branch ) . and_return ( 'not-master' )
end
it " creates cross-reference notes " do
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , closing_commit , commit_author )
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-08-21 09:05:43 -04:00
end
2015-06-12 01:39:50 -04:00
2015-08-21 09:05:43 -04:00
it " doesn't close issues " do
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-08-21 09:05:43 -04:00
expect ( Issue . find ( issue . id ) ) . to be_opened
end
2015-06-12 01:39:50 -04:00
end
2015-12-17 17:08:14 -05:00
context " for jira issue tracker " do
include JiraServiceHelper
let ( :jira_tracker ) { project . create_jira_service if project . jira_service . nil? }
before do
2016-10-06 17:17:11 -04:00
# project.create_jira_service doesn't seem to invalidate the cache here
project . has_external_issue_tracker = true
2015-12-17 17:08:14 -05:00
jira_service_settings
2016-09-29 17:11:32 -04:00
stub_jira_urls ( " JIRA-1 " )
2015-12-17 17:08:14 -05:00
allow ( closing_commit ) . to receive_messages ( {
issue_closing_regex : Regexp . new ( Gitlab . config . gitlab . issue_closing_pattern ) ,
safe_message : message ,
author_name : commit_author . name ,
author_email : commit_author . email
} )
allow ( project . repository ) . to receive_messages ( commits_between : [ closing_commit ] )
end
after do
jira_tracker . destroy!
end
context " mentioning an issue " do
let ( :message ) { " this is some work. \n \n related to JIRA-1 " }
2016-08-01 11:00:44 -04:00
it " initiates one api call to jira server to mention the issue " do
2016-09-29 17:11:32 -04:00
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-12-17 17:08:14 -05:00
2016-09-29 17:11:32 -04:00
expect ( WebMock ) . to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2015-12-17 17:08:14 -05:00
body : / mentioned this issue in /
) . once
end
end
context " closing an issue " do
2016-10-06 18:05:27 -04:00
let ( :message ) { " this is some work. \n \n closes JIRA-1 " }
2016-11-18 07:17:10 -05:00
let ( :comment_body ) { { body : " Issue solved with [ #{ closing_commit . id } |http:// #{ Gitlab . config . gitlab . host } / #{ project . path_with_namespace } /commit/ #{ closing_commit . id } ]. " } . to_json }
2016-10-06 18:05:27 -04:00
2016-11-09 16:55:21 -05:00
before do
open_issue = JIRA :: Resource :: Issue . new ( jira_tracker . client , attrs : { " id " = > " JIRA-1 " } )
closed_issue = open_issue . dup
allow ( open_issue ) . to receive ( :resolution ) . and_return ( false )
allow ( closed_issue ) . to receive ( :resolution ) . and_return ( true )
allow ( JIRA :: Resource :: Issue ) . to receive ( :find ) . and_return ( open_issue , closed_issue )
allow_any_instance_of ( JIRA :: Resource :: Issue ) . to receive ( :key ) . and_return ( " JIRA-1 " )
end
2016-10-06 18:05:27 -04:00
context " using right markdown " do
it " initiates one api call to jira server to close the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2016-09-29 17:11:32 -04:00
expect ( WebMock ) . to have_requested ( :post , jira_api_transition_url ( 'JIRA-1' ) ) . once
2016-10-06 18:05:27 -04:00
end
it " initiates one api call to jira server to comment on the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2016-09-29 17:11:32 -04:00
expect ( WebMock ) . to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2016-10-06 18:05:27 -04:00
body : comment_body
) . once
end
2015-12-17 17:08:14 -05:00
end
2016-10-06 18:05:27 -04:00
context " using wrong markdown " do
let ( :message ) { " this is some work. \n \n closes # 1 " }
2015-12-17 17:08:14 -05:00
2016-10-06 18:05:27 -04:00
it " does not initiates one api call to jira server to close the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2016-09-29 17:11:32 -04:00
expect ( WebMock ) . not_to have_requested ( :post , jira_api_transition_url ( 'JIRA-1' ) )
2016-10-06 18:05:27 -04:00
end
it " does not initiates one api call to jira server to comment on the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2016-09-29 17:11:32 -04:00
expect ( WebMock ) . not_to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2016-10-06 18:05:27 -04:00
body : comment_body
) . once
end
2015-12-17 17:08:14 -05:00
end
end
end
2013-05-30 19:16:49 -04:00
end
2013-02-25 14:21:38 -05:00
2015-05-06 02:49:30 -04:00
describe " empty project " do
let ( :project ) { create ( :project_empty_repo ) }
let ( :new_ref ) { 'refs/heads/feature' }
before do
allow ( project ) . to receive ( :default_branch ) . and_return ( 'feature' )
expect ( project ) . to receive ( :change_head ) { 'feature' }
end
it 'push to first branch updates HEAD' do
2016-02-17 04:42:59 -05:00
execute_service ( project , user , @blankrev , @newrev , new_ref )
2015-05-06 02:49:30 -04:00
end
end
2016-02-17 04:42:59 -05:00
2016-03-14 11:49:24 -04:00
describe " housekeeping " do
2016-03-15 06:03:43 -04:00
let ( :housekeeping ) { Projects :: HousekeepingService . new ( project ) }
2016-03-14 11:49:24 -04:00
before do
2016-10-11 11:31:19 -04:00
# Flush any raw Redis data stored by the housekeeping code.
Gitlab :: Redis . with { | conn | conn . flushall }
2016-03-14 11:49:24 -04:00
allow ( Projects :: HousekeepingService ) . to receive ( :new ) . and_return ( housekeeping )
end
2016-10-11 11:31:19 -04:00
after do
Gitlab :: Redis . with { | conn | conn . flushall }
end
2016-03-14 11:49:24 -04:00
it 'does not perform housekeeping when not needed' do
expect ( housekeeping ) . not_to receive ( :execute )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
2016-03-15 06:03:43 -04:00
context 'when housekeeping is needed' do
before do
allow ( housekeeping ) . to receive ( :needed? ) . and_return ( true )
end
2016-03-14 11:49:24 -04:00
2016-03-15 06:03:43 -04:00
it 'performs housekeeping' do
expect ( housekeeping ) . to receive ( :execute )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
it 'does not raise an exception' do
allow ( housekeeping ) . to receive ( :try_obtain_lease ) . and_return ( false )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
2016-03-14 11:49:24 -04:00
end
it 'increments the push counter' do
expect ( housekeeping ) . to receive ( :increment! )
2016-03-15 06:03:43 -04:00
2016-03-14 11:49:24 -04:00
execute_service ( project , user , @oldrev , @newrev , @ref )
end
end
2016-11-18 08:04:18 -05:00
describe '#update_caches' do
let ( :service ) do
described_class . new ( project ,
user ,
oldrev : sample_commit . parent_id ,
newrev : sample_commit . id ,
ref : 'refs/heads/master' )
end
context 'on the default branch' do
before do
allow ( service ) . to receive ( :is_default_branch? ) . and_return ( true )
end
it 'flushes the caches of any special files that have been changed' do
commit = double ( :commit )
diff = double ( :diff , new_path : 'README.md' )
expect ( commit ) . to receive ( :raw_diffs ) . with ( deltas_only : true ) .
and_return ( [ diff ] )
service . push_commits = [ commit ]
expect ( ProjectCacheWorker ) . to receive ( :perform_async ) .
2016-11-22 11:58:10 -05:00
with ( project . id , % i ( readme ) , % i ( commit_count repository_size ) )
2016-11-18 08:04:18 -05:00
service . update_caches
end
end
context 'on a non-default branch' do
before do
allow ( service ) . to receive ( :is_default_branch? ) . and_return ( false )
end
it 'does not flush any conditional caches' do
expect ( ProjectCacheWorker ) . to receive ( :perform_async ) .
2016-11-22 11:58:10 -05:00
with ( project . id , [ ] , % i ( commit_count repository_size ) ) .
2016-11-18 08:04:18 -05:00
and_call_original
service . update_caches
end
end
end
2016-12-21 10:26:35 -05:00
describe '#process_commit_messages' do
let ( :service ) do
described_class . new ( project ,
user ,
oldrev : sample_commit . parent_id ,
newrev : sample_commit . id ,
ref : 'refs/heads/master' )
end
it 'only schedules a limited number of commits' do
allow ( service ) . to receive ( :push_commits ) .
and_return ( Array . new ( 1000 , double ( :commit , to_hash : { } ) ) )
expect ( ProcessCommitWorker ) . to receive ( :perform_async ) . exactly ( 100 ) . times
service . process_commit_messages
end
end
2016-02-17 04:42:59 -05:00
def execute_service ( project , user , oldrev , newrev , ref )
service = described_class . new ( project , user , oldrev : oldrev , newrev : newrev , ref : ref )
service . execute
service
end
2015-10-14 01:07:58 -04:00
end