rspec-webservice_matchers 4.9.0 → 4.12.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.
Files changed (32) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/HISTORY.md +13 -0
  4. data/README.md +11 -15
  5. data/circle.yml +2 -0
  6. data/lib/rspec/webservice_matchers/be_fast.rb +2 -46
  7. data/lib/rspec/webservice_matchers/be_status.rb +3 -2
  8. data/lib/rspec/webservice_matchers/be_up.rb +2 -24
  9. data/lib/rspec/webservice_matchers/enforce_https_everywhere.rb +7 -6
  10. data/lib/rspec/webservice_matchers/have_a_valid_cert.rb +3 -2
  11. data/lib/rspec/webservice_matchers/redirect_helpers.rb +5 -4
  12. data/lib/rspec/webservice_matchers/redirect_permanently_to.rb +2 -1
  13. data/lib/rspec/webservice_matchers/redirect_temporarily_to.rb +2 -1
  14. data/lib/rspec/webservice_matchers/version.rb +2 -1
  15. data/lib/web_test/be_fast.rb +59 -0
  16. data/lib/web_test/be_up.rb +25 -0
  17. data/lib/web_test/util.rb +105 -0
  18. data/rspec-webservice_matchers.gemspec +10 -9
  19. data/spec/failure_matchers.rb +16 -0
  20. data/spec/rspec/webservice_matchers/{protcol_spec.rb → protocol_spec.rb} +5 -8
  21. data/spec/rspec/webservice_matchers/public_api_spec.rb +6 -5
  22. data/spec/rspec/webservice_matchers/redirect_spec.rb +19 -18
  23. data/spec/rspec/webservice_matchers/ssl_spec.rb +72 -47
  24. data/spec/spec_helper.rb +3 -54
  25. data/spec/web_mock_config.rb +54 -0
  26. data/spec/web_test/be_up_spec.rb +93 -0
  27. data/spec/web_test/util_spec.rb +6 -0
  28. metadata +53 -35
  29. data/lib/rspec/webservice_matchers/util.rb +0 -97
  30. data/spec/rspec/webservice_matchers/be_fast_spec.rb +0 -28
  31. data/spec/rspec/webservice_matchers/be_up_spec.rb +0 -94
  32. data/spec/rspec/webservice_matchers/page_speed_spec.rb +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f930e26ec837ba1ca066f2a911608b5c58edfc09
4
- data.tar.gz: 0c2be7eae06450c998838d3e1530421ee9dcb6b2
2
+ SHA256:
3
+ metadata.gz: 617b8cb74f6bc84677c5ead97e558a6b6b9755f9044bcaeccfb3f63cb986b1b9
4
+ data.tar.gz: 4309003b1b46bf0b06ad2990d984d137c0cfd72028ccacd2e871337a713d347b
5
5
  SHA512:
6
- metadata.gz: 702e17e06e648086ce8c75c2838eb3997a7d44ccb741af282d22b46785fc5d44862966713e788c54acbe908f2290469fb170754c0fec303b8218dab3bfa7197b
7
- data.tar.gz: 88be96f4ae2de62c765bb0a9fd6bc621e0024b6513ba945700922adeb4e76031f9b3e9ab04e9ed1247cb928bf305ee335679a4c9a96128245e44ab721c7c6ec6
6
+ metadata.gz: 5f6253513b26f6bf0adaf28934961912fca38756ddbcbc1cf4e16f70bfdf5c5511a14a353a2989c51a9ef08366fda27a1ef8ea831c9d44e37173363979bdeb87
7
+ data.tar.gz: 1e03ec8f1aa261bba4dad5a82222eb9a5c224336ead102478f3831068e501c50b5c13bfb628233415d3dc47f9258e729d4c8b196108529561ab692cda9f16efd
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.4', '2.5', '2.6', '2.7']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rake
data/HISTORY.md CHANGED
@@ -1,3 +1,16 @@
1
+ 4.12.0
2
+ ------
3
+ Refactoring.
4
+ Change the Be fast test result for response to be the raw response.
5
+
6
+ 4.11.0
7
+ ------
8
+ Adds the full PageSpeed result to the `BeFast::TestResult`.
9
+
10
+ 4.10.0
11
+ ------
12
+ Refactoring lower-level code into new namespace.
13
+
1
14
  4.9.0
