license-acceptance 1.0.13 → 2.1.2

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