capybara-screenshot 1.0.13 → 1.0.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +11 -12
  3. data/Appraisals +14 -16
  4. data/CHANGELOG.md +69 -0
  5. data/Gemfile +4 -3
  6. data/README.md +96 -30
  7. data/capybara-screenshot.gemspec +12 -5
  8. data/gemfiles/cucumber.1.3.gemfile +12 -0
  9. data/gemfiles/cucumber.2.4.gemfile +12 -0
  10. data/gemfiles/latest.gemfile +5 -2
  11. data/gemfiles/rspec.3.0.gemfile +5 -2
  12. data/gemfiles/rspec.3.3.gemfile +12 -0
  13. data/gemfiles/spinach.0.8.gemfile +12 -0
  14. data/lib/capybara-screenshot/callbacks.rb +44 -0
  15. data/lib/capybara-screenshot/capybara.rb +26 -10
  16. data/lib/capybara-screenshot/cucumber.rb +12 -5
  17. data/lib/capybara-screenshot/minitest.rb +1 -1
  18. data/lib/capybara-screenshot/pruner.rb +5 -1
  19. data/lib/capybara-screenshot/rspec/base_reporter.rb +1 -2
  20. data/lib/capybara-screenshot/rspec/html_embed_reporter.rb +14 -3
  21. data/lib/capybara-screenshot/rspec/html_link_reporter.rb +1 -1
  22. data/lib/capybara-screenshot/rspec/text_reporter.rb +2 -2
  23. data/lib/capybara-screenshot/rspec.rb +25 -3
  24. data/lib/capybara-screenshot/s3_saver.rb +39 -11
  25. data/lib/capybara-screenshot/saver.rb +60 -15
  26. data/lib/capybara-screenshot/version.rb +1 -1
  27. data/lib/capybara-screenshot.rb +38 -3
  28. data/spec/cucumber/cucumber_spec.rb +4 -8
  29. data/spec/feature/minitest_spec.rb +2 -6
  30. data/spec/feature/testunit_spec.rb +3 -7
  31. data/spec/rspec/rspec_spec.rb +36 -8
  32. data/spec/spinach/spinach_spec.rb +4 -8
  33. data/spec/support/aruba.rb +0 -1
  34. data/spec/support/common_setup.rb +13 -5
  35. data/spec/unit/capybara-screenshot_spec.rb +2 -1
  36. data/spec/unit/capybara_spec.rb +13 -0
  37. data/spec/unit/pruner_spec.rb +2 -2
  38. data/spec/unit/rspec_reporters/html_embed_reporter_spec.rb +13 -0
  39. data/spec/unit/rspec_reporters/text_reporter_spec.rb +6 -6
  40. data/spec/unit/s3_saver_spec.rb +196 -14
  41. data/spec/unit/saver_spec.rb +132 -16
  42. metadata +19 -17
  43. data/gemfiles/cucumber.1.2.gemfile +0 -9
  44. data/gemfiles/cucumber.1.3.0.gemfile +0 -9
  45. data/gemfiles/rspec.2.14.gemfile +0 -9
  46. data/gemfiles/rspec.2.99.gemfile +0 -9
  47. data/gemfiles/spinach.0.7.gemfile +0 -9
  48. data/gemfiles/spinach.0.8.0.gemfile +0 -9
@@ -5,8 +5,7 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
5
5
  include CommonSetup
6
6
 
7
7
  before do
8
- setup_aruba
9
- Capybara.save_and_open_page_path = expand_path('tmp')
8
+ Capybara::Screenshot.capybara_tmp_path = expand_path('tmp')
10
9
  end
11
10
 
12
11
  def run_failing_case(code, error_message, format=nil)
@@ -32,7 +31,7 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
32
31
  RUBY
33
32
 
34
33
  cmd = cmd_with_format(options[:format])
35
- run_simple_with_retry cmd, false
34
+ run_simple_with_retry cmd
36
35
 
37
36
  expect(last_command_started.output).to match('0 failures') if options[:assert_all_passed]
38
37
  end
