rspec-webservice_matchers 1.1.2 → 1.2.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: 89064b80f84f72a5fd43886b4ef08bddfdd25eab
4
- data.tar.gz: d0da9d277e5023d76d52fd5ca524492434266b10
3
+ metadata.gz: c61a14a2ef20872e409fb4d49f0009e987abdd4b
4
+ data.tar.gz: ed10304376894e7cdfcd83fee505791c931a12ce
5
5
  SHA512:
6
- metadata.gz: 338608ed8145220d05925acf13eb5bad0aba255f5452154af1c01f91e188142dd857a45e02caa2dbcf9f7bea05b50e4d190e70fc2635ce75dcc949f883ee0c0f
7
- data.tar.gz: 0bc6ca8f292510bc568e5e1bf4735d76fe426bc104eec4454f919c6e261dc9f72bce935f4bc6ab5a89754b764822404b9cb92c47f558951d787d6867bbd0c8f9
6
+ metadata.gz: 66899e9f493857af03f4d40f032b6b8094c6e19ab1a2b8ff1f4062854939fcc0c72b0cd4cddff90c06f5bd8c1f54ec44da3c3d4278e05be98c83e6815d767d12
7
+ data.tar.gz: 14dadfd238f5f4e4c46571a96f9896b07f29f8aa2b49ff905f8fcc147d88eb5a40b5002f0afb574eb90b8d8a6c02fdc774e114592667212f9b5eea26f01c63b7
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/rspec-webservice_matchers.png)](http://badge.fury.io/rb/rspec-webservice_matchers) [![Build Status](https://travis-ci.org/dogweather/rspec-webservice_matchers.png?branch=master)](https://travis-ci.org/dogweather/rspec-webservice_matchers)
4
4
 
5
- This [gem](https://rubygems.org/gems/rspec-webservice_matchers) enables you to black-box test a web app's server configuration. For example, whether its SSL certificate is correctly configured and not expired. It's a tool for doing **Test Driven Devops**. (I just made that up.)
5
+ This [gem](https://rubygems.org/gems/rspec-webservice_matchers) enables you to black-box test a web app's server configuration. For example, whether its SSL certificate is correctly configured and not expired. It's a tool for doing **Test Driven Devops**. (I just made that up.) See [my blog post](http://robb.weblaws.org/2014/01/16/new-open-source-library-for-test-driven-devops/) for more about my motivations for making this.
6
6
 
7
7
  This library takes a very minimalist approach: it simply adds new RSpec matchers,
8
8
  and so you can use your own RSpec writing style; there's no new DSL to learn.
@@ -3,6 +3,11 @@ require 'faraday'
3
3
  require 'faraday_middleware'
4
4
  require 'pry'
5
5
 
6
+ # Seconds
7
+ TIMEOUT = 5
8
+ OPEN_TIMEOUT = 2
9
+
10
+
6
11
  module RSpec
7
12
  module WebserviceMatchers
8
13
 
@@ -14,8 +19,7 @@ module RSpec
14
19
 
15
20
  # Test by seeing if Curl retrieves without complaining
16
21
  begin
17
- conn = Faraday.new
18
- response = conn.head("https://#{domain_name_or_url}")
22
+ connection.head("https://#{domain_name_or_url}")
19
23
  return true
20
24
  rescue
21
25
  # Not serving SSL, expired, or incorrect domain name in certificate
@@ -37,19 +41,19 @@ module RSpec
37
41
  # Pass successfully if we get a 301 to the place we intend.
38
42
  RSpec::Matchers.define :redirect_permanently_to do |expected|
39
43
  match do |url|
40
- response = Faraday.new.head(url)
44
+ response = RSpec::WebserviceMatchers.connection.head(url)
41
45
  # binding.pry
42
46
  response.status == 301 && response.headers['location'] == expected
43
47
  end
44
- end
48
+ end
45
49
 
46
50
  # Pass successfully if we get a 302 or 307 to the place we intend.
47
51
  RSpec::Matchers.define :redirect_temporarily_to do |expected|
48
52
  match do |url|
49
- response = Faraday.new.head(url)
53
+ response = RSpec::WebserviceMatchers.connection.head(url)
50
54
  [302, 307].include?(response.status) && response.headers['location'] == expected
51
55
  end
52
- end
56
+ end
53
57
 
54
58
  # This is a high level matcher which checks three things:
55
59
  # 1. Permanent redirect
@@ -57,28 +61,30 @@ module RSpec
57
61
  # 3. which is correctly configured
58
62
  RSpec::Matchers.define :enforce_https_everywhere do
59
63
  match do |domain_name|
60
- response = Faraday.new.head("http://#{domain_name}")
64
+ response = RSpec::WebserviceMatchers.connection.head("http://#{domain_name}")
61
65
  new_url = response.headers['location']
62
66
  (response.status == 301) && (/https/ === new_url) && (RSpec::WebserviceMatchers.has_valid_ssl_cert?(new_url))
63
67
  end
64
- end
68
+ end
65
69
 
66
70
  # Pass when a URL returns the expected status code
67
71
  # Codes are defined in http://www.rfc-editor.org/rfc/rfc2616.txt
68
72
  RSpec::Matchers.define :be_status do |expected|
69
73
  match do |url_or_domain_name|
70
74
  url = RSpec::WebserviceMatchers.make_url(url_or_domain_name)
71
- response = Faraday.new.head(url)
75
+ response = RSpec::WebserviceMatchers.connection.head(url)
72
76
  response.status == expected
73
77
  end
74
78
  end
75
79
 
76
- #Pass when the response code is 200, following redirects
77
- #if necessary.
80
+ # Pass when the response code is 200, following redirects
81
+ # if necessary.
78
82
  RSpec::Matchers.define :be_up do
79
- match do |url_or_domain_name|
83
+ match do |url_or_domain_name|
80
84
  url = RSpec::WebserviceMatchers.make_url(url_or_domain_name)
81
85
  conn = Faraday.new do |c|
86
+ c.options[:timeout] = TIMEOUT
87
+ c.options[:open_timeout] = TIMEOUT
82
88
  c.use FaradayMiddleware::FollowRedirects, limit: 5
83
89
  c.adapter :net_http
84
90
  end
@@ -90,6 +96,14 @@ module RSpec
90
96
 
91
97
  private
92
98
 
99
+ def self.connection
100
+ Faraday.new do |c|
101
+ c.options[:timeout] = TIMEOUT
102
+ c.options[:open_timeout] = TIMEOUT
103
+ c.adapter :net_http
104
+ end
105
+ end
106
+
93
107
  # Ensure that the given string is a URL,
94
108
  # making it into one if necessary.
95
109
  def self.make_url(url_or_domain_name)
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module WebserviceMatchers
3
- VERSION = "1.1.2"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "pry"
24
+ spec.add_development_dependency 'webmock'
24
25
 
25
26
  spec.add_runtime_dependency 'rspec', '~> 2'
26
27
  spec.add_runtime_dependency 'faraday'
@@ -1,15 +1,24 @@
1
+ require 'webmock/rspec'
1
2
  require 'rspec/webservice_matchers'
2
3
 
3
4
  #
4
- # TODO: set up a test server or mocks for these.
5
+ # TODO: set up mocks or VCR for the rest of these.
6
+ # SEE: http://www.slideshare.net/kjbuckley/testing-http-calls-with-webmock-and-vcr
5
7
  #
8
+
9
+ WebMock.stub_request :any, 'http://www.website.com/a/page.txt'
10
+ WebMock.stub_request :any, 'http://www.website.com/'
11
+
12
+ WebMock.allow_net_connect!
13
+
14
+
6
15
  describe 'status_code' do
7
16
  it 'can check 200 for successful resource requests' do
8
- 'http://www.rfc-editor.org/rfc/rfc2616.txt'.should be_status 200
17
+ 'http://www.website.com/a/page.txt'.should be_status 200
9
18
  end
10
19
 
11
20
  it 'handles domain names as well as URLs' do
12
- 'www.rfc-editor.org'.should be_status 200
21
+ 'www.website.com'.should be_status 200
13
22
  end
14
23
 
15
24
  it 'can check 503 for the Service Unavailable status' do
@@ -4,6 +4,7 @@ require 'rspec/webservice_matchers'
4
4
  # TODO: Set up a server for these. (Or a mock?)
5
5
  # Faraday supports testing: we can use that now.
6
6
  #
7
+
7
8
  describe 'redirect_permanently_to' do
8
9
  it 'passes when receiving a 301 to the given URL' do
9
10
  expect('http://weblaws.org').to redirect_permanently_to('http://www.weblaws.org/')
@@ -1,16 +1,19 @@
1
1
  require 'rspec/webservice_matchers'
2
2
 
3
+ # VCR may be the tool to use for this. Can it handle https? Would that work?
4
+
5
+
3
6
  describe 'have_a_valid_cert matcher' do
4
7
  it 'passes when SSL is properly configured' do
5
8
  # EFF created the HTTPS Everywhere movement
6
- # TODO: set up a test server for this.
9
+ # TODO: set up a test server for this. (?)
7
10
  expect('www.eff.org').to have_a_valid_cert
8
11
  end
9
12
 
10
13
  it 'fails if the server is not serving SSL at all' do
11
14
  expect {
12
15
  # www.psu.edu only supports HTTP, port 80.
13
- # TODO: set up a test server for this.
16
+ # TODO: set up a test server for this. (?)
14
17
  expect('www.psu.edu').to have_a_valid_cert
15
18
  }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
16
19
  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: 1.1.2
4
+ version: 1.2.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: 2014-01-30 00:00:00.000000000 Z
11
+ date: 2014-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement