rspec-webservice_matchers 4.10.0 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03bc4ee87b606016d8853436df80b164d0f4f5f4
4
- data.tar.gz: 0429080abde8b75215e9ce6700e7ed6c84620a38
3
+ metadata.gz: 3a087dde9dd0b72fcfc3677cea0c7c3b7e706404
4
+ data.tar.gz: 30488dffd2af4fbe03a7d1906c97601506732a23
5
5
  SHA512:
6
- metadata.gz: 7bdddc6c091db3c310fc7ded0457a1655d9c8cc8f2fff3fbe788c91601f74d81b35a19ff62930d36c3f4843621853fa4d693e0e6648bb219fd4346abdf9bd70e
7
- data.tar.gz: 6e4f6b04be911e8a6f55898dcc78bc8ea8497d82978b3f9cf387cccbeb1dd447eb9ebf93565ca37db845d6902924a347227152cf6b13c600e435b5af50ce5d5f
6
+ metadata.gz: abe119853f955ad508086e23ffe2df8761591816bc8ee05b42972b549e5a895fc8506310080d3e422f5ee338ec114091b510efb5643cecaea00edffe22d624e0
7
+ data.tar.gz: 1ec4dff0037ef5a129e18edecfd198264bd2f195b668f5a6cd5a7b0bfb32afe138748f232d1d786a4a2dd3f699e3de3ed292b0362b0d9e5fb3677ad7bfc47f68
data/HISTORY.md CHANGED
@@ -1,3 +1,7 @@
1
+ 4.11.0
2
+ ------
3
+ Adds the full PageSpeed result to the `BeFast::TestResult`.
4
+
1
5
  4.10.0
2
6
  ------
3
7
  Refactoring lower-level code into new namespace.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module RSpec
3
3
  module WebserviceMatchers
4
- VERSION = '4.10.0'
4
+ VERSION = '4.11.0'
5
5
  end
6
6
  end
@@ -4,27 +4,34 @@ require 'json'
4
4
  require 'validated_object'
5
5
  require 'web_test/util'
6
6
 
7
+ #
8
+ # Runs PageSpeed on a URL.
9
+ # See https://developers.google.com/speed/docs/insights/v2/reference/pagespeedapi/runpagespeed#response
10
+ #
7
11
  module WebTest
8
12
  module BeFast
13
+
9
14
  class TestResult < ValidatedObject::Base
10
- attr_accessor :success, :score
15
+ attr_accessor :success, :score, :response
11
16
  alias success? success
12
17
 
13
- validates :success, inclusion: [true, false]
14
- validates :score, inclusion: 0..100
18
+ validates :success, inclusion: [true, false]
19
+ validates :score, inclusion: 0..100
20
+ validates :response, type: Hash
15
21
  end
16
22
 
17
23
 
18
- def self.parse(json:)
19
- response = JSON.parse(json)
20
- unless response.key?('ruleGroups')
21
- raise "Couldn't parse the PageSpeed response: #{response.inspect}"
24
+ def self.test(url:)
25
+ response = page_speed(url: url)
26
+
27
+ TestResult.new do |r|
28
+ r.score = response.fetch(:score)
29
+ r.success = r.score >= 85
30
+ r.response = response
22
31
  end
23
- score = response.fetch('ruleGroups').fetch('SPEED').fetch('score')
24
- { score: score }
25
32
  end
26
33
 
27
- def self.page_speed_score(url:)
34
+ def self.page_speed(url:)
28
35
  url_param = CGI.escape(WebTest::Util.make_url(url))
29
36
  key = ENV['WEBSERVICE_MATCHER_INSIGHTS_KEY']
30
37
  if key.nil?
@@ -34,15 +41,19 @@ module WebTest
34
41
  end
35
42
  endpoint = 'https://www.googleapis.com/pagespeedonline/v2/runPagespeed'
36
43
  api_url = "#{endpoint}?url=#{url_param}&screenshot=false&key=#{key}"
37
- response = Faraday.get(api_url)
38
- BeFast.parse(json: response.body).fetch(:score)
44
+ parse json: Faraday.get(api_url).body
39
45
  end
40
46
 
