git_helper 3.2.0 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +131 -0
  4. data/Guardfile +3 -1
  5. data/README.md +11 -6
  6. data/Rakefile +2 -0
  7. data/bin/git-helper +25 -13
  8. data/lib/git_helper.rb +5 -1
  9. data/lib/git_helper/change_remote.rb +11 -3
  10. data/lib/git_helper/checkout_default.rb +2 -0
  11. data/lib/git_helper/clean_branches.rb +2 -0
  12. data/lib/git_helper/code_request.rb +29 -15
  13. data/lib/git_helper/empty_commit.rb +2 -0
  14. data/lib/git_helper/forget_local_commits.rb +2 -0
  15. data/lib/git_helper/git_config_reader.rb +12 -6
  16. data/lib/git_helper/gitlab_client.rb +2 -0
  17. data/lib/git_helper/highline_cli.rb +15 -69
  18. data/lib/git_helper/local_code.rb +18 -8
  19. data/lib/git_helper/merge_request.rb +88 -68
  20. data/lib/git_helper/new_branch.rb +3 -1
  21. data/lib/git_helper/octokit_client.rb +2 -0
  22. data/lib/git_helper/pull_request.rb +95 -64
  23. data/lib/git_helper/setup.rb +116 -0
  24. data/lib/git_helper/version.rb +3 -1
  25. data/spec/git_helper/change_remote_spec.rb +19 -19
  26. data/spec/git_helper/checkout_default_spec.rb +2 -0
  27. data/spec/git_helper/clean_branches_spec.rb +2 -0
  28. data/spec/git_helper/code_request_spec.rb +27 -24
  29. data/spec/git_helper/empty_commit_spec.rb +2 -0
  30. data/spec/git_helper/forget_local_commits_spec.rb +2 -0
  31. data/spec/git_helper/git_config_reader_spec.rb +32 -4
  32. data/spec/git_helper/gitlab_client_spec.rb +2 -0
  33. data/spec/git_helper/highline_cli_spec.rb +21 -185
  34. data/spec/git_helper/local_code_spec.rb +2 -0
  35. data/spec/git_helper/merge_request_spec.rb +22 -21
  36. data/spec/git_helper/new_branch_spec.rb +4 -2
  37. data/spec/git_helper/octokit_client_spec.rb +2 -0
  38. data/spec/git_helper/pull_request_spec.rb +17 -15
  39. data/spec/git_helper/setup_spec.rb +180 -0
  40. data/spec/spec_helper.rb +3 -1
  41. metadata +22 -5
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
4
  class NewBranch
3
5
  def execute(new_branch_name = nil)
4
- branch_name = new_branch_name || GitHelper::HighlineCli.new.new_branch_name
6
+ branch_name = new_branch_name || GitHelper::HighlineCli.new.ask('New branch name?')
5
7
  puts "Attempting to create a new branch: #{branch_name}"
6
8
  GitHelper::LocalCode.new.new_branch(branch_name)
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
4
  class OctokitClient
3
5
  def client
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
4
  class GitHubPullRequest
3
5
  attr_accessor :local_repo, :local_branch, :local_code, :cli, :base_branch, :new_pr_title
@@ -9,67 +11,79 @@ module GitHelper
9
11
  @cli = options[:cli]
10
12
  end
11
13
 
14
+ # rubocop:disable Metrics/MethodLength
15
+ # rubocop:disable Metrics/AbcSize
12
16
  def create(options)
13
17
  @base_branch = options[:base_branch]
14
18
  @new_pr_title = options[:new_title]
15
19
 
16
- begin
17
- new_pr_body
20
+ new_pr_body
18
21
 
19
- puts "Creating pull request: #{new_pr_title}"
20
- pr = octokit_client.create_pull_request(local_repo, base_branch, local_branch, new_pr_title, new_pr_body)
21
- puts "Pull request successfully created: #{pr.html_url}"
22
- rescue Octokit::UnprocessableEntity => e
23
- puts 'Could not create pull request:'
24
- if e.message.include?('pull request already exists')
25
- puts ' A pull request already exists for this branch'
26
- elsif e.message.include?('No commits between')
27
- puts ' No commits have been pushed to GitHub'
28
- else
29
- puts e.message
30
- end
31
- rescue Exception => e
32
- puts 'Could not create pull request:'
22
+ puts "Creating pull request: #{new_pr_title}"
23
+ pr = octokit_client.create_pull_request(
24
+ local_repo,
25
+ base_branch,
26
+ local_branch,
27
+ new_pr_title,
28
+ new_pr_body
29
+ )
30
+ puts "Pull request successfully created: #{pr.html_url}"
31
+ rescue Octokit::UnprocessableEntity => e
32
+ puts 'Could not create pull request:'
33
+ if e.message.include?('pull request already exists')
34
+ puts ' A pull request already exists for this branch'
35
+ elsif e.message.include?('No commits between')
36
+ puts ' No commits have been pushed to GitHub'
37
+ else
33
38
  puts e.message