@@ -41,8 +40,8 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
41
40
  "rspec #{"--format #{format} " if format}#{expand_path('spec/test_failure.rb')}"
42
41
  end
43
42
 
44
- it 'saves a screenshot on failure' do
45
- run_failing_case <<-RUBY, %q{Unable to find link or button "you'll never find me"}
43
+ it 'saves a screenshot when browser action fails' do
44
+ run_failing_case <<-RUBY, %r{Unable to find (visible )?link or button "you'll never find me"}
46
45
  feature 'screenshot with failure' do
47
46
  scenario 'click on a missing link' do
48
47
  visit '/'
@@ -51,7 +50,19 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
51
50
  end
52
51
  end
53
52
  RUBY
54
- expect(expand_path('tmp/screenshot.html')).to_not have_file_content('This is the root page')
53
+ expect('tmp/screenshot.html').to have_file_content('This is the root page')
54
+ end
55
+
56
+ it 'saves a screenshot when expectation fails when using :aggregate_failures' do
57
+ run_failing_case <<-RUBY, %q{expected "This is the root page" to include "you'll never find me"}
58
+ feature 'screenshot with failure', :aggregate_failures do
59
+ scenario 'expect a missing link' do
60
+ visit '/'
61
+ expect(page.body).to include("you'll never find me")
62
+ end
63
+ end
64
+ RUBY
65
+ expect('tmp/screenshot.html').to have_file_content('This is the root page')
55
66
  end
56
67
 
