license-acceptance 1.0.13 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,13 @@
1
- require 'tty-prompt'
2
- require 'pastel'
1
+ autoload :TTY, "tty-prompt"
2
+ require "pastel"
3
3
  require "license_acceptance/logger"
4
4
  require "license_acceptance/strategy/base"
5
- require "timeout"
5
+ require "timeout" unless defined?(Timeout)
6
6
 
7
7
  module LicenseAcceptance
8
8
  module Strategy
9
9
 
10
- # Interactive prompt for accepting and persistnce license acceptance, or failing with custom exit code
10
+ # Interactive prompt for accepting and persistence license acceptance, or failing with custom exit code
11
11
  class Prompt < Base
12
12
  include Logger
13
13
 
@@ -17,30 +17,30 @@ module LicenseAcceptance
17
17
  @output = config.output
18
18
  end
19
19
 
20
- WIDTH = 50.freeze
20
+ WIDTH = 50
21
21
  PASTEL = Pastel.new
22
22
  BORDER = "+---------------------------------------------+".freeze
23
23
  YES = PASTEL.green.bold("yes")
24
- CHECK = PASTEL.green("✔")
24
+ CHECK = PASTEL.green("✔")
25
25
 
26
26
  def request(missing_licenses, &persist_callback)
27
27
  logger.debug("Requesting a license for #{missing_licenses.map(&:id)}")
28
28
  c = missing_licenses.size
29
- s = c > 1 ? "s": ""
29
+ s = c > 1 ? "s" : ""
30
30
 
31
31
  acceptance_question = "Do you accept the #{c} product license#{s} (#{YES}/no)?"
32
32
  output.puts <<~EOM
33
- #{BORDER}
34
- Chef License Acceptance
33
+ #{BORDER}
34
+ Chef License Acceptance
35
35
 
36
- Before you can continue, #{c} product license#{s}
37
- must be accepted. View the license at
38
- https://www.chef.io/end-user-license-agreement/
36
+ Before you can continue, #{c} product license#{s}
37
+ must be accepted. View the license at
38
+ https://www.chef.io/end-user-license-agreement/
39
39
 
40
- License#{s} that need accepting:
41
- * #{missing_licenses.map(&:pretty_name).join("\n * ")}
40
+ License#{s} that need accepting:
41
+ * #{missing_licenses.map(&:pretty_name).join("\n * ")}
42
42
 
43
- #{acceptance_question}
43
+ #{acceptance_question}
44
44
 
45
45
  EOM
46
46
 
@@ -51,10 +51,10 @@ module LicenseAcceptance
51
51
 
52
52
  output.puts <<~EOM
53
53
 
54
- If you do not accept this license you will
55
- not be able to use Chef products.
54
+ If you do not accept this license you will
55
+ not be able to use Chef products.
56
56
 
57
- #{acceptance_question}
57
+ #{acceptance_question}
58
58
 
59
59
  EOM
60
60
 
@@ -62,7 +62,7 @@ module LicenseAcceptance
62
62
  if answer != "yes"
63
63
  output.puts BORDER
64
64
  end
65
- return answer
65
+ answer
66
66
  end
67
67
 
68
68
  private
@@ -73,12 +73,12 @@ module LicenseAcceptance
73
73
 
74
74
  answer = "no"
75
75
  begin
76
- Timeout::timeout(60, PromptTimeout) do
76
+ Timeout.timeout(60, PromptTimeout) do
77
77
  answer = prompt.ask(">") do |q|
78
78
  q.modify :down, :trim
79
79
  q.required true
80
80
  q.messages[:required?] = "You must enter 'yes' or 'no'"
81
- q.validate /^\s*(yes|no)\s*$/i
81
+ q.validate(/^\s*(yes|no)\s*$/i)
82
82
  q.messages[:valid?] = "You must enter 'yes' or 'no'"
83
83
  end
84
84
  end
@@ -95,13 +95,13 @@ module LicenseAcceptance
95
95
  output.puts "#{CHECK} #{c} product license#{s} persisted.\n\n"
