ruby-web 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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