34
39
  end
40
+ rescue StandardError => e
41
+ puts 'Could not create pull request:'
42
+ puts e.message
35
43
  end
44
+ # rubocop:enable Metrics/AbcSize
45
+ # rubocop:enable Metrics/MethodLength
36
46
 
47
+ # rubocop:disable Metrics/MethodLength
48
+ # rubocop:disable Metrics/AbcSize
37
49
  def merge
38
- begin
39
- pr_id
40
- merge_method
41
-
42
- puts "Merging pull request: #{pr_id}"
43
- merge = octokit_client.merge_pull_request(local_repo, pr_id, existing_pr.title, { merge_method: merge_method })
44
- puts "Pull request successfully merged: #{merge.sha}"
45
- rescue Octokit::UnprocessableEntity => e
46
- puts 'Could not merge pull request:'
47
- puts e.message
48
- rescue Octokit::NotFound => e
49
- puts 'Could not merge pull request:'
50
- puts " Could not a locate a pull request to merge with ID #{pr_id}"
51
- rescue Octokit::MethodNotAllowed => e
52
- puts 'Could not merge pull request:'
53
- if e.message.include?('405 - Required status check')
54
- puts ' A required status check has not passed'
55
- elsif e.message.include?('405 - Base branch was modified')
56
- puts ' The base branch has been modified'
57
- elsif e.message.include?('405 - Pull Request is not mergeable')
58
- puts ' The pull request is not mergeable'
59
- elsif e.message.include?('405 - Rebase merges are not allowed on this repository')
60
- puts ' Rebase merges are not allowed on this repository'
61
- elsif e.message.include?('405 - Merge commits are not allowed on this repository')
62
- puts ' Merge commits are not allowed on this repository'
63
- elsif e.message.include?('405 - Squash commits are not allowed on this repository')
64
- puts ' Squash merges are not allowed on this repository'
65
- else
66
- puts e.message
67
- end
68
- rescue Exception => e
69
- puts 'Could not merge pull request:'
50
+ pr_id
51
+ merge_method
52
+
53
+ puts "Merging pull request: #{pr_id}"
54
+ merge = octokit_client.merge_pull_request(
55
+ local_repo,
56
+ pr_id,
57
+ existing_pr.title,
58
+ { merge_method: merge_method }
59
+ )
60
+ puts "Pull request successfully merged: #{merge.sha}"
61
+ rescue Octokit::NotFound
62
+ puts 'Could not merge pull request:'
63
+ puts " Could not a locate a pull request to merge with ID #{pr_id}"
64
+ rescue Octokit::MethodNotAllowed => e
65
+ puts 'Could not merge pull request:'
66
+ if e.message.include?('405 - Required status check')
67
+ puts ' A required status check has not passed'
68
+ elsif e.message.include?('405 - Base branch was modified')
69
+ puts ' The base branch has been modified'
70
+ elsif e.message.include?('405 - Pull Request is not mergeable')
71
+ puts ' The pull request is not mergeable'
72
+ elsif e.message.include?('405 - Rebase merges are not allowed on this repository')
73
+ puts ' Rebase merges are not allowed on this repository'
74
+ elsif e.message.include?('405 - Merge commits are not allowed on this repository')
75
+ puts ' Merge commits are not allowed on this repository'
76
+ elsif e.message.include?('405 - Squash commits are not allowed on this repository')
77
+ puts ' Squash merges are not allowed on this repository'
78
+ else
70
79
  puts e.message
71
80
  end
81
+ rescue StandardError => e
82
+ puts 'Could not merge pull request:'
83
+ puts e.message
72
84
  end