2
15
  -----
3
16
  Adds new API for `be_fast`.
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # RSpec::WebserviceMatchers
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/rspec-webservice_matchers.png)](http://badge.fury.io/rb/rspec-webservice_matchers) [![Code Climate](https://codeclimate.com/github/dogweather/rspec-webservice_matchers.png)](https://codeclimate.com/github/dogweather/rspec-webservice_matchers)
4
-
3
+ ![Ruby](https://github.com/dogweather/rspec-webservice_matchers/workflows/Ruby/badge.svg?branch=master) [![Maintainability](https://api.codeclimate.com/v1/badges/501f791f1ea83905e992/maintainability)](https://codeclimate.com/github/dogweather/rspec-webservice_matchers/maintainability) [![Gem Version](https://badge.fury.io/rb/rspec-webservice_matchers.svg)](https://badge.fury.io/rb/rspec-webservice_matchers)
5
4
 
6
5
  A [gem](https://rubygems.org/gems/rspec-webservice_matchers) to black-box test a web server configuration. For example, whether a site's SSL certificate is correctly configured and not expired:
7
6
 
@@ -9,13 +8,10 @@ A [gem](https://rubygems.org/gems/rspec-webservice_matchers) to black-box test a
9
8
  expect('github.com').to have_a_valid_cert
10
9
  ```
11
10
 
12
- It's a tool for doing **Test Driven Devops** (I just made that up). See [the introductory blog post](http://robb.weblaws.org/2014/01/16/new-open-source-library-for-test-driven-devops/) for the backstory and [Nonstop QA - a SaaS built on it](https://nonstop.qa).
11
+ It's a tool for doing **Test Driven Devops** (I just made that up). See [my introductory blog post](https://dogsnog.blog/2014/01/16/new-open-source-library-for-test-driven-devops/) for the backstory.
13
12
 
14
13
  This library takes a minimalist approach: it simply adds new RSpec matchers. Therefore, you can use your own RSpec writing style; there's no new DSL to learn.
15
14
 
16
- If you're too busy to install this and code the tests by hand, you can try the [new hosted service which runs these RSpec matchers in the cloud](http://nonstop.qa): [![QA Status](http://nonstop.qa/projects/20/badges/default.svg)](http://nonstop.qa/projects/20-nonstop-qa)
17
-
18
-
19
15
 
20
16
 
21
17
  Installation
@@ -28,15 +24,15 @@ What You Get
28
24
  ------------
29
25
  These new RSpec matchers:
30
26
 
31
- | Notes
32
- -------------------------------|------------------------------------------------
33
- **be_up** | Looks for a 200, but will follow up to four redirects
34
- **be_fast** | Checks for Google [PageSpeed](https://developers.google.com/speed/pagespeed/insights/) score >= 85. Expects the environment variable `WEBSERVICE_MATCHER_INSIGHTS_KEY` to contain a [Google "server" API key](https://developers.google.com/speed/docs/insights/v2/getting-started) with PageSpeed Insights API enabled.
35
- **enforce_https_everywhere** | Passes if the site will _only_ allow SSL connections. See the [EFF project, HTTPS Everywhere](https://www.eff.org/https-everywhere)
36
- **have_a_valid_cert** | Will fail if there's no cert, or it's expired or incorrectly configured
37
- **be_status** | A low-level matcher to explicitly check for a 200, 503, or any other code
38
- **redirect_permanently_to** | Checks for 301 and a correct destination URL
39
- **redirect_temporarily_to** | Checks for 302 or 307 and a correct destination
27
+ | | Notes
28
+ |-------------------------------|------------------------------------------------
29
+ |**be_up** | Looks for a 200, but will follow up to four redirects
30
+ |**be_fast** | Checks for Google [PageSpeed](https://developers.google.com/speed/pagespeed/insights/) score >= 85. Expects the environment variable `WEBSERVICE_MATCHER_INSIGHTS_KEY` to contain a [Google "server" API key](https://developers.google.com/speed/docs/insights/v2/getting-started) with PageSpeed Insights API enabled.
31
+ |**enforce_https_everywhere** | Passes if the site will _only_ allow SSL connections. See the [EFF project, HTTPS Everywhere](https://www.eff.org/https-everywhere)
32
+ |**have_a_valid_cert** | Will fail if there's no cert, or it's expired or incorrectly configured
33
+ |**be_status** | A low-level matcher to explicitly check for a 200, 503, or any other code
34
+ |**redirect_permanently_to** | Checks for 301 and a correct destination URL
35
+ |**redirect_temporarily_to** | Checks for 302 or 307 and a correct destination
40
36
 
41
37
 
42
38
  Example
data/circle.yml CHANGED
@@ -1,3 +1,5 @@
1
1
  machine:
2
2
  ruby:
3
3
  version: 2.3.0
4
+ version: 2.4.3
5
+ version: 2.5.0
@@ -1,59 +1,15 @@
1
1
  # frozen_string_literal: true
2
- require 'cgi'
3
- require 'json'
4
2
  require 'rspec/matchers'
5
- require 'rspec/webservice_matchers/util'
6
- require 'validated_object'
3
+ require 'web_test/be_fast'
7
4
 
8
5
  module RSpec
9
6
  module WebserviceMatchers
10
7
  module BeFast
11
-
12
- class TestResult < ValidatedObject::Base
13
- attr_accessor :success, :score
14
- alias success? success
15
-
16
- validates :success, inclusion: [true, false]
17
- validates :score, inclusion: (0..100)
18
- end
19
-
20
-
21
- def self.parse(json:)
22
- response = JSON.parse(json)
23
- unless response.key?('ruleGroups')
24
- raise "Couldn't parse the PageSpeed response: #{response.inspect}"
25
- end
26
- score = response.fetch('ruleGroups').fetch('SPEED').fetch('score')
27
- { score: score }
28
- end
29
-
30
- def self.page_speed_score(url:)
31
- url_param = CGI.escape(Util.make_url(url))
32
- key = ENV['WEBSERVICE_MATCHER_INSIGHTS_KEY']
33
- if key.nil?
34
- raise 'be_fast requires the WEBSERVICE_MATCHER_INSIGHTS_KEY '\
35
- 'environment variable to be set to a Google PageSpeed '\
36
- 'Insights API key.'
37
- end
38
- endpoint = 'https://www.googleapis.com/pagespeedonline/v2/runPagespeed'
39
- api_url = "#{endpoint}?url=#{url_param}&screenshot=false&key=#{key}"
40
- response = Faraday.get(api_url)
41
- BeFast.parse(json: response.body).fetch(:score)
42
- end
43
-
44
- def self.test(url:)
45
- TestResult.new do |r|
46
- r.score = BeFast.page_speed_score(url: url)
47
- r.success = r.score >= 85
48
- end
49
- end
50
-
51
-
52
8
  RSpec::Matchers.define :be_fast do
53
9
  score = nil
54
10
 
55
11
  match do |url|
56
- result = BeFast.test(url: url)
12
+ result = WebTest::BeFast.test(url: url)
57
13
  score = result.score
58
14
  result.success?
59
15
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'rspec/webservice_matchers/util'
2
+ require 'web_test/util'
3
+
3
4
 
4
5
  module RSpec
5
6
  module WebserviceMatchers
@@ -10,7 +11,7 @@ module RSpec
10
11
  actual_code = nil
11
12
 
12
13
  match do |url_or_domain_name|
13
- actual_code = Util.status(url_or_domain_name)
14
+ actual_code = WebTest::Util.status(url_or_domain_name)
14
15
  actual_code == expected_code.to_i
15
16
  end
16
17
 
@@ -1,37 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rspec/matchers'
3
- require 'rspec/webservice_matchers/util'
4
- require 'validated_object'
3
+ require 'web_test/be_up'
5
4
 
6
5
  # Pass when the response code is 200, following redirects if necessary.
7
6
  module RSpec
8
7
  module WebserviceMatchers
9
8
  module BeUp
10
-
11
- class TestResult < ValidatedObject::Base
12
- attr_accessor :success, :status_code
13
- alias success? success
14
-
15
- validates :success, inclusion: [true, false]
16
- validates :status_code, inclusion: 100..510
17
- end
18
-
19
-
20
- def self.test(url:nil, domain:nil)
21
- raise 'Must specify a url or domain' if url.nil? && domain.nil?
22
-
23
- TestResult.new do |r|
24
- r.status_code = Util.status(url || domain, follow: true)
25
- r.success = (r.status_code == 200)
26
- end
27
- end
28
-
29
-
30
9
  RSpec::Matchers.define :be_up do
31
10
  status = nil
32
11
 
33
12
  match do |url_or_domain_name|
34
- result = BeUp.test(url: url_or_domain_name)
13
+ result = WebTest::BeUp.test(url: url_or_domain_name)
35
14
  status = result.status_code
36
15
  result.success?
37
16
  end
@@ -40,7 +19,6 @@ module RSpec
40
19
  "Received status #{status}"
41
20
  end
42
21
  end
43
-
44
22
  end
45
23
  end
46
24
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'faraday'
3
- require 'rspec/webservice_matchers/util'
3
+ require 'web_test/util'
4
+
4
5
  require 'rspec/webservice_matchers/redirect_helpers'
5
6
 
6
7
  module RSpec
@@ -14,10 +15,10 @@ module RSpec
14
15
  include RedirectHelpers
15
16
  error_msg = status = final_protocol = has_valid_cert = nil
16
17
 
17
- match do |domain_name|
18
+ match do |domain_name_or_url|
18
19
  begin
19
- status, new_url, final_protocol = get_info(domain_name)
20
- meets_expectations?(status, final_protocol, Util.valid_cert?(new_url))
20
+ status, new_url, final_protocol = get_info(WebTest::Util.make_domain_name(domain_name_or_url))
21
+ meets_expectations?(status, final_protocol, WebTest::Util.valid_cert?(new_url))
21
22
  rescue Faraday::Error::ConnectionFailed
22
23
  error_msg = 'Connection failed'
23
24
  false
@@ -25,7 +26,7 @@ module RSpec
25
26
  end
26
27
 
27
28
  def get_info(domain_name)
28
- status, headers = Util.head(domain_name)
29
+ status, headers = WebTest::Util.head(domain_name)
29
30
  location = headers['location']
30
31
  /^(https?)/ =~ location
31
32
  protocol = Regexp.last_match(1) || nil
@@ -51,7 +52,7 @@ module RSpec
51
52
  errors << "destination uses protocol #{protocol.upcase}"
52
53
  end
53
54
  errors << "there's no valid SSL certificate" unless cert_is_valid
54
- Util.error_message(errors)
55
+ WebTest::Util.error_message(errors)
55
56
  end
56
57
  end
57
58
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'rspec/webservice_matchers/util'
2
+ require 'web_test/util'
3
+
3
4
  require 'rspec/matchers'
4
5
 
5
6
  module RSpec
@@ -11,7 +12,7 @@ module RSpec
11
12
 
12
13
  match do |domain_name_or_url|
13
14
  begin
14
- Util.try_ssl_connection(domain_name_or_url)
15
+ WebTest::Util.try_ssl_connection(domain_name_or_url)
15
16
  rescue Exception => e
16
17
  error_message = fix_for_excon_bug(e.message)
17
18
  false
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
- require 'rspec/webservice_matchers/util'
2
+ require 'web_test/util'
3
+
3
4
 
4
5
  module RSpec
5
6
  module WebserviceMatchers
6
7
  module RedirectHelpers
7
8
  def redirect_failure_message(exception, status, actual_location, kind)
8
- return Util.error_message(exception) if exception
9
+ return WebTest::Util.error_message(exception) if exception
9
10
 
10
11
  errors = []
11
12
  if redirect? status
@@ -19,7 +20,7 @@ module RSpec
19
20
  errors << "not a redirect: received status #{status}"
20
21
  end
21
22
 
22
- Util.error_message(errors)
23
+ WebTest::Util.error_message(errors)
23
24
  end
24
25
 
25
26
  def redirects_correctly?(status, actual_loc, expected_loc, kind)
@@ -27,7 +28,7 @@ module RSpec
27
28
  end
28
29
 
29
30
  def redirect_result(url_or_domain_name)
30
- status, headers = Util.head(url_or_domain_name)
31
+ status, headers = WebTest::Util.head(url_or_domain_name)
31
32
  [status, headers['location']]
32
33
  end
33
34
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'rspec/webservice_matchers/util'
2
+ require 'web_test/util'
3
+
3
4
  require 'rspec/webservice_matchers/redirect_helpers'
4
5
 
5
6
  module RSpec
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'rspec/webservice_matchers/util'
2
+ require 'web_test/util'
3
+
3
4
  require 'rspec/webservice_matchers/redirect_helpers'
4
5
 
5
6
  module RSpec
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module RSpec
3
4
  module WebserviceMatchers
4
- VERSION = '4.9.0'
5
+ VERSION = '4.12.2'
5
6
  end
6
7
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ require 'cgi'
3
+ require 'json'
4
+ require 'validated_object'
5
+ require 'web_test/util'
6
+
7
+ #
8
+ # Runs PageSpeed on a URL.
9
+ # See https://developers.google.com/speed/docs/insights/v2/reference/pagespeedapi/runpagespeed#response
10
+ #
11
+ module WebTest
12
+ module BeFast
13
+
14
+ class TestResult < ValidatedObject::Base
15
+ attr_accessor :success, :score, :response
16
+ alias success? success
17
+
18
+ validates :success, type: Boolean
19
+ validates :score, inclusion: 0..100
20
+ validates :response, type: Hash
21
+ end
22
+
23
+
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[:raw_response]
31
+ end
32
+ end
33
+
34
+ def self.page_speed(url:)
35
+ url_param = CGI.escape(WebTest::Util.make_url(url))
36
+ key = ENV['WEBSERVICE_MATCHER_INSIGHTS_KEY']
37
+ if key.nil?
38
+ raise 'be_fast requires the WEBSERVICE_MATCHER_INSIGHTS_KEY '\
39
+ 'environment variable to be set to a Google PageSpeed '\
40
+ 'Insights API key.'
41
+ end
42
+ endpoint = 'https://www.googleapis.com/pagespeedonline/v2/runPagespeed'
43
+ api_url = "#{endpoint}?url=#{url_param}&screenshot=false&key=#{key}"
44
+ parse json: Faraday.get(api_url).body
45
+ end
46
+
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}"
51
+ end
52
+ score = raw_response.fetch('ruleGroups').fetch('SPEED').fetch('score')
53
+ {
54
+ score: score,
55
+ raw_response: raw_response
56
+ }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require 'validated_object'
3
+ require 'web_test/util'
4
+
5
+ module WebTest
6
+ module BeUp
7
+ class TestResult < ValidatedObject::Base
8
+ attr_accessor :success, :status_code
9
+ alias success? success
10
+
11
+ validates :success, type: Boolean
12
+ validates :status_code, inclusion: 100..510
13
+ end
14
+
15
+
16
+ def self.test(url:nil, domain:nil)
17
+ raise 'Must specify a url or domain' if url.nil? && domain.nil?
18
+
19
+ TestResult.new do |r|
20
+ r.status_code = WebTest::Util.status(url || domain, follow: true)
21
+ r.success = (r.status_code == 200)
22
+ end
23
+ end
24
+ end
25
+ end