socialcast-git-extensions 3.3 → 4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 283e0ebc38ce457e94ca898703a5ab8df99835b6
4
- data.tar.gz: 61d4adc96c8f42e659a03320f2182d844c0aa4ef
3
+ metadata.gz: 1597af4201f51193d8caa155e504dd2c1a1708df
4
+ data.tar.gz: 3998e46534810aa2ab2245faaa69bdaf728a9e60
5
5
  SHA512:
6
- metadata.gz: 310fc3393cfae32881d2b4e5ce1ae3fe1645ba9aeff0a2278b60991a89eff7ccd8d4742e4a2191c1ac7424746063ccad0f8828d0dc681f0357796ef31b0ad0a8
7
- data.tar.gz: 2f8234257b185d9b817be64b9c9c1ca21b790bc2bf867513f66f795f3c6e253fe7141dcd76e3cf34e9b0cdcad381cb45d62df88c8aaf3e37427641edb7b723bd
6
+ metadata.gz: e80849b35dd2a830a8d555565f75084cac88d7abec267e1e98822f412ca5daaea88c6ad8a34b64b86f085f7797533d59d8022a0fcc2626c5fb6a0ae7a73ba302
7
+ data.tar.gz: 5bbd8a91ebff3c6952a0237e64a31d8712ada4af78a79c5bf520dd8616bb8d87f679bb952dcc7cae660660660b490c6463de2fb9e0a02d31d61999131da2f5d0
data/.gitignore CHANGED
@@ -17,6 +17,7 @@ tmtags
17
17
  coverage
18
18
  rdoc
19
19
  pkg
20
+ .byebug_history
20
21
 
21
22
  #bundler
22
23
  Gemfile.lock
data/README.md CHANGED
@@ -29,6 +29,8 @@ Test the token with the [`git findpr`](https://github.com/socialcast/socialcast-
29
29
 
30
30
  ### Options
31
31
  * ```--quiet```: suppress posting message in Socialcast
32
+ * config/scgitx.yml option `share_via_pr_comments`: Set to `true` to post reviewrequest and integration messages
33
+ as pull request comments instead of Socialcast posts.
32
34
 
33
35
  ## git start <new_branch_name (optional)>
34
36
 
@@ -50,9 +52,17 @@ Find pull requests on github including a given commit
50
52
 
51
53
  List branches merged into remote origin/`branch` and not also merged into origin/`base_branch`
52
54
 
55
+ ## git createpr
56
+
57
+ create a pull request on github for the current branch, without assigning it for review.
58
+
53
59
  ## git reviewrequest
54
60
 
55
- create a pull request on github for peer review of the current branch.
61
+ create and assign a pull request on github for peer review of the current branch. See `assignpr` for additional options.
62
+
63
+ ## git assignpr
64
+
65
+ assign the pull request on github for the current branch for peer review.
56
66
 
57
67
  ### Optional:
58
68
  Specify a Review Buddy mapping that will reference the local Github username and @mention a pre-assigned review buddy in the Socialcast Review Request message. Specify the mapping by creating a .scgitx YML file relative to the Repo Root: config/scgitx.yml with the following format:
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'socialcast-git-extensions', 'cli.rb')
4
+ Socialcast::Gitx::CLI.start (['assignpr'] + ARGV)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'socialcast-git-extensions', 'cli.rb')
4
+ Socialcast::Gitx::CLI.start (['createpr'] + ARGV)
@@ -28,13 +28,24 @@ module Socialcast
28
28
  RestClient.log = Logger.new(STDOUT) if options[:trace]
29
29
  end
30
30
 
31
- desc "reviewrequest", "Create a pull request on github"
31
+ desc "createpr", "Create a pull request on github"
32
32
  method_option :description, :type => :string, :aliases => '-d', :desc => 'pull request description'
33
+ # @see http://developer.github.com/v3/pulls/
34
+ def createpr
35
+ update unless @skip_update
36
+ description = options[:description] || editor_input(PULL_REQUEST_DESCRIPTION)
37
+ branch = current_branch
38
+ repo = current_repo
39
+ url = create_pull_request(branch, repo, description)['html_url']
40
+ say "Pull request created: #{url}"
41
+ end
42
+
43
+ desc "assignpr", "Assign the pull request on github for review"
33
44
  method_option :additional_reviewers, :type => :string, :aliases => '-a', :desc => 'add additional reviewers to mention automatically, and skips the prompt'
34
45
  method_option :skip_additional_reviewers, :type => :string, :aliases => '-s', :desc => 'Skips adding additional reviewers'
35
46
  # @see http://developer.github.com/v3/pulls/
36
- def reviewrequest(*additional_reviewers)
37
- update
47
+ def assignpr(*additional_reviewers)
48
+ update unless @skip_update
38
49
 
39
50
  primary_mention = if buddy = socialcast_review_buddy(current_user)
40
51
  "assigned to @#{buddy}"
@@ -58,16 +69,34 @@ module Socialcast
58
69
  end
59
70
  end
60
71
 
61
- assignee = github_review_buddy(current_user)
62
-
63
- description = options[:description] || editor_input(PULL_REQUEST_DESCRIPTION)
64
72
  branch = current_branch
65
73
  repo = current_repo
66
- url = create_pull_request branch, repo, description, assignee
67
- say "Pull request created: #{url}"
74
+ current_pr = current_pr_for_branch(repo, branch)
75
+ issue_url = current_pr['issue_url']
76
+ url = current_pr['html_url']
77
+
78
+ assignee = github_review_buddy(current_user)
79
+ assign_pull_request(assignee, issue_url) if assignee
68
80
 
69
- review_message = ["#reviewrequest for #{branch} in #{current_repo}", "PR #{url} #{primary_mention}", '', description, '', secondary_mention, "/cc @#{developer_group} #scgitx", '', changelog_summary(branch)].compact.join("\n").gsub(/\n{2,}/, "\n\n")
70
- post review_message, :message_type => 'review_request'
81
+ if use_pr_comments?
82
+ issue_message = ['#reviewrequest', primary_mention, secondary_mention, "\n/cc @#{developer_group} #scgitx"].compact.join(' ')
83
+ comment_on_issue(issue_url, issue_message)
84
+ else
85
+ review_message = ["#reviewrequest for #{branch} in #{current_repo}", "PR #{url} #{primary_mention}", '', current_pr['body'], '', secondary_mention, "/cc @#{developer_group} #scgitx", '', changelog_summary(branch)].compact.join("\n").gsub(/\n{2,}/, "\n\n")
86
+ post review_message, :message_type => 'review_request'
87
+ end
88
+ end
89
+
90
+ desc "reviewrequest", "Create and assign a pull request on github"
91
+ method_option :description, :type => :string, :aliases => '-d', :desc => 'pull request description'
92
+ method_option :additional_reviewers, :type => :string, :aliases => '-a', :desc => 'add additional reviewers to mention automatically, and skips the prompt'
93
+ method_option :skip_additional_reviewers, :type => :string, :aliases => '-s', :desc => 'Skips adding additional reviewers'
94
+ # @see http://developer.github.com/v3/pulls/
95
+ def reviewrequest(*additional_reviewers)
96
+ update
97
+ @skip_update = true
98
+ createpr
99
+ assignpr(*additional_reviewers)
71
100
  end
72
101
 
73
102
  desc "findpr", "Find pull requests including a given commit"
