ruby-web 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/ChangeLog +474 -0
  2. data/INSTALL.txt +9 -0
  3. data/InstalledFiles +180 -0
  4. data/LICENSE.txt +74 -0
  5. data/Rakefile +529 -0
  6. data/TODO +65 -0
  7. data/doc/additional.xml +149 -0
  8. data/doc/core.xml +652 -0
  9. data/doc/credits/index.xml +52 -0
  10. data/doc/credits/php.contributors.xml +118 -0
  11. data/doc/credits/php.language-snippets.ent +622 -0
  12. data/doc/install/index.xml +136 -0
  13. data/doc/install/mac/index.xml +21 -0
  14. data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
  15. data/doc/install/unix/index.xml +46 -0
  16. data/doc/install/win/apache1.xml +166 -0
  17. data/doc/install/win/apache2.xml +141 -0
  18. data/doc/install/win/iis.xml +162 -0
  19. data/doc/install/win/index.xml +24 -0
  20. data/doc/install/win/installer.xml +31 -0
  21. data/doc/install/win/manual.xml +43 -0
  22. data/doc/manual.xml +69 -0
  23. data/doc/old/apache_cgi.txt +23 -0
  24. data/doc/old/fastcgi.txt +23 -0
  25. data/doc/old/mod_ruby.txt +21 -0
  26. data/doc/old/snippets.rdoc +183 -0
  27. data/doc/old/webrick.txt +23 -0
  28. data/doc/old/windows_cgi.txt +9 -0
  29. data/doc/tutorial.xml +14 -0
  30. data/doc/xsl/manual-multi.xsl +10 -0
  31. data/doc/xsl/manual-pdf.xsl +6 -0
  32. data/doc/xsl/manual-single.xsl +6 -0
  33. data/doc/xsl/manual.css +22 -0
  34. data/install.rb +1022 -0
  35. data/lib/formatter.rb +314 -0
  36. data/lib/html-parser.rb +429 -0
  37. data/lib/htmlrepair.rb +113 -0
  38. data/lib/htmlsplit.rb +842 -0
  39. data/lib/sgml-parser.rb +332 -0
  40. data/lib/web.rb +68 -0
  41. data/lib/web/assertinclude.rb +129 -0
  42. data/lib/web/config.rb +50 -0
  43. data/lib/web/connection.rb +1070 -0
  44. data/lib/web/convenience.rb +154 -0
  45. data/lib/web/formreader.rb +318 -0
  46. data/lib/web/htmlparser/html-parser.rb +429 -0
  47. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  48. data/lib/web/htmltools/element.rb +296 -0
  49. data/lib/web/htmltools/stparser.rb +276 -0
  50. data/lib/web/htmltools/tags.rb +286 -0
  51. data/lib/web/htmltools/tree.rb +139 -0
  52. data/lib/web/htmltools/xmltree.rb +160 -0
  53. data/lib/web/htmltools/xpath.rb +71 -0
  54. data/lib/web/info.rb +63 -0
  55. data/lib/web/load.rb +210 -0
  56. data/lib/web/mime.rb +87 -0
  57. data/lib/web/phprb.rb +340 -0
  58. data/lib/web/resources/test/cookie.rb +33 -0
  59. data/lib/web/resources/test/counter.rb +20 -0
  60. data/lib/web/resources/test/multipart.rb +14 -0
  61. data/lib/web/resources/test/redirect.rb +8 -0
  62. data/lib/web/resources/test/stock.rb +33 -0
  63. data/lib/web/sapi/apache.rb +129 -0
  64. data/lib/web/sapi/fastcgi.rb +22 -0
  65. data/lib/web/sapi/install/apache.rb +180 -0
  66. data/lib/web/sapi/install/iis.rb +93 -0
  67. data/lib/web/sapi/install/macosx.rb +90 -0
  68. data/lib/web/sapi/webrick.rb +86 -0
  69. data/lib/web/session.rb +83 -0
  70. data/lib/web/shim/cgi.rb +129 -0
  71. data/lib/web/shim/rails.rb +175 -0
  72. data/lib/web/stringio.rb +78 -0
  73. data/lib/web/strscanparser.rb +24 -0
  74. data/lib/web/tagparser.rb +96 -0
  75. data/lib/web/testing.rb +666 -0
  76. data/lib/web/traceoutput.rb +75 -0
  77. data/lib/web/unit.rb +56 -0
  78. data/lib/web/upload.rb +59 -0
  79. data/lib/web/validate.rb +52 -0
  80. data/lib/web/wiki.rb +557 -0
  81. data/lib/web/wiki/linker.rb +72 -0
  82. data/lib/web/wiki/page.rb +201 -0
  83. data/lib/webunit.rb +27 -0
  84. data/lib/webunit/assert.rb +152 -0
  85. data/lib/webunit/converter.rb +154 -0
  86. data/lib/webunit/cookie.rb +118 -0
  87. data/lib/webunit/domwalker.rb +185 -0
  88. data/lib/webunit/exception.rb +14 -0
  89. data/lib/webunit/form.rb +116 -0
  90. data/lib/webunit/frame.rb +37 -0
  91. data/lib/webunit/htmlelem.rb +122 -0
  92. data/lib/webunit/image.rb +26 -0
  93. data/lib/webunit/jscript.rb +31 -0
  94. data/lib/webunit/link.rb +33 -0
  95. data/lib/webunit/params.rb +321 -0
  96. data/lib/webunit/parser.rb +229 -0
  97. data/lib/webunit/response.rb +464 -0
  98. data/lib/webunit/runtest.rb +41 -0
  99. data/lib/webunit/table.rb +148 -0
  100. data/lib/webunit/testcase.rb +45 -0
  101. data/lib/webunit/ui/cui/testrunner.rb +50 -0
  102. data/lib/webunit/utils.rb +68 -0
  103. data/lib/webunit/webunit.rb +28 -0
  104. data/test/dev/action.rb +83 -0
  105. data/test/dev/forms.rb +104 -0
  106. data/test/dev/forms2.rb +104 -0
  107. data/test/dev/parser.rb +17 -0
  108. data/test/dev/scripts/dump.rb +24 -0
  109. data/test/dev/scripts/makedist.rb +62 -0
  110. data/test/dev/scripts/uri.rb +41 -0
  111. data/test/dev/scripts/uri/common.rb +432 -0
  112. data/test/dev/scripts/uri/ftp.rb +149 -0
  113. data/test/dev/scripts/uri/generic.rb +1106 -0
  114. data/test/dev/scripts/uri/http.rb +76 -0
  115. data/test/dev/scripts/uri/https.rb +26 -0
  116. data/test/dev/scripts/uri/ldap.rb +238 -0
  117. data/test/dev/scripts/uri/mailto.rb +260 -0
  118. data/test/dev/scripts/urireg.rb +174 -0
  119. data/test/dev/simpledispatcher.rb +156 -0
  120. data/test/dev/test.action.rb +146 -0
  121. data/test/dev/test.formreader.rb +463 -0
  122. data/test/dev/test.simpledispatcher.rb +186 -0
  123. data/test/dev/webunit/conv/digit-0.rb +21 -0
  124. data/test/dev/webunit/conv/digit-1.rb +17 -0
  125. data/test/dev/webunit/conv/digit.rb +23 -0
  126. data/test/dev/webunit/conv/test_digit-0.rb +16 -0
  127. data/test/dev/webunit/conv/test_digit-1.rb +19 -0
  128. data/test/dev/webunit/conv/test_digit.rb +26 -0
  129. data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
  130. data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
  131. data/test/dev/webunit/conv/test_digit_view.rb +134 -0
  132. data/test/installation/htdocs/cgi_test.rb +296 -0
  133. data/test/installation/htdocs/test_install.rb +4 -0
  134. data/test/installation/runwebtest.rb +5 -0
  135. data/test/installation/test_cookie.rb +128 -0
  136. data/test/installation/test_form.rb +47 -0
  137. data/test/installation/test_multipart.rb +51 -0
  138. data/test/installation/test_request.rb +24 -0
  139. data/test/installation/test_response.rb +35 -0
  140. data/test/unit/htdocs/cookie.rb +32 -0
  141. data/test/unit/htdocs/multipart.rb +28 -0
  142. data/test/unit/htdocs/redirect.rb +12 -0
  143. data/test/unit/htdocs/simple.rb +13 -0
  144. data/test/unit/htdocs/stock.rb +33 -0
  145. data/test/unit/test_assert.rb +162 -0
  146. data/test/unit/test_cookie.rb +114 -0
  147. data/test/unit/test_domwalker.rb +77 -0
  148. data/test/unit/test_form.rb +42 -0
  149. data/test/unit/test_frame.rb +40 -0
  150. data/test/unit/test_htmlelem.rb +74 -0
  151. data/test/unit/test_image.rb +45 -0
  152. data/test/unit/test_jscript.rb +57 -0
  153. data/test/unit/test_link.rb +85 -0
  154. data/test/unit/test_multipart.rb +51 -0
  155. data/test/unit/test_params.rb +210 -0
  156. data/test/unit/test_parser.rb +53 -0
  157. data/test/unit/test_response.rb +150 -0
  158. data/test/unit/test_table.rb +70 -0
  159. data/test/unit/test_utils.rb +106 -0
  160. data/test/unit/test_webunit.rb +28 -0
  161. data/test/web/mod_ruby_stub.rb +39 -0
  162. data/test/web/test.assertinclude.rb +109 -0
  163. data/test/web/test.buffer.rb +182 -0
  164. data/test/web/test.code.loader.rb +78 -0
  165. data/test/web/test.config.rb +31 -0
  166. data/test/web/test.error.handling.rb +91 -0
  167. data/test/web/test.formreader-2.0.rb +352 -0
  168. data/test/web/test.load.rb +125 -0
  169. data/test/web/test.mime-type.rb +23 -0
  170. data/test/web/test.narf.cgi.rb +106 -0
  171. data/test/web/test.phprb.rb +239 -0
  172. data/test/web/test.request.rb +368 -0
  173. data/test/web/test.response.rb +637 -0
  174. data/test/web/test.ruby-web.rb +10 -0
  175. data/test/web/test.session.rb +50 -0
  176. data/test/web/test.shim.cgi.rb +96 -0
  177. data/test/web/test.tagparser.rb +65 -0
  178. data/test/web/test.template2.rb +297 -0
  179. data/test/web/test.testing2.rb +318 -0
  180. data/test/web/test.upload.rb +45 -0
  181. data/test/web/test.validate.rb +46 -0
  182. data/test/web/test.web.test.rb +495 -0
  183. data/test/wiki/test.history.rb +297 -0
  184. data/test/wiki/test.illustration_page.rb +287 -0
  185. data/test/wiki/test.linker.rb +197 -0
  186. data/test/wiki/test.tarpit.rb +56 -0
  187. data/test/wiki/test.wiki.rb +300 -0
  188. data/test/wikitestroot/admin.rb +7 -0
  189. data/test/wikitestroot/wiki.rb +6 -0
  190. metadata +234 -0
