1require 'test/unit'
2require 'cgi'
3
4
5class CGIModrubyTest < Test::Unit::TestCase
6
7
8  def setup
9    @environ = {
10      'SERVER_PROTOCOL' => 'HTTP/1.1',
11      'REQUEST_METHOD'  => 'GET',
12      #'QUERY_STRING'    => 'a=foo&b=bar',
13    }
14    ENV.update(@environ)
15    CGI.class_eval { const_set(:MOD_RUBY, true) }
16    Apache._reset()
17    #@cgi = CGI.new
18    #@req = Apache.request
19  end
20
21
22  def teardown
23    @environ.each do |key, val| ENV.delete(key) end
24    CGI.class_eval { remove_const(:MOD_RUBY) }
25  end
26
27
28  def test_cgi_modruby_simple
29    req = Apache.request
30    cgi = CGI.new
31    assert(req._setup_cgi_env_invoked?)
32    assert(! req._send_http_header_invoked?)
33    actual = cgi.http_header
34    assert_equal('', actual)
35    assert_equal('text/html', req.content_type)
36    assert(req._send_http_header_invoked?)
37  end
38
39
40  def test_cgi_modruby_complex
41    req = Apache.request
42    cgi = CGI.new
43    options = {
44      'status'   => 'FORBIDDEN',
45      'location' => 'http://www.example.com/',
46      'type'     => 'image/gif',
47      'content-encoding' => 'deflate',
48      'cookie'   => [ CGI::Cookie.new('name1', 'abc', '123'),
49                      CGI::Cookie.new('name'=>'name2', 'value'=>'value2', 'secure'=>true),
50                    ],
51    }
52    assert(req._setup_cgi_env_invoked?)
53    assert(! req._send_http_header_invoked?)
54    actual = cgi.http_header(options)
55    assert_equal('', actual)
56    assert_equal('image/gif', req.content_type)
57    assert_equal('403 Forbidden', req.status_line)
58    assert_equal(403, req.status)
59    assert_equal('deflate', req.content_encoding)
60    assert_equal('http://www.example.com/', req.headers_out['location'])
61    assert_equal(["name1=abc&123; path=", "name2=value2; path=; secure"],
62                 req.headers_out['Set-Cookie'])
63    assert(req._send_http_header_invoked?)
64  end
65
66
67  def test_cgi_modruby_location
68    req = Apache.request
69    cgi = CGI.new
70    options = {
71      'status'   => '200 OK',
72      'location' => 'http://www.example.com/',
73    }
74    cgi.http_header(options)
75    assert_equal('200 OK', req.status_line)  # should be '302 Found' ?
76    assert_equal(302, req.status)
77    assert_equal('http://www.example.com/', req.headers_out['location'])
78  end
79
80
81  def test_cgi_modruby_requestparams
82    req = Apache.request
83    req.args = 'a=foo&b=bar'
84    cgi = CGI.new
85    assert_equal('foo', cgi['a'])
86    assert_equal('bar', cgi['b'])
87  end
88
89
90  instance_methods.each do |method|
91    private method if method =~ /^test_(.*)/ && $1 != ENV['TEST']
92  end if ENV['TEST']
93
94end
95
96
97
98## dummy class for mod_ruby
99class Apache  #:nodoc:
100
101  def self._reset
102    @request = Request.new
103  end
104
105  def self.request
106    return @request
107  end
108
109  class Request
110
111    def initialize
112      hash = {}
113      def hash.add(name, value)
114        (self[name] ||= []) << value
115      end
116      @http_header = nil
117      @headers_out  = hash
118      @status_line  = nil
119      @status       = nil
120      @content_type = nil
121      @content_encoding = nil
122    end
123    attr_accessor :headers_out, :status_line, :status, :content_type, :content_encoding
124
125    attr_accessor :args
126    #def args
127    #  return ENV['QUERY_STRING']
128    #end
129
130    def send_http_header
131      @http_header = '*invoked*'
132    end
133    def _send_http_header_invoked?
134      @http_header ? true : false
135    end
136
137    def setup_cgi_env
138      @cgi_env = '*invoked*'
139    end
140    def _setup_cgi_env_invoked?
141      @cgi_env ? true : false
142    end
143
144  end
145
146end
147