egalite 0.0.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 (113) hide show
  1. data/.gitignore +17 -0
  2. data/README.md +91 -0
  3. data/auth/basic.rb +32 -0
  4. data/blank.rb +53 -0
  5. data/egalite.rb +742 -0
  6. data/errorconsole.rb +77 -0
  7. data/examples/simple/example.rb +39 -0
  8. data/examples/simple/pages/test.html +15 -0
  9. data/examples/simple_db/example_db.rb +103 -0
  10. data/examples/simple_db/pages/edit.html +6 -0
  11. data/helper.rb +251 -0
  12. data/keitai/keitai.rb +107 -0
  13. data/keitai/ketai.rb +11 -0
  14. data/keitai/rack/ketai/carrier/abstract.rb +131 -0
  15. data/keitai/rack/ketai/carrier/au.rb +78 -0
  16. data/keitai/rack/ketai/carrier/docomo.rb +80 -0
  17. data/keitai/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
  18. data/keitai/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
  19. data/keitai/rack/ketai/carrier/emoji/emojidata.rb +836 -0
  20. data/keitai/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
  21. data/keitai/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
  22. data/keitai/rack/ketai/carrier/iphone.rb +8 -0
  23. data/keitai/rack/ketai/carrier/softbank.rb +82 -0
  24. data/keitai/rack/ketai/carrier.rb +17 -0
  25. data/keitai/rack/ketai/middleware.rb +24 -0
  26. data/m17n.rb +193 -0
  27. data/rack/auth/abstract/handler.rb +37 -0
  28. data/rack/auth/abstract/request.rb +37 -0
  29. data/rack/auth/basic.rb +58 -0
  30. data/rack/auth/digest/md5.rb +124 -0
  31. data/rack/auth/digest/nonce.rb +51 -0
  32. data/rack/auth/digest/params.rb +55 -0
  33. data/rack/auth/digest/request.rb +40 -0
  34. data/rack/builder.rb +80 -0
  35. data/rack/cascade.rb +41 -0
  36. data/rack/chunked.rb +49 -0
  37. data/rack/commonlogger.rb +49 -0
  38. data/rack/conditionalget.rb +47 -0
  39. data/rack/config.rb +15 -0
  40. data/rack/content_length.rb +29 -0
  41. data/rack/content_type.rb +23 -0
  42. data/rack/deflater.rb +96 -0
  43. data/rack/directory.rb +157 -0
  44. data/rack/etag.rb +32 -0
  45. data/rack/file.rb +92 -0
  46. data/rack/handler/cgi.rb +62 -0
  47. data/rack/handler/evented_mongrel.rb +8 -0
  48. data/rack/handler/fastcgi.rb +89 -0
  49. data/rack/handler/lsws.rb +63 -0
  50. data/rack/handler/mongrel.rb +90 -0
  51. data/rack/handler/scgi.rb +59 -0
  52. data/rack/handler/swiftiplied_mongrel.rb +8 -0
  53. data/rack/handler/thin.rb +18 -0
  54. data/rack/handler/webrick.rb +73 -0
  55. data/rack/handler.rb +88 -0
  56. data/rack/head.rb +19 -0
  57. data/rack/lint.rb +567 -0
  58. data/rack/lobster.rb +65 -0
  59. data/rack/lock.rb +16 -0
  60. data/rack/logger.rb +20 -0
  61. data/rack/methodoverride.rb +27 -0
  62. data/rack/mime.rb +208 -0
  63. data/rack/mock.rb +190 -0
  64. data/rack/nulllogger.rb +18 -0
  65. data/rack/recursive.rb +61 -0
  66. data/rack/reloader.rb +109 -0
  67. data/rack/request.rb +273 -0
  68. data/rack/response.rb +150 -0
  69. data/rack/rewindable_input.rb +103 -0
  70. data/rack/runtime.rb +27 -0
  71. data/rack/sendfile.rb +144 -0
  72. data/rack/server.rb +271 -0
  73. data/rack/session/abstract/id.rb +140 -0
  74. data/rack/session/cookie.rb +90 -0
  75. data/rack/session/memcache.rb +119 -0
  76. data/rack/session/pool.rb +100 -0
  77. data/rack/showexceptions.rb +349 -0
  78. data/rack/showstatus.rb +106 -0
  79. data/rack/static.rb +38 -0
  80. data/rack/urlmap.rb +55 -0
  81. data/rack/utils.rb +662 -0
  82. data/rack.rb +81 -0
  83. data/route.rb +231 -0
  84. data/sendmail.rb +222 -0
  85. data/sequel_helper.rb +20 -0
  86. data/session.rb +132 -0
  87. data/stringify_hash.rb +63 -0
  88. data/support.rb +35 -0
  89. data/template.rb +287 -0
  90. data/test/french.html +13 -0
  91. data/test/french_msg.html +3 -0
  92. data/test/m17n.txt +30 -0
  93. data/test/mobile.html +15 -0
  94. data/test/setup.rb +8 -0
  95. data/test/static/test.txt +1 -0
  96. data/test/template.html +58 -0
  97. data/test/template_inner.html +1 -0
  98. data/test/template_innerparam.html +1 -0
  99. data/test/test_auth.rb +43 -0
  100. data/test/test_blank.rb +44 -0
  101. data/test/test_csrf.rb +87 -0
  102. data/test/test_errorconsole.rb +91 -0
  103. data/test/test_handler.rb +155 -0
  104. data/test/test_helper.rb +296 -0
  105. data/test/test_keitai.rb +107 -0
  106. data/test/test_m17n.rb +129 -0
  107. data/test/test_route.rb +192 -0
  108. data/test/test_sendmail.rb +146 -0
  109. data/test/test_session.rb +83 -0
  110. data/test/test_stringify_hash.rb +67 -0
  111. data/test/test_template.rb +114 -0
  112. data/test.bat +2 -0
  113. metadata +240 -0
