akamai_rspec 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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