85
+ # rubocop:enable Metrics/AbcSize
86
+ # rubocop:enable Metrics/MethodLength
73
87
 
74
88
  private def new_pr_body
75
89
  @new_pr_body ||= template_name_to_apply ? local_code.read_template(template_name_to_apply) : ''
@@ -77,39 +91,56 @@ module GitHelper
77
91
 
78
92
  private def template_name_to_apply
79
93
  return @template_name_to_apply if @template_name_to_apply
94
+
80
95
  @template_name_to_apply = nil
81
96
 
82
- unless pr_template_options.empty?
83
- if pr_template_options.count == 1
84
- apply_single_template = cli.apply_template?(pr_template_options.first, 'pull')
85
- @template_name_to_apply = pr_template_options.first if apply_single_template
86
- else
87
- response = cli.template_to_apply(pr_template_options, 'pull')
88
- @template_name_to_apply = response unless response == 'None'
89
- end
90
- end
97
+ determine_template unless pr_template_options.empty?
91
98
 
92
99
  @template_name_to_apply
93
100
  end
94
101
 
102
+ # rubocop:disable Metrics/MethodLength
103
+ private def determine_template
104
+ if pr_template_options.count == 1
105
+ apply_single_template = cli.ask_yes_no(
106
+ "Apply the pull request template from #{pr_template_options.first}? (y/n)"
107
+ )
108
+ @template_name_to_apply = pr_template_options.first if apply_single_template
109
+ else
110
+ response = cli.ask_options(
111
+ 'Which pull request template should be applied?', pr_template_options << 'None'
112
+ )
113
+ @template_name_to_apply = response unless response == 'None'
114
+ end
115
+ end
116
+ # rubocop:enable Metrics/MethodLength
117
+
95
118
  private def pr_template_options
96
- @pr_template_options ||= local_code.template_options({
97
- template_directory: '.github',
98
- nested_directory_name: 'PULL_REQUEST_TEMPLATE',
99
- non_nested_file_name: 'pull_request_template'
100
- })
119
+ @pr_template_options ||= local_code.template_options(
120
+ {
121
+ template_directory: '.github',
122
+ nested_directory_name: 'PULL_REQUEST_TEMPLATE',
123
+ non_nested_file_name: 'pull_request_template'
124
+ }
125
+ )
101
126
  end
102
127
 
103
128
  private def pr_id
104
- @pr_id ||= cli.code_request_id('Pull')
129
+ @pr_id ||= cli.ask('Pull Request ID?')
105
130
  end
106
131
 
107
132
  private def merge_method
108
- @merge_method ||= merge_options.length == 1 ? merge_options.first : cli.merge_method(merge_options)
133
+ @merge_method ||=
134
+ if merge_options.length == 1
135
+ merge_options.first
136
+ else
137
+ cli.ask_options('Merge method?', merge_options)
138
+ end
109
139
  end
110
140
 
111
141
  private def merge_options
112
142
  return @merge_options if @merge_options
143
+
113
144
  merge_options = []
114
145
  merge_options << 'merge' if existing_project.allow_merge_commit
