zenflow 0.8.0

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.
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