@@ -0,0 +1,174 @@
1
+ # urireg.rb: generates Regexps for uri.rb
2
+ # $Id: urireg.rb,v 1.1.1.1 2002/11/29 04:34:24 patsplat Exp $
3
+
4
+ # CAUTION: Some regexps generated by this cannot be compiled.
5
+ # In ruby v1.4.3, /\//.source() generates "/".
6
+
7
+ =begin
8
+ rfc2396
9
+ URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
10
+ absoluteURI = scheme ":" ( hier_part | opaque_part )
11
+ relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
12
+
13
+ hier_part = ( net_path | abs_path ) [ "?" query ]
14
+ opaque_part = uric_no_slash *uric
15
+
16
+ uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
17
+ "&" | "=" | "+" | "$" | ","
18
+
19
+ net_path = "//" authority [ abs_path ]
20
+ abs_path = "/" path_segments
21
+ rel_path = rel_segment [ abs_path ]
22
+
23
+ rel_segment = 1*( unreserved | escaped |
24
+ ";" | "@" | "&" | "=" | "+" | "$" | "," )
25
+
26
+ scheme = alpha *( alpha | digit | "+" | "-" | "." )
27
+
28
+ authority = server | reg_name
29
+
30
+ reg_name = 1*( unreserved | escaped | "$" | "," |
31
+ ";" | ":" | "@" | "&" | "=" | "+" )
32
+
33
+ server = [ [ userinfo "@" ] hostport ]
34
+ userinfo = *( unreserved | escaped |
35
+ ";" | ":" | "&" | "=" | "+" | "$" | "," )
36
+
37
+ hostport = host [ ":" port ]
38
+ host = hostname | IPv4address
39
+ hostname = *( domainlabel "." ) toplabel [ "." ]
40
+ domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
41
+ toplabel = alpha | alpha *( alphanum | "-" ) alphanum
42
+ IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
43
+ port = *digit
44
+
45
+ path = [ abs_path | opaque_part ] # path is dangling
46
+ path_segments = segment *( "/" segment )
47
+ segment = *pchar *( ";" param )
48
+ param = *pchar
49
+ pchar = unreserved | escaped |
50
+ ":" | "@" | "&" | "=" | "+" | "$" | ","
51
+
52
+ query = *uric
53
+
54
+ fragment = *uric
55
+
56
+ uric = reserved | unreserved | escaped
57
+ reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
58
+ "$" | ","
59
+ unreserved = alphanum | mark
60
+ mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
61
+ "(" | ")"
62
+
63
+ escaped = "%" hex hex
64
+ hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
65
+ "a" | "b" | "c" | "d" | "e" | "f"
66
+
67
+ alphanum = alpha | digit
68
+ alpha = lowalpha | upalpha
69
+
70
+ lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
71
+ "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
72
+ "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
73
+ upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
74
+ "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
75
+ "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
76
+ digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
77
+ "8" | "9"
78
+ =end
79
+
80
+ require 'regman'
81
+
82
+ # pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
83
+ PCHAR = /[0-9A-Za-z\-_.!~*'():@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f]/
84
+
85
+ # param = *pchar
86
+ PARAM = /(?:[0-9A-Za-z\-_.!~*'():@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*/
87
+
88
+ # segment = *pchar *( ";" param )
89
+ SEGMENT = /(?:[0-9A-Za-z\-_.!~*'():@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*(?:;(?:[0-9A-Za-z\-_.!~*'():@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*/
90
+
91
+ # IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
92
+ IPV4ADDRESS = /\d+\.\d+\.\d+\.\d+/
93
+
94
+ # toplabel = alpha | alpha *( alphanum | "-" ) alphanum
95
+ TOPLABEL = /[A-Za-z]|[A-Za-z][0-9A-Za-z\-]*[0-9A-Za-z]/
96
+
97
+ # domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
98
+ DOMAINLABEL = /[0-9A-Za-z]|[0-9A-Za-z][0-9A-Za-z\-]*[0-9A-Za-z]/
99
+
100
+ # hostname = *( domainlabel "." ) toplabel [ "." ]
101
+ HOSTNAME = RM.cat(RM.star(RM.cat(DOMAINLABEL, /\./)), TOPLABEL, /\.?/)
102
+
103
+ # path_segments = segment *( "/" segment )
104
+ tmp = RM.cat(SEGMENT, RM.star(RM.cat(/\//, SEGMENT)))
105
+ PATH_SEGMENTS = /\A#{tmp.source}\z/
106
+
107
+ # abs_path = "/" path_segments
108
+ # equals
109
+ # abs_path = "/" segment *( "/" segment )
110
+ # equals
111
+ # abs_path = 1*( "/" segment )
112
+ tmp = RM.plus(RM.cat(/\//, SEGMENT))
113
+ ABS_PATH = /\A#{tmp.source}\z/
114
+
115
+ # rel_segment = 1*( unreserved | escaped |
116
+ # ";" | "@" | "&" | "=" | "+" | "$" | "," )
117
+ REL_SEGMENT = /\A(?:[0-9A-Za-z\-_.!~*'();@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])+\z/
118
+
119
+ # host = hostname | IPv4address
120
+ tmp = RM.bar(HOSTNAME, /\d+\.\d+\.\d+\.\d+/)
121
+ HOST = /\A(?:#{tmp.source})\z/
122
+
123
+ # userinfo = *( unreserved | escaped |
124
+ # ";" | ":" | "&" | "=" | "+" | "$" | "," )
125
+ USERINFO = /\A(?:[0-9A-Za-z\-_.!~*'();:&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*\z/
126
+
127
+ # reg_name = 1*( unreserved | escaped | "$" | "," |
128
+ # ";" | ":" | "@" | "&" | "=" | "+" )
129
+ REG_NAME = /\A(?:[0-9A-Za-z\-_.!~*'()$,;:@&=+]|%[0-9A-Fa-f][0-9A-Fa-f])+\z/
130
+
131
+ # query = *uric
132
+ # uric = reserved | unreserved | escaped
133
+ QUERY = /\A(?:[0-9A-Za-z\-_.!~*'();\/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*\z/
134
+
135
+ # scheme = alpha *( alpha | digit | "+" | "-" | "." )
136
+ SCHEME = /\A[A-Za-z][0-9A-Za-z+\-.]*\z/
137
+
138
+ # fragment = *uric
139
+ FRAGMENT = QUERY
140
+
141
+ puts 'FRAGMENT (invalid source)'
142
+ puts FRAGMENT.source
143
+ puts
144
+
145
+ puts 'SCHEME'
146
+ puts SCHEME.source
147
+ puts
148
+
149
+ puts 'QUERY (invalid source)'
150
+ puts QUERY.source
151
+ puts
152
+
153
+ puts 'REG_NAME'
154
+ puts REG_NAME.source
155
+ puts
156
+
157
+ puts 'USERINFO'
158
+ puts USERINFO.source
159
+ puts
160
+
161
+ puts 'HOST'
162
+ puts HOST.source
163
+ puts
164
+
165
+ puts 'REL_SEGMENT'
166
+ puts REL_SEGMENT.source
167
+ puts
168
+
169
+ puts 'PATH_SEGMENTS (invalid source)'
170
+ puts PATH_SEGMENTS.source
171
+ puts
172
+
173
+ puts 'ABS_PATH (invalid source)'
174
+ puts ABS_PATH.source
@@ -0,0 +1,156 @@
1
+ module Web
2
+ # Web::SimpleDispatcher provides a simple framework for organizing
3
+ # Web applications, combining them with forms and handling forms.
4
+ #
5
+ # The following is an example form template
6
+ # '/myappdir/html/templates/my_app.html
7
+ #
8
+ # <html>
9
+ # <body>
10
+ # <narf:form name="my_form" method="post">
11
+ # <narf:text name="field1">
12
+ # <narf:textarea name="field2">
13
+ # </narf:form>
14
+ # </body>
15
+ # </html>
16
+ #
17
+ # Patrick notes: simple dispatcher might not be simple.
18
+ # view as promising alpha
19
+ module SimpleDispatcher #:nodoc: all
20
+ def SimpleDispatcher.trace_dispatcher text
21
+ if $ADD_TEST_OUTPUT
22
+ Kernel.puts text
23
+ end
24
+ end
25
+
26
+ class Link
27
+ attr_reader :page, :query
28
+
29
+ def initialize page, query
30
+ @page = page
31
+ @query = query
32
+ end
33
+
34
+ def get_link
35
+ "#{SimpleDispatcher.template_from_class(@page)}?#{Link.make_query_string(Web.encode_objects(@query))}"
36
+ end
37
+
38
+ def encode
39
+ encode64(Marshal.dump(self))
40
+ end
41
+
42
+ class << self
43
+ def make_query_string query
44
+ query.collect do |k,v|
45
+ "#{k}=#{Web.escape(v)}"
46
+ end.join("&")
47
+ end
48
+
49
+ def Link.unencode string
50
+ Marshal.load(decode64(string))
51
+ end
52
+ end
53
+ end
54
+
55
+ module TemplateMixin
56
+ def redirect_to_template templateClass, params
57
+ Web.reset_headers
58
+ Web.set_redirect File.join(Web.script_name, "#{templateClass.template}?#{Web.make_query_string(Web.encode_objects(params))}")
59
+ end
60
+
61
+ def assign_params
62
+ params = {}
63
+ Web.keys.each do |k|
64
+ if k
65
+ params[k] = Web[k]
66
+ end
67
+ end
68
+
69
+ Scope.new(self).update( params )
70
+ end
71
+ end
72
+
73
+ module TemplateClassMixin
74
+ def template
75
+ SimpleDispatcher::template_from_class self
76
+ end
77
+
78
+ def redirect_to params
79
+ Web.reset_headers
80
+ Web.set_redirect File.join(Web.script_name, "#{template}?#{Web.make_query_string(Web.encode_objects(params))}")
81
+ end
82
+
83
+ def template_filename
84
+ template + ".html"
85
+ end
86
+
87
+ def format_description
88
+ "Template: #{template_filename}, formclass #{name}"
89
+ end
90
+
91
+ def was_not_a_submit
92
+ Web["__submitted"] == ""
93
+ end
94
+
95
+ def handle aTemplate
96
+ if was_not_a_submit
97
+ # trace_dispatcher format_description
98
+ else
99
+ # trace_dispatcher "Submit to: #{name}"
100
+ aTemplate.assign_params
101
+ aTemplate.on_submit({})
102
+ end
103
+
104
+ Web::load template_filename
105
+
106
+ #aTemplate, Web.encode_objects(Web.query)
107
+ end
108
+ end
109
+
110
+ class Template
111
+ include TemplateMixin
112
+
113
+ class << self
114
+ include TemplateClassMixin
115
+ end
116
+ end
117
+
118
+ class << self
119
+ def class_from_template template
120
+ template.gsub(/(^|_)([a-z])/) { |m| m.gsub('_','').upcase }
121
+ end
122
+
123
+ def template_from_class aClass
124
+ first = true
125
+ aClass.name.gsub(/([A-Z])/) do |m|
126
+ value = m.downcase
127
+ if first
128
+ first = false
129
+ value
130
+ else
131
+ "_" + value
132
+ end
133
+ end
134
+ end
135
+
136
+ def template_from_path_info
137
+ if (Web.get_cgi.path_info != "/")
138
+ if (m = /\/?(.+)\/?/.match(Web.get_cgi.path_info))
139
+ eval(class_from_template(m[1]))
140
+ end
141
+ end
142
+ end
143
+
144
+ def handle_request options
145
+ unless formclass = template_from_path_info
146
+ options[:default].redirect_to Web.query
147
+ return
148
+ end
149
+
150
+ aTemplate = formclass.new(Web.query)
151
+
152
+ formclass.handle aTemplate
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,146 @@
1
+ module Web
2
+ class Action
3
+ def Action.clear_actions
4
+ Thread::current[:actions] = [ ]
5
+ end
6
+ end
7
+ end
8
+
9
+ class TestAction < Test::Unit::TestCase
10
+ def set_up
11
+ end
12
+
13
+ def teardown
14
+ @output = @cgi = @action = @stored_pattern = nil
15
+ Web::Action.clear_actions
16
+ end
17
+
18
+ def output
19
+ @output ||= ""
20
+ end
21
+
22
+ def cgi params={}
23
+ Web::CGI.new( :out => output, :params => params )
24
+ end
25
+
26
+ def stored_pattern pattern={}
27
+ @stored_pattern ||= pattern
28
+ end
29
+
30
+ def action( pattern=stored_pattern, &function )
31
+ @action ||= Web::Action.new( pattern, &function )
32
+ end
33
+
34
+ def test_failed_match_on_blank_cgi
35
+ action( "name" => // )
36
+ assert_equal( false, action.applies?(cgi) )
37
+ end
38
+
39
+ def test_fails_with_different_params
40
+ action "name" => //
41
+ assert_equal( false, action.applies?(cgi( {"not" => "me"} )) )
42
+ end
43
+
44
+ def test_matchs_by_param_present
45
+ action "name" => //
46
+ assert action.applies?(cgi( {"name" => "something"}) )
47
+ end
48
+
49
+ def test_matches_exact_param
50
+ action "name" => "patrick"
51
+ assert action.applies?(cgi( {"name" => "patrick" } ))
52
+ assert_equal( false, action.applies?(cgi( {"name" => "patrick.may"} ) ))
53
+ end
54
+
55
+ def test_matches_pattern
56
+ action "name" => /patrick|tom/
57
+ assert action.applies?(cgi( {"name" => "patrick the great" } ))
58
+ assert action.applies?(cgi( {"name" => "tom the silly" } ))
59
+ end
60
+
61
+ def test_match_is_not_anal
62
+ action "name" => //
63
+ assert action.applies?(cgi( {"name" => "something", "ignore" => "me"} ))
64
+ end
65
+
66
+ def test_runs_block
67
+ action_ran_flag = false
68
+ action( "name" => // ) {
69
+ action_ran_flag = true
70
+ }
71
+
72
+ action.run
73
+
74
+ assert action_ran_flag
75
+ end
76
+
77
+ def test_guards_block
78
+ Web::Action.new.run
79
+ end
80
+
81
+ def test_passes_cgi_in_with_run
82
+ action_ran_flag = false
83
+ action( "name" => // ){ |cgi|
84
+ action_ran_flag = cgi.key? "flag"
85
+ }
86
+
87
+ action.run cgi( "flag" => "it ran" )
88
+
89
+ assert action_ran_flag
90
+ end
91
+
92
+ def test_pick_action_picks_the_most_specific_action
93
+ one = Web::Action.new( "name" => // ) { assert false }
94
+ second = Web::Action.new( "name" => "patrick" ) { assert true }
95
+ third = Web::Action.new( "name" => /patrick|tom/ ) { assert false }
96
+
97
+ # for some reason, object ids change with thread local variables
98
+ # assert_equal( second, Web::Action.pick( cgi({ "name" => "patrick"}) ) )
99
+
100
+ Web::Action.pick( cgi({ "name" => "patrick"}) ).run
101
+ end
102
+
103
+ def test_set_default_action
104
+ default = Web::Action.new
105
+ another = Web::Action.new( "this" => "that", "here" => "there" )
106
+ assert_equal( default, Web::Action.pick( cgi ) )
107
+ end
108
+
109
+ # this test causes no initial default action
110
+ # def test_raises_exception_if_no_action_is_found
111
+ # assert_raises(Web::Exception){
112
+ # Web::Action.pick cgi
113
+ # }
114
+ # end
115
+
116
+ def test_doesnt_raise_exception_if_no_exception_is_found
117
+ Web::Action.pick(cgi).run
118
+ end
119
+
120
+ def test_blank_action_doesnt_mask_default
121
+ Web::Action.pick(cgi).run
122
+
123
+ default = Web::Action.new
124
+
125
+ assert_equal( default, Web::Action.pick(cgi) )
126
+ end
127
+
128
+ def test_run
129
+ cgi_params = { "name" => "patrick" }
130
+ test_params = {}
131
+
132
+ Web::Action.new { |cgi|
133
+ test_params = cgi.multiple_params
134
+ }
135
+
136
+ Web::set_cgi nil
137
+ Web::Action.run :params => cgi_params, :out => ""
138
+
139
+ assert_equal( cgi_params, test_params )
140
+ end
141
+
142
+ def todo_test_subclassing_action
143
+
144
+ end
145
+
146
+ end