akamai_rspec 0.2.4 → 0.3.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: d43da91b99bffdb375af2895ae8c06ee21ef5c2b
4
- data.tar.gz: 0e2550fbd977588675e38cdeafd3c2c2d98b3fea
3
+ metadata.gz: 26b9891b50b16db2cb6b518794ee939ab864f9e4
4
+ data.tar.gz: 4c46663b9c2ba79788fc98a846c519585483f66e
5
5
  SHA512:
6
- metadata.gz: 8e830785e239ca8a42dbbd2fbbad8c3f265a2de8a8c720a04dd16ad4c03fbcc2e164583aaaa80ab01d376b5f1e483cd1f0c967b211a81b8d7a39e3ab7c6f0d0f
7
- data.tar.gz: 158112f7fd65328f5804e93340412f321103045bb67f3ac4772a55591318b3a3e3ddf8e82e4cc74d00ce87e63d87b9cab2c02e2824b63c84529cf09bf9876657
6
+ metadata.gz: 34b3ec6371e11c316c90346745ef568192a5ef18f1ca7c5b09510f7add7cbd2fddd8699e82db4114fcc50c16878b7c8cbcaeb1a6d69c8b2704aa5b9dac96a772
7
+ data.tar.gz: 898b11a2d6c01868cfffd6594c6aa14521da6563711a9e223201ddc7d460dca904f233bff5a2bf039e0d562b7216cb981d5216ecb7dc9fb4926861eab4ab630d
@@ -1,5 +1,5 @@
1
1
  module AkamaiHeaders
2
- def akamai_debug_headers
2
+ def self.akamai_debug_headers
3
3
  {
4
4
  pragma: 'akamai-x-cache-on, akamai-x-cache-remote-on, akamai-x-check-cacheable, akamai-x-get-cache-key, akamai-x-get-extracted-values, akamai-x-get-nonces, akamai-x-get-ssl-client-session-id, akamai-x-get-true-cache-key, akamai-x-serial-no'
5
5
  }
@@ -3,7 +3,7 @@ require 'securerandom'
3
3
 
4
4
  RSpec::Matchers.define :be_cacheable do
5
5
  match do |url|
6
- response = RestClient::Request.responsify url
6
+ response = AkamaiRSpec::Request.get url
7
7
  x_check_cacheable(response, 'YES')
8
8
  response.code == 200
9
9
  end
@@ -15,7 +15,7 @@ end
15
15
 
16
16
  RSpec::Matchers.define :have_no_cache_set do
17
17
  match do |url|
18
- response = RestClient::Request.responsify url
18
+ response = AkamaiRSpec::Request.get url
19
19
  cache_control = response.headers[:cache_control]
20
20
  fail('Cache-Control has been set') unless cache_control == 'no-cache'
21
21
  true
@@ -24,21 +24,22 @@ end
24
24
 
25
25
  RSpec::Matchers.define :not_be_cached do
26
26
  match do |url|
27
- response = RestClient::Request.responsify url
27
+ response = AkamaiRSpec::Request.get url
28
28
  x_check_cacheable(response, 'NO')
29
- response = RestClient::Request.responsify response.args[:url] # again to prevent spurious cache miss
29
+ response = AkamaiRSpec::Request.get url # again to prevent spurious cache miss
30
30
 
31
31
  not_cached = response.headers[:x_cache] =~ /TCP(\w+)?_MISS/
32
- unless not_cached
32
+ if not_cached
33
+ true
34
+ else
33
35
  fail("x_cache header does not indicate an origin hit: '#{response.headers[:x_cache]}'")
34
36
  end
35
- response.code == 200 && not_cached
36
37
  end
37
38
  end
38
39
 
39
40
  RSpec::Matchers.define :be_tier_distributed do
40
41
  match do |url|
41
- response = RestClient::Request.request_cache_miss(url)
42
+ response = AkamaiRSpec::Request.get_cache_miss(url)
42
43
  tiered = !response.headers[:x_cache_remote].nil?
43
44
  fail('No X-Cache-Remote header in response') unless tiered
44
45
  response.code == 200 && tiered
@@ -9,7 +9,7 @@ RSpec::Matchers.define :honour_origin_cache_headers do |origin, headers|
9
9
  fail("Headers must be one of: #{header_options}") unless header_options.include? headers
10
10
 
11
11
  match do |url|
12
- akamai_response = RestClient::Request.responsify url
12
+ akamai_response = AkamaiRSpec::Request.get url
13
13
  origin_response = origin_response(origin)
14
14
  check_cache_control(origin_response, akamai_response, headers)
15
15
  check_expires(origin_response, akamai_response, headers)
@@ -18,7 +18,7 @@ RSpec::Matchers.define :honour_origin_cache_headers do |origin, headers|
18
18
  end