57
68
  formatters = {
@@ -92,7 +103,7 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
92
103
  end
93
104
 
94
105
  it 'saves a screenshot for the correct session for failures using_session' do
95
- run_failing_case <<-RUBY, %q{Unable to find link or button "you'll never find me"}
106
+ run_failing_case <<-RUBY, %r{Unable to find (visible )?link or button "you'll never find me"}
96
107
  feature 'screenshot with failure' do
97
108
  scenario 'click on a missing link' do
98
109
  visit '/'
@@ -105,7 +116,24 @@ describe Capybara::Screenshot::RSpec, :type => :aruba do
105
116
  end
106
117
  end
107
118
  RUBY
108
- expect('tmp/screenshot.html').to have_file_content(/is/)
119
+ expect('tmp/screenshot.html').to have_file_content(/This is a different page/)
120
+ end
121
+
122
+ it 'saves a screenshot for the correct session for failures Capybara.using_session' do
123
+ run_failing_case <<-RUBY, %r{Unable to find (visible )?link or button "you'll never find me"}
124
+ feature 'screenshot with failure' do
125
+ scenario 'click on a missing link' do
126
+ visit '/'
127
+ expect(page.body).to include('This is the root page')
128
+ Capybara.using_session :different_session do
129
+ visit '/different_page'
130
+ expect(page.body).to include('This is a different page')
131
+ click_on "you'll never find me"
132
+ end
133
+ end
134
+ end
135
+ RUBY
136
+ expect('tmp/screenshot.html').to have_file_content(/This is a different page/)
109
137
  end
110
138
 
111
139
  context 'pruning' do
@@ -3,10 +3,6 @@ require "spec_helper"
3
3
  describe "Using Capybara::Screenshot with Spinach" do
4
4
  include CommonSetup
5
5
 
6
- before do
7
- setup_aruba
8
- end
9
-
10
6
  def run_failing_case(failure_message, code)
11
7
  write_file('steps/failure.rb', <<-RUBY)
12
8
  #{ensure_load_paths_valid}
@@ -16,12 +12,12 @@ describe "Using Capybara::Screenshot with Spinach" do
16
12
 
17
13
  write_file('spinach.feature', code)
18
14
  cmd = 'bundle exec spinach -f .'
19
- run_simple_with_retry cmd, false
15
+ run_simple_with_retry cmd
20
16
  expect(last_command_started.output).to match(failure_message)
21
17
  end
22
18
 
23
19
  it "saves a screenshot on failure" do
24
- run_failing_case(%q{Unable to find link or button "you'll never find me"}, <<-GHERKIN)
20
+ run_failing_case(%q{Unable to find (visible )?link or button "you'll never find me"}, <<-GHERKIN)
25
21
  Feature: Failure
26
22
  Scenario: Failure
27
23
  Given I visit "/"
@@ -41,7 +37,7 @@ describe "Using Capybara::Screenshot with Spinach" do
41
37
  end
42
38
 
43
39
  it "saves a screenshot for the correct session for failures using_session" do
44
- run_failing_case(%q{Unable to find link or button "you'll never find me"}, <<-GHERKIN)
40
+ run_failing_case(%q{Unable to find (visible )?link or button "you'll never find me"}, <<-GHERKIN)
45
41
  Feature: Failure
46
42
  Scenario: Failure in different session
47
43
  Given I visit "/"
@@ -53,7 +49,7 @@ describe "Using Capybara::Screenshot with Spinach" do
53
49
  it 'on failure it prunes previous screenshots when strategy is set' do
54
50
  create_screenshot_for_pruning
55
51
  configure_prune_strategy :last_run
56
- run_failing_case(%q{Unable to find link or button "you'll never find me"}, <<-GHERKIN)
52
+ run_failing_case(%q{Unable to find (visible )?link or button "you'll never find me"}, <<-GHERKIN)
57
53
  Feature: Failure
58
54
  Scenario: Failure
59
55
  Given I visit "/"
@@ -1,3 +1,2 @@
1
1
  require 'aruba/rspec'
2
- require 'aruba/api'
3
2
  require 'aruba/config/jruby'
@@ -20,7 +20,7 @@ module CommonSetup
20
20
  target.let(:setup_test_app) do
21
21
  <<-RUBY
22
22
  require 'support/test_app'
23
- Capybara.save_and_open_page_path = '#{screenshot_path}'
23
+ Capybara::Screenshot.capybara_tmp_path = '#{screenshot_path}'
24
24
  Capybara.app = TestApp
25
25
  Capybara::Screenshot.append_timestamp = false
26
26
  #{@additional_setup_steps}
@@ -33,11 +33,19 @@ module CommonSetup
33
33
  end
34
34
  end
35
35
 
36
- def run_simple_with_retry(*args)
37
- run_simple(*args)
36
+ target.after(:each) do |example|
37
+ if example.exception
38
+ puts "Output from failed Aruba test:"
39
+ puts all_commands.map { |c| c.output }.map { |line| " #{line}"}
40
+ puts ""
41
+ end
42
+ end
43
+
44
+ def run_simple_with_retry(cmd, fail_on_error: false)
45
+ run_command_and_stop(cmd, fail_on_error: fail_on_error)
38
46
  rescue ChildProcess::TimeoutError => e
39
- puts "run_simple(#{args.join(', ')}) failed. Will retry once. `#{e.message}`"
40
- run_simple(*args)
47
+ puts "run_command_and_stop(#{cmd}, fail_on_error: #{fail_on_error}) failed. Will retry once. `#{e.message}`"
48
+ run_command_and_stop(cmd, fail_on_error: fail_on_error)
41
49
  end
42
50
 
43
51
  def configure_prune_strategy(strategy)
@@ -81,11 +81,12 @@ describe Capybara::Screenshot do
81
81
  args = double('args')
82
82
  s3_saver_double = double('s3_saver')
83
83
  s3_configuration = { hello: 'world' }
84
+ s3_object_configuration = {}
84
85
 
85
86
  Capybara::Screenshot.s3_configuration = s3_configuration
86
87
 
87
88
  expect(Capybara::Screenshot::Saver).to receive(:new).with(args).and_return(saver_double)
88
- expect(Capybara::Screenshot::S3Saver).to receive(:new_with_configuration).with(saver_double, s3_configuration).and_return(s3_saver_double)
89
+ expect(Capybara::Screenshot::S3Saver).to receive(:new_with_configuration).with(saver_double, s3_configuration, s3_object_configuration).and_return(s3_saver_double)
89
90
 
90
91
  expect(Capybara::Screenshot.new_saver(args)).to eq(s3_saver_double)
91
92
  end
@@ -26,6 +26,19 @@ describe Capybara do
26
26
  }.to raise_exception ::RSpec::Expectations::ExpectationNotMetError
