2014-09-02 18:07:02 +05:30
require 'spec_helper'
2015-12-23 02:04:40 +05:30
describe GitPushService , services : true do
2014-09-02 18:07:02 +05:30
include RepoHelpers
2017-08-17 22:00:37 +05:30
let ( :user ) { create ( :user ) }
let ( :project ) { create ( :project , :repository ) }
2014-09-02 18:07:02 +05:30
before do
2016-09-13 17:45:13 +05:30
project . team << [ user , :master ]
2015-04-26 12:48:37 +05:30
@blankrev = Gitlab :: Git :: BLANK_SHA
2014-09-02 18:07:02 +05:30
@oldrev = sample_commit . parent_id
@newrev = sample_commit . id
@ref = 'refs/heads/master'
end
2015-04-26 12:48:37 +05:30
describe 'Push branches' do
2016-04-02 18:10:28 +05:30
let ( :oldrev ) { @oldrev }
let ( :newrev ) { @newrev }
subject do
execute_service ( project , user , oldrev , newrev , @ref )
end
2015-04-26 12:48:37 +05:30
context 'new branch' do
2016-04-02 18:10:28 +05:30
let ( :oldrev ) { @blankrev }
2015-04-26 12:48:37 +05:30
it { is_expected . to be_truthy }
2016-04-02 18:10:28 +05:30
2017-08-17 22:00:37 +05:30
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-04-02 18:10:28 +05:30
subject
end
2017-08-17 22:00:37 +05:30
it 'calls the after_create_branch hook' do
expect ( project . repository ) . to receive ( :after_create_branch )
2016-08-24 12:49:21 +05:30
subject
end
2015-04-26 12:48:37 +05:30
end
context 'existing branch' do
it { is_expected . to be_truthy }
2016-04-02 18:10:28 +05:30
2017-08-17 22:00:37 +05:30
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-08-24 12:49:21 +05:30
subject
end
2015-04-26 12:48:37 +05:30
end
context 'rm branch' do
2016-04-02 18:10:28 +05:30
let ( :newrev ) { @blankrev }
2015-04-26 12:48:37 +05:30
it { is_expected . to be_truthy }
2016-04-02 18:10:28 +05:30
2017-08-17 22:00:37 +05:30
it 'calls the after_push_commit hook' do
expect ( project . repository ) . to receive ( :after_push_commit ) . with ( 'master' )
2016-04-02 18:10:28 +05:30
subject
end
2017-08-17 22:00:37 +05:30
it 'calls the after_remove_branch hook' do
expect ( project . repository ) . to receive ( :after_remove_branch )
2016-04-02 18:10:28 +05:30
subject
end
2015-04-26 12:48:37 +05:30
end
end
2014-09-02 18:07:02 +05:30
describe " Git Push Data " do
before do
2016-04-02 18:10:28 +05:30
service = execute_service ( project , user , @oldrev , @newrev , @ref )
2014-09-02 18:07:02 +05:30
@push_data = service . push_data
2015-09-11 14:41:01 +05:30
@commit = project . commit ( @newrev )
2014-09-02 18:07:02 +05:30
end
subject { @push_data }
2015-04-26 12:48:37 +05:30
it { is_expected . to include ( object_kind : 'push' ) }
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 ) }
2014-09-02 18:07:02 +05:30
context " with repository data " do
subject { @push_data [ :repository ] }
2015-04-26 12:48:37 +05:30
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 ) }
2014-09-02 18:07:02 +05:30
end
context " with commits " do
subject { @push_data [ :commits ] }
2015-04-26 12:48:37 +05:30
it { is_expected . to be_an ( Array ) }
it 'has 1 element' do
expect ( subject . size ) . to eq ( 1 )
end
2014-09-02 18:07:02 +05:30
context " the commit " do
subject { @push_data [ :commits ] . first }
2015-04-26 12:48:37 +05:30
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 ) }
it do
is_expected . to include (
url : [
Gitlab . config . gitlab . url ,
project . namespace . to_param ,
project . to_param ,
'commit' ,
@commit . id
] . join ( '/' )
)
end
2014-09-02 18:07:02 +05:30
context " with a author " do
subject { @push_data [ :commits ] . first [ :author ] }
2015-04-26 12:48:37 +05:30
it { is_expected . to include ( name : @commit . author_name ) }
it { is_expected . to include ( email : @commit . author_email ) }
2014-09-02 18:07:02 +05:30
end
end
end
end
describe " Push Event " do
before do
2016-04-02 18:10:28 +05:30
service = execute_service ( project , user , @oldrev , @newrev , @ref )
2016-09-13 17:45:13 +05:30
@event = Event . find_by_action ( Event :: PUSHED )
2016-04-02 18:10:28 +05:30
@push_data = service . push_data
2014-09-02 18:07:02 +05:30
end
2015-04-26 12:48:37 +05:30
it { expect ( @event ) . not_to be_nil }
it { expect ( @event . project ) . to eq ( project ) }
it { expect ( @event . action ) . to eq ( Event :: PUSHED ) }
2016-04-02 18:10:28 +05:30
it { expect ( @event . data ) . to eq ( @push_data ) }
2015-10-24 18:46:33 +05:30
context " Updates merge requests " do
it " when pushing a new branch for the first time " do
2016-11-03 12:29:30 +05:30
expect ( UpdateMergeRequestsWorker ) . to receive ( :perform_async ) .
with ( project . id , user . id , @blankrev , 'newrev' , 'refs/heads/master' )
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2015-10-24 18:46:33 +05:30
end
end
2017-08-17 22:00:37 +05:30
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
2014-09-02 18:07:02 +05:30
end
2016-06-02 11:05:42 +05:30
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
describe " Webhooks " do
context " execute webhooks " do
2014-09-02 18:07:02 +05:30
it " when pushing a branch for the first time " do
2015-04-26 12:48:37 +05:30
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-09-13 17:45:13 +05:30
expect ( project . protected_branches ) . not_to be_empty
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 ] )
2014-09-02 18:07:02 +05:30
end
2015-04-26 12:48:37 +05:30
it " when pushing a branch for the first time with default branch protection disabled " do
2015-09-11 14:41:01 +05:30
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_NONE )
2015-04-26 12:48:37 +05:30
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-09-13 17:45:13 +05:30
expect ( project . protected_branches ) . to be_empty
2014-09-02 18:07:02 +05:30
end
2015-04-26 12:48:37 +05:30
it " when pushing a branch for the first time with default branch protection set to 'developers can push' " do
2015-09-11 14:41:01 +05:30
stub_application_setting ( default_branch_protection : Gitlab :: Access :: PROTECTION_DEV_CAN_PUSH )
2015-04-26 12:48:37 +05:30
expect ( project ) . to receive ( :execute_hooks )
expect ( project . default_branch ) . to eq ( " master " )
2016-08-24 12:49:21 +05:30
2016-09-13 17:45:13 +05:30
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 :: DEVELOPER ] )
expect ( project . protected_branches . last . merge_access_levels . map ( & :access_level ) ) . to eq ( [ Gitlab :: Access :: MASTER ] )
2016-08-24 12:49:21 +05:30
end
2016-09-29 09:46:39 +05:30
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-08-24 12:49:21 +05:30
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-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , 'newrev' , 'refs/heads/master' )
2016-09-13 17:45:13 +05:30
expect ( project . protected_branches ) . not_to be_empty
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 ] )
2015-04-26 12:48:37 +05:30
end
it " when pushing new commits to existing branch " do
expect ( project ) . to receive ( :execute_hooks )
2016-04-02 18:10:28 +05:30
execute_service ( project , user , 'oldrev' , 'newrev' , 'refs/heads/master' )
2014-09-02 18:07:02 +05:30
end
end
end
describe " cross-reference notes " do
let ( :issue ) { create :issue , project : project }
let ( :commit_author ) { create :user }
2015-09-11 14:41:01 +05:30
let ( :commit ) { project . commit }
2014-09-02 18:07:02 +05:30
before do
2016-06-02 11:05:42 +05:30
project . team << [ commit_author , :developer ]
project . team << [ user , :developer ]
2015-09-11 14:41:01 +05:30
allow ( commit ) . to receive_messages (
2015-10-24 18:46:33 +05:30
safe_message : " this commit \n mentions #{ issue . to_reference } " ,
2014-09-02 18:07:02 +05:30
references : [ issue ] ,
author_name : commit_author . name ,
author_email : commit_author . email
2015-09-11 14:41:01 +05:30
)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
and_return ( commit )
2015-09-11 14:41:01 +05:30
allow ( project . repository ) . to receive ( :commits_between ) . and_return ( [ commit ] )
2014-09-02 18:07:02 +05:30
end
it " creates a note if a pushed commit mentions an issue " do
2015-09-11 14:41:01 +05:30
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2014-09-02 18:07:02 +05:30
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2014-09-02 18:07:02 +05:30
end
it " only creates a cross-reference note if one doesn't already exist " do
2015-09-11 14:41:01 +05:30
SystemNoteService . cross_reference ( issue , commit , user )
2014-09-02 18:07:02 +05:30
2015-09-11 14:41:01 +05:30
expect ( SystemNoteService ) . not_to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2014-09-02 18:07:02 +05:30
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2014-09-02 18:07:02 +05:30
end
it " defaults to the pushing user if the commit's author is not known " do
2015-09-11 14:41:01 +05:30
allow ( commit ) . to receive_messages (
author_name : 'unknown name' ,
author_email : 'unknown@email.com'
)
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , user )
2014-09-02 18:07:02 +05:30
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2014-09-02 18:07:02 +05:30
end
it " finds references in the first push to a non-default branch " do
2015-04-26 12:48:37 +05:30
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 ] )
2014-09-02 18:07:02 +05:30
2015-09-11 14:41:01 +05:30
expect ( SystemNoteService ) . to receive ( :cross_reference ) . with ( issue , commit , commit_author )
2014-09-02 18:07:02 +05:30
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , @newrev , 'refs/heads/other' )
2014-09-02 18:07:02 +05:30
end
end
2016-09-29 09:46:39 +05:30
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
)
2017-08-17 22:00:37 +05:30
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
and_return ( commit )
2016-09-29 09:46:39 +05:30
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-11-03 12:29:30 +05:30
expect ( issue . reload . metrics . first_mentioned_in_commit_at ) . to be_like_time ( commit_time )
2016-09-29 09:46:39 +05:30
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 )
expect ( non_referenced_issue . reload . metrics . first_mentioned_in_commit_at ) . to be_nil
end
end
end
2015-09-25 12:07:36 +05:30
describe " closing issues from pushed commits containing a closing reference " do
2014-09-02 18:07:02 +05:30
let ( :issue ) { create :issue , project : project }
let ( :other_issue ) { create :issue , project : project }
let ( :commit_author ) { create :user }
2015-09-11 14:41:01 +05:30
let ( :closing_commit ) { project . commit }
2014-09-02 18:07:02 +05:30
before do
2015-09-11 14:41:01 +05:30
allow ( closing_commit ) . to receive_messages (
2014-09-02 18:07:02 +05:30
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-09-11 14:41:01 +05:30
)
2014-09-02 18:07:02 +05:30
2015-09-11 14:41:01 +05:30
allow ( project . repository ) . to receive ( :commits_between ) .
and_return ( [ closing_commit ] )
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
allow_any_instance_of ( ProcessCommitWorker ) . to receive ( :build_commit ) .
and_return ( closing_commit )
2016-06-02 11:05:42 +05:30
project . team << [ commit_author , :master ]
2014-09-02 18:07:02 +05:30
end
2015-09-25 12:07:36 +05:30
context " to default branches " do
it " closes issues " do
2016-06-02 11:05:42 +05:30
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-09-25 12:07:36 +05:30
expect ( Issue . find ( issue . id ) ) . to be_closed
end
2014-09-02 18:07:02 +05:30
2015-09-25 12:07:36 +05:30
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-06-02 11:05:42 +05:30
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-09-25 12:07:36 +05:30
end
2014-09-02 18:07:02 +05:30
2015-09-25 12:07:36 +05:30
it " doesn't create additional cross-reference notes " do
expect ( SystemNoteService ) . not_to receive ( :cross_reference )
2016-06-02 11:05:42 +05:30
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2015-09-25 12:07:36 +05:30
end
2014-09-02 18:07:02 +05:30
end
2015-09-11 14:41:01 +05:30
2015-09-25 12:07:36 +05:30
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-04-02 18:10:28 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-09-25 12:07:36 +05:30
end
2015-09-11 14:41:01 +05:30
2015-09-25 12:07:36 +05:30
it " doesn't close issues " do
2016-04-02 18:10:28 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-09-25 12:07:36 +05:30
expect ( Issue . find ( issue . id ) ) . to be_opened
end
2015-09-11 14:41:01 +05:30
end
2015-12-23 02:04:40 +05:30
context " for jira issue tracker " do
include JiraServiceHelper
let ( :jira_tracker ) { project . create_jira_service if project . jira_service . nil? }
before do
2016-11-03 12:29:30 +05:30
# project.create_jira_service doesn't seem to invalidate the cache here
project . has_external_issue_tracker = true
2015-12-23 02:04:40 +05:30
jira_service_settings
2017-08-17 22:00:37 +05:30
stub_jira_urls ( " JIRA-1 " )
2015-12-23 02:04:40 +05:30
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-09-13 17:45:13 +05:30
it " initiates one api call to jira server to mention the issue " do
2017-08-17 22:00:37 +05:30
execute_service ( project , user , @oldrev , @newrev , @ref )
2015-12-23 02:04:40 +05:30
2017-08-17 22:00:37 +05:30
expect ( WebMock ) . to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2015-12-23 02:04:40 +05:30
body : / mentioned this issue in /
) . once
end
end
context " closing an issue " do
2016-11-03 12:29:30 +05:30
let ( :message ) { " this is some work. \n \n closes JIRA-1 " }
2017-08-17 22:00:37 +05:30
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 }
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-11-03 12:29:30 +05:30
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 )
2017-08-17 22:00:37 +05:30
expect ( WebMock ) . to have_requested ( :post , jira_api_transition_url ( 'JIRA-1' ) ) . once
2016-11-03 12:29:30 +05:30
end
it " initiates one api call to jira server to comment on the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2017-08-17 22:00:37 +05:30
expect ( WebMock ) . to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2016-11-03 12:29:30 +05:30
body : comment_body
) . once
end
2015-12-23 02:04:40 +05:30
end
2016-11-03 12:29:30 +05:30
context " using wrong markdown " do
let ( :message ) { " this is some work. \n \n closes # 1 " }
2015-12-23 02:04:40 +05:30
2016-11-03 12:29:30 +05:30
it " does not initiates one api call to jira server to close the issue " do
execute_service ( project , commit_author , @oldrev , @newrev , @ref )
2017-08-17 22:00:37 +05:30
expect ( WebMock ) . not_to have_requested ( :post , jira_api_transition_url ( 'JIRA-1' ) )
2016-11-03 12:29:30 +05:30
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 )
2017-08-17 22:00:37 +05:30
expect ( WebMock ) . not_to have_requested ( :post , jira_api_comment_url ( 'JIRA-1' ) ) . with (
2016-11-03 12:29:30 +05:30
body : comment_body
) . once
end
2015-12-23 02:04:40 +05:30
end
end
end
2014-09-02 18:07:02 +05:30
end
2015-09-11 14:41:01 +05:30
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-04-02 18:10:28 +05:30
execute_service ( project , user , @blankrev , @newrev , new_ref )
2015-09-11 14:41:01 +05:30
end
end
2016-04-02 18:10:28 +05:30
2016-06-02 11:05:42 +05:30
describe " housekeeping " do
let ( :housekeeping ) { Projects :: HousekeepingService . new ( project ) }
before do
2017-08-17 22:00:37 +05:30
# Flush any raw Redis data stored by the housekeeping code.
Gitlab :: Redis . with { | conn | conn . flushall }
2016-06-02 11:05:42 +05:30
allow ( Projects :: HousekeepingService ) . to receive ( :new ) . and_return ( housekeeping )
end
2017-08-17 22:00:37 +05:30
after do
Gitlab :: Redis . with { | conn | conn . flushall }
end
2016-06-02 11:05:42 +05:30
it 'does not perform housekeeping when not needed' do
expect ( housekeeping ) . not_to receive ( :execute )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
context 'when housekeeping is needed' do
before do
allow ( housekeeping ) . to receive ( :needed? ) . and_return ( true )
end
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
end
it 'increments the push counter' do
expect ( housekeeping ) . to receive ( :increment! )
execute_service ( project , user , @oldrev , @newrev , @ref )
end
end
2017-08-17 22:00:37 +05:30
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 ) .
with ( project . id , % i ( readme ) , % i ( commit_count repository_size ) )
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 ) .
with ( project . id , [ ] , % i ( commit_count repository_size ) ) .
and_call_original
service . update_caches
end
end
end
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-04-02 18:10:28 +05:30
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-09-11 14:41:01 +05:30
end