@@ -104,14 +133,21 @@ module Socialcast
104
133
  maintenance_branch_url = "https://github.com/#{repo}/tree/#{maintenance_branch}"
105
134
  description = "Backport ##{pull_request_num} to #{maintenance_branch_url}\n***\n#{pull_request_data['body']}"
106
135
 
107
- pull_request_url = create_pull_request(backport_branch, repo, description, assignee)
136
+ pr_hash = create_pull_request(backport_branch, repo, description)
137
+ assign_pull_request(assignee, pr_hash['issue_url']) if assignee
108
138
 
109
- review_message = ["#reviewrequest backport ##{pull_request_num} to #{maintenance_branch} in #{current_repo} #scgitx"]
110
- if socialcast_reviewer
111
- review_message << "/cc @#{socialcast_reviewer} for #backport track"
139
+ reviewer_mention = "@#{socialcast_reviewer}" if socialcast_reviewer
140
+ if use_pr_comments?
141
+ issue_message = ['#reviewrequest backport', reviewer_mention, "/cc @#{developer_group} #scgitx"].compact.join(' ')
142
+ comment_on_issue(pr_hash['issue_url'], issue_message)
143
+ else
144
+ review_message = ["#reviewrequest backport ##{pull_request_num} to #{maintenance_branch} in #{current_repo} #scgitx"]
145
+ if socialcast_reviewer
146
+ review_message << "/cc #{reviewer_mention} for #backport track"
147
+ end
148
+ review_message << "/cc @#{developer_group}"
149
+ post review_message.join("\n\n"), :url => pr_hash['html_url'], :message_type => 'review_request'
112
150
  end
113
- review_message << "/cc @#{developer_group}"
114
- post review_message.join("\n\n"), :url => pull_request_url, :message_type => 'review_request'
115
151
  ensure
116
152
  ENV['BASE_BRANCH'] = original_base_branch
117
153
  end
@@ -192,12 +228,26 @@ module Socialcast
192
228
  integrate_branch(target_branch, prototype_branch) if target_branch == staging_branch
193
229
  run_cmd "git checkout #{branch}"
194
230
 
195
- message = <<-EOS.strip_heredoc
196
- #worklog integrating #{branch} into #{target_branch} in #{current_repo} #scgitx
197
- /cc @#{developer_group}
198
- EOS
231
+ current_pr = begin
232
+ current_pr_for_branch(current_repo, current_branch)
233
+ rescue => e
234
+ say e.message.to_s
235
+ nil
236
+ end
199
237
 
200
- post message.strip
238
+ say("WARNING: Unable to find current pull request. Use `git createpr` to create one.", :red) unless current_pr
239
+
240
+ if use_pr_comments? && current_pr
241
+ issue_message = "Integrated into #{target_branch}"
242
+ comment_on_issue(current_pr['issue_url'], issue_message) unless options[:quiet]
243
+ else
244
+ message = <<-EOS.strip_heredoc
245
+ #worklog integrating #{branch} into #{target_branch} in #{current_repo} #scgitx
246
+ /cc @#{developer_group}
247
+ EOS
248
+
249
+ post message.strip
250
+ end
201
251
  end
202
252
 
203
253
  desc 'promote', '(DEPRECATED) promote the current branch into staging'
@@ -264,12 +314,14 @@ module Socialcast
264
314
  integrate_branch(base_branch, staging_branch)
265
315
  cleanup
266
316
 
267
- message = <<-EOS.strip_heredoc
268
- #worklog releasing #{branch} to #{base_branch} in #{current_repo} #scgitx
269
- /cc @#{developer_group}
270
- EOS
317
+ unless use_pr_comments?
318
+ message = <<-EOS.strip_heredoc
319
+ #worklog releasing #{branch} to #{base_branch} in #{current_repo} #scgitx
320
+ /cc @#{developer_group}
321
+ EOS
271
322
 
272
- post message.strip
323
+ post message.strip
324
+ end
273
325
  end
274
326
 
275
327
  private
@@ -282,6 +334,10 @@ module Socialcast
282
334
  !!config['enforce_staging_before_release']
283
335
  end
284
336
 
337
+ def use_pr_comments?
338
+ config['share_via_pr_comments'] == true
339
+ end
340
+
285
341
  # post a message in socialcast
286
342
  # skip sharing message if CLI quiet option is present
287
343
  def post(message, params = {})
@@ -31,9 +31,8 @@ module Socialcast
31
31
  throw e
32
32
  end
33
33
 
34
- # returns the url of the created pull request
35
34
  # @see http://developer.github.com/v3/pulls/
36
- def create_pull_request(branch, repo, body, assignee)
35
+ def create_pull_request(branch, repo, body)
37
36
  payload = {:title => branch, :base => base_branch, :head => branch, :body => body}.to_json
38
37
  say "Creating pull request for "
39
38
  say "#{branch} ", :green
@@ -41,11 +40,7 @@ module Socialcast
41
40
  say "#{base_branch} ", :green
42
41
  say "in "
43
42
  say repo, :green
44
- data = github_api_request("POST", "repos/#{repo}/pulls", payload)
45
- assign_pull_request(branch, assignee, data) if assignee ## Unfortunately this needs to be done in a seperate request.
46
-
47
- url = data['html_url']
48
- url
43
+ github_api_request("POST", "repos/#{repo}/pulls", payload)
49
44
  end
50
45
 
51
46
  # find the PRs matching the given commit hash
@@ -56,13 +51,33 @@ module Socialcast
56
51
  github_api_request "GET", "search/issues?q=#{query}"
57
52
  end
58
53
 
59
- def assign_pull_request(branch, assignee, data)
60
- issue_payload = { :title => branch, :assignee => assignee }.to_json
61
- github_api_request "PATCH", data['issue_url'], issue_payload
54
+ # find the PRs for a given branch
55
+ # https://developer.github.com/v3/pulls/#list-pull-requests
56
+ def pull_requests_for_branch(repo, branch)
57
+ head_name = "#{repo.split('/').first}:#{branch}"
58
+ github_api_request "GET", "repos/#{repo}/pulls?head=#{head_name}"
59
+ end
60
+
61
+ # find the current PR for a given branch
62
+ def current_pr_for_branch(repo, branch)
63
+ prs = pull_requests_for_branch(repo, branch)
64
+ raise "Multiple (#{prs.size}) open PRs for #{branch} found in #{repo}, unable to proceed" if prs.size > 1
65
+ prs.first
66
+ end
67
+
68
+ def assign_pull_request(assignee, issue_url)
69
+ issue_payload = { :assignee => assignee }.to_json
70
+ github_api_request "PATCH", issue_url, issue_payload
62
71
  rescue => e
63
72
  say "Failed to assign pull request: #{e.message}", :red
64
73
  end
65
74
 
75
+ # post a comment on an issue
76
+ # https://developer.github.com/v3/issues/comments/#create-a-comment
77
+ def comment_on_issue(issue_url, comment_body)
78
+ github_api_request 'POST', "#{issue_url}/comments", { :body => comment_body }.to_json
79
+ end
80
+
66
81
  # @returns [String] socialcast username to assign the review to
67
82
  # @returns [nil] when no buddy system configured or user not found
68
83
  def socialcast_review_buddy(current_user)
@@ -1,5 +1,5 @@
1
1
  module Socialcast
2
2
  module Gitx
3
- VERSION = "3.3"
3
+ VERSION = "4.0"
4
4
  end
5
5
  end
