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 +4 -4
- data/lib/akamai_rspec/akamai_headers.rb +1 -1
- data/lib/akamai_rspec/matchers/caching.rb +8 -7
- data/lib/akamai_rspec/matchers/honour_origin_headers.rb +2 -2
- data/lib/akamai_rspec/matchers/matchers.rb +1 -52
- data/lib/akamai_rspec/matchers/non_akamai.rb +11 -3
- data/lib/akamai_rspec/matchers/x_cache_headers.rb +29 -0
- data/lib/akamai_rspec/request.rb +69 -59
- data/lib/akamai_rspec/response.rb +45 -0
- data/lib/akamai_rspec.rb +1 -0
- metadata +15 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26b9891b50b16db2cb6b518794ee939ab864f9e4
|
4
|
+
data.tar.gz: 4c46663b9c2ba79788fc98a846c519585483f66e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 =
|
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 =
|
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 =
|
27
|
+
response = AkamaiRSpec::Request.get url
|
28
28
|
x_check_cacheable(response, 'NO')
|
29
|
-
response =
|
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
|
-
|
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 =
|
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 =
|
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]
|
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 =
|
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 =
|
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 =
|
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
|
data/lib/akamai_rspec/request.rb
CHANGED
@@ -1,89 +1,99 @@
|
|
1
1
|
require 'rest-client'
|
2
|
-
require '
|
2
|
+
require 'forwardable'
|
3
3
|
|
4
|
-
module
|
4
|
+
module AkamaiRSpec
|
5
5
|
class Request
|
6
|
-
|
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
|
-
|
21
|
-
|
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.
|
33
|
-
|
34
|
-
"http://#{domain}#{url}"
|
19
|
+
def self.network=(env)
|
20
|
+
@@env = env
|
35
21
|
end
|
36
22
|
|
37
|
-
def self.
|
38
|
-
|
39
|
-
"https://#{domain}#{url}"
|
23
|
+
def self.get(url)
|
24
|
+
new.get(url)
|
40
25
|
end
|
41
26
|
|
42
|
-
|
43
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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.
|
53
|
-
|
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
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
84
|
-
|
85
|
-
|
86
|
-
|
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
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.
|
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:
|
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.
|
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.
|
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.
|
91
|
+
rubygems_version: 2.2.2
|
90
92
|
signing_key:
|
91
93
|
specification_version: 4
|
92
94
|
summary: Test your akamai configuration with rspec
|