41
- def self.test(url:)
42
- TestResult.new do |r|
43
- r.score = BeFast.page_speed_score(url: url)
44
- r.success = r.score >= 85
47
+ def self.parse(json:)
48
+ raw_response = JSON.parse(json)
49
+ unless raw_response.key?('ruleGroups')
50
+ raise "Couldn't parse the PageSpeed raw_response: #{raw_response.inspect}"
45
51
  end
52
+ score = raw_response.fetch('ruleGroups').fetch('SPEED').fetch('score')
53
+ {
54
+ score: score,
55
+ raw_response: raw_response
56
+ }
46
57
  end
47
58
  end
48
59
  end
@@ -0,0 +1,16 @@
1
+ module RSpec
2
+ # Matchers to help test RSpec matchers
3
+ module Matchers
4
+ def fail
5
+ raise_error(RSpec::Expectations::ExpectationNotMetError)
6
+ end
7
+
8
+ def fail_with(message)
9
+ raise_error(RSpec::Expectations::ExpectationNotMetError, message)
10
+ end
11
+
12
+ def fail_matching(regex)
13
+ raise_error(RSpec::Expectations::ExpectationNotMetError, regex)
14
+ end
15
+ end
16
+ end
@@ -1,13 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  # Specs for all of the PageSpeed code and matchers.
3
-
4
3
  require 'spec_helper'
5
4
  require 'rspec/webservice_matchers'
6
5
  require 'web_test/util'
7
6
 
8
7
 
9
- SAMPLE_JSON_RESPONSE = 'spec/fixtures/pagespeed.json'
10
-
11
8
  describe RSpec::WebserviceMatchers::BeFast do
12
9
  describe '#be_fast' do
13
10
  it 'performs a Google PageSpeed Insights API query on a fast site' do
@@ -64,8 +64,4 @@ describe 'be_up' do
64
64
  it 'succeeds even if the site times out on the first try' do
65
65
  expect('http://www.timeout-once.com').to be_up
66
66
  end
67
-
68
- it 'works on cars.com' do
69
- expect('http://cars.com').to be_up
70
- end
71
67
  end
@@ -35,7 +35,7 @@ describe 'redirect_permanently_to' do
35
35
 
36
36
  it 'gives a good error message when the hostname is bad' do
37
37
  expect {
38
- expect('asdhfjadhsfksd.com').to redirect_permanently_to 'http://the-wrong-site.com/'
38
+ expect('not-a-domain.com').to redirect_permanently_to 'http://the-wrong-site.com/'
39
39
  }.to fail_matching(/not known/i)
40
40
  end
41
41
  end
@@ -73,7 +73,7 @@ describe 'redirect_temporarily_to' do
73
73
 
74
74
  it 'gives a good error message when the hostname is bad' do
75
75
  expect {
76
- expect('234678234687234.com').to redirect_temporarily_to 'www.nowhere.com'
76
+ expect('not-a-domain.com').to redirect_temporarily_to 'www.nowhere.com'
77
77
  }.to fail_matching(/not known/i)
78
78
  end
79
79
  end
@@ -2,61 +2,66 @@
2
2
  require 'spec_helper'
3
3
  require 'rspec/webservice_matchers'
4
4
 
5
- describe 'have_a_valid_cert matcher' do
6
- it 'passes when SSL is properly configured' do
7
- # EFF created the HTTPS Everywhere movement
8
- # TODO: set up a test server for this. (?)
9
- expect('www.eff.org').to have_a_valid_cert
10
- end
5
+ describe 'SSL tests' do
6
+ before(:each) { WebMock.allow_net_connect! }
7
+ after(:each) { WebMock.disable_net_connect! }
11
8
 
12
- it 'fails if the server is not serving SSL at all' do
13
- expect {
14
- expect('www.psu.edu').to have_a_valid_cert
15
- }.to fail_matching(/443/)
16
- end
9
+ describe 'have_a_valid_cert matcher' do
10
+ it 'passes when SSL is properly configured' do
11
+ # EFF created the HTTPS Everywhere movement
12
+ # TODO: set up a test server for this. (?)
13
+ expect('www.eff.org').to have_a_valid_cert
14
+ end
17
15
 