@@ -16,13 +16,14 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_runtime_dependency 'rugged', '>= 0.23'
18
18
  s.add_runtime_dependency 'socialcast', '~> 1.3.0'
19
- s.add_runtime_dependency 'activesupport', '~> 4.0'
19
+ s.add_runtime_dependency 'activesupport', '>= 4.0'
20
20
  s.add_runtime_dependency 'rest-client', '~> 1.7'
21
21
  s.add_runtime_dependency 'thor', '~> 0.19.1'
22
22
  s.add_runtime_dependency 'rake', '~> 10.3'
23
23
  s.add_development_dependency 'rspec', '~> 3.0'
24
24
  s.add_development_dependency 'pry', '~> 0.9.12.6'
25
25
  s.add_development_dependency 'webmock', '~> 1.21'
26
+ s.add_development_dependency 'byebug'
26
27
 
27
28
  s.files = `git ls-files`.split("\n")
28
29
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -3,10 +3,18 @@ require 'spec_helper'
3
3
  describe Socialcast::Gitx::CLI do
4
4
  let(:stubbed_executed_commands) { [] }
5
5
 
6
- def stub_message(message_body, params = {})
6
+ def expect_message(message_body, params = {})
7
7
  expect(Socialcast::CommandLine::Message).to receive(:create).with(params.merge(:body => message_body)).and_return(double(:permalink_url => 'https://community.socialcast.com/messages/1234'))
8
8
  end
9
9
 
10
+ let(:git_update_commands) do
11
+ [
12
+ "git pull origin FOO",
13
+ "git pull origin master",
14
+ "git push origin HEAD"
15
+ ]
16
+ end
17
+
10
18
  before do
11
19
  Socialcast::Gitx::CLI.instance_eval do # to supress warning from stubbing ldap_config
12
20
  @no_tasks = @no_commands = true
@@ -25,12 +33,10 @@ describe Socialcast::Gitx::CLI do
25
33
  end
26
34
 
27
35
  describe '#update' do
28
- before do
36
+ it do
29
37
  expect_any_instance_of(Socialcast::Gitx::CLI).not_to receive(:post)
30
38
  Socialcast::Gitx::CLI.start ['update']
31
- end
32
- it 'should not post message to socialcast' do end # see expectations
33
- it 'should run expected commands' do
39
+
34
40
  expect(stubbed_executed_commands).to eq([
35
41
  'git pull origin FOO',
36
42
  'git pull origin master',
@@ -40,107 +46,163 @@ describe Socialcast::Gitx::CLI do
40
46
  end
41
47
 
42
48
  describe '#integrate' do
43
- context 'when target branch is ommitted' do
44
- before do
45
- stub_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
46
-
47
- Socialcast::Gitx::CLI.start ['integrate']
49
+ context 'with no existing pull request' do
50
+ let!(:github_api_pulls_list) do
51
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
52
+ .to_return(:status => 200, :body => "[]", :headers => {})
48
53
  end
49
- it 'should post message to socialcast' do end # see expectations
50
- it 'should default to prototype' do
51
- expect(stubbed_executed_commands).to eq([
52
- "git pull origin FOO",
53
- "git pull origin master",
54
- "git push origin HEAD",
55
- "git branch -D prototype",
56
- "git fetch origin",
57
- "git checkout prototype",
58
- "git pull . FOO",
59
- "git push origin HEAD",
60
- "git checkout FOO",
61
- "git checkout FOO"
62
- ])
54
+ context 'when target branch is omitted' do
55
+ it 'defaults to prototype' do
56
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
57
+
58
+ Socialcast::Gitx::CLI.start ['integrate']
59
+
60
+ expect(stubbed_executed_commands).to eq([
61
+ "git pull origin FOO",
62
+ "git pull origin master",
63
+ "git push origin HEAD",
64
+ "git branch -D prototype",
65
+ "git fetch origin",
66
+ "git checkout prototype",
67
+ "git pull . FOO",
68
+ "git push origin HEAD",
69
+ "git checkout FOO",
70
+ "git checkout FOO"
71
+ ])
72
+ expect(github_api_pulls_list).to have_been_requested
73
+ end
63
74
  end
64
- end
65
- context 'when target branch is ommitted with custom prototype branch' do
66
- before do
67
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:prototype_branch).and_return('special-prototype')
75
+ context 'when target branch is omitted with custom prototype branch' do
76
+ it 'defaults to the custom prototype branch' do
77
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:prototype_branch).and_return('special-prototype')
68
78
 
69
- stub_message "#worklog integrating FOO into special-prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
79
+ expect_message "#worklog integrating FOO into special-prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
70
80
 
71
- Socialcast::Gitx::CLI.start ['integrate']
81
+ Socialcast::Gitx::CLI.start ['integrate']
82
+
83
+ expect(stubbed_executed_commands).to eq([
84
+ "git pull origin FOO",
85
+ "git pull origin master",
86
+ "git push origin HEAD",
87
+ "git branch -D special-prototype",
88
+ "git fetch origin",
89
+ "git checkout special-prototype",
90
+ "git pull . FOO",
91
+ "git push origin HEAD",
92
+ "git checkout FOO",
93
+ "git checkout FOO"
94
+ ])
95
+ end
72
96
  end
73
- it 'should post message to socialcast' do end # see expectations
74
- it 'should default to prototype' do
75
- expect(stubbed_executed_commands).to eq([
76
- "git pull origin FOO",
77
- "git pull origin master",
78
- "git push origin HEAD",
79
- "git branch -D special-prototype",
80
- "git fetch origin",
81
- "git checkout special-prototype",
82
- "git pull . FOO",
83
- "git push origin HEAD",
84
- "git checkout FOO",
85
- "git checkout FOO"
86
- ])
97
+ context 'when target branch == prototype' do
98
+ it do
99
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
100
+
101
+ Socialcast::Gitx::CLI.start ['integrate', 'prototype']
102
+
103
+ expect(stubbed_executed_commands).to eq([
104
+ "git pull origin FOO",
105
+ "git pull origin master",
106
+ "git push origin HEAD",
107
+ "git branch -D prototype",
108
+ "git fetch origin",
109
+ "git checkout prototype",
110
+ "git pull . FOO",
111
+ "git push origin HEAD",
112
+ "git checkout FOO",
113
+ "git checkout FOO"
114
+ ])
115
+ end
87
116
  end
88
- end
89
- context 'when target branch == prototype' do
90
- before do
91
- stub_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
117
+ context 'when target branch == staging' do
118
+ it do
119
+ expect_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
92
120
 
93
- Socialcast::Gitx::CLI.start ['integrate', 'prototype']
121
+ Socialcast::Gitx::CLI.start ['integrate', 'staging']
122
+
123
+ expect(stubbed_executed_commands).to eq([
124
+ "git pull origin FOO",
125
+ "git pull origin master",
126
+ "git push origin HEAD",
127
+ "git branch -D staging",
128
+ "git fetch origin",
129
+ "git checkout staging",
130
+ "git pull . FOO",
131
+ "git push origin HEAD",
132
+ "git checkout FOO",
133
+ "git branch -D prototype",
134
+ "git fetch origin",
135
+ "git checkout prototype",
136
+ "git pull . staging",
137
+ "git push origin HEAD",
138
+ "git checkout staging",
139
+ "git checkout FOO"
140
+ ])
141
+ end
94
142
  end