115
146
  merge_options << 'squash' if existing_project.allow_squash_merge
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitHelper
4
+ class Setup
5
+ def execute
6
+ execute_config_file
7
+ execute_plugins
8
+ end
9
+
10
+ private def execute_config_file
11
+ if config_file_exists?
12
+ answer = highline.ask_yes_no(
13
+ "It looks like the #{config_file} file already exists. Do you wish to replace it? (y/n)"
14
+ )
15
+ puts
16
+ else
17
+ answer = true
18
+ end
19
+
20
+ create_or_update_config_file if answer
21
+ end
22
+
23
+ private def execute_plugins
24
+ answer = highline.ask_yes_no(
25
+ 'Do you wish to set up the Git Helper plugins? (y/n) (This process will ' \
26
+ 'attempt to use your GitHub personal access token to authenticate)'
27
+ )
28
+
29
+ return unless answer
30
+
31
+ create_or_update_plugin_files
32
+ puts "\nNow add this line to your ~/.bash_profile:\n" \
33
+ ' export PATH=/path/to/computer/home/.git_helper/plugins:$PATH'
34
+ puts "\nDone!"
35
+ end
36
+
37
+ private def create_or_update_config_file
38
+ contents = generate_file_contents
39
+ puts "\nCreating or updating your #{config_file} file..."
40
+ File.open(config_file, 'w') { |file| file.puts contents }
41
+ puts "\nDone!\n\n"
42
+ end
43
+
44
+ private def config_file_exists?
45
+ File.exist?(config_file)
46
+ end
47
+
48
+ # rubocop:disable Metrics/MethodLength
49
+ private def generate_file_contents
50
+ file_contents = ''.dup
51
+
52
+ if highline.ask_yes_no('Do you wish to set up GitHub credentials? (y/n)')
53
+ file_contents << ":github_user: #{ask_question('GitHub username?')}\n"
54
+ file_contents << ':github_token: ' \
55
+ "#{ask_question('GitHub personal access token? (Navigate to https://github.com/settings/tokens ' \
56
+ 'to create a new personal access token)')}\n"
57
+ end
58
+
59
+ if highline.ask_yes_no("\nDo you wish to set up GitLab credentials? (y/n)")
60
+ file_contents << ":gitlab_user: #{ask_question('GitLab username?')}\n"
61
+ file_contents << ':gitlab_token: ' \
62
+ "#{ask_question(
63
+ 'GitLab personal access token? (Navigate to https://gitlab.com/-/profile/personal_access_tokens' \
64
+ ' to create a new personal access token)'
65
+ )}\n"
66
+ end
67
+
68
+ file_contents.strip
69
+ end
70
+ # rubocop:enable Metrics/MethodLength
71
+
72
+ private def ask_question(prompt)
73
+ answer = highline.ask("\n#{prompt}")
74
+
75
+ if answer.empty?
76
+ puts "\nThis question is required."
77
+ ask_question(prompt)
78
+ else
79
+ answer
80
+ end
81
+ end
82
+
83
+ # rubocop:disable Metrics/MethodLength
84
+ # rubocop:disable Metrics/AbcSize
85
+ private def create_or_update_plugin_files
86
+ plugins_dir = "#{Dir.pwd.scan(%r{\A/\w*/\w*/}).first}.git_helper/plugins"
87
+ plugins_url = 'https://api.github.com/repos/emmahsax/git_helper/contents/plugins'
88
+ header = 'Accept: application/vnd.github.v3.raw'
89
+ token = git_config_reader.github_token
90
+ user = git_config_reader.github_user
91
+
92
+ Dir.mkdir(plugins_dir) unless File.exist?(plugins_dir)
93
+
94
+ all_plugins = JSON.parse(`curl -s -u #{user}:#{token} -H "#{header}" -L "#{plugins_url}"`)
95
+
96
+ all_plugins.each do |plugin|
97
+ plugin_content = `curl -s -u #{user}:#{token} -H "#{header}" -L "#{plugins_url}/#{plugin['name']}"`
98
+ File.open("#{plugins_dir}/#{plugin['name']}", 'w') { |file| file.puts plugin_content }
99
+ end
100
+ end
101
+ # rubocop:enable Metrics/MethodLength
102
+ # rubocop:enable Metrics/AbcSize
103
+
104
+ private def config_file
105
+ git_config_reader.git_config_file_path
106
+ end
107
+
108
+ private def git_config_reader
109
+ @git_config_reader ||= GitHelper::GitConfigReader.new
110
+ end
111
+
112
+ private def highline
113
+ @highline ||= GitHelper::HighlineCli.new
114
+ end
115
+ end
116
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
- VERSION = '3.2.0'
4
+ VERSION = '3.3.2'
3
5
  end
@@ -1,24 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
4
6
  describe GitHelper::ChangeRemote do
5
7
  let(:remote1) { "git@github.com:#{old_owner}/#{project}.git" }
6
8
  let(:project) { Faker::Lorem.word }
7
- let(:cli) { double(:highline_cli, process_directory_remotes?: true) }
9
+ let(:cli) { double(:highline_cli, ask_yes_no: true) }
8
10
  let(:old_owner) { Faker::Internet.username }
9
11
  let(:new_owner) { Faker::Internet.username }
10
- let(:directory_entries) { [ '.', '..', project, Faker::Lorem.word, Faker::Lorem.word ] }
12
+ let(:directory_entries) { ['.', '..', project, Faker::Lorem.word, Faker::Lorem.word] }
11
13
 
12
14
  let(:local_code) do
