zenflow 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.zenflow +10 -0
  7. data/CHANGELOG.md +0 -0
  8. data/Gemfile +3 -0
  9. data/Gemfile.lock +95 -0
  10. data/Guardfile +6 -0
  11. data/LICENSE.md +22 -0
  12. data/README.markdown +92 -0
  13. data/VERSION.yml +5 -0
  14. data/bin/zenflow +17 -0
  15. data/lib/zenflow.rb +35 -0
  16. data/lib/zenflow/cli.rb +130 -0
  17. data/lib/zenflow/commands/deploy.rb +33 -0
  18. data/lib/zenflow/commands/feature.rb +10 -0
  19. data/lib/zenflow/commands/hotfix.rb +15 -0
  20. data/lib/zenflow/commands/release.rb +16 -0
  21. data/lib/zenflow/commands/reviews.rb +12 -0
  22. data/lib/zenflow/helpers/ask.rb +66 -0
  23. data/lib/zenflow/helpers/branch.rb +80 -0
  24. data/lib/zenflow/helpers/branch_command.rb +95 -0
  25. data/lib/zenflow/helpers/branch_commands/abort.rb +21 -0
  26. data/lib/zenflow/helpers/branch_commands/branches.rb +21 -0
  27. data/lib/zenflow/helpers/branch_commands/compare.rb +20 -0
  28. data/lib/zenflow/helpers/branch_commands/deploy.rb +29 -0
  29. data/lib/zenflow/helpers/branch_commands/diff.rb +19 -0
  30. data/lib/zenflow/helpers/branch_commands/finish.rb +68 -0
  31. data/lib/zenflow/helpers/branch_commands/review.rb +58 -0
  32. data/lib/zenflow/helpers/branch_commands/start.rb +39 -0
  33. data/lib/zenflow/helpers/branch_commands/update.rb +22 -0
  34. data/lib/zenflow/helpers/changelog.rb +100 -0
  35. data/lib/zenflow/helpers/config.rb +36 -0
  36. data/lib/zenflow/helpers/github.rb +40 -0
  37. data/lib/zenflow/helpers/help.rb +37 -0
  38. data/lib/zenflow/helpers/log.rb +21 -0
  39. data/lib/zenflow/helpers/pull_request.rb +68 -0
  40. data/lib/zenflow/helpers/repo.rb +13 -0
  41. data/lib/zenflow/helpers/shell.rb +89 -0
  42. data/lib/zenflow/helpers/version.rb +87 -0
  43. data/lib/zenflow/version.rb +3 -0
  44. data/spec/fixtures/VERSION.yml +5 -0
  45. data/spec/fixtures/cassettes/create_bad_pull_request.yml +57 -0
  46. data/spec/fixtures/cassettes/create_pull_request.yml +68 -0
  47. data/spec/fixtures/cassettes/existing_pull_request.yml +145 -0
  48. data/spec/fixtures/cassettes/pull_request_by_ref.yml +145 -0
  49. data/spec/fixtures/cassettes/pull_request_find.yml +70 -0
  50. data/spec/fixtures/cassettes/pull_request_for_non-existent_ref.yml +145 -0
  51. data/spec/fixtures/cassettes/pull_request_list.yml +74 -0
  52. data/spec/fixtures/cassettes/unexisting_pull_request.yml +145 -0
  53. data/spec/spec_helper.rb +36 -0
  54. data/spec/support/shared_examples_for_version_number.rb +19 -0
  55. data/spec/zenflow/commands/deploy_spec.rb +48 -0
  56. data/spec/zenflow/commands/feature_spec.rb +11 -0
  57. data/spec/zenflow/commands/hotfix_spec.rb +14 -0
  58. data/spec/zenflow/commands/release_spec.rb +15 -0
  59. data/spec/zenflow/commands/reviews_spec.rb +15 -0
  60. data/spec/zenflow/helpers/ask_spec.rb +115 -0
  61. data/spec/zenflow/helpers/branch_command_spec.rb +310 -0
  62. data/spec/zenflow/helpers/branch_spec.rb +300 -0
  63. data/spec/zenflow/helpers/changelog_spec.rb +188 -0
  64. data/spec/zenflow/helpers/cli_spec.rb +277 -0
  65. data/spec/zenflow/helpers/github_spec.rb +45 -0
  66. data/spec/zenflow/helpers/help_spec.rb +36 -0
  67. data/spec/zenflow/helpers/log_spec.rb +31 -0
  68. data/spec/zenflow/helpers/pull_request_spec.rb +108 -0
  69. data/spec/zenflow/helpers/shell_spec.rb +135 -0
  70. data/spec/zenflow/helpers/version_spec.rb +111 -0
  71. data/zenflow.gemspec +33 -0
  72. metadata +273 -0