95
- it 'should post message to socialcast' do end # see expectations
96
- it 'should run expected commands' do
97
- expect(stubbed_executed_commands).to eq([
98
- "git pull origin FOO",
99
- "git pull origin master",
100
- "git push origin HEAD",
101
- "git branch -D prototype",
102
- "git fetch origin",
103
- "git checkout prototype",
104
- "git pull . FOO",
105
- "git push origin HEAD",
106
- "git checkout FOO",
107
- "git checkout FOO"
108
- ])
143
+ context 'when target branch != staging || prototype' do
144
+ it do
145
+ expect {
146
+ Socialcast::Gitx::CLI.start ['integrate', 'asdfasdfasdf']
147
+ }.to raise_error(/Only aggregate branches are allowed for integration/)
148
+ end
109
149
  end
110
150
  end
111
- context 'when target branch == staging' do
151
+ context 'with an existing pull request' do
152
+ let!(:github_api_pulls_list) do
153
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
154
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]))
155
+ end
156
+ let!(:github_api_comments_create) do
157
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
158
+ .with(:body => "{\"body\":\"Integrated into prototype\"}")
159
+ .to_return(:status => 200, :body => "{}", :headers => {})
160
+ end
112
161
  before do
113
- stub_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
114
-
115
- Socialcast::Gitx::CLI.start ['integrate', 'staging']
162
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
116
163
  end
117
- it 'should post message to socialcast' do end # see expectations
118
- it 'should also integrate into prototype and run expected commands' do
119
- expect(stubbed_executed_commands).to eq([
120
- "git pull origin FOO",
121
- "git pull origin master",
122
- "git push origin HEAD",
123
- "git branch -D staging",
124
- "git fetch origin",
125
- "git checkout staging",
126
- "git pull . FOO",
127
- "git push origin HEAD",
128
- "git checkout FOO",
129
- "git branch -D prototype",
130
- "git fetch origin",
131
- "git checkout prototype",
132
- "git pull . staging",
133
- "git push origin HEAD",
134
- "git checkout staging",
135
- "git checkout FOO"
136
- ])
164
+ context 'when use_pr_comments? is false' do
165
+ let(:use_pr_comments) { false }
166
+ it 'does not comment on the PR posts a message' do
167
+ expect_message "#worklog integrating FOO into prototype in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
168
+ Socialcast::Gitx::CLI.start ['integrate']
169
+
170
+ expect(stubbed_executed_commands).to eq([
171
+ "git pull origin FOO",
172
+ "git pull origin master",
173
+ "git push origin HEAD",
174
+ "git branch -D prototype",
175
+ "git fetch origin",
176
+ "git checkout prototype",
177
+ "git pull . FOO",
178
+ "git push origin HEAD",
179
+ "git checkout FOO",
180
+ "git checkout FOO"
181
+ ])
182
+ expect(github_api_pulls_list).to have_been_requested
183
+ expect(github_api_comments_create).to_not have_been_requested
184
+ end
137
185
  end
138
- end
139
- context 'when target branch != staging || prototype' do
140
- it 'should raise an error' do
141
- expect {
142
- Socialcast::Gitx::CLI.start ['integrate', 'asdfasdfasdf']
143
- }.to raise_error(/Only aggregate branches are allowed for integration/)
186
+ context 'when use_pr_comments? is true' do
187
+ let(:use_pr_comments) { true }
188
+ it 'comments on the PR and does not post a message' do
189
+ Socialcast::Gitx::CLI.start ['integrate']
190
+
191
+ expect(stubbed_executed_commands).to eq([
192
+ "git pull origin FOO",
193
+ "git pull origin master",
194
+ "git push origin HEAD",
195
+ "git branch -D prototype",
196
+ "git fetch origin",
197
+ "git checkout prototype",
198
+ "git pull . FOO",
199
+ "git push origin HEAD",
200
+ "git checkout FOO",
201
+ "git checkout FOO"
202
+ ])
203
+ expect(github_api_pulls_list).to have_been_requested
204
+ expect(github_api_comments_create).to have_been_requested
205
+ end
144
206
  end
145
207
  end
146
208
  end
@@ -163,38 +225,52 @@ describe Socialcast::Gitx::CLI do
163
225
  end
164
226
  context 'when user confirms release' do
165
227
  before do
166
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
167
-
168
228
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
169
229
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
170
- Socialcast::Gitx::CLI.start ['release']
171
230
  end
172
- it 'should post message to socialcast' do end # see expectations
173
- it 'should run expected commands' do
174
- expect(stubbed_executed_commands).to eq([
175
- "git branch -D last_known_good_staging",
176
- "git fetch origin",
177
- "git checkout last_known_good_staging",
178
- "git checkout FOO",
179
- "git pull origin FOO",
180
- "git pull origin master",
181
- "git push origin HEAD",
182
- "git checkout master",
183
- "git pull origin master",
184
- "git pull . FOO",
185
- "git push origin HEAD",
186
- "git branch -D staging",
187
- "git fetch origin",
188
- "git checkout staging",
189
- "git pull . master",
190
- "git push origin HEAD",
191
- "git checkout master"
192
- ])
231
+ shared_examples_for 'releasing the branch' do
232
+ it do
233
+ expect(stubbed_executed_commands).to eq([
234
+ "git branch -D last_known_good_staging",
235
+ "git fetch origin",
236
+ "git checkout last_known_good_staging",
237
+ "git checkout FOO",
238
+ "git pull origin FOO",
239
+ "git pull origin master",
240
+ "git push origin HEAD",
241
+ "git checkout master",
242
+ "git pull origin master",
243
+ "git pull . FOO",
244
+ "git push origin HEAD",
245
+ "git branch -D staging",
246
+ "git fetch origin",
247
+ "git checkout staging",
248
+ "git pull . master",
249
+ "git push origin HEAD",
250
+ "git checkout master"
251
+ ])
252
+ end
253
+ end
254
+ context 'when use_pr_comments? is false' do
255
+ before do
256
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(false)
257
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
258
+ Socialcast::Gitx::CLI.start ['release']
259
+ end
260
+ it_behaves_like 'releasing the branch'
261
+ end
262
+ context 'when use_pr_comments? is true' do
263
+ before do
264
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(true)
265
+ Socialcast::Gitx::CLI.start ['release']
266
+ end
267
+ # does not post a message nor a pr comment (github reports "merged" event via webhook)'
268
+ it_behaves_like 'releasing the branch'
193
269
  end
194
270
  end
195
271
 
196
272
  context 'when the branch is not in last_known_good_staging' do
197
- context 'and enforce_staging_before_release = true' do
273
+ context 'when enforce_staging_before_release = true' do
198
274
  let(:branches_in_last_known_good_staging) { ['another-branch'] }
199
275
  before do
200
276
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:enforce_staging_before_release?).and_return(true)
@@ -204,16 +280,16 @@ describe Socialcast::Gitx::CLI do
204
280
  expect { Socialcast::Gitx::CLI.start ['release'] }.to raise_error(RuntimeError, 'Cannot release FOO unless it has already been promoted separately to staging and the build has passed.')
205
281
  end
206
282
  end
207
- context 'and enforce_staging_before_release = false' do
283
+ context 'when enforce_staging_before_release = false' do
208
284
  let(:branches_in_last_known_good_staging) { ['another-branch'] }
209
285
  before do
210
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
286
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
211
287
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:enforce_staging_before_release?).and_return(false)
212
288
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
213
289
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
214
290
  Socialcast::Gitx::CLI.start ['release']