27
27
  end
28
28
  end
29
+
30
+ describe 'Capybara.using_session' do
31
+ include Capybara::DSL
32
+
33
+ it 'saves the name of the final session' do
34
+ expect(Capybara::Screenshot).to receive(:final_session_name=).with(:different_session)
35
+ expect {
36
+ Capybara.using_session :different_session do
37
+ expect(0).to eq 1
38
+ end
39
+ }.to raise_exception ::RSpec::Expectations::ExpectationNotMetError
40
+ end
41
+ end
29
42
  end
30
43
 
31
44
  describe 'final_session_name' do
@@ -27,7 +27,7 @@ describe Capybara::Screenshot::Pruner do
27
27
  let(:strategy) { :invalid_strategy }
28
28
 
29
29
  it 'raises an error' do
30
- expect { pruner }.to raise_error
30
+ expect { pruner }.to raise_error(/Invalid prune strategy/)
31
31
  end
32
32
  end
33
33
 
@@ -35,7 +35,7 @@ describe Capybara::Screenshot::Pruner do
35
35
  let(:strategy) { { keep: :symbol } }
36
36
 
37
37
  it 'raises an error' do
38
- expect { pruner }.to raise_error
38
+ expect { pruner }.to raise_error(/must be a Integer/)
39
39
  end
40
40
  end
41
41
  end
@@ -15,4 +15,17 @@ describe Capybara::Screenshot::RSpec::HtmlEmbedReporter do
15
15
  expect(content_without_styles).to eql("original content<img src='data:image/png;base64,#{encoded_image_data}'>")
16
16
  end
17
17
  end
18
+
19
+ context 'when an image was saved to s3' do
20
+ let(:s3_image_url) { "http://s3.amazon.com/path/to/image" }
21
+
22
+ before do
23
+ set_example double("example", metadata: {screenshot: {image: s3_image_url}})
24
+ end
25
+
26
+ it 'embeds the image URL into the content' do
27
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style='.*?' ?/, "")
28
+ expect(content_without_styles).to eql("original content<img src='#{s3_image_url}'>")
29
+ end
30
+ end
18
31
  end
@@ -64,20 +64,20 @@ describe Capybara::Screenshot::RSpec::TextReporter do
64
64
  end
65
65
 
66
66
  context 'when a html file was saved' do
67
- let(:example) { example_failed_method_argument_double(screenshot: { html: "path/to/html" }) }
67
+ let(:example) { example_failed_method_argument_double(screenshot: { html: "/path/to/html" }) }
68
68
 
69
69
  it 'appends the html file path to the original output' do
70
70
  @reporter.send(example_failed_method, example)
