git_reflow 0.8.9 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/workflows/multi-ruby-tests.yml +33 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -0
- data/Appraisals +1 -6
- data/CHANGELOG.md +466 -348
- data/Gemfile.lock +99 -72
- data/LICENSE +20 -20
- data/README.md +481 -0
- data/Rakefile +15 -8
- data/Workflow +3 -0
- data/_config.yml +1 -0
- data/bin/console +7 -7
- data/bin/setup +6 -6
- data/exe/git-reflow +20 -36
- data/git_reflow.gemspec +26 -30
- data/lib/git_reflow.rb +3 -15
- data/lib/git_reflow/config.rb +48 -13
- data/lib/git_reflow/git_helpers.rb +69 -22
- data/lib/git_reflow/git_server.rb +63 -63
- data/lib/git_reflow/git_server/base.rb +68 -68
- data/lib/git_reflow/git_server/bit_bucket.rb +101 -101
- data/lib/git_reflow/git_server/bit_bucket/pull_request.rb +84 -84
- data/lib/git_reflow/git_server/git_hub.rb +53 -41
- data/lib/git_reflow/git_server/git_hub/pull_request.rb +16 -14
- data/lib/git_reflow/git_server/pull_request.rb +4 -2
- data/lib/git_reflow/merge_error.rb +9 -9
- data/lib/git_reflow/rspec.rb +3 -2
- data/lib/git_reflow/rspec/command_line_helpers.rb +23 -6
- data/lib/git_reflow/rspec/stub_helpers.rb +13 -13
- data/lib/git_reflow/rspec/workflow_helpers.rb +18 -0
- data/lib/git_reflow/sandbox.rb +16 -6
- data/lib/git_reflow/version.rb +1 -1
- data/lib/git_reflow/workflow.rb +304 -9
- data/lib/git_reflow/workflows/FlatMergeWorkflow +38 -0
- data/lib/git_reflow/workflows/core.rb +364 -238
- data/spec/fixtures/authentication_failure.json +3 -0
- data/spec/fixtures/awesome_workflow.rb +3 -7
- data/spec/fixtures/git/git_config +7 -7
- data/spec/fixtures/issues/comment.json.erb +27 -27
- data/spec/fixtures/issues/comments.json +29 -29
- data/spec/fixtures/issues/comments.json.erb +15 -15
- data/spec/fixtures/pull_requests/comment.json.erb +45 -45
- data/spec/fixtures/pull_requests/comments.json +47 -47
- data/spec/fixtures/pull_requests/comments.json.erb +15 -15
- data/spec/fixtures/pull_requests/commits.json +29 -29
- data/spec/fixtures/pull_requests/external_pull_request.json +145 -145
- data/spec/fixtures/pull_requests/pull_request.json +142 -142
- data/spec/fixtures/pull_requests/pull_request.json.erb +142 -142
- data/spec/fixtures/pull_requests/pull_request_branch_nonexistent_error.json +32 -0
- data/spec/fixtures/pull_requests/pull_request_exists_error.json +32 -32
- data/spec/fixtures/pull_requests/pull_requests.json +136 -136
- data/spec/fixtures/repositories/commit.json +53 -53
- data/spec/fixtures/repositories/commit.json.erb +53 -53
- data/spec/fixtures/repositories/commits.json.erb +13 -13
- data/spec/fixtures/repositories/statuses.json +31 -31
- data/spec/fixtures/users/user.json +32 -0
- data/spec/lib/git_reflow/git_helpers_spec.rb +115 -12
- data/spec/lib/git_reflow/git_server/bit_bucket_spec.rb +81 -81
- data/spec/lib/git_reflow/git_server/git_hub/pull_request_spec.rb +10 -10
- data/spec/lib/git_reflow/git_server/git_hub_spec.rb +77 -3
- data/spec/lib/git_reflow/git_server/pull_request_spec.rb +9 -3
- data/spec/lib/git_reflow/git_server_spec.rb +101 -101
- data/spec/lib/git_reflow/sandbox_spec.rb +1 -1
- data/spec/lib/git_reflow/workflow_spec.rb +304 -59
- data/spec/lib/git_reflow/workflows/core_spec.rb +225 -67
- data/spec/lib/git_reflow/workflows/flat_merge_spec.rb +71 -59
- data/spec/lib/git_reflow_spec.rb +2 -25
- data/spec/spec_helper.rb +3 -0
- data/spec/support/fixtures.rb +54 -54
- data/spec/support/github_helpers.rb +99 -109
- data/spec/support/mock_pull_request.rb +17 -17
- data/spec/support/web_mocks.rb +39 -39
- metadata +51 -74
- data/README.rdoc +0 -461
- data/circle.yml +0 -26
- data/lib/git_reflow/commands/deliver.rb +0 -10
- data/lib/git_reflow/commands/refresh.rb +0 -20
- data/lib/git_reflow/commands/review.rb +0 -13
- data/lib/git_reflow/commands/setup.rb +0 -11
- data/lib/git_reflow/commands/stage.rb +0 -9
- data/lib/git_reflow/commands/start.rb +0 -18
- data/lib/git_reflow/commands/status.rb +0 -7
- data/lib/git_reflow/os_detector.rb +0 -23
- data/lib/git_reflow/workflows/flat_merge.rb +0 -10
- data/spec/fixtures/workflow_with_super.rb +0 -8
@@ -9,7 +9,7 @@ RSpec.describe GitReflow::Sandbox do
|
|
9
9
|
|
10
10
|
it "when blocking is flagged off, the command exits silently" do
|
11
11
|
allow(GitReflow::Sandbox).to receive(:run).and_call_original
|
12
|
-
expect { GitReflow::Sandbox.run("ls wtf", blocking: false) }.to_not raise_error
|
12
|
+
expect { GitReflow::Sandbox.run("ls wtf", blocking: false) }.to_not raise_error
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,59 +1,304 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe GitReflow::Workflow do
|
4
|
-
|
5
|
-
class DummyWorkflow
|
6
|
-
include GitReflow::Workflow
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
expect(
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitReflow::Workflow do
|
4
|
+
|
5
|
+
class DummyWorkflow
|
6
|
+
include GitReflow::Workflow
|
7
|
+
end
|
8
|
+
|
9
|
+
class DummyBundler
|
10
|
+
def gemfile(&block)
|
11
|
+
instance_eval &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def source(name); end
|
15
|
+
def gem(name, *args); end
|
16
|
+
end
|
17
|
+
|
18
|
+
class DummyGemifiedWorkflow
|
19
|
+
include GitReflow::Workflow
|
20
|
+
|
21
|
+
command :whirl do
|
22
|
+
puts "whirl"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:workflow) { DummyWorkflow }
|
27
|
+
let(:loader) { double() }
|
28
|
+
|
29
|
+
describe ".current" do
|
30
|
+
subject { GitReflow::Workflow.current }
|
31
|
+
|
32
|
+
before do
|
33
|
+
allow(GitReflow::Workflows::Core).to receive(:load_raw_workflow)
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when no workflow is set" do
|
37
|
+
before { allow(GitReflow::Config).to receive(:get).with("reflow.workflow").and_return('') }
|
38
|
+
specify { expect( subject ).to eql(GitReflow::Workflows::Core) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when a global workflow is set" do
|
42
|
+
let(:workflow_path) { File.join(File.expand_path("../../../fixtures", __FILE__), "/awesome_workflow.rb") }
|
43
|
+
|
44
|
+
before { allow(GitReflow::Config).to receive(:get).with("reflow.workflow").and_return(workflow_path) }
|
45
|
+
specify { expect( subject ).to eql(GitReflow::Workflows::Core) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when a local workflow is set" do
|
49
|
+
let(:workflow_content) do
|
50
|
+
<<~WORKFLOW_CONTENT
|
51
|
+
command :dummy do
|
52
|
+
GitReflow.say "derp"
|
53
|
+
end
|
54
|
+
WORKFLOW_CONTENT
|
55
|
+
end
|
56
|
+
|
57
|
+
before do
|
58
|
+
allow(File).to receive(:exists?).with("#{GitReflow.git_root_dir}/Workflow").and_return(true)
|
59
|
+
allow(File).to receive(:read).with("#{GitReflow.git_root_dir}/Workflow").and_return(workflow_content)
|
60
|
+
expect(GitReflow::Workflows::Core).to receive(:load_raw_workflow).with(workflow_content).and_call_original
|
61
|
+
end
|
62
|
+
|
63
|
+
specify { expect( subject ).to respond_to(:dummy) }
|
64
|
+
specify { expect( subject ).to eql(GitReflow::Workflows::Core) }
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when both a local and a global workflow are set" do
|
68
|
+
let(:workflow_path) { File.join(File.expand_path("../../../fixtures", __FILE__), "/awesome_workflow.rb") }
|
69
|
+
let(:workflow_content) do
|
70
|
+
<<~WORKFLOW_CONTENT
|
71
|
+
command :dummy do
|
72
|
+
GitReflow.say "derp"
|
73
|
+
end
|
74
|
+
WORKFLOW_CONTENT
|
75
|
+
end
|
76
|
+
|
77
|
+
before do
|
78
|
+
allow(File).to receive(:exists?).with("#{GitReflow.git_root_dir}/Workflow").and_return(true)
|
79
|
+
allow(File).to receive(:read).with("#{GitReflow.git_root_dir}/Workflow").and_return(workflow_content)
|
80
|
+
allow(GitReflow::Config).to receive(:get).with("reflow.workflow").and_return(workflow_path)
|
81
|
+
allow(GitReflow::Workflows::Core).to receive(:load_raw_workflow).and_call_original
|
82
|
+
end
|
83
|
+
|
84
|
+
specify { expect(subject).to respond_to(:dummy) }
|
85
|
+
specify { expect(subject).to eql(GitReflow::Workflows::Core) }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe ".before" do
|
90
|
+
it "executes the block before the command" do
|
91
|
+
GitReflow::Workflows::Core.load_raw_workflow <<~WORKFLOW_CONTENT
|
92
|
+
command :yips do
|
93
|
+
puts "Yips."
|
94
|
+
end
|
95
|
+
|
96
|
+
before :yips do
|
97
|
+
puts "Would you like a donut?"
|
98
|
+
end
|
99
|
+
WORKFLOW_CONTENT
|
100
|
+
|
101
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_return(true)
|
102
|
+
|
103
|
+
expect { GitReflow.workflow.yips }.to have_output "Would you like a donut?\nYips."
|
104
|
+
end
|
105
|
+
|
106
|
+
it "executes blocks sequentially by order of appearance" do
|
107
|
+
GitReflow::Workflows::Core.load_raw_workflow <<~WORKFLOW_CONTENT
|
108
|
+
command :yips do
|
109
|
+
puts "Yips."
|
110
|
+
end
|
111
|
+
|
112
|
+
before :yips do
|
113
|
+
puts "Cupcake?"
|
114
|
+
end
|
115
|
+
|
116
|
+
before :yips do
|
117
|
+
puts "Would you like a donut?"
|
118
|
+
end
|
119
|
+
WORKFLOW_CONTENT
|
120
|
+
|
121
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_return(true)
|
122
|
+
|
123
|
+
expect { GitReflow.workflow.yips }.to have_output "Cupcake?\nWould you like a donut?\nYips."
|
124
|
+
end
|
125
|
+
|
126
|
+
it "proxies any arguments returned to the command" do
|
127
|
+
GitReflow::Workflows::Core.load_raw_workflow <<~WORKFLOW_CONTENT
|
128
|
+
command :yips, arguments: { spiced: false } do |**params|
|
129
|
+
puts params[:spiced] ? "Too spicy." : "Yips."
|
130
|
+
end
|
131
|
+
|
132
|
+
before :yips do
|
133
|
+
puts "Wasabe?"
|
134
|
+
{ spiced: true }
|
135
|
+
end
|
136
|
+
WORKFLOW_CONTENT
|
137
|
+
|
138
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_return(true)
|
139
|
+
|
140
|
+
expect { GitReflow.workflow.yips }.to have_output "Wasabe?\nToo spicy."
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe ".after" do
|
145
|
+
it "executes the block after the command" do
|
146
|
+
GitReflow::Workflows::Core.load_raw_workflow <<~WORKFLOW_CONTENT
|
147
|
+
command :vroom do
|
148
|
+
puts "Vroom"
|
149
|
+
end
|
150
|
+
|
151
|
+
after :vroom do
|
152
|
+
puts "VROOOOM"
|
153
|
+
end
|
154
|
+
WORKFLOW_CONTENT
|
155
|
+
|
156
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_return(true)
|
157
|
+
|
158
|
+
expect { GitReflow.workflow.vroom }.to have_output "Vroom\nVROOOOM"
|
159
|
+
end
|
160
|
+
|
161
|
+
it "executes blocks sequentially by order of appearance" do
|
162
|
+
GitReflow::Workflows::Core.load_raw_workflow <<~WORKFLOW_CONTENT
|
163
|
+
command :vroom do
|
164
|
+
puts "Vroom"
|
165
|
+
end
|
166
|
+
|
167
|
+
after :vroom do
|
168
|
+
puts "Vrooom"
|
169
|
+
end
|
170
|
+
|
171
|
+
after :vroom do
|
172
|
+
puts "VROOOOM"
|
173
|
+
end
|
174
|
+
WORKFLOW_CONTENT
|
175
|
+
|
176
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_return(true)
|
177
|
+
|
178
|
+
expect { GitReflow.workflow.vroom }.to have_output "Vroom\nVrooom\nVROOOOM"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe ".command" do
|
183
|
+
it "creates a class method for a bogus command" do
|
184
|
+
workflow.command :bogus do
|
185
|
+
GitReflow.say "Woohoo"
|
186
|
+
end
|
187
|
+
|
188
|
+
expect { DummyWorkflow.bogus }.to have_said("Woohoo")
|
189
|
+
end
|
190
|
+
|
191
|
+
it "creates a method for a bogus command with arguments" do
|
192
|
+
workflow.command :bogus, arguments: { feature_branch: nil } do |**params|
|
193
|
+
GitReflow.say "Woohoo #{params[:feature_branch]}!"
|
194
|
+
end
|
195
|
+
|
196
|
+
expect { DummyWorkflow.bogus(feature_branch: "arguments") }.to have_said("Woohoo arguments!")
|
197
|
+
end
|
198
|
+
|
199
|
+
it "creates a class method for a bogus command with default arguments" do
|
200
|
+
workflow.command :bogus, arguments: { feature_branch: nil, decoration: "sprinkles" } do |**params|
|
201
|
+
donut_excitement = "Woohoo #{params[:feature_branch]}"
|
202
|
+
donut_excitement += " with #{params[:decoration]}" if params[:decoration]
|
203
|
+
GitReflow.say "#{donut_excitement}!"
|
204
|
+
end
|
205
|
+
|
206
|
+
expect { DummyWorkflow.bogus(feature_branch: "donuts") }.to have_said("Woohoo donuts with sprinkles!")
|
207
|
+
end
|
208
|
+
|
209
|
+
it "creates a class method for a bogus command with flags" do
|
210
|
+
workflow.command :bogus, flags: { feature_branch: nil } do |**params|
|
211
|
+
GitReflow.say "Woohoo #{params[:feature_branch]}!"
|
212
|
+
end
|
213
|
+
|
214
|
+
expect { DummyWorkflow.bogus(feature_branch: "flags") }.to have_said("Woohoo flags!")
|
215
|
+
end
|
216
|
+
|
217
|
+
it "creates a class method for a bogus command with default flags" do
|
218
|
+
workflow.command :bogus, flags: { feature_branch: "donuts" } do |**params|
|
219
|
+
GitReflow.say "Woohoo #{params[:feature_branch]}!"
|
220
|
+
end
|
221
|
+
|
222
|
+
expect { DummyWorkflow.bogus }.to have_said("Woohoo donuts!")
|
223
|
+
end
|
224
|
+
|
225
|
+
it "creates a class method for a bogus command with switches" do
|
226
|
+
workflow.command :bogus, switches: { feature_branch: nil } do |**params|
|
227
|
+
GitReflow.say "Woohoo #{params[:feature_branch]}!"
|
228
|
+
end
|
229
|
+
|
230
|
+
expect { DummyWorkflow.bogus(feature_branch: "switches") }.to have_said("Woohoo switches!")
|
231
|
+
end
|
232
|
+
|
233
|
+
it "creates a class method for a bogus command with default switches" do
|
234
|
+
workflow.command :bogus, switches: { feature_branch: "donuts" } do |**params|
|
235
|
+
GitReflow.say "Woohoo #{params[:feature_branch]}!"
|
236
|
+
end
|
237
|
+
|
238
|
+
expect { DummyWorkflow.bogus }.to have_said("Woohoo donuts!")
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe ".use(workflow_name)" do
|
243
|
+
it "Uses a pre-existing workflow as a basis" do
|
244
|
+
allow(GitReflow::Workflows::Core).to receive(:load_workflow)
|
245
|
+
expect(GitReflow::Workflows::Core).to receive(:load_workflow)
|
246
|
+
.with(workflow.workflows["FlatMergeWorkflow"])
|
247
|
+
.and_return(true)
|
248
|
+
workflow.use "FlatMergeWorkflow"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
describe ".use_gem(name, *ags)" do
|
253
|
+
let(:mock_bundler) { DummyBundler.new }
|
254
|
+
|
255
|
+
before do
|
256
|
+
allow(DummyGemifiedWorkflow).to receive(:gemfile) do |&block|
|
257
|
+
mock_bundler.gemfile(&block)
|
258
|
+
end
|
259
|
+
stub_run_for(DummyGemifiedWorkflow)
|
260
|
+
end
|
261
|
+
|
262
|
+
it "Installs a gem using Bundler's inline gemfile" do
|
263
|
+
stub_command(command: "gem list -ie whirly", options: { loud: false, raise: true }, return_value: "false")
|
264
|
+
expect(mock_bundler).to receive(:source).with("https://rubygems.org")
|
265
|
+
expect(mock_bundler).to receive(:gem).with("whirly", "0.2.6")
|
266
|
+
|
267
|
+
DummyGemifiedWorkflow.class_eval do
|
268
|
+
use_gem "whirly", "0.2.6"
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
it "Uses an existing gem if it's already installed" do
|
273
|
+
stub_command(command: "gem list -ie whirly", options: { loud: false, raise: false }, return_value: "true")
|
274
|
+
expect(DummyGemifiedWorkflow).to_not receive(:gemfile)
|
275
|
+
|
276
|
+
DummyGemifiedWorkflow.class_eval do
|
277
|
+
use_gem "whirly", "0.2.6"
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
describe ".use_gemfile(&block)" do
|
283
|
+
let(:mock_bundler) { DummyBundler.new }
|
284
|
+
|
285
|
+
before do
|
286
|
+
allow(DummyGemifiedWorkflow).to receive(:gemfile) do |&block|
|
287
|
+
mock_bundler.gemfile(&block)
|
288
|
+
end
|
289
|
+
stub_run_for(DummyGemifiedWorkflow)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "runs bundler's inline gemfile with the provided block" do
|
293
|
+
expect(mock_bundler).to receive(:source).with("https://rubygems.org")
|
294
|
+
expect(mock_bundler).to receive(:gem).with("standard")
|
295
|
+
|
296
|
+
DummyGemifiedWorkflow.class_eval do
|
297
|
+
use_gemfile do
|
298
|
+
source "https://rubygems.org"
|
299
|
+
gem "standard"
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
@@ -5,14 +5,51 @@ describe GitReflow::Workflows::Core do
|
|
5
5
|
let(:existing_pull_requests) { Fixture.new('pull_requests/pull_requests.json').to_json_hashie }
|
6
6
|
let(:existing_gh_pull_request) { GitReflow::GitServer::GitHub::PullRequest.new existing_pull_requests.first }
|
7
7
|
let(:pull_request_message_file) { "#{GitReflow.git_root_dir}/.git/GIT_REFLOW_PR_MSG" }
|
8
|
+
let(:workflow) { described_class }
|
8
9
|
|
9
10
|
before do
|
10
|
-
allow(
|
11
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
11
12
|
allow_any_instance_of(HighLine).to receive(:choose)
|
12
13
|
end
|
13
14
|
|
15
|
+
describe ".load_workflow(workflow_path)" do
|
16
|
+
let(:workflow_path) { "/tmp/Workflow" }
|
17
|
+
subject { GitReflow::Workflows::Core.load_workflow(workflow_path) }
|
18
|
+
|
19
|
+
before { allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_call_original }
|
20
|
+
|
21
|
+
it "returns `nil` if the workflow path doesn't exist" do
|
22
|
+
allow(File).to receive(:exists?).and_return(false)
|
23
|
+
expect(subject).to be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "evaluates the workflow file in the context of the class" do
|
27
|
+
workflow_content = "# testing"
|
28
|
+
allow(File).to receive(:exists?).with("#{GitReflow.git_root_dir}/Workflow").and_return(false)
|
29
|
+
allow(File).to receive(:exists?).with(workflow_path).and_return(true)
|
30
|
+
expect(File).to receive(:read).with(workflow_path).and_return(workflow_content)
|
31
|
+
expect(GitReflow::Workflows::Core).to receive(:load_raw_workflow).with(workflow_content)
|
32
|
+
subject
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".load_raw_workflow(workflow_string)" do
|
37
|
+
before { allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_call_original }
|
38
|
+
it "evaluates the raw string in the context of the Core workflow" do
|
39
|
+
workflow_content = <<~WORKFLOW_CONTENT
|
40
|
+
command :dummy do
|
41
|
+
puts "Dummy"
|
42
|
+
end
|
43
|
+
WORKFLOW_CONTENT
|
44
|
+
fake_binding = instance_double(Binding)
|
45
|
+
expect(fake_binding).to receive(:eval).with(workflow_content)
|
46
|
+
expect(described_class).to receive(:binding).and_return(fake_binding)
|
47
|
+
GitReflow::Workflows::Core.load_raw_workflow(workflow_content)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
14
51
|
describe ".setup" do
|
15
|
-
subject {
|
52
|
+
subject { workflow.setup }
|
16
53
|
|
17
54
|
before do
|
18
55
|
allow(File).to receive(:exist?).and_return(false)
|
@@ -27,7 +64,8 @@ describe GitReflow::Workflows::Core do
|
|
27
64
|
context "core.editor git config has already been set" do
|
28
65
|
before do
|
29
66
|
allow(GitReflow::Config).to receive(:get) { "" }
|
30
|
-
allow(
|
67
|
+
allow(workflow.git_config).to receive(:get) { "" }
|
68
|
+
allow(workflow.git_config).to receive(:get).with('core.editor').and_return('emacs')
|
31
69
|
end
|
32
70
|
|
33
71
|
specify { expect { subject }.to_not have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all core.editor \"#{GitReflow.default_editor}\"", blocking: false }
|
@@ -36,8 +74,7 @@ describe GitReflow::Workflows::Core do
|
|
36
74
|
context "git-reflow has not been setup before" do
|
37
75
|
it "notifies the user of global setup" do
|
38
76
|
expect { subject }.to have_said "We'll walk you through setting up git-reflow's defaults for all your projects.", :notice
|
39
|
-
expect { subject }.to have_said "In the future, you can run \`git-reflow setup\` from the root of any project you want to setup differently.", :notice
|
40
|
-
expect { subject }.to have_said "To adjust these settings globally, you can run \`git-reflow setup --global\`.", :notice
|
77
|
+
expect { subject }.to have_said "In the future, you can run \`git-reflow setup --local\` from the root of any project you want to setup differently.", :notice
|
41
78
|
end
|
42
79
|
|
43
80
|
it "creates a .gitconfig.reflow file and includes it in the user's global git config" do
|
@@ -84,9 +121,9 @@ describe GitReflow::Workflows::Core do
|
|
84
121
|
|
85
122
|
describe ".start" do
|
86
123
|
let(:feature_branch) { 'new_feature' }
|
87
|
-
subject {
|
124
|
+
subject { workflow.start feature_branch: feature_branch }
|
88
125
|
|
89
|
-
it "updates the local repo and
|
126
|
+
it "updates the local repo and creates a new branch" do
|
90
127
|
expect { subject }.to have_run_commands_in_order [
|
91
128
|
"git checkout master",
|
92
129
|
"git pull origin master",
|
@@ -108,13 +145,23 @@ describe GitReflow::Workflows::Core do
|
|
108
145
|
end
|
109
146
|
|
110
147
|
it "starts from a different base branch when one is supplied" do
|
111
|
-
expect {
|
148
|
+
expect { workflow.start feature_branch: feature_branch, base: 'development' }.to have_run_commands_in_order [
|
112
149
|
"git checkout development",
|
113
150
|
"git pull origin development",
|
114
151
|
"git push origin development:refs/heads/#{feature_branch}",
|
115
152
|
"git checkout --track -b #{feature_branch} origin/#{feature_branch}"
|
116
153
|
]
|
117
154
|
end
|
155
|
+
|
156
|
+
it "starts from a different base branch when one is configured" do
|
157
|
+
allow(GitReflow::Config).to receive(:get).with("reflow.base-branch").and_return("sudo-master")
|
158
|
+
expect { workflow.start feature_branch: feature_branch }.to have_run_commands_in_order [
|
159
|
+
"git checkout sudo-master",
|
160
|
+
"git pull origin sudo-master",
|
161
|
+
"git push origin sudo-master:refs/heads/#{feature_branch}",
|
162
|
+
"git checkout --track -b #{feature_branch} origin/#{feature_branch}"
|
163
|
+
]
|
164
|
+
end
|
118
165
|
end
|
119
166
|
|
120
167
|
describe ".review" do
|
@@ -125,11 +172,11 @@ describe GitReflow::Workflows::Core do
|
|
125
172
|
let(:inputs) { {} }
|
126
173
|
|
127
174
|
before do
|
128
|
-
allow(
|
175
|
+
allow(workflow).to receive(:remote_user).and_return(user)
|
129
176
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
130
|
-
allow(
|
131
|
-
allow(
|
132
|
-
allow(
|
177
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
178
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).and_return(nil)
|
179
|
+
allow(workflow.git_server).to receive(:create_pull_request).and_return(existing_gh_pull_request)
|
133
180
|
allow(File).to receive(:open).with(pull_request_message_file, 'w')
|
134
181
|
allow(File).to receive(:read).with(pull_request_message_file).and_return("bingo")
|
135
182
|
allow(File).to receive(:delete)
|
@@ -139,7 +186,7 @@ describe GitReflow::Workflows::Core do
|
|
139
186
|
})
|
140
187
|
end
|
141
188
|
|
142
|
-
subject {
|
189
|
+
subject { workflow.review inputs }
|
143
190
|
|
144
191
|
it "fetches updates to the base branch" do
|
145
192
|
expect { subject }.to have_run_command "git fetch origin master"
|
@@ -152,7 +199,7 @@ describe GitReflow::Workflows::Core do
|
|
152
199
|
it "uses the current branch name as the text for the PR" do
|
153
200
|
fake_file = double
|
154
201
|
expect(File).to receive(:open).with(pull_request_message_file, "w").and_yield(fake_file)
|
155
|
-
expect(fake_file).to receive(:write).with(
|
202
|
+
expect(fake_file).to receive(:write).with(workflow.current_branch)
|
156
203
|
subject
|
157
204
|
end
|
158
205
|
|
@@ -176,7 +223,7 @@ describe GitReflow::Workflows::Core do
|
|
176
223
|
context "and a PR template exists" do
|
177
224
|
let(:template_content) { "hey now" }
|
178
225
|
before do
|
179
|
-
allow(
|
226
|
+
allow(workflow).to receive(:pull_request_template).and_return(template_content)
|
180
227
|
end
|
181
228
|
|
182
229
|
it "uses the template's content for the PR" do
|
@@ -185,7 +232,6 @@ describe GitReflow::Workflows::Core do
|
|
185
232
|
expect(fake_file).to receive(:write).with(template_content)
|
186
233
|
subject
|
187
234
|
end
|
188
|
-
|
189
235
|
end
|
190
236
|
|
191
237
|
context "providing a base branch" do
|
@@ -198,7 +244,7 @@ describe GitReflow::Workflows::Core do
|
|
198
244
|
end
|
199
245
|
|
200
246
|
it "creates a pull request using the custom base branch" do
|
201
|
-
expect(
|
247
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
202
248
|
title: 'bingo',
|
203
249
|
body: "\n",
|
204
250
|
head: "#{user}:#{feature_branch}",
|
@@ -208,6 +254,25 @@ describe GitReflow::Workflows::Core do
|
|
208
254
|
end
|
209
255
|
end
|
210
256
|
|
257
|
+
context 'when a base branch is configured' do
|
258
|
+
before do
|
259
|
+
stub_command_line_inputs('Submit pull request? (Y)' => 'yes')
|
260
|
+
allow(GitReflow::Config).to receive(:get).and_call_original
|
261
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
262
|
+
inputs.delete(:base)
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'creates a pull request using the custom base branch' do
|
266
|
+
expect(GitReflow.git_server).to receive(:create_pull_request).with({
|
267
|
+
title: 'bingo',
|
268
|
+
body: "\n",
|
269
|
+
head: "#{user}:#{feature_branch}",
|
270
|
+
base: 'racecar'
|
271
|
+
})
|
272
|
+
subject
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
211
276
|
context "providing only a title" do
|
212
277
|
let(:inputs) {{ title: "Amazing new feature" }}
|
213
278
|
|
@@ -218,7 +283,7 @@ describe GitReflow::Workflows::Core do
|
|
218
283
|
end
|
219
284
|
|
220
285
|
it "creates a pull request with only the given title" do
|
221
|
-
expect(
|
286
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
222
287
|
title: inputs[:title],
|
223
288
|
body: nil,
|
224
289
|
head: "#{user}:#{feature_branch}",
|
@@ -236,7 +301,7 @@ describe GitReflow::Workflows::Core do
|
|
236
301
|
end
|
237
302
|
|
238
303
|
context "providing only a body" do
|
239
|
-
let(:inputs) {{
|
304
|
+
let(:inputs) {{ message: "Please pull this in!" }}
|
240
305
|
|
241
306
|
before do
|
242
307
|
stub_command_line_inputs({
|
@@ -245,9 +310,9 @@ describe GitReflow::Workflows::Core do
|
|
245
310
|
end
|
246
311
|
|
247
312
|
it "creates a pull request with the body as both title and body" do
|
248
|
-
expect(
|
249
|
-
title: inputs[:
|
250
|
-
body: inputs[:
|
313
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
314
|
+
title: inputs[:message],
|
315
|
+
body: inputs[:message],
|
251
316
|
head: "#{user}:#{feature_branch}",
|
252
317
|
base: 'master'
|
253
318
|
})
|
@@ -256,7 +321,7 @@ describe GitReflow::Workflows::Core do
|
|
256
321
|
end
|
257
322
|
|
258
323
|
context "providing both title and body" do
|
259
|
-
let(:inputs) {{ title: "Amazing new feature",
|
324
|
+
let(:inputs) {{ title: "Amazing new feature", message: "Please pull this in!" }}
|
260
325
|
|
261
326
|
before do
|
262
327
|
stub_command_line_inputs({
|
@@ -265,9 +330,9 @@ describe GitReflow::Workflows::Core do
|
|
265
330
|
end
|
266
331
|
|
267
332
|
it "creates a pull request with only the given title" do
|
268
|
-
expect(
|
333
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
269
334
|
title: inputs[:title],
|
270
|
-
body: inputs[:
|
335
|
+
body: inputs[:message],
|
271
336
|
head: "#{user}:#{feature_branch}",
|
272
337
|
base: 'master'
|
273
338
|
})
|
@@ -277,7 +342,7 @@ describe GitReflow::Workflows::Core do
|
|
277
342
|
|
278
343
|
context "with existing pull request" do
|
279
344
|
before do
|
280
|
-
expect(
|
345
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).and_return(existing_gh_pull_request)
|
281
346
|
allow(existing_gh_pull_request).to receive(:display_pull_request_summary)
|
282
347
|
end
|
283
348
|
|
@@ -297,7 +362,7 @@ describe GitReflow::Workflows::Core do
|
|
297
362
|
end
|
298
363
|
|
299
364
|
it "creates a pull request" do
|
300
|
-
expect(
|
365
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
301
366
|
title: 'bingo',
|
302
367
|
body: "\n",
|
303
368
|
head: "#{user}:#{feature_branch}",
|
@@ -307,9 +372,27 @@ describe GitReflow::Workflows::Core do
|
|
307
372
|
end
|
308
373
|
|
309
374
|
it "notifies the user that the pull request was created" do
|
310
|
-
expect(
|
375
|
+
expect(workflow.git_server).to receive(:create_pull_request).and_return(existing_gh_pull_request)
|
311
376
|
expect{ subject }.to have_said "Successfully created pull request ##{existing_gh_pull_request.number}: #{existing_gh_pull_request.title}\nPull Request URL: #{existing_gh_pull_request.html_url}\n", :success
|
312
377
|
end
|
378
|
+
|
379
|
+
context "when pull request creation fails" do
|
380
|
+
let(:github_error) { Github::Error::UnprocessableEntity.new(eval(Fixture.new('pull_requests/pull_request_branch_nonexistent_error.json').to_s)) }
|
381
|
+
|
382
|
+
it "retries creating a pull request" do
|
383
|
+
call_count = 0
|
384
|
+
allow(workflow.git_server).to receive(:create_pull_request) do
|
385
|
+
call_count += 1
|
386
|
+
(call_count <= 1) ? raise(github_error) : existing_gh_pull_request
|
387
|
+
end
|
388
|
+
expect{ subject }.to have_said "Successfully created pull request ##{existing_gh_pull_request.number}: #{existing_gh_pull_request.title}\nPull Request URL: #{existing_gh_pull_request.html_url}\n", :success
|
389
|
+
end
|
390
|
+
|
391
|
+
it "reports failures even after retrying" do
|
392
|
+
allow(workflow.git_server).to receive(:create_pull_request).and_raise github_error
|
393
|
+
expect { subject }.to have_said "Github Error: #{github_error.to_s}", :error
|
394
|
+
end
|
395
|
+
end
|
313
396
|
end
|
314
397
|
|
315
398
|
context "aborting during PR template review" do
|
@@ -320,7 +403,7 @@ describe GitReflow::Workflows::Core do
|
|
320
403
|
end
|
321
404
|
|
322
405
|
it "does not create a pull request" do
|
323
|
-
expect(
|
406
|
+
expect(workflow.git_server).to_not receive(:create_pull_request)
|
324
407
|
subject
|
325
408
|
end
|
326
409
|
|
@@ -334,17 +417,17 @@ describe GitReflow::Workflows::Core do
|
|
334
417
|
let(:feature_branch) { 'new-feature' }
|
335
418
|
let(:destination_branch) { nil }
|
336
419
|
|
337
|
-
subject {
|
420
|
+
subject { workflow.status destination_branch: destination_branch }
|
338
421
|
|
339
422
|
before do
|
340
423
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
341
|
-
allow(
|
424
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
342
425
|
allow(GitReflow).to receive(:current_branch).and_return(feature_branch)
|
343
426
|
allow(existing_gh_pull_request).to receive(:display_pull_request_summary)
|
344
427
|
end
|
345
428
|
|
346
429
|
context "with no existing pull request" do
|
347
|
-
before { allow(
|
430
|
+
before { allow(workflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: 'master'}).and_return(nil) }
|
348
431
|
it { expect{ subject }.to have_said "No pull request exists for #{feature_branch} -> master", :notice }
|
349
432
|
it { expect{ subject }.to have_said "Run 'git reflow review master' to start the review process", :notice }
|
350
433
|
end
|
@@ -352,7 +435,7 @@ describe GitReflow::Workflows::Core do
|
|
352
435
|
context "with an existing pull request" do
|
353
436
|
let(:destination_branch) { 'master' }
|
354
437
|
before do
|
355
|
-
allow(
|
438
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).and_return(existing_gh_pull_request)
|
356
439
|
end
|
357
440
|
|
358
441
|
it "displays a summary of the pull request" do
|
@@ -364,7 +447,19 @@ describe GitReflow::Workflows::Core do
|
|
364
447
|
let(:destination_branch) { 'develop' }
|
365
448
|
|
366
449
|
it "uses the custom destination branch to lookup the pull request" do
|
367
|
-
expect(
|
450
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: destination_branch}).and_return(existing_gh_pull_request)
|
451
|
+
subject
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
context "when custom base-branch is configured" do
|
456
|
+
before do
|
457
|
+
allow(GitReflow::Config).to receive(:get).and_call_original
|
458
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
459
|
+
end
|
460
|
+
subject { workflow.status }
|
461
|
+
it "uses the custom configured base-branch to lookup the pull request" do
|
462
|
+
expect(GitReflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: 'racecar'}).and_return(existing_gh_pull_request)
|
368
463
|
subject
|
369
464
|
end
|
370
465
|
end
|
@@ -374,7 +469,7 @@ describe GitReflow::Workflows::Core do
|
|
374
469
|
describe ".deploy" do
|
375
470
|
let(:deploy_command) { "bundle exec cap #{destination} deploy" }
|
376
471
|
let(:destination) { nil }
|
377
|
-
subject {
|
472
|
+
subject { workflow.deploy(destination_server: destination) }
|
378
473
|
|
379
474
|
before do
|
380
475
|
stub_command_line_inputs({
|
@@ -409,16 +504,16 @@ describe GitReflow::Workflows::Core do
|
|
409
504
|
describe ".stage" do
|
410
505
|
let(:feature_branch) { 'new-feature' }
|
411
506
|
|
412
|
-
subject {
|
507
|
+
subject { workflow.stage }
|
413
508
|
|
414
509
|
before do
|
415
|
-
allow(
|
416
|
-
allow(
|
510
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
511
|
+
allow(workflow.git_config).to receive(:get).and_call_original
|
417
512
|
allow(GitReflow::Workflows::Core).to receive(:deploy)
|
418
513
|
end
|
419
514
|
|
420
515
|
it "checks out and updates the staging branch" do
|
421
|
-
expect(
|
516
|
+
expect(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
422
517
|
expect { subject }.to have_run_commands_in_order([
|
423
518
|
"git checkout staging",
|
424
519
|
"git pull origin staging",
|
@@ -429,9 +524,9 @@ describe GitReflow::Workflows::Core do
|
|
429
524
|
|
430
525
|
context "merge is not successful" do
|
431
526
|
before do
|
432
|
-
allow(
|
433
|
-
allow(
|
434
|
-
expect(
|
527
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
528
|
+
allow(workflow).to receive(:run_command_with_label).and_call_original
|
529
|
+
expect(workflow).to receive(:run_command_with_label).with("git merge #{feature_branch}", with_system: true).and_return(false)
|
435
530
|
end
|
436
531
|
|
437
532
|
it "notifies the user of unsuccessful merge" do
|
@@ -450,9 +545,9 @@ describe GitReflow::Workflows::Core do
|
|
450
545
|
|
451
546
|
context "merge is successful" do
|
452
547
|
before do
|
453
|
-
allow(
|
454
|
-
allow(
|
455
|
-
expect(
|
548
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
549
|
+
allow(workflow).to receive(:run_command_with_label).and_call_original
|
550
|
+
expect(workflow).to receive(:run_command_with_label).with("git merge #{feature_branch}", with_system: true).and_return(true).and_call_original
|
456
551
|
end
|
457
552
|
|
458
553
|
specify { expect{ subject }.to have_run_command "git push origin staging" }
|
@@ -470,19 +565,19 @@ describe GitReflow::Workflows::Core do
|
|
470
565
|
|
471
566
|
context "no staging branch has been setup" do
|
472
567
|
before do
|
473
|
-
allow(
|
568
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('')
|
474
569
|
stub_command_line_inputs({
|
475
570
|
"What's the name of your staging branch? (default: 'staging') " => "bobby"
|
476
571
|
})
|
477
572
|
end
|
478
573
|
|
479
574
|
it "sets the reflow.staging-branch git config to 'staging'" do
|
480
|
-
expect(
|
575
|
+
expect(workflow.git_config).to receive(:set).with("reflow.staging-branch", "bobby", local: true)
|
481
576
|
subject
|
482
577
|
end
|
483
578
|
|
484
579
|
it "checks out and updates the staging branch" do
|
485
|
-
allow(
|
580
|
+
allow(workflow.git_config).to receive(:set).with("reflow.staging-branch", "bobby", local: true)
|
486
581
|
expect { subject }.to have_run_commands_in_order([
|
487
582
|
"git checkout bobby",
|
488
583
|
"git pull origin bobby",
|
@@ -519,23 +614,25 @@ describe GitReflow::Workflows::Core do
|
|
519
614
|
let(:user) { 'reenhanced' }
|
520
615
|
let(:repo) { 'repo' }
|
521
616
|
|
522
|
-
subject {
|
617
|
+
subject { workflow.deliver }
|
523
618
|
|
524
619
|
before do
|
525
620
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
526
621
|
allow(GitReflow).to receive(:remote_user).and_return(user)
|
622
|
+
allow(workflow).to receive(:remote_user).and_return(user)
|
527
623
|
allow(GitReflow).to receive(:current_branch).and_return(feature_branch)
|
528
|
-
allow(
|
624
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
625
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
529
626
|
end
|
530
627
|
|
531
628
|
context "pull request does not exist" do
|
532
|
-
before { allow(
|
629
|
+
before { allow(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'master').and_return(nil) }
|
533
630
|
specify { expect{ subject }.to have_said "No pull request exists for #{user}:#{feature_branch}\nPlease submit your branch for review first with \`git reflow review\`", :deliver_halted }
|
534
631
|
end
|
535
632
|
|
536
633
|
context "pull request exists" do
|
537
634
|
before do
|
538
|
-
allow(
|
635
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'master').and_return(existing_gh_pull_request)
|
539
636
|
allow(GitReflow::Workflows::Core).to receive(:status)
|
540
637
|
end
|
541
638
|
|
@@ -586,11 +683,16 @@ describe GitReflow::Workflows::Core do
|
|
586
683
|
end
|
587
684
|
|
588
685
|
context "but forcing the deliver" do
|
589
|
-
subject {
|
686
|
+
subject { workflow.deliver force: true }
|
590
687
|
|
591
688
|
before do
|
592
689
|
allow(existing_gh_pull_request).to receive(:good_to_merge?).with(force: true).and_return(true)
|
593
|
-
allow(existing_gh_pull_request).to receive(:merge!).with(
|
690
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
691
|
+
force: true,
|
692
|
+
merge_method: "squash",
|
693
|
+
base: 'master',
|
694
|
+
skip_lgtm: false
|
695
|
+
)
|
594
696
|
end
|
595
697
|
|
596
698
|
it "displays the status of the PR" do
|
@@ -599,28 +701,74 @@ describe GitReflow::Workflows::Core do
|
|
599
701
|
end
|
600
702
|
|
601
703
|
it "merges the feature branch anyway" do
|
602
|
-
expect(existing_gh_pull_request).to receive(:merge!).with(
|
704
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
705
|
+
force: true,
|
706
|
+
merge_method: "squash",
|
707
|
+
base: 'master',
|
708
|
+
skip_lgtm: false
|
709
|
+
)
|
603
710
|
subject
|
604
711
|
end
|
605
712
|
end
|
606
713
|
end
|
607
714
|
|
608
715
|
context "and using a custom base branch" do
|
609
|
-
subject {
|
716
|
+
subject { workflow.deliver base: 'development' }
|
610
717
|
before do
|
611
|
-
expect(
|
718
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'development').and_return(existing_gh_pull_request)
|
612
719
|
allow(existing_gh_pull_request).to receive(:good_to_merge?).and_return(true)
|
613
720
|
end
|
614
721
|
|
615
722
|
|
616
723
|
it "displays the status of the PR" do
|
617
|
-
allow(existing_gh_pull_request).to receive(:merge!).with(
|
724
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
725
|
+
base: 'development',
|
726
|
+
merge_method: "squash",
|
727
|
+
force: false,
|
728
|
+
skip_lgtm: false
|
729
|
+
)
|
618
730
|
expect(GitReflow::Workflows::Core).to receive(:status).with(destination_branch: 'development')
|
619
731
|
subject
|
620
732
|
end
|
621
733
|
|
622
734
|
it "merges the feature branch" do
|
623
|
-
expect(existing_gh_pull_request).to receive(:merge!).with(
|
735
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
736
|
+
base: "development",
|
737
|
+
merge_method: "squash",
|
738
|
+
force: false,
|
739
|
+
skip_lgtm: false
|
740
|
+
)
|
741
|
+
subject
|
742
|
+
end
|
743
|
+
end
|
744
|
+
|
745
|
+
context "when a custom base-branch is configured" do
|
746
|
+
subject { workflow.deliver }
|
747
|
+
before do
|
748
|
+
expect(GitReflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'racecar').and_return(existing_gh_pull_request)
|
749
|
+
allow(existing_gh_pull_request).to receive(:good_to_merge?).and_return(true)
|
750
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
751
|
+
end
|
752
|
+
|
753
|
+
|
754
|
+
it "displays the status of the PR" do
|
755
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
756
|
+
base: 'racecar',
|
757
|
+
merge_method: "squash",
|
758
|
+
force: false,
|
759
|
+
skip_lgtm: false
|
760
|
+
)
|
761
|
+
expect(GitReflow::Workflows::Core).to receive(:status).with(destination_branch: 'racecar')
|
762
|
+
subject
|
763
|
+
end
|
764
|
+
|
765
|
+
it "merges the feature branch" do
|
766
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
767
|
+
base: "racecar",
|
768
|
+
merge_method: "squash",
|
769
|
+
force: false,
|
770
|
+
skip_lgtm: false
|
771
|
+
)
|
624
772
|
subject
|
625
773
|
end
|
626
774
|
end
|
@@ -628,36 +776,46 @@ describe GitReflow::Workflows::Core do
|
|
628
776
|
end
|
629
777
|
|
630
778
|
describe ".refresh" do
|
631
|
-
subject {
|
779
|
+
subject { workflow.refresh }
|
632
780
|
|
633
781
|
it "updates the feature branch with default remote repo and base branch" do
|
634
|
-
expect(
|
782
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'master')
|
635
783
|
subject
|
636
784
|
end
|
637
785
|
|
638
786
|
context "providing a custom base branch" do
|
639
|
-
subject {
|
787
|
+
subject { workflow.refresh base: 'development' }
|
640
788
|
|
641
789
|
it "updates the feature branch with default remote repo and base branch" do
|
642
|
-
expect(
|
790
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'development')
|
791
|
+
subject
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
context "when a custom base branch is configured" do
|
796
|
+
before { allow(workflow.git_config).to receive(:get).with('reflow.base-branch').and_return('racecar') }
|
797
|
+
subject { workflow.refresh }
|
798
|
+
|
799
|
+
it "updates the feature branch with custom base branch" do
|
800
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'racecar')
|
643
801
|
subject
|
644
802
|
end
|
645
803
|
end
|
646
804
|
|
647
805
|
context "provding a custom remote repo" do
|
648
|
-
subject {
|
806
|
+
subject { workflow.refresh remote: 'upstream' }
|
649
807
|
|
650
808
|
it "updates the feature branch with default remote repo and base branch" do
|
651
|
-
expect(
|
809
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'upstream', base: 'master')
|
652
810
|
subject
|
653
811
|
end
|
654
812
|
end
|
655
813
|
|
656
814
|
context "providing a custom base branch and remote repo" do
|
657
|
-
subject {
|
815
|
+
subject { workflow.refresh remote: 'upstream', base: 'development' }
|
658
816
|
|
659
817
|
it "updates the feature branch with default remote repo and base branch" do
|
660
|
-
expect(
|
818
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'upstream', base: 'development')
|
661
819
|
subject
|
662
820
|
end
|
663
821
|
end
|