215
291
  end
216
- it 'should run expected commands' do
292
+ it do
217
293
  expect(stubbed_executed_commands).to eq([
218
294
  "git pull origin FOO",
219
295
  "git pull origin master",
@@ -235,9 +311,9 @@ describe Socialcast::Gitx::CLI do
235
311
 
236
312
  context 'with reserved_branches via config file' do
237
313
  before do
238
- stub_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
314
+ expect_message "#worklog releasing FOO to master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
239
315
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
240
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'reserved_branches' => ['dont-del-me','dont-del-me-2'] })
316
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('reserved_branches' => ['dont-del-me', 'dont-del-me-2'])
241
317
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
242
318
  Socialcast::Gitx::CLI.start ['release']
243
319
  end
@@ -248,19 +324,16 @@ describe Socialcast::Gitx::CLI do
248
324
  end
249
325
 
250
326
  context 'with alternative base branch via config file' do
251
- before do
252
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
327
+ it do
328
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
253
329
 
254
330
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
255
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'base_branch' => 'special-master' })
331
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('base_branch' => 'special-master')
256
332
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
257
333
  Socialcast::Gitx::CLI.start ['release']
258
- end
259
- it 'should post message to socialcast' do end # see expectations
260
- it "treats the alternative base branch as reserved" do
334
+
261
335
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
262
- end
263
- it 'should run expected commands' do
336
+
264
337
  expect(stubbed_executed_commands).to eq([
265
338
  "git branch -D last_known_good_staging",
266
339
  "git fetch origin",
@@ -285,7 +358,7 @@ describe Socialcast::Gitx::CLI do
285
358
 
286
359
  context 'with alternative base branch via environment variable' do
287
360
  before do
288
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
361
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
289
362
 
290
363
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
291
364
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({})
@@ -296,11 +369,9 @@ describe Socialcast::Gitx::CLI do
296
369
  after do
297
370
  ENV.delete('BASE_BRANCH')
298
371
  end
299
- it "treats the alternative base branch as reserved" do
372
+ it do
300
373
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
301
- end
302
- it 'should post message to socialcast' do end # see expectations
303
- it 'should run expected commands' do
374
+
304
375
  expect(stubbed_executed_commands).to eq([
305
376
  "git branch -D last_known_good_staging",
306
377
  "git fetch origin",
@@ -325,10 +396,10 @@ describe Socialcast::Gitx::CLI do
325
396
 
326
397
  context 'with alternative base branch via environment variable overriding base branch in config' do
327
398
  before do
328
- stub_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
399
+ expect_message "#worklog releasing FOO to special-master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
329
400
 
330
401
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:yes?).and_return(true)
331
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({ 'base_branch' => 'extra-special-master' })
402
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('base_branch' => 'extra-special-master')
332
403
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:cleanup)
333
404
  ENV['BASE_BRANCH'] = 'special-master'
334
405
  Socialcast::Gitx::CLI.start ['release']
@@ -339,9 +410,7 @@ describe Socialcast::Gitx::CLI do
339
410
  it "treats the alternative base branch as reserved" do
340
411
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'special-master'
341
412
  expect(Socialcast::Gitx::CLI.new.send(:reserved_branches)).to include 'extra-special-master'
342
- end
343
- it 'should post message to socialcast' do end # see expectations
344
- it 'should run expected commands' do
413
+
345
414
  expect(stubbed_executed_commands).to eq([
346
415
  "git branch -D last_known_good_staging",
347
416
  "git fetch origin",
@@ -410,10 +479,10 @@ describe Socialcast::Gitx::CLI do
410
479
  before { allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:branches).and_return([]) }
411
480
  context 'when target branch == staging and --destination == last_known_good_staging' do
412
481
  before do
413
- stub_message "#worklog resetting staging branch to last_known_good_staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
482
+ expect_message "#worklog resetting staging branch to last_known_good_staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
414
483
  Socialcast::Gitx::CLI.start ['nuke', 'staging', '--destination', 'last_known_good_staging']
415
484
  end
416
- it 'should run expected commands' do
485
+ it do
417
486
  expect(stubbed_executed_commands).to eq([
418
487
  "git checkout master",
419
488
  "git branch -D last_known_good_staging",
@@ -430,12 +499,12 @@ describe Socialcast::Gitx::CLI do
430
499
  end
431
500
  context 'when target branch == qa and destination prompt == nil and using custom aggregate_branches config' do
432
501
  before do
433
- stub_message "#worklog resetting qa branch to last_known_good_qa in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
434
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'aggregate_branches' => ['staging', 'qa'] })
502
+ expect_message "#worklog resetting qa branch to last_known_good_qa in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
503
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('aggregate_branches' => ['staging', 'qa'])
435
504
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('')
436
505
  Socialcast::Gitx::CLI.start ['nuke', 'qa']
437
506
  end
438
- it 'defaults to last_known_good_qa and should run expected commands' do
507
+ it 'defaults to last_known_good_qa' do
439
508
  expect(stubbed_executed_commands).to eq([
440
509
  "git checkout master",
441
510
  "git branch -D last_known_good_qa",
@@ -452,12 +521,12 @@ describe Socialcast::Gitx::CLI do
452
521
  end
453
522
  context 'when target branch == qa and destination prompt = master and using custom aggregate_branches config' do
454
523
  before do
455
- stub_message "#worklog resetting qa branch to last_known_good_master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
456
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return( { 'aggregate_branches' => ['staging', 'qa'] })
524
+ expect_message "#worklog resetting qa branch to last_known_good_master in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
525
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return('aggregate_branches' => ['staging', 'qa'])
457
526
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
458
527
  Socialcast::Gitx::CLI.start ['nuke', 'qa']
459
528
  end
460
- it 'should run expected commands' do
529
+ it do
461
530
  expect(stubbed_executed_commands).to eq([
462
531
  "git checkout master",
463
532
  "git branch -D last_known_good_master",
@@ -483,17 +552,17 @@ describe Socialcast::Gitx::CLI do
483
552
  end
484
553
  end
485
554
  it 'raises an error when target branch is not an aggregate branch' do
555
+ expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
486
556
  expect {
487
- expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:ask).and_return('master')
488
557
  Socialcast::Gitx::CLI.start ['nuke', 'asdfasdf']
489
558
  }.to raise_error(/Only aggregate branches are allowed to be reset/)
490
559
  end
491
560
  end
492
561
 
493
562
  describe '#backportpr' do
494
- before do
563
+ let(:pr_response) do
495
564
  # https://developer.github.com/v3/search/#search-issues
496
- pr_response = {
565
+ {
497
566
  "url" => "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59",
498
567
  "id" => 13712197,
499
568
  "html_url" => "https://github.com/socialcast/socialcast-git-extensions/pull/59",
@@ -792,8 +861,9 @@ describe Socialcast::Gitx::CLI do
792
861
  "deletions" => 2,
793
862
  "changed_files" => 2
794
863
  }
795
-
796
- commits_response = [
864
+ end
865
+ let(:commits_response) do
866
+ [
797
867
  {
798
868
  "sha" => "5e30d5af3f4d1bb3a34cc97568299be028b65f6f",
799
869
  "commit" => {
@@ -865,30 +935,87 @@ describe Socialcast::Gitx::CLI do
865
935
  ]
866
936
  }
867
937
  ]
938
+ end
939
+ let!(:github_pr_show) do
940
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59")
941
+ .to_return(:status => 200, :body => pr_response.to_json, :headers => {})
942
+ end
943
+ let!(:github_pr_commits_list) do
944
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59/commits")
945
+ .to_return(:status => 200, :body => commits_response.to_json, :headers => {})
946
+ end
947
+ let!(:github_pr_create) do
948
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
949
+ .with(:body => "{\"title\":\"backport_59_to_v1.x\",\"base\":\"v1.x\",\"head\":\"backport_59_to_v1.x\",\"body\":\"Backport #59 to https://github.com/socialcast/socialcast-git-extensions/tree/v1.x\\n***\\nsimply testing this out\"}")
950
+ .to_return(:status => 200, :body => '{"html_url": "https://github.com/socialcast/socialcast-git-extensions/pulls/60", "issue_url": "https://api.github.com/repos/repo/project/issues/60"}', :headers => { 'Content-Type' => 'application/json' })
951
+ end
952
+ let!(:github_pr_comment_create) do
953
+ stub_request(:post, "https://api.github.com/repos/repo/project/issues/60/comments")
954
+ .with(:body => "{\"body\":\"#reviewrequest backport /cc @SocialcastDevelopers #scgitx\"}")
955
+ .to_return(:status => 200, :body => "{}", :headers => {})
956
+ end
957
+ let!(:socialcast_message_create) do
958
+ stub_request(:post, "https://testuser:testpassword@testdomain/api/messages.json")
959
+ .with(:body => "{\"message\":{\"url\":\"https://github.com/socialcast/socialcast-git-extensions/pulls/60\",\"message_type\":\"review_request\",\"body\":\"#reviewrequest backport #59 to v1.x in socialcast/socialcast-git-extensions #scgitx\\n\\n/cc @SocialcastDevelopers\"}}")
960
+ .to_return(:status => 200, :body => "", :headers => {})
961
+ end
962
+ before do
963
+ expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:backportpr).and_call_original
964
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
965
+ end
966
+ context 'when use_pr_comments? is false' do
967
+ let(:use_pr_comments) { false }
968
+ it 'creates a branch based on v1.x and cherry-picks in PR 59' do
969
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
970
+ expect(github_pr_show).to have_been_requested
971
+ expect(github_pr_commits_list).to have_been_requested
972
+ expect(github_pr_create).to have_been_requested
868
973
 
869
- stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59").
870
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions' }).
871
- to_return(:status => 200, :body => pr_response.to_json, :headers => {})
872
- stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls/59/commits").
873
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions' }).
874
- to_return(:status => 200, :body => commits_response.to_json, :headers => {})
875
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
876
- with(:body => "{\"title\":\"backport_59_to_v1.x\",\"base\":\"v1.x\",\"head\":\"backport_59_to_v1.x\",\"body\":\"Backport #59 to https://github.com/socialcast/socialcast-git-extensions/tree/v1.x\\n***\\nsimply testing this out\"}",
877
- :headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent'=>'socialcast-git-extensions' }).
878
- to_return(:status => 200, :body => '{"html_url": "https://github.com/socialcast/socialcast-git-extensions/pulls/60"}', :headers => { 'Content-Type' => 'application/json' })
974
+ expect(github_pr_comment_create).to_not have_been_requested
975
+ expect(socialcast_message_create).to have_been_requested
976
+ end
977
+ end
978
+ context 'when use_pr_comments? is true' do
979
+ let(:use_pr_comments) { true }
980
+ it 'posts a pr comment instead of posting a socialcast message' do
981
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
982
+ expect(github_pr_show).to have_been_requested
983
+ expect(github_pr_commits_list).to have_been_requested
984
+ expect(github_pr_create).to have_been_requested
879
985
 
880
- stub_message "#reviewrequest backport #59 to v1.x in socialcast/socialcast-git-extensions #scgitx\n\n/cc @SocialcastDevelopers", :url => 'https://github.com/socialcast/socialcast-git-extensions/pulls/60', :message_type => 'review_request'
986
+ expect(github_pr_comment_create).to have_been_requested
987
+ expect(socialcast_message_create).to_not have_been_requested
988
+ end
989
+ end
990
+ context 'when a backport reviewer is configured' do
991
+ before do
992
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_track_reviewer).with('Backport').and_return('janedoe')
993
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_track_reviewer).with('Backport').and_return('JaneDoe')
994
+ end
995
+ let(:use_pr_comments) { true }
996
+ let!(:github_pr_comment_create) do
997
+ stub_request(:post, "https://api.github.com/repos/repo/project/issues/60/comments")
998
+ .with(:body => "{\"body\":\"#reviewrequest backport @JaneDoe /cc @SocialcastDevelopers #scgitx\"}")
999
+ .to_return(:status => 200, :body => "{}", :headers => {})
1000
+ end
1001
+ let!(:github_assign_pr) { stub_request(:patch, "https://api.github.com/repos/repo/project/issues/60").to_return(:status => 200) }
1002
+ it 'mentions the track reviewer' do
1003
+ Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
1004
+ expect(github_pr_show).to have_been_requested
1005
+ expect(github_pr_commits_list).to have_been_requested
1006
+ expect(github_pr_create).to have_been_requested
1007
+ expect(github_assign_pr).to have_been_requested
881
1008
 
882
- expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:backportpr).and_call_original
883
- Socialcast::Gitx::CLI.start ['backportpr', '59', 'v1.x']
1009
+ expect(github_pr_comment_create).to have_been_requested
1010
+ expect(socialcast_message_create).to_not have_been_requested
1011
+ end
884
1012
  end
885
- it 'creates a branch based on v1.x and cherry-picks in PR 59' do end
886
1013
  end
887
1014
 
888
1015
  describe '#findpr' do
889
- before do
1016
+ let(:issue_response) do
890
1017
  # https://developer.github.com/v3/search/#search-issues
891
- stub_response = {
1018
+ {
892
1019
  "total_count"=> 280,
893
1020
  "items"=> [{
894
1021
  "url" => "https://api.github.com/repos/batterseapower/pinyin-toolkit/issues/132",
@@ -938,98 +1065,300 @@ describe Socialcast::Gitx::CLI do
938
1065
  "score" => 1.3859273
939
1066
  }]
940
1067
  }
941
-
942
- stub_request(:get, "https://api.github.com/search/issues?q=abc123%20type:pr%20repo:socialcast/socialcast-git-extensions").
943
- with(:headers => { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip, deflate', 'Authorization' => /token\s\w+/, 'Content-Type' => 'application/json', 'User-Agent' => 'socialcast-git-extensions'}).
944
- to_return(:status => 200, :body => stub_response.to_json, :headers => {})
1068
+ end
1069
+ let!(:github_issue_search) do
1070
+ stub_request(:get, "https://api.github.com/search/issues?q=abc123%20type:pr%20repo:socialcast/socialcast-git-extensions")
1071
+ .to_return(:status => 200, :body => issue_response.to_json, :headers => {})
1072
+ end
1073
+ it do
945
1074
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:findpr).and_call_original
946
1075
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:say).with("Searching github pull requests for abc123")
947
1076
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:say).with("\nhttps://github.com/batterseapower/pinyin-toolkit/issues/132\n\tLine Number Indexes Beyond 20 Not Displayed\n\tNick3C 2009-07-12T20:10:41Z")
948
1077
  Socialcast::Gitx::CLI.start ['findpr', 'abc123']
1078
+ expect(github_issue_search).to have_been_requested
949
1079
  end
950
- it 'fetches the data from github and prints it out' do end
951
1080
  end
952
1081
 
953
1082
  describe '#reviewrequest' do
1083
+ let!(:github_create_pr) do
1084
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
1085
+ .to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1"}), :headers => {})
1086
+ end
1087
+ let!(:github_find_pr_for_branch) do
1088
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1089
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]), :headers => {})
1090
+ end
1091
+ let(:stub_github_create_pr_comment) do
1092
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
1093
+ .with(:body => pr_comment_body)
1094
+ .to_return(:status => 200, :body => "{}", :headers => {})
1095
+ end
1096
+ let(:use_pr_comments) { false }
1097
+ before do
1098
+ stub_github_create_pr_comment
1099
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
1100
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1101
+ end
954
1102
  context 'when there are no review_buddies specified' do
955
1103
  before do
956
1104
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config_file).and_return(Pathname(''))
957
1105
  end
958
- context 'when description != nil' do
959
- before do
960
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
961
- to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1"}), :headers => {})
962
-
963
- stub_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
964
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1106
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest \\n/cc @SocialcastDevelopers #scgitx\"}" }
1107
+ context 'when use_pr_comments? is false' do
1108
+ it do
1109
+ expect_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
965
1110
  Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1111
+
1112
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1113
+ expect(github_create_pr).to have_been_requested
1114
+ expect(github_find_pr_for_branch).to have_been_requested
1115
+
1116
+ expect(stub_github_create_pr_comment).to_not have_been_requested
966
1117
  end
967
- it 'should create github pull request' do end # see expectations
968
- it 'should post socialcast message' do end # see expectations
969
- it 'should run expected commands' do
970
- expect(stubbed_executed_commands).to eq([
971
- "git pull origin FOO",
972
- "git pull origin master",
973
- "git push origin HEAD"
974
- ])
1118
+ end
1119
+ context 'when use_pr_comments? is true' do
1120
+ let(:use_pr_comments) { true }
1121
+ it do
1122
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1123
+
1124
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1125
+ expect(github_create_pr).to have_been_requested
1126
+ expect(github_find_pr_for_branch).to have_been_requested
1127
+
1128
+ expect(stub_github_create_pr_comment).to have_been_requested
975
1129
  end
976
1130
  end
977
1131
  end
978
1132
 
979
1133
  context 'when review_buddies are specified via a /config YML file' do
1134
+ let!(:github_assign_pr) { stub_request(:patch, "http://api.github.com/repos/repo/project/issues/1").to_return(:status => 200) }
980
1135
  before do
981
- stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls").
982
- to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://github.com/repos/repo/project/issues/1"}), :headers => {})
983
- stub_request(:patch, "http://github.com/repos/repo/project/issues/1").to_return(:status => 200)
984
1136
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_review_buddy).and_return('JaneDoe')
985
- end
1137
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_review_buddy).and_return('janedoe')
1138
+ end
986
1139
  context 'and additional reviewers are specified' do