@@ -0,0 +1,277 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zenflow::CLI do
4
+
5
+ subject {Zenflow::CLI.new}
6
+
7
+ describe "#version" do
8
+ it 'outputs the version number' do
9
+ subject.should_receive(:puts).with("Zenflow #{Zenflow::VERSION}")
10
+ subject.version
11
+ end
12
+ end
13
+
14
+ describe "#help" do
15
+ it 'displays helpful information' do
16
+ subject.should_receive(:version)
17
+ $stdout.should_receive(:puts).at_least(:once)
18
+ subject.help
19
+ end
20
+ end
21
+
22
+ describe "#authorize_github" do
23
+ context "when a zenflow_token is already saved" do
24
+ before do
25
+ Zenflow::Github.should_receive(:zenflow_token).and_return('super secret token')
26
+ end
27
+
28
+ context "and the user decides to set a new one" do
29
+ before do
30
+ Zenflow.should_receive(:Ask).and_return('y')
31
+ end
32
+
33
+ it "authorizes with Github" do
34
+ Zenflow::Github.should_receive(:authorize)
35
+ subject.authorize_github
36
+ end
37
+ end
38
+
39
+ context "and the user decides not to set a new one" do
40
+ before do
41
+ Zenflow.should_receive(:Ask).and_return('n')
42
+ end
43
+
44
+ it "does not authorize with Github" do
45
+ Zenflow::Github.should_not_receive(:authorize)
46
+ subject.authorize_github
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when a zenflow_token is not already saved" do
52
+ before do
53
+ Zenflow::Github.should_receive(:zenflow_token).and_return(nil)
54
+ end
55
+
56
+ it "authorizes with Github" do
57
+ Zenflow::Github.should_receive(:authorize)
58
+ subject.authorize_github
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "#already_configured" do
64
+ let(:question) {['There is an existing config file. Overwrite it?', {:options => ["y", "N"], :default => "N"}]}
65
+ before do
66
+ Zenflow.should_receive(:Log).with('Warning', :color => :red)
67
+ end
68
+
69
+ context "when the user wants to overwrite the configuration" do
70
+ before do
71
+ Zenflow.should_receive(:Ask).with(*question).and_return('y')
72
+ end
73
+
74
+ it "forces initialization" do
75
+ subject.should_receive(:init).with(true)
76
+ subject.already_configured
77
+ end
78
+ end
79
+
80
+ context "when the user does not want to overwrite the configuration" do
81
+ before do
82
+ Zenflow.should_receive(:Ask).with(*question).and_return('n')
83
+ end
84
+
85
+ it "aborts" do
86
+ Zenflow.should_receive(:Log).with('Aborting...', :color => :red)
87
+ lambda{ subject.already_configured}.should raise_error(SystemExit)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "#configure_branch" do
93
+ context "when the user wants to configure a staging branch" do
94
+ before do
95
+ Zenflow.should_receive(:Ask).with("Use a branch for staging releases and hotfixes?", :options => ["Y", "n"], :default => "Y").and_return('y')
96
+ end
97
+
98
+ it 'names the staging branch whatever the user wants' do
99
+ Zenflow.should_receive(:Ask).with("What is the name of that branch?", :default => "staging").and_return('staging')
100
+ Zenflow::Config.should_receive(:[]=).with(:staging_branch, 'staging')
101
+ subject.configure_branch(:staging_branch, "Use a branch for staging releases and hotfixes?", 'staging')
102
+ end
103
+ end
104
+
105
+ context "when the user does not want to configure a staging branch" do
106
+ before do
107
+ Zenflow.should_receive(:Ask).with("Use a branch for staging releases and hotfixes?", :options => ["Y", "n"], :default => "Y").and_return('n')
108
+ end
109
+
110
+ it 'names the staging branch whatever the user wants' do
111
+ Zenflow::Config.should_receive(:[]=).with(:staging_branch, false)
112
+ subject.configure_branch(:staging_branch, "Use a branch for staging releases and hotfixes?", 'staging')
113
+ end
114
+ end
115
+ end
116
+
117
+ describe "#configure_project" do
118
+ it 'asks the user to name their project' do
119
+ Zenflow.should_receive(:Ask).with("What is the name of this project?", :required => true).and_return('zenflow')
120
+ Zenflow.should_receive(:Log).with("Project")
121
+ Zenflow::Config.should_receive(:[]=).with(:project, 'zenflow')
122
+ subject.configure_project
123
+ end
124
+ end
125
+
126
+ describe "#configure_branches" do
127
+ it 'configures branches for the project' do
128
+ Zenflow.should_receive(:Ask).with("What is the name of the main development branch?", :default => "master").and_return('master')
129
+ Zenflow.should_receive(:Log).with("Branches")
130
+ Zenflow::Config.should_receive(:[]=).with(:development_branch, 'master')
131
+ subject.should_receive(:configure_branch).exactly(3).times
132
+ subject.configure_branches
133
+ end
134
+ end
135
+
136
+ describe "#configure_remotes" do
137
+ context "when the user wants to configure a backup remote" do
138
+ before do
139
+ Zenflow.should_receive(:Ask).with("Use a backup remote?", :options => ["Y", "n"], :default => "n").and_return('y')
140
+ end
141
+
142
+ it 'configures the primary remote and a backup remote' do
143
+ Zenflow.should_receive(:Ask).with("What is the name of your primary remote?", :default => "origin").and_return('origin')
144
+ Zenflow::Config.should_receive(:[]=).with(:remote, 'origin')
145
+ Zenflow.should_receive(:Ask).with("What is the name of your backup remote?", :default => "backup").and_return('backup')
146
+ Zenflow::Config.should_receive(:[]=).with(:backup_remote, 'backup')
147
+ subject.configure_remotes
148
+ end
149
+ end
150
+
151
+ context "when the user does not want to configure a backup remote" do
152
+ before do
153
+ Zenflow.should_receive(:Ask).with("Use a backup remote?", :options => ["Y", "n"], :default => "n").and_return('n')
154
+ end
155
+
156
+ it 'configures the primary remote and a backup remote' do
157
+ Zenflow.should_receive(:Ask).with("What is the name of your primary remote?", :default => "origin").and_return('origin')
158
+ Zenflow::Config.should_receive(:[]=).with(:remote, 'origin')
159
+ Zenflow.should_not_receive(:Ask).with("What is the name of your backup remote?", :default => "backup")
160
+ Zenflow::Config.should_receive(:[]=).with(:backup_remote, false)
161
+ subject.configure_remotes
162
+ end
163
+ end
164
+ end
165
+
166
+ describe "#set_up_changelog" do
167
+ context "when the changelog doesn't already exist" do
168
+ before do
169
+ File.should_receive(:exist?).with("CHANGELOG.md").and_return(false)
170
+ Zenflow.should_receive(:Log).with("Changelog Management")
171
+ end
172
+
173
+ context "when the user wants to set up a changelog" do
174
+ it 'sets up the changelog' do
175
+ Zenflow.should_receive(:Ask).with("Set up a changelog?", :options => ["Y", "n"], :default => "Y").and_return('y')
176
+ Zenflow::Changelog.should_receive(:create)
177
+ subject.set_up_changelog
178
+ end
179
+ end
180
+
181
+ context "when the user does not want to set up a changelog" do
182
+ it 'does not set up the changelog' do
183
+ Zenflow.should_receive(:Ask).with("Set up a changelog?", :options => ["Y", "n"], :default => "Y").and_return('n')
184
+ Zenflow::Changelog.should_not_receive(:create)
185
+ subject.set_up_changelog
186
+ end
187
+ end
188
+ end
189
+
190
+ context "when the changelog already exists" do
191
+ before do
192
+ File.should_receive(:exist?).with("CHANGELOG.md").and_return(true)
193
+ end
194
+
195
+ it 'does not set up the changelog' do
196
+ Zenflow.should_not_receive(:Log).with("Changelog Management")
197
+ Zenflow.should_not_receive(:Ask).with("Set up a changelog?", :options => ["Y", "n"], :default => "Y")
198
+ Zenflow::Changelog.should_not_receive(:create)
199
+ subject.set_up_changelog
200
+ end
201
+ end
202
+ end
203
+
204
+ describe "#confirm_some_stuff" do
205
+ it "confirms staging deployment and code review requirements" do
206
+ Zenflow.should_receive(:Log).with("Confirmations")
207
+ Zenflow.should_receive(:Ask).with("Require deployment to a staging environment?", :options => ["Y", "n"], :default => "Y").and_return('y')
208
+ Zenflow::Config.should_receive(:[]=).with(:confirm_staging, true)
209
+ Zenflow.should_receive(:Ask).with("Require code reviews?", :options => ["Y", "n"], :default => "Y").and_return('n')
210
+ Zenflow::Config.should_receive(:[]=).with(:confirm_review, false)
211
+ subject.confirm_some_stuff
212
+ end
213
+ end
214
+
215
+ describe "#init" do
216
+ context "when zenflow has not been configured" do
217
+ before do
218
+ Zenflow::Config.should_receive(:configured?).and_return(false)
219
+ end
220
+
221
+ it 'configures zenflow' do
222
+ subject.should_not_receive(:already_configured)
223
+ subject.should_receive(:set_up_github)
224
+ subject.should_receive(:authorize_github)
225
+ subject.should_receive(:configure_project)
226
+ subject.should_receive(:configure_branches)
227
+ subject.should_receive(:configure_remotes)
228
+ subject.should_receive(:confirm_some_stuff)
229
+ subject.should_receive(:set_up_changelog)
230
+ Zenflow::Config.should_receive(:save!)
231
+ subject.init
232
+ end
233
+ end
234
+
235
+ context "when zenflow has already been configured" do
236
+ before do
237
+ Zenflow::Config.should_receive(:configured?).and_return(true)
238
+ end
239
+
240
+ context 'and it is forced to initialize' do
241
+ it 'configures zenflow' do
242
+ subject.should_not_receive(:already_configured)
243
+ subject.should_receive(:set_up_github)
244
+ subject.should_receive(:authorize_github)
245
+ subject.should_receive(:configure_project)
246
+ subject.should_receive(:configure_branches)
247
+ subject.should_receive(:configure_remotes)
248
+ subject.should_receive(:confirm_some_stuff)
249
+ subject.should_receive(:set_up_changelog)
250
+ Zenflow::Config.should_receive(:save!)
251
+ subject.init(true)
252
+ end
253
+ end
254
+
255
+ context 'and it is forced to initialize' do
256
+ before do
257
+ Zenflow.should_receive(:Log).with('Warning', :color => :red)
258
+ Zenflow.should_receive(:Ask).and_return('n')
259
+ Zenflow.should_receive(:Log).with('Aborting...', :color => :red)
260
+ end
261
+
262
+ it 'calls already_configured' do
263
+ subject.should_receive(:already_configured).and_call_original
264
+ subject.should_not_receive(:authorize_github)
265
+ subject.should_not_receive(:configure_project)
266
+ subject.should_not_receive(:configure_branches)
267
+ subject.should_not_receive(:configure_remotes)
268
+ subject.should_not_receive(:confirm_some_stuff)
269
+ subject.should_not_receive(:set_up_changelog)
270
+ Zenflow::Config.should_not_receive(:save!)
271
+ lambda{ subject.init}.should raise_error(SystemExit)
272
+ end
273
+ end
274
+ end
275
+ end
276
+
277
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zenflow::Github do
4
+ describe '.user' do
5
+ let(:user){'github-user'}
6
+
7
+ before(:each){
8
+ Zenflow::Shell.should_receive(:run).and_return(user)
9
+ }
10
+
11
+ it "returns the user" do
12
+ expect(Zenflow::Github.user).to eq(user)
13
+ end
14
+ end
15
+
16
+ describe '.authorize' do
17
+ context "when authorization fails" do
18
+ before do
19
+ Zenflow.should_receive("Log").with("Authorizing with GitHub... Enter your GitHub password.")
20
+ Zenflow::Github.should_receive(:user).and_return('adamkittelson')
21
+ Zenflow::Shell.should_receive(:run).and_return('{"message": "failed to authorize, bummer"}')
22
+ end
23
+
24
+ it "logs that something went wrong" do
25
+ Zenflow.should_receive("Log").with("Something went wrong. Error from GitHub was: failed to authorize, bummer")
26
+ Zenflow::Github.authorize
27
+ end
28
+ end
29
+
30
+ context "when authorization succeeds" do
31
+ before do
32
+ Zenflow.should_receive("Log").with("Authorizing with GitHub... Enter your GitHub password.")
33
+ Zenflow::Github.should_receive(:user).and_return('adamkittelson')
34
+ Zenflow::Shell.should_receive(:run).with(%{curl -u "adamkittelson" https://api.github.com/authorizations -d '{"scopes":["repo"], "note":"Zenflow"}' --silent}, :silent => true).and_return('{"token": "super secure token"}')
35
+ end
36
+
37
+ it "adds the token to git config and logs a happy message of success" do
38
+ Zenflow::Shell.should_receive(:run).with("git config --global zenflow.token super secure token", :silent => true)
39
+ Zenflow.should_receive("Log").with("Authorized!")
40
+ Zenflow::Github.authorize
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zenflow::Help do
4
+
5
+ describe "Zenflow.Help" do
6
+ it "initializes and returns a new Zenflow::Help object" do
7
+ expect(Zenflow.Help.class).to eq(Zenflow::Help.new.class)
8
+ end
9
+ end
10
+
11
+ subject { Zenflow::Help.new(:command => 'test-help',
12
+ :summary => "tests Zenflow::Help",
13
+ :usage => "test-help (optional please)",
14
+ :commands => ['test-help', 'spec-help'])}
15
+
16
+ it "has an amazing banner" do
17
+ expect(subject.banner).to eq("\e[36m- Summary ------------------------------\e[0m\ntests Zenflow::Help\n\n\e[36m- Usage --------------------------------\e[0m\ntest-help (optional please)\n\n\e[36m- Available Commands -------------------\e[0m\n[\"test-help\", \"spec-help\"]\n\n\e[36m- Options ------------------------------\e[0m")
18
+ end
19
+
20
+ context "#unknown_command" do
21
+ describe "when the command is missing" do
22
+ it "logs the error and exits" do
23
+ Zenflow.should_receive(:Log).with "Missing command", :color => :red
24
+ lambda {Zenflow::Help.new.unknown_command}.should raise_error(SystemExit)
25
+ end
26
+ end
27
+
28
+ describe "when the command is present" do
29
+ it "logs the error and exits" do
30
+ Zenflow.should_receive(:Log).with "Unknown command \"test-unknown_command\"", :color => :red
31
+ lambda {Zenflow::Help.new(:command => 'test-unknown_command').unknown_command}.should raise_error(SystemExit)
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zenflow do
4
+ describe 'Log' do
5
+ context 'with indentation' do
6
+ before(:each) do
7
+ Zenflow.stub(:LogToFile)
8
+ end
9
+
10
+ it 'indents the text' do
11
+ $stdout.should_receive(:puts).with(/\s+foo/)
12
+ Zenflow.Log('foo', indent: true)
13
+ end
14
+
15
+ it 'adds an arrow the text' do
16
+ $stdout.should_receive(:puts).with(/-----> foo/)
17
+ Zenflow.Log('foo', arrows: true)
18
+ end
19
+
20
+ it 'colorizes the text' do
21
+ $stdout.should_receive(:puts).with(/\e\[34mfoo/)
22
+ Zenflow.Log('foo', color: :blue, arrows: false)
23
+ end
24
+
25
+ it 'does not colorize the text' do
26
+ $stdout.should_receive(:puts).with('foo')
27
+ Zenflow.Log('foo', color: false, arrows: false)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zenflow::PullRequest do
4
+ before(:each){
5
+ Zenflow::Github.stub(:user).and_return('github-user')
6
+ Zenflow::Github.stub(:token).and_return('github-token')
7
+ Zenflow::Github.stub(:zenflow_token).and_return('zenflow-token')
8
+ Zenflow::GithubRequest.base_uri 'https://api.github.com/repos/zencoder/zenflow-example'
9
+ }
10
+
11
+ describe '.list', vcr: { cassette_name: "pull request list" } do
12
+ let(:pull_requests){Zenflow::PullRequest.list}
13
+ it{expect(pull_requests).to be_a_kind_of(Array)}
14
+ it{expect(pull_requests.first).to be_a_kind_of(Zenflow::PullRequest)}
15
+ end
16
+
17
+ describe '.find', vcr: { cassette_name: "pull request find" } do
18
+ let(:pull_request){Zenflow::PullRequest.find(1)}
19
+ it{expect(pull_request).to be_a_kind_of(Zenflow::PullRequest)}
20
+ end
21
+
22
+ describe '.find_by_ref' do
23
+ before(:each){Zenflow.should_receive(:Log).with(Regexp.new('Looking up'))}
24
+
25
+ context 'existing ref', vcr: { cassette_name: "pull request by ref" } do
26
+ let(:pull_request){Zenflow::PullRequest.find_by_ref('feature/example')}
27
+ it{expect(pull_request).to be_a_kind_of(Zenflow::PullRequest)}
28
+ end
29
+
30
+ context 'non-existant ref', vcr: { cassette_name: "pull request for non-existent ref" } do
31
+ let(:pull_request){Zenflow::PullRequest.find_by_ref('feature/foo')}
32
+ it{expect(pull_request).to be_nil}
33
+ end
34
+ end
35
+
36
+ describe '.find_by_ref!' do
37
+ before(:each){Zenflow.should_receive(:Log).with(Regexp.new('Looking up'))}
38
+
39
+ context 'existing ref', vcr: { cassette_name: "pull request by ref" } do
40
+ let(:pull_request){Zenflow::PullRequest.find_by_ref!('feature/example')}
41
+ it{expect(pull_request).to be_a_kind_of(Zenflow::PullRequest)}
42
+ end
43
+
44
+ context 'non-existent ref', vcr: { cassette_name: "pull request for non-existent ref" } do
45
+ let(:ref){'feature/foo'}
46
+
47
+ it 'logs the failure' do
48
+ Zenflow.should_receive(:Log).with(Regexp.new(ref), color: :red)
49
+ expect{Zenflow::PullRequest.find_by_ref!(ref)}.to raise_error(SystemExit)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '.exist?' do
55
+ before(:each){Zenflow.should_receive(:Log).with(Regexp.new('Looking up'))}
56
+
57
+ context 'a valid pull', vcr: { cassette_name: "existing pull request" } do
58
+ it{expect(Zenflow::PullRequest.exist?('feature/example')).to be_true}
59
+ end
60
+
61
+ context 'an invalid pull', vcr: { cassette_name: "unexisting pull request" } do
62
+ it{expect(Zenflow::PullRequest.exist?('feature/foo')).to be_false}
63
+ end
64
+ end
65
+
66
+ describe '.create', vcr: { cassette_name: "create pull request" } do
67
+ let(:request_options) do
68
+ {
69
+ base: 'master',
70
+ head: 'feature/new-branch',
71
+ title: 'Feaure: new-branch',
72
+ body: 'making a new pull request'
73
+ }
74
+ end
75
+ it{ expect(Zenflow::PullRequest.create(request_options)).to(
76
+ be_a_kind_of(Zenflow::PullRequest)
77
+ ) }
78
+ end
79
+
80
+ describe '#valid?' do
81
+ context 'good request', vcr: { cassette_name: "create pull request" } do
82
+ let(:request){Zenflow::PullRequest.create({})}
83
+ it{expect(request.valid?).to be_true}
84
+ end
85
+
86
+ context 'bad request', vcr: { cassette_name: "create bad pull request" } do
87
+ let(:request_options) do
88
+ {
89
+ base: 'master',
90
+ head: 'feature/phoney',
91
+ title: 'this feature does not exist',
92
+ body: 'gonna fail'
93
+ }
94
+ end
95
+ let(:request){Zenflow::PullRequest.create()}
96
+ it{expect(request.valid?).to be_false}
97
+ end
98
+ end
99
+
100
+ describe '#[]' do
101
+ context 'good request', vcr: { cassette_name: "create pull request" } do
102
+ let(:request){Zenflow::PullRequest.create({})}
103
+ it{expect(request["comments"]).to_not be_nil}
104
+ it{expect(request["fdsfa"]).to be_nil}
105
+ end
106
+ end
107
+
108
+ end