49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
RSpec::Matchers.define :have_cacheable_headers do
 | 
						|
  match do |response|
 | 
						|
    @response = response
 | 
						|
 | 
						|
    @errors = [].tap do |errors|
 | 
						|
      errors << check_cookies
 | 
						|
      errors << check_cookie_headers
 | 
						|
      errors << check_session
 | 
						|
      errors << check_cache_control
 | 
						|
      errors << check_vary if @expected_vary.present?
 | 
						|
    end
 | 
						|
 | 
						|
    @errors.compact.empty?
 | 
						|
  end
 | 
						|
 | 
						|
  chain :with_vary do |string|
 | 
						|
    @expected_vary = string
 | 
						|
  end
 | 
						|
 | 
						|
  failure_message do
 | 
						|
    <<~ERROR
 | 
						|
      Expected that the response would be cacheable but it was not:
 | 
						|
        - #{@errors.compact.join("\n  - ")}
 | 
						|
    ERROR
 | 
						|
  end
 | 
						|
 | 
						|
  def check_vary
 | 
						|
    "Response `Vary` header does not contain `#{@expected_vary}`" unless @response.headers['Vary'].include?(@expected_vary)
 | 
						|
  end
 | 
						|
 | 
						|
  def check_cookies
 | 
						|
    'Reponse cookies are present' unless @response.cookies.empty?
 | 
						|
  end
 | 
						|
 | 
						|
  def check_cookie_headers
 | 
						|
    'Response `Set-Cookies` headers are present' if @response.headers['Set-Cookies'].present?
 | 
						|
  end
 | 
						|
 | 
						|
  def check_session
 | 
						|
    'The session is not empty' unless session.empty?
 | 
						|
  end
 | 
						|
 | 
						|
  def check_cache_control
 | 
						|
    'The `Cache-Control` header does not contain `public`' unless @response.headers['Cache-Control'].include?('public')
 | 
						|
  end
 | 
						|
end
 |