987
1140
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\nAssigned additionally to @JohnSmith for API review\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
988
- before do
989
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
990
- stub_message message_body, :message_type => 'review_request'
991
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1141
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\nAssigned additionally to @JohnSmith for API review \\n/cc @SocialcastDevelopers #scgitx\"}" }
1142
+ context 'when use_pr_comments? is false' do
1143
+ it do
1144
+ expect_message message_body, :message_type => 'review_request'
1145
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1146
+
1147
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1148
+ expect(github_create_pr).to have_been_requested
1149
+ expect(github_assign_pr).to have_been_requested
1150
+
1151
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1152
+ end
992
1153
  end
993
- it 'should create github pull request' do end # see expectations
994
- it 'should post socialcast message' do end # see expectations
995
- it 'should run expected commands' do
996
- expect(stubbed_executed_commands).to eq([
997
- "git pull origin FOO",
998
- "git pull origin master",
999
- "git push origin HEAD"
1000
- ])
1154
+ context 'when use_pr_comments? is true' do
1155
+ let(:use_pr_comments) { true }
1156
+ it do
1157
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-a', 'a']
1158
+
1159
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1160
+ expect(github_create_pr).to have_been_requested
1161
+ expect(github_assign_pr).to have_been_requested
1162
+
1163
+ expect(stub_github_create_pr_comment).to have_been_requested
1164
+ end
1001
1165
  end