19
19
 
20
20
  def fix_date_header(origin_response)
21
- origin_response.headers[:date] = Time.now.httpdate unless origin_response.headers[:date]
21
+ origin_response.headers[:date] ||= Time.now.httpdate
22
22
  origin_response
23
23
  end
24
24
 
@@ -4,60 +4,9 @@ require_relative 'redirects'
4
4
  require_relative 'caching'
5
5
  require_relative 'non_akamai'
6
6
  require_relative 'honour_origin_headers'
7
+ require_relative 'x_cache_headers'
7
8
  include AkamaiHeaders
8
9
 
9
- X_CACHE_HEADERS = [:x_true_cache_key, :x_cache_key]
10
-
11
- RSpec::Matchers.define :be_served_from_origin do |contents|
12
- match do |url|
13
- response = RestClient::Request.responsify url
14
- return true if x_cache_headers_from_origin(response, contents)
15
- missing_x_cache_error(response, contents)
16
- expect(response).to be_successful
17
- has_x_cache_headers(response)
18
- end
19
- end
20
-
21
- RSpec::Matchers.define :have_cp_code do |contents|
22
- match do |url|
23
- response = RestClient::Request.responsify url
24
- has_x_cache_headers(response)
25
- return true if x_cache_headers_contain(response, contents)
26
- missing_x_cache_error(response, contents)
27
- expect(response).to be_successful
28
- end
29
- end
30
-
31
- def has_x_cache_headers(response)
32
- unless X_CACHE_HEADERS.inject(false) { |bool, header| bool || response.headers.include?(header) }
33
- fail "Response does not contain the debug headers"
34
- end
35
- end
36
-
37
- def x_cache_headers_contain(response, contents)
38
- X_CACHE_HEADERS.each do |key|
39
- return true if response.headers[key] && response.headers[key].include?(contents)
40
- end
41
- false
42
- end
43
-
44
-
45
- def x_cache_headers_from_origin(response, contents)
46
- X_CACHE_HEADERS.each do |key|
47
- header = response.headers[key]
48
- return true if (header && header =~ /\/#{contents}\//)
49
- end
50
- return false
51
- end
52
-
53
- def missing_x_cache_error(response, contents)
54
- X_CACHE_HEADERS.each do |key|
55
- if (response.headers[key])
56
- fail("#{key} has value '#{response.headers[key]}' which doesn't match '#{contents}'")
57
- end
58
- end
59
- end
60
-
61
10
  RSpec::Matchers.define :be_forwarded_to_index do |channel|
62
11
  match do |url|
63
12
  response = RestClient.get(url, akamai_debug_headers)
@@ -32,7 +32,7 @@ end
32
32
 
33
33
  RSpec::Matchers.define :be_successful do
34
34
  match do |url|
35
- response = RestClient::Request.responsify url
35
+ response = AkamaiRSpec::Request.get url
36
36
  fail('Response was not successful') unless response.code == 200
37
37
  true
38
38
  end
@@ -51,17 +51,25 @@ end
51
51
 
52
52
  RSpec::Matchers.define :be_gzipped do
53
53
  match do |response_or_url|
54
- response = RestClient::Request.responsify response_or_url
54
+ response = AkamaiRSpec::Request.get_decode response_or_url
55
55
  response.headers[:content_encoding] == 'gzip'
56
56
  end
57
57
  end
58
58
 
59
59
  RSpec::Matchers.define :have_cookie do |cookie|
60
60
  match do |response_or_url|
61
- response = RestClient::Request.responsify response_or_url
61
+ response = AkamaiRSpec::Request.get response_or_url
62
62
  unless response.cookies[cookie]
63
63
  fail("Cookie #{cookie} not in #{response.cookies}")
64
64
  end
65
65
  response.cookies[cookie]
66
66
  end
67
67
  end
68
+
69
+ RSpec::Matchers.define :be_forbidden do
70
+ match do |url|
71
+ response = AkamaiRSpec::Request.get url
72
+ fail('Response was not forbidden') unless response.code == 403
73
+ true
74
+ end
75
+ end
@@ -0,0 +1,29 @@
1
+ require 'rspec'
2
+
3
+ module AkamaiRSpec
4
+ module Helpers
5
+ X_CACHE_HEADERS = [:x_true_cache_key, :x_cache_key]
6
+
7
+ def x_cache_headers
8
+ X_CACHE_HEADERS
9
+ end
10
+ end
11
+ end
12
+
13
+ RSpec::Matchers.define :be_served_from_origin do |contents|
14
+ include AkamaiRSpec::Helpers
15
+ match do |url|
16
+ response = AkamaiRSpec::Request.get url
17
+ response.headers.any? { |key, value| x_cache_headers.include?(key) && value =~ /\/#{contents}\// } && \
18
+ response.code == 200
19
+ end
20
+ end
21
+
22
+ RSpec::Matchers.define :have_cp_code do |contents|
23
+ include AkamaiRSpec::Helpers
24
+ match do |url|
25
+ response = AkamaiRSpec::Request.get url
26
+ response.headers.any? { |key, value| x_cache_headers.include?(key) && value == contents } && \
27
+ response.code == 200
28
+ end
29
+ end
@@ -1,89 +1,99 @@
1
1
  require 'rest-client'
2
- require 'akamai_rspec'
2
+ require 'forwardable'
3
3
 
4
- module RestClient
4
+ module AkamaiRSpec
5
5
  class Request
6
- @@akamai_network = 'prod'
7
- @@akamai_stg_domain = 'overwrite me'
8
- @@akamai_prod_domain = 'overwrite me'
9
-
10
- def self.domain
11
- env = @@akamai_network
12
- case env.downcase
13
- when 'staging'
14
- @@akamai_stg_domain
15
- else
16
- @@akamai_prod_domain
17
- end
18
- end
6
+ extend Forwardable
19
7
 
20
- def self.akamai_network(env)
21
- @@akamai_network = env
22
- end
8
+ @@akamai_stg_domain = nil
9
+ @@akamai_prod_domain = nil
23
10
 
24
- def self.stg_domain(domain)
11
+ def self.stg_domain=(domain)
25
12
  @@akamai_stg_domain = domain
26
13
  end
27
14
 
28
- def self.prod_domain(domain)
15
+ def self.prod_domain=(domain)
29
16
  @@akamai_prod_domain = domain
30
17
  end
31
18
 
32
- def self.http_url(url)
33
- url = "/#{url}" unless url.start_with?('/')
34
- "http://#{domain}#{url}"
19
+ def self.network=(env)
20
+ @@env = env
35
21
  end
36
22
 
37
- def self.https_url(url)
38
- url = "/#{url}" unless url.start_with?('/')
39
- "https://#{domain}#{url}"
23
+ def self.get(url)
24
+ new.get(url)
40
25
  end
41
26
 
42
- # Define the Host header and join the Akamai headers
43
- def self.options
44
- akamai_debug_headers
27
+ def self.get_with_debug_headers(url)
28
+ new.get(url, AkamaiHeaders.akamai_debug_headers)
45
29
  end
46
30
 
47
- # Make requests to the right network
48
- def self.http_get(url, options, cookies = {})
49
- do_get(url, options, cookies, false)
31
+ def self.get_cache_miss(url)
32
+ url += url.include?('?') ? '&' : '?'
33
+ url += SecureRandom.hex
34
+ new.get(url, AkamaiHeaders.akamai_debug_headers)
50
35
  end
51
36
 
52
- def self.https_get(url, options, cookies = {})
53
- do_get(url, options, cookies, true)
37
+ def self.get_decode(url)
38
+ response = new.get(url, AkamaiHeaders.akamai_debug_headers)
39
+ RestClient::Request.decode(response.headers[:content_encoding], response.body)
40
+ response
54
41
  end
55
42
 
56
- def self.do_get(url, options, cookies = {}, is_secure)
57
- if is_secure
58
- base_url = https_url(url)
59
- else
60
- base_url = http_url(url)
61
- end
62
- headers = options.merge(akamai_debug_headers).merge(cookies)
63
- do_get_no_ssl(base_url, headers) { |response, _, _| response }
64
- end
43
+ def initialize
44
+ @@env ||= 'prod'
45
+
46
+ @domain = case @@env.downcase
47
+ when 'staging'
48
+ if @@akamai_stg_domain.nil?
49
+ raise ArgumentError.new(
50
+ "You must set the prod domain: AkamaiRSpec::Request.stg_domain = 'www.example.com.edgesuite.net'"
51
+ )
52
+ end
53
+
54
+ @@akamai_stg_domain
55
+ else
56
+ if @@akamai_prod_domain.nil?
57
+ raise ArgumentError.new(
58
+ "You must set the prod domain: AkamaiRSpec::Request.prod_domain = 'www.example.com.edgesuite.net'"
59
+ )
60
+ end
61
+
62
+ @@akamai_prod_domain
63
+ end
65
64
 
66
- def self.do_get_no_ssl(url, additional_headers = {}, &block)
67
- headers = (options[:headers] || {}).merge(additional_headers)
68
- RestClient::Request.execute(options.merge(
69
- method: :get,
70
- url: url,
71
- verify_ssl: false,
72
- headers: headers), &(block || @block))
65
+ @rest_client = RestClient::Request.new(method: :get,
66
+ url: 'fakeurl.com',
67
+ verify_ssl: false)
73
68
  end
74
69
 
75
- def self.responsify(maybe_a_url)
76
- if maybe_a_url.is_a? RestClient::Response
77
- maybe_a_url
78
- else
79
- RestClient.get(maybe_a_url, akamai_debug_headers)
70
+ delegate [:parse_url_with_auth, :stringify_headers] => :@rest_client
71
+
72
+ def get(url, headers = {})
73
+ if url.is_a? RestClient::Response
74
+ warn 'This functionality is deprecated and will be removed in the next release'
75
+ return AkamaiRSpec::Response.new(url)
76
+ end
77
+
78
+ uri = parse_url_with_auth(url)
79
+
80
+ req = build_request(uri, stringify_headers(headers))
81
+
82
+ req['Host'] = uri.hostname
83
+ uri.hostname = @domain
84
+
85
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
86
+ http.request(req, nil) { |http_response| http_response }
80
87
  end
88
+
89
+ AkamaiRSpec::Response.new(response)
81
90
  end
82
91
 
83
- def self.request_cache_miss(url)
84
- url += url.include?('?') ? '&' : '?'
85
- url += SecureRandom.hex
86
- RestClient.get(url, akamai_debug_headers)
92
+ def build_request(uri, headers)
93
+ req = Net::HTTP::Get.new(uri)
94
+ headers.each { |key, value| req.send(:[]=, key, value) }
95
+
96
+ req
87
97
  end
88
98
  end
89
99
  end
@@ -0,0 +1,45 @@
1
+ module AkamaiRSpec
2
+ class Response
3
+ def initialize(response)
4
+ @response = response
5
+ end
6
+
7
+ def headers
8
+ headers = Hash[@response.to_hash.map{ |k, v| [k.gsub(/-/,'_').downcase.to_sym, v] }]
9
+ headers.each do |k, v|
10
+ if v.is_a?(Array) && v.size == 1
11
+ headers[k] = v.first
12
+ end
13
+ end
14
+
15
+ headers
16
+ end
17
+
18
+ def code
19
+ @response.code.to_i
20
+ end
21
+
22
+ def cookies
23
+ cookie_header = headers.to_hash[:set_cookie]
24
+ if cookie_header
25
+ if cookie_header.is_a?(Array)
26
+ cookies_string = cookie_header.collect do |header_value|
27
+ header_value.split('; ')
28
+ end
29
+ cookies_string.flatten!
30
+ cookies_array = cookies_string.collect { |c| c.split('=') }
31
+ else
32
+ cookies_array = [cookie_header.split('=')]
33
+ end
34
+
35
+ Hash[cookies_array]
36
+ else
37
+ {}
38
+ end
39
+ end
40
+
41
+ def method_missing(method, *args)
42
+ @response.send(method, *args)
43
+ end
44
+ end
45
+ end
data/lib/akamai_rspec.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'akamai_rspec/akamai_headers'
2
2
  require 'akamai_rspec/matchers/matchers'
3
3
  require 'akamai_rspec/request'
4
+ require 'akamai_rspec/response'
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: akamai_rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bianca Gibson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-27 00:00:00.000000000 Z
11
+ date: 2016-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '1.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.8'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.8'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.2'
55
55
  description: Test your akamai configuration with rspec
@@ -65,7 +65,9 @@ files:
65
65
  - lib/akamai_rspec/matchers/matchers.rb
66
66
  - lib/akamai_rspec/matchers/non_akamai.rb
67
67
  - lib/akamai_rspec/matchers/redirects.rb
68
+ - lib/akamai_rspec/matchers/x_cache_headers.rb
68
69
  - lib/akamai_rspec/request.rb
70
+ - lib/akamai_rspec/response.rb
69
71
  homepage: https://github.com/realestate-com-au/akamai-rspec
70
72
  licenses:
71
73
  - MIT
@@ -76,17 +78,17 @@ require_paths:
76
78
  - lib
77
79
  required_ruby_version: !ruby/object:Gem::Requirement
78
80
  requirements:
79
- - - '>='
81
+ - - ">="
80
82
  - !ruby/object:Gem::Version
81
83
  version: '0'
82
84
  required_rubygems_version: !ruby/object:Gem::Requirement
83
85
  requirements:
84
- - - '>='
86
+ - - ">="
85
87
  - !ruby/object:Gem::Version
86
88
  version: '0'
87
89
  requirements: []
88
90
  rubyforge_project:
89
- rubygems_version: 2.1.11
91
+ rubygems_version: 2.2.2
90
92
  signing_key:
91
93
  specification_version: 4
92
94
  summary: Test your akamai configuration with rspec