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 +4 -4
- data/HISTORY.md +4 -0
- data/lib/rspec/webservice_matchers/version.rb +1 -1
- data/lib/web_test/be_fast.rb +27 -16
- data/spec/failure_matchers.rb +16 -0
- data/spec/rspec/webservice_matchers/page_speed_spec.rb +0 -3
- data/spec/rspec/webservice_matchers/protocol_spec.rb +0 -4
- data/spec/rspec/webservice_matchers/redirect_spec.rb +2 -2
- data/spec/rspec/webservice_matchers/ssl_spec.rb +52 -47
- data/spec/spec_helper.rb +3 -54
- data/spec/web_mock_config.rb +54 -0
- data/spec/web_test/be_fast_spec.rb +11 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a087dde9dd0b72fcfc3677cea0c7c3b7e706404
|
4
|
+
data.tar.gz: 30488dffd2af4fbe03a7d1906c97601506732a23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe119853f955ad508086e23ffe2df8761591816bc8ee05b42972b549e5a895fc8506310080d3e422f5ee338ec114091b510efb5643cecaea00edffe22d624e0
|
7
|
+
data.tar.gz: 1ec4dff0037ef5a129e18edecfd198264bd2f195b668f5a6cd5a7b0bfb32afe138748f232d1d786a4a2dd3f699e3de3ed292b0362b0d9e5fb3677ad7bfc47f68
|
data/HISTORY.md
CHANGED
data/lib/web_test/be_fast.rb
CHANGED
@@ -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,
|
14
|
-
validates :score,
|
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.
|
19
|
-
response =
|
20
|
-
|
21
|
-
|
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.
|
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
|
-
|
38
|
-
BeFast.parse(json: response.body).fetch(:score)
|
44
|
+
parse json: Faraday.get(api_url).body
|
39
45
|
end
|
40
46
|
|
41
|
-
def self.
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
@@ -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('
|
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('
|
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 '
|
6
|
-
|
7
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
expect('
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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 '
|
2
|
+
require 'web_mock_config'
|
3
|
+
require 'failure_matchers'
|
3
4
|
|
4
|
-
|
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(
|
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.
|
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-
|
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.
|
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
|