1002
1166
  end
1003
1167
  context 'and a developer group is specified' do
1004
1168
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @#{another_group} #scgitx\n\n1 file changed" }
1169
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @#{another_group} #scgitx\"}" }
1005
1170
  let(:another_group) { 'AnotherDeveloperGroup' }
1006
1171
  before do
1007
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1008
1172
  allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({'developer_group' => another_group})
1009
- stub_message message_body, :message_type => 'review_request'
1010
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1011
1173
  end
1012
- it 'should create github pull request with a different group mentioned' do end # see expectations
1174
+ context 'when use_pr_comments? is false' do
1175
+ it do
1176
+ expect_message message_body, :message_type => 'review_request'
1177
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1178
+ expect(github_create_pr).to have_been_requested
1179
+ expect(github_assign_pr).to have_been_requested
1180
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1181
+ end
1182
+ end
1183
+ context 'when use_pr_comments? is true' do
1184
+ let(:use_pr_comments) { true }
1185
+ it do
1186
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1187
+ expect(github_create_pr).to have_been_requested
1188
+ expect(github_assign_pr).to have_been_requested
1189
+ expect(stub_github_create_pr_comment).to have_been_requested
1190
+ end
1191
+ end
1013
1192
  end
1014
1193
  context 'and additional reviewers are not specified' do