13
15
  double(:local_code,
14
- remotes: [remote1],
15
- remote_name: Faker::Lorem.word,
16
- ssh_remote?: true,
17
- https_remote?: false,
18
- remote_project: project,
19
- remote_source: 'github.com',
20
- change_remote: true
21
- )
16
+ remotes: [remote1],
17
+ remote_name: Faker::Lorem.word,
18
+ ssh_remote?: true,
19
+ https_remote?: false,
20
+ remote_project: project,
21
+ remote_source: 'github.com',
22
+ change_remote: true)
22
23
  end
23
24
 
24
25
  subject { GitHelper::ChangeRemote.new(old_owner, new_owner) }
@@ -73,7 +74,7 @@ describe GitHelper::ChangeRemote do
73
74
  end
74
75
 
75
76
  context 'when the user says not to process the directory' do
76
- let(:cli) { double(:highline_cli, process_directory_remotes?: false) }
77
+ let(:cli) { double(:highline_cli, ask_yes_no: false) }
77
78
 
78
79
  it 'should not call to process the directory' do
79
80
  expect(subject).not_to receive(:process_git_repository)
@@ -138,14 +139,13 @@ describe GitHelper::ChangeRemote do
138
139
  context 'https remote' do
139
140
  let(:local_code) do
140
141
  double(:local_code,
141
- remotes: [remote1],
142
- remote_name: Faker::Lorem.word,
143
- ssh_remote?: false,
144
- https_remote?: false,
145
- remote_project: project,
146
- remote_source: 'github.com',
147
- change_remote: true
148
- )
142
+ remotes: [remote1],
143
+ remote_name: Faker::Lorem.word,
144
+ ssh_remote?: false,
145
+ https_remote?: false,
146
+ remote_project: project,
147
+ remote_source: 'github.com',
148
+ change_remote: true)
149
149
  end
150
150
 
151
151
  it 'should ask if the remote is SSH' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -101,19 +103,19 @@ describe GitHelper::CodeRequest do
101
103
 
102
104
  describe '#ask_for_clarification' do
103
105
  it 'should ask the CLI' do
104
- expect(highline_cli).to receive(:conflicting_remote_clarification).and_return('github')
106
+ expect(highline_cli).to receive(:ask).and_return('github')
105
107
  subject.send(:ask_for_clarification)
106
108
  end
107
109
 
108
110
  context 'when response is github' do
109
111
  it 'should return github_pull_request' do
110
- allow(highline_cli).to receive(:conflicting_remote_clarification).and_return('github')
112
+ allow(highline_cli).to receive(:ask).and_return('github')
111
113
  expect(subject).to receive(:github_pull_request)
112
114
  subject.send(:ask_for_clarification)
113
115
  end
114
116
 
115
117
  it 'should return github_pull_request' do
116
- allow(highline_cli).to receive(:conflicting_remote_clarification).and_return('Github')
118
+ allow(highline_cli).to receive(:ask).and_return('Github')
117
119
  expect(subject).to receive(:github_pull_request)
118
120
  subject.send(:ask_for_clarification)
119
121
  end
@@ -121,21 +123,22 @@ describe GitHelper::CodeRequest do
121
123
 
122
124
  context 'when response is gitlab' do
123
125
  it 'should return gitlab_merge_request' do
124
- allow(highline_cli).to receive(:conflicting_remote_clarification).and_return('gitlab')
126
+ allow(highline_cli).to receive(:ask).and_return('gitlab')
125
127
  expect(subject).to receive(:gitlab_merge_request)
126
128
  subject.send(:ask_for_clarification)
127
129
  end
128
130
 
129
131
  it 'should return gitlab_merge_request' do
130
- allow(highline_cli).to receive(:conflicting_remote_clarification).and_return('Gitlab')
132
+ allow(highline_cli).to receive(:ask).and_return('Gitlab')
131
133
  expect(subject).to receive(:gitlab_merge_request)
132
134
  subject.send(:ask_for_clarification)
133
135
  end
134
136
  end
135
137
 
138
+ # Unfortunately this test sometimes fails... just rerun the tests if it does
136
139
  context 'when response is neither' do
137
140
  it 'should raise an error' do
138
- allow(highline_cli).to receive(:conflicting_remote_clarification).and_return(Faker::Lorem.word)
141
+ allow(highline_cli).to receive(:ask).and_return(Faker::Lorem.word)
139
142
  expect(subject).to receive(:exit)