96
96
  else
97
97
  output.puts <<~EOM
98
- #{CHECK} #{c} product license#{s} accepted.
99
- Could not persist acceptance:\n\t* #{errs.map(&:message).join("\n\t* ")}
98
+ #{CHECK} #{c} product license#{s} accepted.
99
+ Could not persist acceptance:\n\t* #{errs.map(&:message).join("\n\t* ")}
100
100
  EOM
101
101
  end
102
102
  return true
103
103
  end
104
- return false
104
+ false
105
105
  end
106
106
  end
107
107
 
@@ -12,17 +12,20 @@ module LicenseAcceptance
12
12
  end
13
13
 
14
14
  def accepted?
15
- value == ACCEPT
15
+ String(value).downcase == ACCEPT
16
16
  end
17
17
 
18
18
  def silent?
19
- value == ACCEPT_SILENT
19
+ String(value).downcase == ACCEPT_SILENT
20
20
  end
21
21
 
22
22
  def no_persist?
23
- value == ACCEPT_NO_PERSIST
23
+ String(value).downcase == ACCEPT_NO_PERSIST
24
24
  end
25
- end
26
25
 
26
+ def value?
27
+ !!value
28
+ end
29
+ end
27
30
  end
28
31
  end
@@ -1,3 +1,3 @@
1
1
  module LicenseAcceptance
2
- VERSION = "1.0.13"
2
+ VERSION = "2.1.2".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: license-acceptance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - tyler-ball
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-12 00:00:00.000000000 Z
11
+ date: 2020-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pastel
@@ -44,140 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.3'
47
+ version: '0.6'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.3'
54
+ version: '0.6'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: tty-prompt
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.18'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.18'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '10.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '10.0'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '3.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '3.0'
97
- - !ruby/object:Gem::Dependency
98
- name: pry
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '0.12'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '0.12'
111
- - !ruby/object:Gem::Dependency
112
- name: pry-byebug
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '3.6'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '3.6'
125
- - !ruby/object:Gem::Dependency
126
- name: pry-stack_explorer
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.4'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.4'
139
- - !ruby/object:Gem::Dependency
140
- name: mixlib-cli
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '1.7'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '1.7'
153
- - !ruby/object:Gem::Dependency
154
- name: thor
155
57
  requirement: !ruby/object:Gem::Requirement
156
58
  requirements:
157
59
  - - "~>"
158
60
  - !ruby/object:Gem::Version
159
61
  version: '0.20'
160
- type: :development
62
+ type: :runtime
161
63
  prerelease: false
162
64
  version_requirements: !ruby/object:Gem::Requirement
163
65
  requirements:
164
66
  - - "~>"
165
67
  - !ruby/object:Gem::Version
166
68
  version: '0.20'
167
- - !ruby/object:Gem::Dependency
168
- name: climate_control
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '0.2'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '0.2'
181
69
  description: Chef End User License Agreement Acceptance for Ruby products
182
70
  email:
183
71
  - tball@chef.io
@@ -186,9 +74,7 @@ extensions: []
186
74
  extra_rdoc_files: []
187
75
  files:
188
76
  - Gemfile
189
- - Gemfile.lock
190
77
  - LICENSE
191
- - Rakefile
192
78
  - config/product_info.toml
193
79
  - lib/license_acceptance/acceptor.rb
194
80
  - lib/license_acceptance/cli_flags/mixlib_cli.rb
@@ -205,18 +91,6 @@ files:
205
91
  - lib/license_acceptance/strategy/prompt.rb
206
92
  - lib/license_acceptance/strategy/provided_value.rb
207
93
  - lib/license_acceptance/version.rb