71
- expect(@reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: file://path/to/html")}\n")
71
+ expect(@reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: /path/to/html")}\n")
72
72
  end
73
73
  end
74
74
 
75
75
  context 'when a html file and an image were saved' do
76
- let(:example) { example_failed_method_argument_double(screenshot: { html: "path/to/html", image: "path/to/image" }) }
76
+ let(:example) { example_failed_method_argument_double(screenshot: { html: "/path/to/html", image: "/path/to/image" }) }
77
77
 
78
78
  it 'appends the image path to the original output' do
79
79
  @reporter.send(example_failed_method, example)
80
- expect(@reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: file://path/to/html")}\n #{CapybaraScreenshot::Helpers.yellow("Image screenshot: file://path/to/image")}\n")
80
+ expect(@reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: /path/to/html")}\n #{CapybaraScreenshot::Helpers.yellow("Image screenshot: /path/to/image")}\n")
81
81
  end
82
82
  end
83
83
 
@@ -91,8 +91,8 @@ describe Capybara::Screenshot::RSpec::TextReporter do
91
91
  end
92
92
  old_reporter = old_reporter_class.new
93
93
  old_reporter.singleton_class.send :include, described_class
94
- example = example_failed_method_argument_double(screenshot: { html: "path/to/html" })
94
+ example = example_failed_method_argument_double(screenshot: { html: "/path/to/html" })
95
95
  old_reporter.send(example_failed_method, example)
96
- expect(old_reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: file://path/to/html")}\n")
96
+ expect(old_reporter.output.string).to eql("original failure info\n #{CapybaraScreenshot::Helpers.yellow("HTML screenshot: /path/to/html")}\n")
97
97
  end
98
98
  end
@@ -4,9 +4,19 @@ require 'capybara-screenshot/s3_saver'
4
4
  describe Capybara::Screenshot::S3Saver do
5
5
  let(:saver) { double('saver') }
6
6
  let(:bucket_name) { double('bucket_name') }
7
+ let(:s3_object_configuration) { {} }
8
+ let(:options) { {} }
7
9
  let(:s3_client) { double('s3_client') }
10
+ let(:key_prefix){ "some/path/" }
8
11
 
9
- let(:s3_saver) { Capybara::Screenshot::S3Saver.new(saver, s3_client, bucket_name) }
12
+ let(:s3_saver) { described_class.new(saver, s3_client, bucket_name, s3_object_configuration, options) }
13
+ let(:s3_saver_with_key_prefix) { described_class.new(saver, s3_client, bucket_name, s3_object_configuration, key_prefix: key_prefix) }
14
+
15
+ let(:region) { double('region') }
16
+
17
+ before do
18
+ allow(s3_client).to receive(:get_bucket_location).and_return(double(:bucket_location_response, location_constraint: region))
19
+ end
10
20
 
11
21
  describe '.new_with_configuration' do
12
22
  let(:access_key_id) { double('access_key_id') }
@@ -18,40 +28,73 @@ describe Capybara::Screenshot::S3Saver do
18
28
  }
19
29
  }
20
30
 
21
- let(:region) { double('region') }
22
31
  let(:s3_client_credentials) {
23
32
  s3_client_credentials_using_defaults.merge(region: region)
24
33
  }
25
34
 
26
- it 'destructures the configuration into its components' do
35
+ before do
27
36
  allow(Aws::S3::Client).to receive(:new).and_return(s3_client)
28
- allow(Capybara::Screenshot::S3Saver).to receive(:new)
37
+ allow(described_class).to receive(:new)
38
+ end
29
39
 
30
- Capybara::Screenshot::S3Saver.new_with_configuration(saver, {
40
+ it 'destructures the configuration into its components' do
41
+ described_class.new_with_configuration(saver, {
31
42
  s3_client_credentials: s3_client_credentials,
32
43
  bucket_name: bucket_name
33
- })
44
+ }, s3_object_configuration)
34
45
 
35
46
  expect(Aws::S3::Client).to have_received(:new).with(s3_client_credentials)
36
- expect(Capybara::Screenshot::S3Saver).to have_received(:new).with(saver, s3_client, bucket_name)
47
+ expect(described_class).to have_received(:new).with(saver, s3_client, bucket_name, s3_object_configuration, hash_including({}))
48
+ end
49
+
50
+ it 'passes key_prefix option if specified' do
51
+ described_class.new_with_configuration(saver, {
52
+ s3_client_credentials: s3_client_credentials,
53
+ bucket_name: bucket_name,
54
+ key_prefix: key_prefix,
55
+ }, s3_object_configuration)
56
+
57
+ expect(Aws::S3::Client).to have_received(:new).with(s3_client_credentials)
58
+ expect(described_class).to have_received(:new).with(saver, s3_client, bucket_name, s3_object_configuration, hash_including(key_prefix: key_prefix))
37
59
  end
38
60
 
39
61
  it 'defaults the region to us-east-1' do
40
62
  default_region = 'us-east-1'
41
63
 
42
- allow(Aws::S3::Client).to receive(:new).and_return(s3_client)
43
- allow(Capybara::Screenshot::S3Saver).to receive(:new)
44
-
45
- Capybara::Screenshot::S3Saver.new_with_configuration(saver, {
64
+ described_class.new_with_configuration(saver, {
46
65
  s3_client_credentials: s3_client_credentials_using_defaults,
47
66
  bucket_name: bucket_name
48
- })
67
+ }, s3_object_configuration)
49
68
 
50
69
  expect(Aws::S3::Client).to have_received(:new).with(
51
70
  s3_client_credentials.merge(region: default_region)
52
71
  )
53
72
 
54
- expect(Capybara::Screenshot::S3Saver).to have_received(:new).with(saver, s3_client, bucket_name)
73
+ expect(described_class).to have_received(:new).with(saver, s3_client, bucket_name, s3_object_configuration, hash_including({}))
74
+ end
75
+
76
+ it 'stores the object configuration when passed' do
77
+ s3_object_configuration = { acl: 'public-read' }
78
+ Capybara::Screenshot.s3_object_configuration = { acl: 'public-read' }
79
+
80
+ described_class.new_with_configuration(saver, {
81
+ s3_client_credentials: s3_client_credentials,
82
+ bucket_name: bucket_name
83
+ }, s3_object_configuration)
84
+
85
+ expect(Aws::S3::Client).to have_received(:new).with(s3_client_credentials)
86
+ expect(described_class).to have_received(:new).with(saver, s3_client, bucket_name, s3_object_configuration, hash_including({}))
87
+ end
88
+
89
+ it 'passes key_prefix option if specified' do
90
+ described_class.new_with_configuration(saver, {
91
+ s3_client_credentials: s3_client_credentials,
92
+ bucket_name: bucket_name,
93
+ key_prefix: key_prefix,
94
+ }, s3_object_configuration)
95
+
96
+ expect(Aws::S3::Client).to have_received(:new).with(s3_client_credentials)
97
+ expect(described_class).to have_received(:new).with(saver, s3_client, bucket_name, s3_object_configuration, hash_including(key_prefix: key_prefix))
55
98
  end
56
99
  end
57
100
 
@@ -62,6 +105,20 @@ describe Capybara::Screenshot::S3Saver do
62
105
  allow(saver).to receive(:save)
63
106
  end
64
107
 
108
+ context 'providing a bucket_host' do
109
+ let(:options) { { bucket_host: 'some other location' } }
110
+
111
+ it 'does not request the bucket location' do
112
+ screenshot_path = '/baz/bim.jpg'
113
+
114
+ screenshot_file = double('screenshot_file')
115
+
116
+ expect(s3_saver).not_to receive(:determine_bucket_host)
117
+
118
+ s3_saver.save
119
+ end
120
+ end
121
+
65
122
  it 'calls save on the underlying saver' do
66
123
  expect(saver).to receive(:save)
67
124
 
@@ -83,6 +140,8 @@ describe Capybara::Screenshot::S3Saver do
83
140
  body: html_file
84
141
  )