18
- it 'provides a relevant error message' do
19
- expect {
20
- expect('www.psu.edu').to have_a_valid_cert
21
- }.to fail_matching(/(unreachable)|(no route to host)|(connection refused)/i)
22
- end
16
+ it 'fails if the server is not serving SSL at all' do
17
+ expect do
18
+ expect('www.psu.edu').to have_a_valid_cert
19
+ end.to fail_matching(/443/)
20
+ end
23
21
 
24
- it "provides a relevant error message when the domain name doesn't exist" do
25
- expect {
26
- expect('sdfgkljhsdfghjkhsdfgj.edu').to have_a_valid_cert
27
- }.to fail_matching(/not known/i)
28
- end
22
+ it 'provides a relevant error message' do
23
+ expect do
24
+ expect('www.psu.edu').to have_a_valid_cert
25
+ end.to fail_matching(/(unreachable)|(no route to host)|(connection refused)/i)
26
+ end
29
27
 
30
- it "provides a good error message when it's a redirect" do
31
- expect {
32
- # Can't figure out how to do this with WebMock.
33
- expect('bloc.io').to have_a_valid_cert
34
- }.to fail_matching(/redirect/i)
35
- end
28
+ it "provides a relevant error message when the domain name doesn't exist" do
29
+ expect do
30
+ expect('sdfgkljhsdfghjkhsdfgj.edu').to have_a_valid_cert
31
+ end.to fail_matching(/not known/i)
32
+ end
36
33
 
37
- # TODO: Find a good way to test this.
38
- # it 'provides a good error message if the request times out' do
39
- # expect {
40
- # expect('www.myapp.com').to have_a_valid_cert
41
- # }.to fail_matching(/(timeout)|(execution expired)/)
42
- # end
43
- end
34
+ it "provides a good error message when it's a redirect" do
35
+ expect do
36
+ # Can't figure out how to do this with WebMock.
37
+ expect('bloc.io').to have_a_valid_cert
38
+ end.to fail_matching(/redirect/i)
39
+ end
44
40
 
45
- # See https://www.eff.org/https-everywhere
46
- describe 'enforce_https_everywhere' do
47
- it 'passes when http requests are redirected to valid https urls' do
48
- expect('eff.org').to enforce_https_everywhere
41
+ # TODO: Find a good way to test this.
42
+ # it 'provides a good error message if the request times out' do
43
+ # expect {
44
+ # expect('www.myapp.com').to have_a_valid_cert
45
+ # }.to fail_matching(/(timeout)|(execution expired)/)
46
+ # end
49
47
  end
50
48
 
51
- it 'provides a relevant error message' do
52
- expect {
53
- expect('www.psu.edu').to enforce_https_everywhere
54
- }.to fail_matching(/200/)
55
- end
49
+ # See https://www.eff.org/https-everywhere
50
+ describe 'enforce_https_everywhere' do
51
+ it 'passes when http requests are redirected to valid https urls' do
52
+ expect('eff.org').to enforce_https_everywhere
53
+ end
54
+
55
+ it 'provides a relevant error message' do
56
+ expect do
57
+ expect('www.psu.edu').to enforce_https_everywhere
58
+ end.to fail_matching(/200/)
59
+ end
56
60
 
57
- it "provides a relevant error message when the domain name doesn't exist" do
58
- expect {
59
- expect('asdhfjkalsdhfjklasdfhjkasdhfl.com').to enforce_https_everywhere
60
- }.to fail_matching(/connection failed/i)
61
+ it "provides a relevant error message when the domain name doesn't exist" do
62
+ expect do
63
+ expect('asdhfjkalsdhfjklasdfhjkasdhfl.com').to enforce_https_everywhere
64
+ end.to fail_matching(/connection failed/i)
65
+ end
61
66
  end
62
67
  end
data/spec/spec_helper.rb CHANGED
@@ -1,56 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'webmock/rspec'
2
+ require 'web_mock_config'
3
+ require 'failure_matchers'
3
4
 