140
143
  subject.send(:ask_for_clarification)
141
144
  end
@@ -173,23 +176,23 @@ describe GitHelper::CodeRequest do
173
176
  describe '#base_branch' do
174
177
  it 'should call the default branch' do
175
178
  expect(subject).to receive(:default_branch)
176
- allow(highline_cli).to receive(:base_branch_default?).at_least(:once)
177
- allow(highline_cli).to receive(:base_branch).at_least(:once).and_return(base_branch)
179
+ allow(highline_cli).to receive(:ask_yes_no).at_least(:once)
180
+ allow(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
178
181
  subject.send(:base_branch)
179
182
  end
180
183
 
181
184
  it 'should ask the CLI to ask the user' do
182
185
  allow(subject).to receive(:default_branch)
183
- expect(highline_cli).to receive(:base_branch_default?).at_least(:once)
184
- allow(highline_cli).to receive(:base_branch).at_least(:once).and_return(base_branch)
186
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once)
187
+ allow(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
185
188
  subject.send(:base_branch)
186
189
  end
187
190
 
188
191
  context 'if the user says no' do
189
192
  it 'definitely asks for the users base branch' do
190
193
  allow(subject).to receive(:default_branch)
191
- expect(highline_cli).to receive(:base_branch_default?).at_least(:once).and_return(false)
192
- expect(highline_cli).to receive(:base_branch).at_least(:once).and_return(base_branch)
194
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(false)
195
+ expect(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
193
196
  subject.send(:base_branch)
194
197
  end
195
198
  end
@@ -197,7 +200,7 @@ describe GitHelper::CodeRequest do
197
200
  context 'if the user says yes' do
198
201
  it 'does not ask for the users base branch' do
199
202
  allow(subject).to receive(:default_branch)
200
- expect(highline_cli).to receive(:base_branch_default?).at_least(:once).and_return(true)
203
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(true)
201
204
  expect(highline_cli).not_to receive(:base_branch)
202
205
  subject.send(:base_branch)
203
206
  end
@@ -215,32 +218,32 @@ describe GitHelper::CodeRequest do
215
218
  describe '#new_code_request_title' do
216
219
  it 'should call autogenerated title method' do
217
220
  expect(subject).to receive(:autogenerated_title)
218
- allow(highline_cli).to receive(:accept_autogenerated_title?).at_least(:once)
219
- allow(highline_cli).to receive(:title).at_least(:once).and_return(title)
221
+ allow(highline_cli).to receive(:ask_yes_no).at_least(:once)
222
+ allow(highline_cli).to receive(:ask).at_least(:once).and_return(title)
220
223
  subject.send(:new_code_request_title)
221
224
  end
222
225
 
223
226
  it 'should ask the CLI to ask the user' do
224
- allow(subject).to receive(:autogenerated_title)
225
- expect(highline_cli).to receive(:accept_autogenerated_title?).at_least(:once)
226
- allow(highline_cli).to receive(:title).at_least(:once).and_return(title)
227
+ allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
228
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once)
229
+ allow(highline_cli).to receive(:ask).at_least(:once).and_return(title)
227
230
  subject.send(:new_code_request_title)
228
231
  end
229
232
 
230
233
  context 'if the user says no' do
231
234
  it 'definitely asks for the users title' do
232
- allow(subject).to receive(:autogenerated_title)
233
- expect(highline_cli).to receive(:accept_autogenerated_title?).at_least(:once).and_return(false)
234
- expect(highline_cli).to receive(:title).at_least(:once).and_return(title)
235
+ allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
236
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(false)
237
+ expect(highline_cli).to receive(:ask).at_least(:once).and_return(title)
235
238
  subject.send(:new_code_request_title)
236
239
  end
237
240
  end
238
241
 
239
242
  context 'if the user says yes to original title' do
240
243
  it 'does not ask for the users chosen title' do
241
- allow(subject).to receive(:autogenerated_title)
242
- expect(highline_cli).to receive(:accept_autogenerated_title?).at_least(:once).and_return(true)
243
- expect(highline_cli).not_to receive(:title)
244
+ allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
245
+ expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(true)
246
+ expect(highline_cli).not_to receive(:ask)
244
247
  subject.send(:new_code_request_title)
245
248
  end
246
249
  end