File: key_test.rb

package info (click to toggle)
ruby-rack-cache 1.17.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 648 kB
  • sloc: ruby: 3,581; makefile: 4
file content (85 lines) | stat: -rw-r--r-- 2,401 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
require_relative 'test_helper'
require 'rack/cache/key'

describe Rack::Cache::Key do
  def mock_request(*args)
    uri, opts = args
    env = Rack::MockRequest.env_for(uri, opts || {})
    Rack::Cache::Request.new(env)
  end

  def new_key(request)
    Rack::Cache::Key.call(request)
  end

  def with_query_string_ignore(proc)
    Rack::Cache::Key.query_string_ignore = proc
    yield
  ensure
    Rack::Cache::Key.query_string_ignore = nil
  end

  it "sorts params" do
    request = mock_request('/test?z=last&a=first')
    new_key(request).must_include('a=first&z=last')
  end

  it "handles badly encoded params" do
    request = mock_request('/test?%D0%BA=%D1')
    new_key(request).must_include('%D0%BA=%D1')
  end

  it "doesn't confuse encoded equals sign with query string separator" do
    request = mock_request('/test?weird%3Dkey=whatever')
    new_key(request).must_include('weird%3Dkey=whatever')
  end

  it "includes the scheme" do
    request = mock_request(
      '/test',
      'rack.url_scheme' => 'https',
      'HTTP_HOST' => 'www2.example.org'
    )
    new_key(request).must_include('https://')
  end

  it "includes host" do
    request = mock_request('/test', "HTTP_HOST" => 'www2.example.org')
    new_key(request).must_include('www2.example.org')
  end

  it "includes path" do
    request = mock_request('/test')
    new_key(request).must_include('/test')
  end

  it "does not include question mark if there is no query string" do
    request = mock_request('/test')
    new_key(request).wont_include('?')
  end

  it "sorts the query string by key/value after decoding" do
    request = mock_request('/test?x=q&a=b&%78=c')
    new_key(request).must_match(/\?a=b&x=c&x=q$/)
  end

  it "is in order of scheme, host, path, params" do
    request = mock_request('/test?x=y', "HTTP_HOST" => 'www2.example.org')
    new_key(request).must_equal "http://www2.example.org/test?x=y"
  end

  it "ignores params based on configuration" do
    with_query_string_ignore proc { |k, _v| k == 'a' } do
      request = mock_request('/test?a=first&z=last')
      new_key(request).wont_include('a=first')
      new_key(request).must_include('z=last')
    end
  end

  it "does not include query when all params are ignored" do
    with_query_string_ignore proc { |k, _v| k == 'a' } do
      request = mock_request('/test?a=a')
      new_key(request).wont_include('?')
    end
  end
end