4
- RSpec.configure do |config|
5
- config.before(:each) do
6
- WebMock.stub_request :any, 'http://a-page.com/a/page.txt'
7
- WebMock.stub_request :any, 'www.website.com'
8
- WebMock.stub_request(:any, /notfound.com/).to_return(status: 404)
9
- WebMock.stub_request(:any, 'outoforder.com').to_return(status: 503)
10
-
11
- # A host which doesn't support HEAD
12
- WebMock.stub_request(:head, 'appengine.com').to_return(status: 405)
13
- WebMock.stub_request(:get, 'appengine.com').to_return(status: 200)
14
-
15
- WebMock.stub_request(:any, 'perm-redirector.com')
16
- .to_return(status: 301, headers: { Location: 'http://www.website.com/' })
17
-
18
- WebMock.stub_request(:any, 'temp-redirector.org')
19
- .to_return(status: 302, headers: { Location: 'http://a-page.com/a/page.txt' })
20
-
21
- WebMock.stub_request(:any, 'temp-307-redirector.net')
22
- .to_return(status: 307, headers: { Location: 'http://a-page.com/a/page.txt' })
23
-
24
- # Timeout scenarios
25
- WebMock.stub_request(:any, 'www.timeout.com').to_timeout
26
- WebMock.stub_request(:any, 'www.timeout-once.com').to_timeout.then.to_return(body: 'abc')
27
-
28
- # Insights API
29
- key = ENV['WEBSERVICE_MATCHER_INSIGHTS_KEY']
30
- WebMock.stub_request(:get, "https://www.googleapis.com/pagespeedonline/v2/runPagespeed?key=#{key}&screenshot=false&url=http://nonstop.qa")
31
- .with(headers: { 'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Faraday v0.9.2' })
32
- .to_return(
33
- status: 200,
34
- body: IO.read('spec/fixtures/pagespeed.json'),
35
- headers: {})
36
-
37
- WebMock.allow_net_connect!
38
- end
39
- end
40
-
41
- module RSpec
42
- # Matchers to help test RSpec matchers
43
- module Matchers
44
- def fail
45
- raise_error(RSpec::Expectations::ExpectationNotMetError)
46
- end
47
-
48
- def fail_with(message)
49
- raise_error(RSpec::Expectations::ExpectationNotMetError, message)
50
- end
51
-
52
- def fail_matching(regex)
53
- raise_error(RSpec::Expectations::ExpectationNotMetError, regex)
54
- end
55
- end
56
- end
5
+ SAMPLE_PAGESPEED_JSON_RESPONSE = 'spec/fixtures/pagespeed.json'
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ require 'faraday'
3
+ require 'webmock/rspec'
4
+
5
+ RSpec.configure do |config|
6
+ config.before(:each) do
7
+ # HOSTS WHICH RETURN ERRORS
8
+ WebMock.stub_request(:any, /notfound.com/).to_return(status: 404)
9
+ WebMock.stub_request(:any, 'outoforder.com').to_return(status: 503)
10
+ WebMock.stub_request(:any, 'not-a-domain.com')
11
+ .to_raise(Faraday::ConnectionFailed.new('Failed to open TCP ' \
12
+ 'connection to asdhfjkahsdfadfd.com:80 ' \
13
+ '(getaddrinfo: nodename nor servname provided, ' \
14
+ 'or not known)'))
15
+
16
+ # FUNCTIONING WEB PAGES
17
+ WebMock.stub_request :any, 'http://a-page.com/a/page.txt'
18
+ WebMock.stub_request :any, 'www.website.com'
19
+
20
+ # A HOST WHICH DOESN'T SUPPORT HEAD
21
+ WebMock.stub_request(:head, 'appengine.com').to_return(status: 405)
22
+ WebMock.stub_request(:get, 'appengine.com').to_return(status: 200)
23
+
24
+ # FUNCTIONING REDIRECTS
25
+ WebMock.stub_request(:head, 'perm-redirector.com')
26
+ .to_return(status: 301,
27
+ body: '',
28
+ headers: { Location: 'http://www.website.com/' })
29
+
30
+ WebMock.stub_request(:any, 'temp-redirector.org')
31
+ .to_return(status: 302,
32
+ headers: { Location: 'http://a-page.com/a/page.txt' })
33
+
34
+ WebMock.stub_request(:any, 'temp-307-redirector.net')
35
+ .to_return(status: 307,
36
+ headers: { Location: 'http://a-page.com/a/page.txt' })
37
+
38
+ # TIMEOUT SCENARIOS
39
+ WebMock.stub_request(:any, 'www.timeout.com').to_timeout
40
+ WebMock.stub_request(:any, 'www.timeout-once.com').to_timeout
41
+ .then.to_return(body: 'abc')
42
+
43
+ # PageSpeed Insights API
44
+ key = ENV['WEBSERVICE_MATCHER_INSIGHTS_KEY']
45
+ WebMock.stub_request(:get,
46
+ 'https://www.googleapis.com/pagespeedonline/v2/' \
47
+ "runPagespeed?key=#{key}&screenshot=false" \
48
+ '&url=http://nonstop.qa')
49
+ .to_return(
50
+ status: 200,
51
+ body: IO.read('spec/fixtures/pagespeed.json'),
52
+ headers: {})
53
+ end
54
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'spec_helper'
2
3
  require 'web_test/be_fast'
