summaryrefslogtreecommitdiff
path: root/test/cgi/test_cgi_modruby.rb
blob: 4eb02fac563105f5c8f74bc98707c5be759fcd15 (plain)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
require 'test/unit'
require 'cgi'


class CGIModrubyTest < Test::Unit::TestCase


  def setup
    @environ = {
      'SERVER_PROTOCOL' => 'HTTP/1.1',
      'REQUEST_METHOD'  => 'GET',
      #'QUERY_STRING'    => 'a=foo&b=bar',
    }
    ENV.update(@environ)
    CGI.class_eval { const_set(:MOD_RUBY, true) }
    Apache._reset()
    #@cgi = CGI.new
    #@req = Apache.request
  end


  def teardown
    @environ.each do |key, val| ENV.delete(key) end
    CGI.class_eval { remove_const(:MOD_RUBY) }
  end


  def test_cgi_modruby_simple
    req = Apache.request
    cgi = CGI.new
    assert(req._setup_cgi_env_invoked?)
    assert(! req._send_http_header_invoked?)
    actual = cgi.header
    assert_equal('', actual)
    assert_equal('text/html', req.content_type)
    assert(req._send_http_header_invoked?)
  end


  def test_cgi_modruby_complex
    req = Apache.request
    cgi = CGI.new
    options = {
      'status'   => 'FORBIDDEN',
      'location' => 'http://www.example.com/',
      'type'     => 'image/gif',
      'content-encoding' => 'deflate',
      'cookie'   => [ CGI::Cookie.new('name1', 'abc', '123'),
                      CGI::Cookie.new('name'=>'name2', 'value'=>'value2', 'secure'=>true),
                    ],
    }
    assert(req._setup_cgi_env_invoked?)
    assert(! req._send_http_header_invoked?)
    actual = cgi.header(options)
    assert_equal('', actual)
    assert_equal('image/gif', req.content_type)
    assert_equal('403 Forbidden', req.status_line)
    assert_equal(403, req.status)
    assert_equal('deflate', req.content_encoding)
    assert_equal('http://www.example.com/', req.headers_out['location'])
    assert_equal(["name1=abc&123; path=", "name2=value2; path=; secure"],
                 req.headers_out['Set-Cookie'])
    assert(req._send_http_header_invoked?)
  end


  def test_cgi_modruby_location
    req = Apache.request
    cgi = CGI.new
    options = {
      'status'   => '200 OK',
      'location' => 'http://www.example.com/',
    }
    actual = cgi.header(options)
    assert_equal('200 OK', req.status_line)  # should be '302 Found' ?
    assert_equal(302, req.status)
    assert_equal('http://www.example.com/', req.headers_out['location'])
  end


  def test_cgi_modruby_requestparams
    req = Apache.request
    req.args = 'a=foo&b=bar'
    cgi = CGI.new
    assert_equal('foo', cgi['a'])
    assert_equal('bar', cgi['b'])
  end


  instance_methods.each do |method|
    private method if method =~ /^test_(.*)/ && $1 != ENV['TEST']
  end if ENV['TEST']

end



## dummy class for mod_ruby
class Apache  #:nodoc:

  def self._reset
    @request = Request.new
  end

  def self.request
    return @request
  end

  class Request

    def initialize
      hash = {}
      def hash.add(name, value)
        (self[name] ||= []) << value
      end
      @headers_out  = hash
      @status_line  = nil
      @status       = nil
      @content_type = nil
      @content_encoding = nil
    end
    attr_accessor :headers_out, :status_line, :status, :content_type, :content_encoding

    attr_accessor :args
    #def args
    #  return ENV['QUERY_STRING']
    #end

    def send_http_header
      @http_header = '*invoked*'
    end
    def _send_http_header_invoked?
      @http_header ? true : false
    end

    def setup_cgi_env
      @cgi_env = '*invoked*'
    end
    def _setup_cgi_env_invoked?
      @cgi_env ? true : false
    end

  end

end