1015
1194
  let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1195
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @SocialcastDevelopers #scgitx\"}" }
1196
+ context 'when use_pr_comments? is false' do
1197
+ it do
1198
+ expect_message message_body, :message_type => 'review_request'
1199
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1200
+ expect(github_create_pr).to have_been_requested
1201
+ expect(github_assign_pr).to have_been_requested
1202
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1203
+ end
1204
+ end
1205
+ context 'when use_pr_comments? is true' do
1206
+ let(:use_pr_comments) { true }
1207
+ it do
1208
+ Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1209
+ expect(github_create_pr).to have_been_requested
1210
+ expect(github_assign_pr).to have_been_requested
1211
+ expect(stub_github_create_pr_comment).to have_been_requested
1212
+ end
1213
+ end
1214
+ end
1215
+ end
1216
+ end
1217
+
1218
+ describe '#createpr' do
1219
+ let!(:github_pr_create) do
1220
+ stub_request(:post, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls")
1221
+ .to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1"}), :headers => {})
1222
+ end
1223
+ it do
1224
+ Socialcast::Gitx::CLI.start ['createpr', '--description', 'testing']
1225
+
1226
+ expect(stubbed_executed_commands).to eq git_update_commands
1227
+ expect(github_pr_create).to have_been_requested
1228
+ end
1229
+ end
1230
+
1231
+ describe '#assignpr' do
1232
+ let!(:github_find_pr_for_branch) do
1233
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1234
+ .to_return(:status => 200, :body => %q([{"html_url": "http://github.com/repo/project/pulls/1", "issue_url": "http://api.github.com/repos/repo/project/issues/1", "body":"testing"}]), :headers => {})
1235
+ end
1236
+ let(:stub_github_create_pr_comment) do
1237
+ stub_request(:post, "http://api.github.com/repos/repo/project/issues/1/comments")
1238
+ .with(:body => pr_comment_body)
1239
+ .to_return(:status => 200, :body => "{}", :headers => {})
1240
+ end
1241
+ let(:use_pr_comments) { false }
1242
+ before do
1243
+ stub_github_create_pr_comment
1244
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:use_pr_comments?).and_return(use_pr_comments)
1245
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1246
+ end
1247
+ context 'when there are no review_buddies specified' do
1248
+ before do
1249
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config_file).and_return(Pathname(''))
1250
+ end
1251
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest \\n/cc @SocialcastDevelopers #scgitx\"}" }
1252
+ context 'when use_pr_comments? is false' do
1253
+ it do
1254
+ expect_message "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 \n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed", :message_type => 'review_request'
1255
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1256
+
1257
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1258
+ expect(github_find_pr_for_branch).to have_been_requested
1259
+
1260
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1261
+ end
1262
+ end
1263
+ context 'when use_pr_comments? is true' do
1264
+ let(:use_pr_comments) { true }
1265
+ it do
1266
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1267
+
1268
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1269
+ expect(github_find_pr_for_branch).to have_been_requested
1270
+
1271
+ expect(stub_github_create_pr_comment).to have_been_requested
1272
+ end
1273
+ end
1274
+ end
1275
+
1276
+ context 'when review_buddies are specified via a /config YML file' do
1277
+ let!(:github_assign_pr) { stub_request(:patch, "http://api.github.com/repos/repo/project/issues/1").to_return(:status => 200) }
1278
+ before do
1279
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:socialcast_review_buddy).and_return('JaneDoe')
1280
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:github_review_buddy).and_return('janedoe')
1281
+ end
1282
+ context 'and additional reviewers are specified' do
1283
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\nAssigned additionally to @JohnSmith for API review\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1284
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\nAssigned additionally to @JohnSmith for API review \\n/cc @SocialcastDevelopers #scgitx\"}" }
1285
+ context 'when use_pr_comments? is false' do
1286
+ it do
1287
+ expect_message message_body, :message_type => 'review_request'
1288
+ Socialcast::Gitx::CLI.start ['assignpr', '-a', 'a']
1289
+
1290
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1291
+ expect(github_assign_pr).to have_been_requested
1292
+
1293
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1294
+ end
1295
+ end
1296
+ context 'when use_pr_comments? is true' do
1297
+ let(:use_pr_comments) { true }
1298
+ it do
1299
+ Socialcast::Gitx::CLI.start ['assignpr', '-a', 'a']
1300
+
1301
+ expect(stubbed_executed_commands).to eq(git_update_commands)
1302
+ expect(github_assign_pr).to have_been_requested
1303
+
1304
+ expect(stub_github_create_pr_comment).to have_been_requested
1305
+ end
1306
+ end
1307
+ end
1308
+ context 'and a developer group is specified' do
1309
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @#{another_group} #scgitx\n\n1 file changed" }
1310
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @#{another_group} #scgitx\"}" }
1311
+ let(:another_group) { 'AnotherDeveloperGroup' }
1016
1312
  before do
1017
- allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:changelog_summary).and_return('1 file changed')
1018
- stub_message message_body, :message_type => 'review_request'
1019
- Socialcast::Gitx::CLI.start ['reviewrequest', '--description', 'testing', '-s']
1313
+ allow_any_instance_of(Socialcast::Gitx::CLI).to receive(:config).and_return({'developer_group' => another_group})
1314
+ end
1315
+ context 'when use_pr_comments? is false' do
1316
+ it do
1317
+ expect_message message_body, :message_type => 'review_request'
1318
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1319
+ expect(github_assign_pr).to have_been_requested
1320
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1321
+ end
1322
+ end
1323
+ context 'when use_pr_comments? is true' do
1324
+ let(:use_pr_comments) { true }
1325
+ it do
1326
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1327
+ expect(github_assign_pr).to have_been_requested
1328
+ expect(stub_github_create_pr_comment).to have_been_requested
1329
+ end
1330
+ end
1331
+ end
1332
+ context 'and additional reviewers are not specified' do
1333
+ let(:message_body) { "#reviewrequest for FOO in socialcast/socialcast-git-extensions\nPR http://github.com/repo/project/pulls/1 assigned to @JaneDoe\n\ntesting\n\n/cc @SocialcastDevelopers #scgitx\n\n1 file changed" }
1334
+ let(:pr_comment_body) { "{\"body\":\"#reviewrequest assigned to @JaneDoe \\n/cc @SocialcastDevelopers #scgitx\"}" }
1335
+ context 'when use_pr_comments? is false' do
1336
+ it do
1337
+ expect_message message_body, :message_type => 'review_request'
1338
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1339
+ expect(github_assign_pr).to have_been_requested
1340
+ expect(stub_github_create_pr_comment).to_not have_been_requested
1341
+ end
1342
+ end
1343
+ context 'when use_pr_comments? is true' do
1344
+ let(:use_pr_comments) { true }
1345
+ it do
1346
+ Socialcast::Gitx::CLI.start ['assignpr', '-s']
1347
+ expect(github_assign_pr).to have_been_requested
1348
+ expect(stub_github_create_pr_comment).to have_been_requested
1349
+ end
1020
1350
  end
1021
- it 'should create github pull request' do end # see expectations
1022
1351
  end
1023
1352
  end
1024
1353
  end
1025
1354
 
1026
1355
  describe '#promote' do
1027
1356
  before do
1028
- stub_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
1029
- Socialcast::Gitx::CLI.start ['promote']
1357
+ stub_request(:get, "https://api.github.com/repos/socialcast/socialcast-git-extensions/pulls?head=socialcast:FOO")
1358
+ .to_return(:status => 200, :body => "[]", :headers => {})
1030
1359
  end
1031
- it 'should integrate into staging' do
1032
- expect(stubbed_executed_commands).to eq([
1360
+ let(:staging_integration_commands) do
1361
+ [
1033
1362
  "git pull origin FOO",
1034
1363
  "git pull origin master",
1035
1364
  "git push origin HEAD",
@@ -1046,7 +1375,12 @@ describe Socialcast::Gitx::CLI do
1046
1375
  "git push origin HEAD",
1047
1376
  "git checkout staging",
1048
1377
  "git checkout FOO"
1049
- ])
1378
+ ]
1379
+ end
1380
+ it do
1381
+ expect_message "#worklog integrating FOO into staging in socialcast/socialcast-git-extensions #scgitx\n/cc @SocialcastDevelopers"
1382
+ Socialcast::Gitx::CLI.start ['promote']
1383
+ expect(stubbed_executed_commands).to eq staging_integration_commands
1050
1384
  end
1051
1385
  end
1052
1386
 
@@ -1056,7 +1390,7 @@ describe Socialcast::Gitx::CLI do
1056
1390
  expect_any_instance_of(Socialcast::Gitx::CLI).to receive(:branches).with(:merged => true).and_return(['staging', 'bazquux', 'last_known_good_prototype'])
1057
1391
  Socialcast::Gitx::CLI.start ['cleanup']
1058
1392
  end
1059
- it 'should only cleanup non-reserved branches' do
1393
+ it 'only cleans up non-reserved branches' do
1060
1394
  expect(stubbed_executed_commands).to eq([
1061
1395
  "git checkout master",
1062
1396
  "git pull",