3
4
 
4
5
  RSpec.describe WebTest::BeFast do
@@ -14,7 +15,7 @@ RSpec.describe WebTest::BeFast do
14
15
 
15
16
  describe '#parse' do
16
17
  it 'can parse the overall score' do
17
- api_response = File.read(SAMPLE_JSON_RESPONSE)
18
+ api_response = File.read(SAMPLE_PAGESPEED_JSON_RESPONSE)
18
19
  data = WebTest::BeFast.parse json: api_response
19
20
  expect(data[:score]).to eq 85
20
21
  end
@@ -32,5 +33,14 @@ RSpec.describe WebTest::BeFast do
32
33
  WebTest::BeFast::TestResult.new { |r| r.success = true }
33
34
  end.to raise_error(ArgumentError, /score/i)
34
35
  end
36
+
37
+ it 'requires :response' do
38
+ expect do
39
+ WebTest::BeFast::TestResult.new { |r|
40
+ r.success = true
41
+ r.score = 90
42
+ }
43
+ end.to raise_error(ArgumentError, /response/i)
44
+ end
35
45
  end
36
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-webservice_matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.10.0
4
+ version: 4.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-31 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -192,6 +192,7 @@ files:
192
192
  - lib/web_test/be_up.rb
193
193
  - lib/web_test/util.rb
194
194
  - rspec-webservice_matchers.gemspec
195
+ - spec/failure_matchers.rb
195
196
  - spec/fixtures/pagespeed.json
196
197
  - spec/rspec/webservice_matchers/page_speed_spec.rb
197
198
  - spec/rspec/webservice_matchers/protocol_spec.rb
@@ -199,6 +200,7 @@ files:
199
200
  - spec/rspec/webservice_matchers/redirect_spec.rb
200
201
  - spec/rspec/webservice_matchers/ssl_spec.rb
201
202
  - spec/spec_helper.rb
203
+ - spec/web_mock_config.rb
202
204
  - spec/web_test/be_fast_spec.rb
203
205
  - spec/web_test/be_up_spec.rb
204
206
  - spec/web_test/util_spec.rb
@@ -222,11 +224,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
224
  version: '0'
223
225
  requirements: []
224
226
  rubyforge_project:
225
- rubygems_version: 2.5.1
227
+ rubygems_version: 2.6.2
226
228
  signing_key:
227
229
  specification_version: 4
228
230
  summary: Black-box web app configuration testing
229
231
  test_files:
232
+ - spec/failure_matchers.rb
230
233
  - spec/fixtures/pagespeed.json
231
234
  - spec/rspec/webservice_matchers/page_speed_spec.rb
232
235
  - spec/rspec/webservice_matchers/protocol_spec.rb
@@ -234,6 +237,7 @@ test_files:
234
237
  - spec/rspec/webservice_matchers/redirect_spec.rb
235
238
  - spec/rspec/webservice_matchers/ssl_spec.rb
236
239
  - spec/spec_helper.rb
240
+ - spec/web_mock_config.rb
237
241
  - spec/web_test/be_fast_spec.rb
238
242
  - spec/web_test/be_up_spec.rb
239
243
  - spec/web_test/util_spec.rb