85
142
 
143
+ expect(s3_saver).to receive(:determine_bucket_host).and_call_original
144
+
86
145
  s3_saver.save
87
146
  end
88
147
 
@@ -103,6 +162,129 @@ describe Capybara::Screenshot::S3Saver do
103
162
 
104
163
  s3_saver.save
105
164
  end
165
+
166
+ context 'with object configuration' do
167
+ let(:s3_object_configuration) { { acl: 'public-read' } }
168
+ let(:s3_saver) { described_class.new(saver, s3_client, bucket_name, s3_object_configuration) }
169
+
170
+ it 'uploads the html' do
171
+ html_path = '/foo/bar.html'
172
+ expect(saver).to receive(:html_path).and_return(html_path)
173
+ expect(saver).to receive(:html_saved?).and_return(true)
174
+
175
+ html_file = double('html_file')
176
+
177
+ expect(File).to receive(:open).with(html_path).and_yield(html_file)
178
+
179
+ expect(s3_client).to receive(:put_object).with(
180
+ bucket: bucket_name,
181
+ key: 'bar.html',
182
+ body: html_file,
183
+ acl: 'public-read'
184
+ )
185
+
186
+ s3_saver.save
187
+ end
188
+
189
+ it 'uploads the screenshot' do
190
+ screenshot_path = '/baz/bim.jpg'
191
+ expect(saver).to receive(:screenshot_path).and_return(screenshot_path)
192
+ expect(saver).to receive(:screenshot_saved?).and_return(true)
193
+
194
+ screenshot_file = double('screenshot_file')
195
+
196
+ expect(File).to receive(:open).with(screenshot_path).and_yield(screenshot_file)
197
+
198
+ expect(s3_client).to receive(:put_object).with(
199
+ bucket: bucket_name,
200
+ key: 'bim.jpg',
201
+ body: screenshot_file,
202
+ acl: 'public-read'
203
+ )
204
+
205
+ s3_saver.save
206
+ end
207
+ end
208
+
209
+ context 'with key_prefix specified' do
210
+ it 'uploads the html with key prefix' do
211
+ html_path = '/foo/bar.html'
212
+ expect(saver).to receive(:html_path).and_return(html_path)
213
+ expect(saver).to receive(:html_saved?).and_return(true)
214
+
215
+ html_file = double('html_file')
216
+
217
+ expect(File).to receive(:open).with(html_path).and_yield(html_file)
218
+
219
+ expect(s3_client).to receive(:put_object).with(
220
+ bucket: bucket_name,
221
+ key: 'some/path/bar.html',
222
+ body: html_file
223
+ )
224
+
225
+ s3_saver_with_key_prefix.save
226
+ end
227
+
228
+ it 'uploads the screenshot with key prefix' do
229
+ screenshot_path = '/baz/bim.jpg'
230
+ expect(saver).to receive(:screenshot_path).and_return(screenshot_path)
231
+ expect(saver).to receive(:screenshot_saved?).and_return(true)
232
+
233
+ screenshot_file = double('screenshot_file')
234
+
235
+ expect(File).to receive(:open).with(screenshot_path).and_yield(screenshot_file)
236
+
237
+ expect(s3_client).to receive(:put_object).with(
238
+ bucket: bucket_name,
239
+ key: 'some/path/bim.jpg',
240
+ body: screenshot_file
241
+ )
242
+
243
+ s3_saver_with_key_prefix.save
244
+ end
245
+
246
+ context 'with object configuration' do
247
+ let(:s3_object_configuration) { { acl: 'public-read' } }
248
+
249
+ it 'uploads the html' do
250
+ html_path = '/foo/bar.html'
251
+ expect(saver).to receive(:html_path).and_return(html_path)
252
+ expect(saver).to receive(:html_saved?).and_return(true)
253
+
254
+ html_file = double('html_file')
255
+
256
+ expect(File).to receive(:open).with(html_path).and_yield(html_file)
257
+
258
+ expect(s3_client).to receive(:put_object).with(
259
+ bucket: bucket_name,
260
+ key: 'some/path/bar.html',
261
+ body: html_file,
262
+ acl: 'public-read'
263
+ )
264
+
265
+ s3_saver_with_key_prefix.save
266
+ end
267
+
268
+ it 'uploads the screenshot' do
269
+ screenshot_path = '/baz/bim.jpg'
270
+ expect(saver).to receive(:screenshot_path).and_return(screenshot_path)
271
+ expect(saver).to receive(:screenshot_saved?).and_return(true)
272
+
273
+ screenshot_file = double('screenshot_file')
274
+
275
+ expect(File).to receive(:open).with(screenshot_path).and_yield(screenshot_file)
276
+
277
+ expect(s3_client).to receive(:put_object).with(
278
+ bucket: bucket_name,
279
+ key: 'some/path/bim.jpg',
280
+ body: screenshot_file,
281
+ acl: 'public-read'
282
+ )
283
+
284
+ s3_saver_with_key_prefix.save
285
+ end
286
+ end
287
+ end
106
288
  end
107
289
 
108
290
  # Needed because we cannot depend on Verifying Doubles
@@ -129,4 +311,4 @@ describe Capybara::Screenshot::S3Saver do
129
311
  expect(saver).to have_received(:foo_bar).with(*args)
130
312
  end
131
313
  end
132
- end
314
+ end