208
- - spec/license_acceptance/acceptor_spec.rb
209
- - spec/license_acceptance/cli_flags/mixlib_cli_spec.rb
210
- - spec/license_acceptance/cli_flags/thor_spec.rb
211
- - spec/license_acceptance/config_spec.rb
212
- - spec/license_acceptance/product_reader_spec.rb
213
- - spec/license_acceptance/product_spec.rb
214
- - spec/license_acceptance/strategy/argument_spec.rb
215
- - spec/license_acceptance/strategy/environment_spec.rb
216
- - spec/license_acceptance/strategy/file_spec.rb
217
- - spec/license_acceptance/strategy/prompt_spec.rb
218
- - spec/license_acceptance/strategy/provided_value_spec.rb
219
- - spec/spec_helper.rb
220
94
  homepage: https://github.com/chef/license-acceptance/
221
95
  licenses:
222
96
  - Apache-2.0
@@ -229,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
229
103
  requirements:
230
104
  - - ">="
231
105
  - !ruby/object:Gem::Version
232
- version: '2.3'
106
+ version: '2.4'
233
107
  required_rubygems_version: !ruby/object:Gem::Requirement
234
108
  requirements:
235
109
  - - ">="
@@ -1,91 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- license-acceptance (1.0.13)
5
- pastel (~> 0.7)
6
- tomlrb (~> 1.2)
7
- tty-box (~> 0.3)
8
- tty-prompt (~> 0.18)
9
-
10
- GEM
11
- remote: https://rubygems.org/
12
- specs:
13
- binding_of_caller (0.8.0)
14
- debug_inspector (>= 0.0.1)
15
- byebug (11.0.1)
16
- climate_control (0.2.0)
17
- coderay (1.1.2)
18
- debug_inspector (0.0.3)
19
- diff-lcs (1.3)
20
- equatable (0.5.0)
21
- method_source (0.9.2)
22
- mixlib-cli (1.7.0)
23
- necromancer (0.5.0)
24
- pastel (0.7.2)
25
- equatable (~> 0.5.0)
26
- tty-color (~> 0.4.0)
27
- pry (0.12.2)
28
- coderay (~> 1.1.0)
29
- method_source (~> 0.9.0)
30
- pry-byebug (3.7.0)
31
- byebug (~> 11.0)
32
- pry (~> 0.10)
33
- pry-stack_explorer (0.4.9.3)
34
- binding_of_caller (>= 0.7)
35
- pry (>= 0.9.11)
36
- rake (10.5.0)
37
- rspec (3.8.0)
38
- rspec-core (~> 3.8.0)
39
- rspec-expectations (~> 3.8.0)
40
- rspec-mocks (~> 3.8.0)
41
- rspec-core (3.8.0)
42
- rspec-support (~> 3.8.0)
43
- rspec-expectations (3.8.4)
44
- diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.8.0)
46
- rspec-mocks (3.8.0)
47
- diff-lcs (>= 1.2.0, < 2.0)
48
- rspec-support (~> 3.8.0)
49
- rspec-support (3.8.2)
50
- strings (0.1.5)
51
- strings-ansi (~> 0.1)
52
- unicode-display_width (~> 1.5)
53
- unicode_utils (~> 1.4)
54
- strings-ansi (0.1.0)
55
- thor (0.20.3)
56
- tomlrb (1.2.8)
57
- tty-box (0.4.0)
58
- pastel (~> 0.7.2)
59
- strings (~> 0.1.5)
60
- tty-cursor (~> 0.7)
61
- tty-color (0.4.3)
62
- tty-cursor (0.7.0)
63
- tty-prompt (0.19.0)
64
- necromancer (~> 0.5.0)
65
- pastel (~> 0.7.0)
66
- tty-reader (~> 0.6.0)
67
- tty-reader (0.6.0)
68
- tty-cursor (~> 0.7)
69
- tty-screen (~> 0.7)
70
- wisper (~> 2.0.0)
71
- tty-screen (0.7.0)
72
- unicode-display_width (1.6.0)
73
- unicode_utils (1.4.0)
74
- wisper (2.0.0)
75
-
76
- PLATFORMS
77
- ruby
78
-
79
- DEPENDENCIES
80
- climate_control (~> 0.2)
81
- license-acceptance!
82
- mixlib-cli (~> 1.7)
83
- pry (~> 0.12)
84
- pry-byebug (~> 3.6)
85
- pry-stack_explorer (~> 0.4)
86
- rake (~> 10.0)
87
- rspec (~> 3.0)
88
- thor (~> 0.20)
89
-
90
- BUNDLED WITH
91
- 1.17.3
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
@@ -1,302 +0,0 @@
1
- require "spec_helper"
2
- require "license_acceptance/acceptor"
3
-
4
- RSpec.describe LicenseAcceptance::Acceptor do
5
- it "has a version number" do
6
- expect(LicenseAcceptance::VERSION).not_to be nil
7
- end
8
-
9
- let(:output) do
10
- d = StringIO.new
11
- allow(d).to receive(:isatty).and_return(true)
12
- d
13
- end
14
- let(:opts) { { output: output } }
15
- let(:reader) { instance_double(LicenseAcceptance::ProductReader) }
16
- let(:acc) { LicenseAcceptance::Acceptor.new(opts) }
17
- let(:product) { instance_double(LicenseAcceptance::Product, id: "foo", pretty_name: "Foo") }
18
- let(:version) { "version" }
19
- let(:relationship) { instance_double(LicenseAcceptance::ProductRelationship, parent: product) }
20
- let(:missing) { [product] }
21
-
22
- describe "#check_and_persist!" do
23
- before do
24
- expect(LicenseAcceptance::ProductReader).to receive(:new).and_return(reader)
25
- expect(reader).to receive(:read)
26
- end
27
-
28
- let(:err) { LicenseAcceptance::LicenseNotAcceptedError.new(product, [product]) }
29
- it "outputs an error message to stdout and exits when license acceptance is declined" do
30
- expect(acc).to receive(:check_and_persist).and_raise(err)
31
- expect { acc.check_and_persist!(product.id, version) }.to raise_error(SystemExit)
32
- expect(output.string).to match(/#{product.pretty_name}/)
33
- end
34
- end
35
-
36
- describe "#check_and_persist" do
37
- let(:file_acc) { instance_double(LicenseAcceptance::Strategy::File) }
38
- let(:arg_acc) { instance_double(LicenseAcceptance::Strategy::Argument) }
39
- let(:prompt_acc) { instance_double(LicenseAcceptance::Strategy::Prompt) }
40
- let(:env_acc) { instance_double(LicenseAcceptance::Strategy::Environment) }
41
- let(:provided_acc) { instance_double(LicenseAcceptance::Strategy::ProvidedValue) }
42
-
43
- before do
44
- expect(LicenseAcceptance::ProductReader).to receive(:new).and_return(reader)
45
- expect(LicenseAcceptance::Strategy::File).to receive(:new).and_return(file_acc)
46
- expect(LicenseAcceptance::Strategy::Argument).to receive(:new).and_return(arg_acc)
47
- expect(LicenseAcceptance::Strategy::Prompt).to receive(:new).and_return(prompt_acc)
48
- expect(LicenseAcceptance::Strategy::Environment).to receive(:new).and_return(env_acc)
49
- expect(LicenseAcceptance::Strategy::ProvidedValue).to receive(:new).and_return(provided_acc)
50
-
51
- allow(provided_acc).to receive(:no_persist?).and_return(false)
52
- allow(env_acc).to receive(:no_persist?).and_return(false)
53
- allow(arg_acc).to receive(:no_persist?).and_return(false)
54
- allow(provided_acc).to receive(:accepted?).and_return(false)
55
- allow(env_acc).to receive(:accepted?).and_return(false)
56
- allow(arg_acc).to receive(:accepted?).and_return(false)
57
- allow(provided_acc).to receive(:silent?).and_return(false)
58
- allow(env_acc).to receive(:silent?).and_return(false)
59
- allow(arg_acc).to receive(:silent?).and_return(false)
60
-
61
- expect(reader).to receive(:read)
62
- end
63
-
64
- describe "when accept-no-persist is provided from the caller" do
65
- it "returns true" do
66
- expect(provided_acc).to receive(:no_persist?).and_return(true)
67
- expect(acc.check_and_persist(product, version)).to eq(true)
68
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_NO_PERSIST)
69
- end
70
- end
71
-
72
- describe "when accept-no-persist environment variable is set" do
73
- it "returns true" do
74
- expect(env_acc).to receive(:no_persist?).and_return(true)
75
- expect(acc.check_and_persist(product, version)).to eq(true)
76
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_NO_PERSIST)
77
- end
78
- end
79
-
80
- describe "when accept-no-persist command line argument is set" do
81
- it "returns true" do
82
- expect(arg_acc).to receive(:no_persist?).and_return(true)
83
- expect(acc.check_and_persist(product, version)).to eq(true)
84
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_NO_PERSIST)
85
- end
86
- end
87
-
88
- describe "when there are no missing licenses" do
89
- it "returns true" do
90
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
91
- expect(file_acc).to receive(:accepted?).with(relationship).and_return([])
92
- expect(acc.check_and_persist(product, version)).to eq(true)
93
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
94
- end
95
- end
96
-
97
- describe "when the user accepts as an environment variable" do
98
- it "returns true" do
99
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
100
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
101
- expect(env_acc).to receive(:accepted?).and_return(true)
102
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([])
103
- expect(acc.check_and_persist(product, version)).to eq(true)
104
- expect(output.string).to match(/1 product license accepted./)
105
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
106
- end
107
-
108
- describe "when persist is set to false" do
109
- let(:opts) { { output: output, persist: false } }
110
-
111
- it "returns true" do
112
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
113
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
114
- expect(env_acc).to receive(:accepted?).and_return(true)
115
- expect(acc.check_and_persist(product, version)).to eq(true)
116
- expect(output.string).to_not match(/accepted./)
117
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
118
- end
119
- end
120
-
121
- describe "when the silent option is used" do
122
- let(:opts) { { output: output } }
123
-
124
- it "returns true and silently persists the file" do
125
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
126
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
127
- expect(env_acc).to receive(:silent?).times.exactly(3).and_return(true)
128
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([])
129
- expect(acc.check_and_persist(product, version)).to eq(true)
130
- expect(output.string).to be_empty
131
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_SILENT)
132
- end
133
- end
134
-
135
- describe "when file persistance fails" do
136
- it "returns true" do
137
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
138
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
139
- expect(env_acc).to receive(:accepted?).and_return(true)
140
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([StandardError.new("foo")])
141
- expect(acc.check_and_persist(product, version)).to eq(true)
142
- expect(output.string).to match(/Could not persist acceptance:/)
143
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
144
- end
145
- end
146
- end
147
-
148
- describe "when the user accepts as an arg" do
149
- it "returns true" do
150
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
151
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
152
- expect(arg_acc).to receive(:accepted?).and_return(true)
153
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([])
154
- expect(acc.check_and_persist(product, version)).to eq(true)
155
- expect(output.string).to match(/1 product license accepted./)
156
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
157
- end
158
-
159
- describe "when the silent option is used" do
160
- let(:opts) { { output: output } }
161
-
162
- it "returns true and silently persists the file" do
163
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
164
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
165
- expect(arg_acc).to receive(:silent?).times.exactly(3).and_return(true)
166
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([])
167
- expect(acc.check_and_persist(product, version)).to eq(true)
168
- expect(output.string).to be_empty
169
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_SILENT)
170
- end
171
- end
172
-
173
-
174
- describe "when persist is set to false" do
175
- let(:opts) { { output: output, persist: false } }
176
-
177
- it "returns true" do
178
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
179
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
180
- expect(arg_acc).to receive(:accepted?).and_return(true)
181
- expect(acc.check_and_persist(product, version)).to eq(true)
182
- expect(output.string).to_not match(/accepted./)
183
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
184
- end
185
- end
186
-
187
- describe "when file persistance fails" do
188
- it "returns true" do
189
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
190
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
191
- expect(arg_acc).to receive(:accepted?).and_return(true)
192
- expect(file_acc).to receive(:persist).with(relationship, missing).and_return([StandardError.new("bar")])
193
- expect(acc.check_and_persist(product, version)).to eq(true)
194
- expect(output.string).to match(/Could not persist acceptance:/)
195
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
196
- end
197
- end
198
- end
199
-
200
- describe "when the prompt is not a tty" do
201
- let(:opts) { { output: File.open(File::NULL, "w") } }
202
- it "raises a LicenseNotAcceptedError error" do
203
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
204
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
205
- expect(prompt_acc).to_not receive(:request)
206
- expect { acc.check_and_persist(product, version) }.to raise_error(LicenseAcceptance::LicenseNotAcceptedError)
207
- expect(acc.acceptance_value).to eq(nil)
208
- end
209
- end
210
-
211
- describe "when the user accepts with the prompt" do
212
- it "returns true" do
213
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
214
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
215
- expect(prompt_acc).to receive(:request).with(missing).and_yield.and_return(true)
216
- expect(file_acc).to receive(:persist).with(relationship, missing)
217
- expect(acc.check_and_persist(product, version)).to eq(true)
218
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT)
219
- end
220
-
221
- describe "when persist is set to false" do
222
- let(:opts) { { output: output, persist: false } }
223
-
224
- it "returns true" do
225
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
226
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
227
- expect(prompt_acc).to receive(:request).with(missing).and_yield.and_return(true)
228
- expect(acc.check_and_persist(product, version)).to eq(true)
229
- expect(acc.acceptance_value).to eq(LicenseAcceptance::ACCEPT_NO_PERSIST)
230
- end
231
- end
232
- end
233
-
234
- describe "when the user declines with the prompt" do
235
- it "raises a LicenseNotAcceptedError error" do
236
- expect(reader).to receive(:lookup).with(product, version).and_return(relationship)
237
- expect(file_acc).to receive(:accepted?).with(relationship).and_return(missing)
238
- expect(prompt_acc).to receive(:request).with(missing).and_return(false)
239
- expect { acc.check_and_persist(product, version) }.to raise_error(LicenseAcceptance::LicenseNotAcceptedError)
240
- expect(acc.acceptance_value).to eq(nil)
241
- end
242
- end
243
- end
244
-
245
- describe "#license_required?" do
246
- let(:reader) { instance_double(LicenseAcceptance::ProductReader) }
247
- let(:mixlib_name) { "chef" }
248
- let(:version) { "15.0.0" }
249
- let(:product) { instance_double(LicenseAcceptance::Product, id: "foo", license_required_version: "15.0.0") }
250
-
251
- before do
252
- expect(LicenseAcceptance::ProductReader).to receive(:new).and_return(reader)
253
- expect(reader).to receive(:read)
254
- end
255
-
256
- it "returns false if no product can be found" do
257
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return nil
258
- expect(acc.license_required?(mixlib_name, version)).to eq(false)
259
- end
260
-
261
- describe "when version is :latest" do
262
- let(:version) { :latest }
263
- it "returns true" do
264
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return product
265
- expect(acc.license_required?(mixlib_name, version)).to eq(true)
266
- end
267
- end
268
-
269
- ["latest", "unstable", "current", "stable"].each do |version|
270
- describe "when version is '#{version}'" do
271
- it "returns true" do
272
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return product
273
- expect(acc.license_required?(mixlib_name, version)).to eq(true)
274
- end
275
- end
276
- end
277
-
278
- describe "when version is nil" do
279
- let(:version) { nil }
280
- it "returns true" do
281
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return product
282
- expect(acc.license_required?(mixlib_name, version)).to eq(true)
283
- end
284
- end
285
-
286
- describe "when version is >= than required version" do
287
- let(:version) { "15.0.0" }
288
- it "returns true" do
289
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return product
290
- expect(acc.license_required?(mixlib_name, version)).to eq(true)
291
- end
292
- end
293
-
294
- describe "when version is < required version" do
295
- let(:version) { "14.99.99" }
296
- it "returns false" do
297
- expect(reader).to receive(:lookup_by_mixlib).with(mixlib_name).and_return product
298
- expect(acc.license_required?(mixlib_name, version)).to eq(false)
299
- end
300
- end
301
- end
302
- end