data/stringify_hash.rb ADDED
@@ -0,0 +1,63 @@
1
+ # used with http parameters
2
+ # simpler version of HashWithIndifferentAccess of Ruby on Rails
3
+
4
+ module Egalite
5
+ class StringifyHash < Hash
6
+ def self.create(values)
7
+ hash = self.new
8
+ hash.update(values)
9
+ hash
10
+ end
11
+ def [](k)
12
+ super(stringify(k))
13
+ end
14
+ def []=(k,v)
15
+ super(stringify(k),v)
16
+ end
17
+ def update(hash)
18
+ newhash = {}
19
+ hash.each { |k,v|
20
+ newhash[stringify(k)] = v
21
+ }
22
+ super(newhash)
23
+ end
24
+ alias_method :merge!, :update
25
+
26
+ def key?(key)
27
+ super(stringify(key))
28
+ end
29
+
30
+ alias_method :include?, :key?
31
+ alias_method :has_key?, :key?
32
+ alias_method :member?, :key?
33
+
34
+ def fetch(key, *extras)
35
+ super(stringify(key), *extras)
36
+ end
37
+
38
+ def values_at(*indices)
39
+ indices.collect {|key| self[key]}
40
+ end
41
+
42
+ def dup
43
+ StringifyHash.create(self)
44
+ end
45
+
46
+ def merge(hash)
47
+ dup.update(hash)
48
+ end
49
+
50
+ def delete(key)
51
+ super(stringify(key))
52
+ end
53
+
54
+ # Convert to a Hash with String keys.
55
+ def to_hash
56
+ Hash.new(default).merge(self)
57
+ end
58
+ private
59
+ def stringify(key)
60
+ key.kind_of?(Symbol) ? key.to_s : key
61
+ end
62
+ end
63
+ end
data/support.rb ADDED
@@ -0,0 +1,35 @@
1
+ # Egalite support methods
2
+
3
+ class Hash
4
+ def <<(b)
5
+ merge(b.to_hash)
6
+ end
7
+ def >>(b)
8
+ b.to_hash.merge(self)
9
+ end
10
+ end
11
+
12
+ class NilClass #:nodoc:
13
+ def size
14
+ 0
15
+ end
16
+ end
17
+
18
+ # <<from ActiveSupport library of Ruby on Rails>>
19
+ # (MIT License)
20
+
21
+ # Tries to send the method only if object responds to it. Return +nil+ otherwise.
22
+ #
23
+ # ==== Example :
24
+ #
25
+ # # Without try
26
+ # @person ? @person.name : nil
27
+ #
28
+ # With try
29
+ # @person.try(:name)
30
+ class Object
31
+ def try(method)
32
+ send(method) if respond_to?(method, true)
33
+ end
34
+ end
35
+
data/template.rb ADDED
@@ -0,0 +1,287 @@
1
+ require 'jcode'
2
+
3
+ module Egalite
4
+
5
+ class NonEscapeString < String
6
+ def +(b)
7
+ NonEscapeString.new(super(HTMLTagBuilder.escape_html(b)))
8
+ end
9
+ end
10
+
11
+ class HTMLTemplate
12
+ RE_NEST = /<(group|if|unless)\s+name=['"](.+?)['"]>/i
13
+ RE_ENDNEST = /<\/(group|if|unless)>/i
14
+ RE_PLACE = /&=([.-_0-9a-zA-Z]+?);/
15
+ RE_INPUT = /<input\s+(.+?)>/im
16
+ RE_SELECT = /<select\s+name\s*=\s*['"](.+?)['"](.*?)>\s*<\/select>/im
17
+
18
+ RE_A = /<a\s+(.+?)>/im
19
+ RE_FORM = /<form\s+(.+?)>/im
20
+
21
+ RE_INCLUDE = /<include\s+(.+?)\/>/i
22
+ RE_PARENT = /<parent\s+name=['"](.+?)['"]\s*\/>/i
23
+ RE_YIELD = /<yield\/>/i
24
+
25
+ attr_accessor :controller, :default_escape
26
+
27
+ def initialize
28
+ @default_escape = true
29
+ @controller = nil
30
+ end
31
+
32
+ private
33
+
34
+ def parse_tag_attributes(attrs)
35
+ a = attrs.split(/(\:?\w+(!:[^=])|\:?\w+=(?:'[^']+'|"[^"]+"|\S+))\s*/)
36
+ a = a.select { |s| s != "" }
37
+ hash = {}
38
+ a.each { |s|
39
+ b = s.split('=',2)
40
+ b[0].sub!(/\s$/,'')
41
+ b[1] = b[1][1..-2] if b[1] and (b[1][0,1] == '"' or b[1][0,1] == "'")
42
+ hash[b[0]] = b[1] || true
43
+ }
44
+ hash
45
+ end
46
+ def attr_colon(attrs)
47
+ colons = {}
48
+ attrs.each { |k,v| colons[k[1..-1]] = v if k =~ /^\:/ }
49
+ str = attrs.select { |k,v| k !~ /^\:/ }.map { |k,v| "#{k}='#{v}'" }.join(' ')
50
+ [colons, str]
51
+ end
52
+
53
+ def dotchain(values, name)
54
+ dots = name.split('.').select {|s| not s.empty? }
55
+
56
+ value = values
57
+ dots.each { |key|
58
+ value = if not value.is_a?(Hash) and value.respond_to?(key)
59
+ value.send(key)
60
+ elsif value.respond_to?(:[])
61
+ value[key] || value[key.to_sym]
62
+ end
63
+ break unless value
64
+ }
65
+ value
66
+ end
67
+
68
+ #
69
+ # tags
70
+ #
71
+ def placeholder(html, params)
72
+ html.gsub!(RE_PLACE) {
73
+ key = $1
74
+ if params[key].is_a?(NonEscapeString) or not @default_escape
75
+ params[key]
76
+ else
77
+ escapeHTML(params[key])
78
+ end
79
+ }
80
+ end
81
+ def input_tag(html, params)
82
+ html.gsub!(RE_INPUT) { |s|
83
+ attrs = parse_tag_attributes($1)
84
+ next s if attrs['checked'] or attrs['selected']
85
+ name = attrs['name']
86
+ next s unless name
87
+ case attrs['type']
88
+ when 'text'
89
+ next s if attrs['value']
90
+ s.sub!(/\/?>$/," value='"+escapeHTML(params[name])+"'/>") if params[name]
91
+ when 'hidden'
92
+ next s if attrs['value']
93
+ s.sub!(/\/?>$/," value='"+escapeHTML(params[name])+"'/>") if params[name]
94
+ when 'radio'
95
+ s.sub!(/\/?>$/," checked/>") if (params[name].to_s == attrs['value'])
96
+ when 'checkbox'
97
+ s.sub!(/\/?>$/," checked/>") if params[name]
98
+ end
99
+ s
100
+ }
101
+ end
102
+ def a_tag(html, params)
103
+ html.gsub!(RE_A) { |s|
104
+ attrs = parse_tag_attributes($1)
105
+ next s if attrs['href']
106
+ next s unless @controller
107
+
108
+ (colons, noncolons) = attr_colon(attrs)
109
+ next s if colons.empty?
110
+ # when :hoge=$foo, expand hash parameter ['foo']
111
+ colons.each { |k,v|
112
+ next if v[0,1] != '$'
113
+ val = params[v[1..-1]]
114
+ colons[k] = val
115
+ }
116
+ colons = StringifyHash.create(colons)
117
+ link = @controller.url_for(colons)
118
+ "<a href='#{link}' #{noncolons}>"
119
+ }
120
+ end
121
+ def form_tag(html,params)
122
+ html.gsub!(RE_FORM) { |s|
123
+ attrs = parse_tag_attributes($1)
124
+ next s if attrs['action']
125
+ next s unless @controller
126
+
127
+ (colons, noncolons) = attr_colon(attrs)
128
+ next s if colons.empty?
129
+ colons = StringifyHash.create(colons)
130
+ link = @controller.url_for(colons)
131
+ "<form action='#{link}' #{noncolons}>"
132
+ }
133
+ end
134
+ def select_tag(html,params)
135
+ html.gsub!(RE_SELECT) { sel = "<select name='#$1'#$2>"
136
+ if (params[$1] and params[$1].is_a?(Array))
137
+ params[$1].each_index() { |key|
138
+ next if (key == 0)
139
+ selected = " selected" if params[$1][0] == key
140
+ value = params[$1][key]
141
+ sel << "<option value='#{key}'#{selected}>"
142
+ sel << escapeHTML(value)
143
+ sel << "</option>" unless @keitai
144
+ }
145
+ end
146
+ sel << "</select>"
147
+ }
148
+ end
149
+
150
+ #
151
+ # main routines
152
+ #
153
+
154
+ def nonnestedtags(html, params)
155
+ placeholder(html,params)
156
+ input_tag(html,params)
157
+ a_tag(html,params)
158
+ form_tag(html,params)
159
+ select_tag(html,params)
160
+
161
+ # parse include tag
162
+ if block_given?
163
+ html.gsub!(RE_INCLUDE) {
164
+ attrs = parse_tag_attributes($1)
165
+ attrs.each { |k,v| attrs[k[1..-1]] = v if k =~ /^\:/ }
166
+ yield(attrs)
167
+ }
168
+ parent = nil
169
+ md = RE_PARENT.match(html)
170
+ parent = md[1] if md
171
+ html.gsub!(RE_PARENT,"")
172
+ if parent
173
+ txt = yield(parent)
174
+ txt.gsub!(RE_YIELD, html)
175
+ html = txt
176
+ end
177
+ end
178
+ html
179
+ end
180
+
181
+ def keyexpander(params, parent_params)
182
+ lambda { |k|
183
+ if k[0,1] == '.'
184
+ dotchain(params, k)
185
+ else
186
+ if params[k] == nil
187
+ if params[k.to_sym] == nil
188
+ parent_params[k]
189
+ else
190
+ params[k.to_sym]
191
+ end
192
+ else
193
+ params[k]
194
+ end
195
+ end
196
+ }
197
+ end
198
+
199
+ def string_after_outermost_closetag(html)
200
+ while md1 = RE_NEST.match(html)
201
+ break if (RE_ENDNEST.match(md1.pre_match))
202
+ html = string_after_outermost_closetag(md1.post_match)
203
+ end
204
+ RE_ENDNEST.match(html).post_match
205
+ end
206
+
207
+ public
208
+
209
+ def escapeHTML(s)
210
+ s.to_s.gsub(/&/n, '&amp;').gsub(/'/n,'&#039;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
211
+ end
212
+
213
+ def handleTemplate(html, orig_values, parent_params={}, &block)
214
+ params = keyexpander(orig_values, parent_params)
215
+
216
+ # parse group tag and recurse inner loop
217
+ while md1 = RE_NEST.match(html) # beware: complicated....
218
+ # break if it is innermost loop.
219
+ break if (RE_ENDNEST.match(md1.pre_match))
220
+
221
+ # obtain a length of outermost group tag.
222
+ post = string_after_outermost_closetag(md1.post_match)
223
+
224
+ tag = md1[1]
225
+ key = md1[2]
226
+
227
+ # recursive-call for each element of array
228
+ innertext = ""
229
+ case tag.downcase
230
+ when 'group'
231
+ groupval = params[key]
232
+ groupval = [] if (groupval == nil)
233
+ groupval = [groupval] unless (groupval.is_a?(Array))
234
+ groupval.each { |v|
235
+ innertext << handleTemplate(md1.post_match, v, params)
236
+ }
237
+ when 'if'
238
+ unless params[key].blank?
239
+ innertext << handleTemplate(md1.post_match, orig_values, parent_params)
240
+ end
241
+ when 'unless'
242
+ if params[key].blank?
243
+ innertext << handleTemplate(md1.post_match, orig_values, parent_params)
244
+ end
245
+ else
246
+ raise
247
+ end
248
+ # replace this group tag
249
+ html[md1.begin(0)..-(post.size+1)] = innertext
250
+ end
251
+ # cutoff after end tag, in inner-most loop.
252
+ md1 = RE_ENDNEST.match(html)
253
+ html = md1.pre_match if (md1)
254
+
255
+ nonnestedtags(html, params, &block)
256
+ end
257
+ end
258
+
259
+ class CSRFTemplate < HTMLTemplate
260
+ RE_FORM = /<form\s+([^>]+?)>(?!\s*<input type='hidden' name='csrf')/im
261
+
262
+ def form_tag(html,params)
263
+ html.gsub!(RE_FORM) { |s|
264
+ formtag = s
265
+ attrs = parse_tag_attributes($1)
266
+ csrf = nil
267
+ if attrs[":nocsrf"]
268
+ attrs.delete(":nocsrf")
269
+ elsif attrs["method"] =~ /\APOST\Z/i
270
+ csrf = params["csrf"]
271
+ csrf = "<input type='hidden' name='csrf' value='#{escapeHTML(csrf)}'/>"
272
+ end
273
+
274
+ if (not attrs['action']) and @controller
275
+ (colons, noncolons) = attr_colon(attrs)
276
+ unless colons.empty?
277
+ colons = StringifyHash.create(colons)
278
+ link = @controller.url_for(colons)
279
+ formtag = "<form action='#{link}' #{noncolons}>"
280
+ end
281
+ end
282
+ "#{formtag}#{csrf}"
283
+ }
284
+ end
285
+ end
286
+
287
+ end # end module
data/test/french.html ADDED
@@ -0,0 +1,13 @@
1
+ <html>
2
+ <head><title>hoge</title></head>
3
+ <body>
4
+ <table>
5
+ <tr><td>Product Name</td><td>Price</td></tr>
6
+ </table>
7
+ <group name='g'>
8
+ &=text;
9
+ </group>
10
+ <img src='/hoge/itembtn1.jpg'/>
11
+ </body>
12
+ </html>
13
+
@@ -0,0 +1,3 @@
1
+
2
+ @@@&=message;@@@
3
+
data/test/m17n.txt ADDED
@@ -0,0 +1,30 @@
1
+ {{languages en, fr}}
2
+ {{system_default en}}
3
+ {{english_name en, English}}
4
+ {{native_name en, English}}
5
+ {{english_name fr, French}}
6
+ {{native_name fr, Francais}}
7
+ {{aliases fr, zh-hans,zh-cn,zh-hans-cn}}
8
+ ####
9
+ html french.html
10
+
11
+ Product Name Nom de Produit
12
+ Price Prix
13
+ ####
14
+ msg FrenchController#get
15
+
16
+ Do you speak English? Parlez vous Francais?
17
+ ####
18
+ msg FrenchController#dlg
19
+
20
+ I am an English man. Je suis un Francais.
21
+
22
+ ####
23
+ msg FrenchController#placeholder
24
+
25
+ Hoge {0}. {0} Piyo.
26
+
27
+ ####
28
+ img french.html
29
+
30
+ /hoge/itembtn1.jpg
data/test/mobile.html ADDED
@@ -0,0 +1,15 @@
1
+ <html>
2
+ <body>
3
+ <a :action='get_userid'>hoge</a>
4
+
5
+ <a href='http://www.yahoo.com'>yahoo</a>
6
+
7
+ <a href='mailto:arai@example.com'>mail</a>
8
+
9
+ <a href='tel:03-1234-5678'>tel</a>
10
+
11
+ <form :action='bar' method='GET'>
12
+ hoge
13
+ </form>
14
+ </body>
15
+ </html>
data/test/setup.rb ADDED
@@ -0,0 +1,8 @@
1
+
2
+ unless $setup
3
+ ShowException = true
4
+ RouteDebug = false
5
+ $raise_exception = true
6
+ $setup = true
7
+ end
8
+
@@ -0,0 +1 @@
1
+ piyo
@@ -0,0 +1,58 @@
1
+ <html>
2
+ <body>
3
+ value:&=val;<br/>
4
+
5
+ <group name='array'>
6
+ group1-1: &=val;
7
+ <if name='true'>
8
+ <unless name='false'>
9
+ <group name='array2'>
10
+ group2: &=val;
11
+ </group>
12
+ </unless>
13
+ </if>
14
+ <group name='array3'>
15
+ group3-1: &=val;
16
+ <group name='array4'>
17
+ group4: &=val;
18
+ </group>
19
+ group3-2: &=val;
20
+ </group>
21
+ group1-2: &=val;
22
+ </group>
23
+
24
+ <if name='true'>
25
+ iftrue
26
+ </if>
27
+ <if name='false'>
28
+ iffalse
29
+ </if>
30
+ <unless name='true'>
31
+ unlesstrue
32
+ </unless>
33
+ <unless name='false'>
34
+ unlessfalse
35
+ </unless>
36
+
37
+ <if name='true'>
38
+ <unless name='false'>
39
+ <if name='true'>
40
+ nestedif
41
+ </if>
42
+ </unless>
43
+ </if>
44
+
45
+ <a :controller='foo' :action='bar' :id='1' :hoge='piyo'>link</a>
46
+
47
+ <form :controller='foo' :action='bar' :id='1' :hoge='piyo' method='post'>
48
+ <input type='text' name='text'/>
49
+ </form>
50
+
51
+ <include action='inner' />
52
+
53
+ <include :action='innerparam' :id='9' :usagi='hiyoko' />
54
+
55
+ <include :action='innerdelegate' />
56
+
57
+ </body>
58
+ </html>
@@ -0,0 +1 @@
1
+ &=innervalue;
@@ -0,0 +1 @@
1
+ &=innervalue;
data/test/test_auth.rb ADDED
@@ -0,0 +1,43 @@
1
+ $LOAD_PATH << File.dirname(__FILE__)
2
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..')
3
+
4
+ require 'rubygems'
5
+ require 'test/unit'
6
+ require 'egalite'
7
+ require 'auth/basic'
8
+
9
+ require 'rack/test'
10
+
11
+ require 'setup'
12
+
13
+ class AuthtestController < Egalite::Controller
14
+ def before_filter
15
+ Egalite::Auth::Basic.authorize(req, 'authtest') { |username,password|
16
+ username == 'testing' and password == '1234'
17
+ }
18
+ end
19
+ def test
20
+ 'okay'
21
+ end
22
+ end
23
+
24
+ class T_Auth < Test::Unit::TestCase
25
+ include Rack::Test::Methods
26
+
27
+ def app
28
+ Egalite::Handler.new
29
+ end
30
+ def test_auth_failure
31
+ get "/authtest/test"
32
+ assert_equal last_response.status, 401
33
+ assert_equal last_response.headers['WWW-Authenticate'], 'Basic realm="authtest"'
34
+ basic_authorize('testing','9999')
35
+ get "/authtest/test"
36
+ assert_equal last_response.status, 401
37
+ assert_equal last_response.headers['WWW-Authenticate'], 'Basic realm="authtest"'
38
+ basic_authorize('testing','1234')
39
+ get "/authtest/test"
40
+ assert last_response.ok?
41
+ assert_equal last_response.body,'okay'
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..')
2
+
3
+ require 'test/unit'
4
+ require 'blank'
5
+
6
+ class Empty
7
+ def empty?
8
+ true
9
+ end
10
+ end
11
+
12
+ class T_Blank < Test::Unit::TestCase
13
+ def test_nil
14
+ assert nil.blank?
15
+ end
16
+ def test_false
17
+ assert false.blank?
18
+ end
19
+ def test_true
20
+ assert(true.blank? == false)
21
+ end
22
+ def test_array
23
+ assert [].blank?
24
+ assert([1,2,3].blank? == false)
25
+ end
26
+ def test_hash
27
+ assert({}.blank?)
28
+ assert({:foo => 1}.blank? == false)
29
+ end
30
+ def test_empty
31
+ assert Empty.new.blank?
32
+ end
33
+ def test_string
34
+ assert "".blank?
35
+ assert " \t\n".blank?
36
+ assert("hoge".blank? == false)
37
+ end
38
+ def test_numeric
39
+ assert(123.blank? == false)
40
+ end
41
+ def test_object
42
+ assert(:foo.blank? == false)
43
+ end
44
+ end
data/test/test_csrf.rb ADDED
@@ -0,0 +1,87 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..')
2
+
3
+ require 'rubygems'
4
+ require 'test/unit'
5
+ require 'egalite'
6
+
7
+ require 'rack/test'
8
+
9
+ require 'setup'
10
+
11
+ class CsrftemplateController < Egalite::CSRFController
12
+ def get
13
+ @template_file = 'template.html'
14
+ session.create(:user_id => 1)
15
+ {
16
+ :val => 'piyo',
17
+ :true => true,
18
+ :false => false,
19
+ :array => [
20
+ {:val => 1,
21
+ :true => true,
22
+ :array2 => [{:val => 2}],
23
+ :array3 => [{:val => 3, :array4 => [{:val => 41},{:val => 42}]
24
+ }]
25
+ },
26
+ {:val => 12}
27
+ ]
28
+ }
29
+ end
30
+ def inner
31
+ @template_file = 'template_inner.html'
32
+ { :innervalue => 'mogura' }
33
+ end
34
+ def innerparam(id)
35
+ @template_file = 'template_innerparam.html'
36
+ { :innervalue => "inner:#{id}_#{params[:usagi]}" }
37
+ end
38
+ def innerdelegate
39
+ delegate :action => :innerparam, :id => 5, :usagi => :kirin
40
+ end
41
+ end
42
+
43
+ class T_CSRFTemplate < Test::Unit::TestCase
44
+ include Rack::Test::Methods
45
+
46
+ def app
47
+ db = Sequel.sqlite
48
+ Egalite::SessionSequel.create_table(db)
49
+ db.alter_table :sessions do
50
+ add_column :user_id, :integer
51
+ end
52
+ Egalite::Handler.new(
53
+ :db => db,
54
+ :session_handler => Egalite::SessionSequel,
55
+ :template_path => File.dirname(__FILE__),
56
+ :template_engine => Egalite::CSRFTemplate
57
+ )
58
+ end
59
+ def test_template
60
+ get "/csrftemplate"
61
+ assert last_response.ok?
62
+ assert last_response.body =~ /value:piyo/
63
+ assert last_response.body =~ /nestedif/
64
+ assert last_response.body =~ /iftrue/
65
+ assert last_response.body !~ /iffalse/
66
+ assert last_response.body !~ /unlesstrue/
67
+ assert last_response.body =~ /unlessfalse/
68
+ assert last_response.body =~ %r|<a\s+href='/foo/bar/1\?hoge=piyo'\s*>|
69
+ assert last_response.body =~ %r|<form action='/foo/bar/1\?hoge=piyo'\s+method='post'\s*><input type='hidden' name='csrf' value='[0-9]+_[0-9a-f]+'/>|
70
+ assert last_response.body =~ /mogura/
71
+ assert last_response.body =~ /inner:9_hiyoko/
72
+ assert last_response.body =~ /inner:5_kirin/
73
+ end
74
+ def test_grouptag
75
+ get "/csrftemplate"
76
+ assert last_response.body =~ /group1-1: 1/
77
+ assert last_response.body =~ /group1-2: 1/
78
+ assert last_response.body =~ /group1-1: 12/
79
+ assert last_response.body =~ /group1-2: 12/
80
+ assert last_response.body =~ /group2: 2/
81
+ assert last_response.body =~ /group3-1: 3/
82
+ assert last_response.body =~ /group3-2: 3/
83
+ assert last_response.body =~ /group4: 41/
84
+ assert last_response.body =~ /group4: 42/
85
+ end
86
+ end
87
+