ruby-web 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +474 -0
- data/INSTALL.txt +9 -0
- data/InstalledFiles +180 -0
- data/LICENSE.txt +74 -0
- data/Rakefile +529 -0
- data/TODO +65 -0
- data/doc/additional.xml +149 -0
- data/doc/core.xml +652 -0
- data/doc/credits/index.xml +52 -0
- data/doc/credits/php.contributors.xml +118 -0
- data/doc/credits/php.language-snippets.ent +622 -0
- data/doc/install/index.xml +136 -0
- data/doc/install/mac/index.xml +21 -0
- data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
- data/doc/install/unix/index.xml +46 -0
- data/doc/install/win/apache1.xml +166 -0
- data/doc/install/win/apache2.xml +141 -0
- data/doc/install/win/iis.xml +162 -0
- data/doc/install/win/index.xml +24 -0
- data/doc/install/win/installer.xml +31 -0
- data/doc/install/win/manual.xml +43 -0
- data/doc/manual.xml +69 -0
- data/doc/old/apache_cgi.txt +23 -0
- data/doc/old/fastcgi.txt +23 -0
- data/doc/old/mod_ruby.txt +21 -0
- data/doc/old/snippets.rdoc +183 -0
- data/doc/old/webrick.txt +23 -0
- data/doc/old/windows_cgi.txt +9 -0
- data/doc/tutorial.xml +14 -0
- data/doc/xsl/manual-multi.xsl +10 -0
- data/doc/xsl/manual-pdf.xsl +6 -0
- data/doc/xsl/manual-single.xsl +6 -0
- data/doc/xsl/manual.css +22 -0
- data/install.rb +1022 -0
- data/lib/formatter.rb +314 -0
- data/lib/html-parser.rb +429 -0
- data/lib/htmlrepair.rb +113 -0
- data/lib/htmlsplit.rb +842 -0
- data/lib/sgml-parser.rb +332 -0
- data/lib/web.rb +68 -0
- data/lib/web/assertinclude.rb +129 -0
- data/lib/web/config.rb +50 -0
- data/lib/web/connection.rb +1070 -0
- data/lib/web/convenience.rb +154 -0
- data/lib/web/formreader.rb +318 -0
- data/lib/web/htmlparser/html-parser.rb +429 -0
- data/lib/web/htmlparser/sgml-parser.rb +332 -0
- data/lib/web/htmltools/element.rb +296 -0
- data/lib/web/htmltools/stparser.rb +276 -0
- data/lib/web/htmltools/tags.rb +286 -0
- data/lib/web/htmltools/tree.rb +139 -0
- data/lib/web/htmltools/xmltree.rb +160 -0
- data/lib/web/htmltools/xpath.rb +71 -0
- data/lib/web/info.rb +63 -0
- data/lib/web/load.rb +210 -0
- data/lib/web/mime.rb +87 -0
- data/lib/web/phprb.rb +340 -0
- data/lib/web/resources/test/cookie.rb +33 -0
- data/lib/web/resources/test/counter.rb +20 -0
- data/lib/web/resources/test/multipart.rb +14 -0
- data/lib/web/resources/test/redirect.rb +8 -0
- data/lib/web/resources/test/stock.rb +33 -0
- data/lib/web/sapi/apache.rb +129 -0
- data/lib/web/sapi/fastcgi.rb +22 -0
- data/lib/web/sapi/install/apache.rb +180 -0
- data/lib/web/sapi/install/iis.rb +93 -0
- data/lib/web/sapi/install/macosx.rb +90 -0
- data/lib/web/sapi/webrick.rb +86 -0
- data/lib/web/session.rb +83 -0
- data/lib/web/shim/cgi.rb +129 -0
- data/lib/web/shim/rails.rb +175 -0
- data/lib/web/stringio.rb +78 -0
- data/lib/web/strscanparser.rb +24 -0
- data/lib/web/tagparser.rb +96 -0
- data/lib/web/testing.rb +666 -0
- data/lib/web/traceoutput.rb +75 -0
- data/lib/web/unit.rb +56 -0
- data/lib/web/upload.rb +59 -0
- data/lib/web/validate.rb +52 -0
- data/lib/web/wiki.rb +557 -0
- data/lib/web/wiki/linker.rb +72 -0
- data/lib/web/wiki/page.rb +201 -0
- data/lib/webunit.rb +27 -0
- data/lib/webunit/assert.rb +152 -0
- data/lib/webunit/converter.rb +154 -0
- data/lib/webunit/cookie.rb +118 -0
- data/lib/webunit/domwalker.rb +185 -0
- data/lib/webunit/exception.rb +14 -0
- data/lib/webunit/form.rb +116 -0
- data/lib/webunit/frame.rb +37 -0
- data/lib/webunit/htmlelem.rb +122 -0
- data/lib/webunit/image.rb +26 -0
- data/lib/webunit/jscript.rb +31 -0
- data/lib/webunit/link.rb +33 -0
- data/lib/webunit/params.rb +321 -0
- data/lib/webunit/parser.rb +229 -0
- data/lib/webunit/response.rb +464 -0
- data/lib/webunit/runtest.rb +41 -0
- data/lib/webunit/table.rb +148 -0
- data/lib/webunit/testcase.rb +45 -0
- data/lib/webunit/ui/cui/testrunner.rb +50 -0
- data/lib/webunit/utils.rb +68 -0
- data/lib/webunit/webunit.rb +28 -0
- data/test/dev/action.rb +83 -0
- data/test/dev/forms.rb +104 -0
- data/test/dev/forms2.rb +104 -0
- data/test/dev/parser.rb +17 -0
- data/test/dev/scripts/dump.rb +24 -0
- data/test/dev/scripts/makedist.rb +62 -0
- data/test/dev/scripts/uri.rb +41 -0
- data/test/dev/scripts/uri/common.rb +432 -0
- data/test/dev/scripts/uri/ftp.rb +149 -0
- data/test/dev/scripts/uri/generic.rb +1106 -0
- data/test/dev/scripts/uri/http.rb +76 -0
- data/test/dev/scripts/uri/https.rb +26 -0
- data/test/dev/scripts/uri/ldap.rb +238 -0
- data/test/dev/scripts/uri/mailto.rb +260 -0
- data/test/dev/scripts/urireg.rb +174 -0
- data/test/dev/simpledispatcher.rb +156 -0
- data/test/dev/test.action.rb +146 -0
- data/test/dev/test.formreader.rb +463 -0
- data/test/dev/test.simpledispatcher.rb +186 -0
- data/test/dev/webunit/conv/digit-0.rb +21 -0
- data/test/dev/webunit/conv/digit-1.rb +17 -0
- data/test/dev/webunit/conv/digit.rb +23 -0
- data/test/dev/webunit/conv/test_digit-0.rb +16 -0
- data/test/dev/webunit/conv/test_digit-1.rb +19 -0
- data/test/dev/webunit/conv/test_digit.rb +26 -0
- data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
- data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
- data/test/dev/webunit/conv/test_digit_view.rb +134 -0
- data/test/installation/htdocs/cgi_test.rb +296 -0
- data/test/installation/htdocs/test_install.rb +4 -0
- data/test/installation/runwebtest.rb +5 -0
- data/test/installation/test_cookie.rb +128 -0
- data/test/installation/test_form.rb +47 -0
- data/test/installation/test_multipart.rb +51 -0
- data/test/installation/test_request.rb +24 -0
- data/test/installation/test_response.rb +35 -0
- data/test/unit/htdocs/cookie.rb +32 -0
- data/test/unit/htdocs/multipart.rb +28 -0
- data/test/unit/htdocs/redirect.rb +12 -0
- data/test/unit/htdocs/simple.rb +13 -0
- data/test/unit/htdocs/stock.rb +33 -0
- data/test/unit/test_assert.rb +162 -0
- data/test/unit/test_cookie.rb +114 -0
- data/test/unit/test_domwalker.rb +77 -0
- data/test/unit/test_form.rb +42 -0
- data/test/unit/test_frame.rb +40 -0
- data/test/unit/test_htmlelem.rb +74 -0
- data/test/unit/test_image.rb +45 -0
- data/test/unit/test_jscript.rb +57 -0
- data/test/unit/test_link.rb +85 -0
- data/test/unit/test_multipart.rb +51 -0
- data/test/unit/test_params.rb +210 -0
- data/test/unit/test_parser.rb +53 -0
- data/test/unit/test_response.rb +150 -0
- data/test/unit/test_table.rb +70 -0
- data/test/unit/test_utils.rb +106 -0
- data/test/unit/test_webunit.rb +28 -0
- data/test/web/mod_ruby_stub.rb +39 -0
- data/test/web/test.assertinclude.rb +109 -0
- data/test/web/test.buffer.rb +182 -0
- data/test/web/test.code.loader.rb +78 -0
- data/test/web/test.config.rb +31 -0
- data/test/web/test.error.handling.rb +91 -0
- data/test/web/test.formreader-2.0.rb +352 -0
- data/test/web/test.load.rb +125 -0
- data/test/web/test.mime-type.rb +23 -0
- data/test/web/test.narf.cgi.rb +106 -0
- data/test/web/test.phprb.rb +239 -0
- data/test/web/test.request.rb +368 -0
- data/test/web/test.response.rb +637 -0
- data/test/web/test.ruby-web.rb +10 -0
- data/test/web/test.session.rb +50 -0
- data/test/web/test.shim.cgi.rb +96 -0
- data/test/web/test.tagparser.rb +65 -0
- data/test/web/test.template2.rb +297 -0
- data/test/web/test.testing2.rb +318 -0
- data/test/web/test.upload.rb +45 -0
- data/test/web/test.validate.rb +46 -0
- data/test/web/test.web.test.rb +495 -0
- data/test/wiki/test.history.rb +297 -0
- data/test/wiki/test.illustration_page.rb +287 -0
- data/test/wiki/test.linker.rb +197 -0
- data/test/wiki/test.tarpit.rb +56 -0
- data/test/wiki/test.wiki.rb +300 -0
- data/test/wikitestroot/admin.rb +7 -0
- data/test/wikitestroot/wiki.rb +6 -0
- metadata +234 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
class TestCodeLoader < Test::Unit::TestCase
|
2
|
+
include Web::Testing
|
3
|
+
|
4
|
+
def setup
|
5
|
+
@pwd = Dir.pwd
|
6
|
+
if File.exists?( temp_dir + "/test_dir/" )
|
7
|
+
rm_rf(temp_dir + "/test_dir")
|
8
|
+
end
|
9
|
+
Dir.mkdir(temp_dir + "/test_dir/")
|
10
|
+
Dir.chdir(temp_dir + "/test_dir/")
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
Dir.chdir(@pwd)
|
15
|
+
rm_rf(temp_dir + "/test_dir")
|
16
|
+
end
|
17
|
+
|
18
|
+
def write_file filename, contents
|
19
|
+
File.open( temp_dir + "/test_dir/#{filename}" , "w" ) { |f|
|
20
|
+
f.write(contents)
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_ruby
|
25
|
+
write_file "app.rb", <<-EOF
|
26
|
+
print "Hello, World"
|
27
|
+
EOF
|
28
|
+
|
29
|
+
do_request "app.rb"
|
30
|
+
|
31
|
+
assert_content "Hello, World"
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_phprb
|
35
|
+
require 'pp'
|
36
|
+
@old_default_handler = Web::config['load_suffix'].default
|
37
|
+
Web::config['load_suffix'].default = lambda do |script|
|
38
|
+
PHPRB::load(script)
|
39
|
+
end
|
40
|
+
|
41
|
+
write_file "app.rhtml", <<-EOF
|
42
|
+
<?= "Hello, World" ?>
|
43
|
+
EOF
|
44
|
+
|
45
|
+
do_request "app.rhtml"
|
46
|
+
|
47
|
+
assert_equal( "Hello, World", Web::get_content.strip )
|
48
|
+
ensure
|
49
|
+
Web::config['load_suffix'].default = @old_default_handler
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_erb
|
53
|
+
write_file "app.erb", <<-EOF
|
54
|
+
<%= "Hello, World" %>
|
55
|
+
EOF
|
56
|
+
|
57
|
+
do_request "app.erb"
|
58
|
+
|
59
|
+
assert_equal( "Hello, World", Web::get_content.strip )
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_custom
|
64
|
+
Web::config[:load_suffix][:custom] = lambda do |script|
|
65
|
+
Web::write script
|
66
|
+
end
|
67
|
+
|
68
|
+
write_file "app.custom", <<-EOF
|
69
|
+
this code doesn't matter
|
70
|
+
EOF
|
71
|
+
|
72
|
+
do_request "app.custom"
|
73
|
+
assert_match( /app.custom$/, Web::get_content.strip )
|
74
|
+
ensure
|
75
|
+
Web::config[:load_suffix].delete :custom
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class TestWebConfig < Test::Unit::TestCase
|
2
|
+
def setup
|
3
|
+
@old_config = Web::config
|
4
|
+
Web::module_eval do
|
5
|
+
@@config = Web::Config.new
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
c = @old_config
|
11
|
+
Web::module_eval do
|
12
|
+
@@config = c
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_preferences
|
17
|
+
Web::config.set("random_pref" => "random value",
|
18
|
+
"another_pref" => "another value")
|
19
|
+
assert_equal( "random value", Web::config::random_pref )
|
20
|
+
assert_equal( "random value", Web::config["random_pref"] )
|
21
|
+
assert_equal( "another value", Web::config::another_pref )
|
22
|
+
assert_equal( "another value", Web::config["another_pref"] )
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_docs
|
26
|
+
assert_equal( nil, Web::config["random_pref"] )
|
27
|
+
Web::config::describe( :random_pref => "This is a test" )
|
28
|
+
assert_equal( "This is a test", Web::config::docs[:random_pref] )
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class TestErrorHandling < Test::Unit::TestCase
|
2
|
+
def app
|
3
|
+
temp_dir + "/test_dir/app.rb"
|
4
|
+
end
|
5
|
+
|
6
|
+
def setup
|
7
|
+
File.delete(app) if File.exists? app
|
8
|
+
@stdout, @stderr = $stdout, $stderr
|
9
|
+
$stdout, $stderr = StringIO.new, StringIO.new
|
10
|
+
Web::setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
File.delete(app) if File.exists? app
|
15
|
+
Web::teardown
|
16
|
+
$stdout, $stderr = @stdout, @stderr
|
17
|
+
end
|
18
|
+
|
19
|
+
def write_file file
|
20
|
+
File.open( temp_dir + "/test_dir/app.rb" , "w" ) { |f| f.write(file) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_error_handling
|
24
|
+
Web::config[:error_style] = :production
|
25
|
+
|
26
|
+
Web::open do
|
27
|
+
Web::filter do
|
28
|
+
raise "hell"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
assert_match( /RuntimeError.*hell/m, $stdout.string )
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_production
|
35
|
+
Web::config[:error_style] = :production
|
36
|
+
|
37
|
+
Web::open do
|
38
|
+
raise "this is a test error"
|
39
|
+
end
|
40
|
+
|
41
|
+
assert_equal( '500', Web::status )
|
42
|
+
|
43
|
+
assert_match( /^RuntimeError: this is a test error/,
|
44
|
+
$stderr.string,
|
45
|
+
"Error printed to stderr" )
|
46
|
+
assert_match( /<b style='font-size:20px'>this is a test error<\/b>/,
|
47
|
+
$stdout.string,
|
48
|
+
"Error printed with html to stdout" )
|
49
|
+
assert_no_match( /test.error.handling.rb/,
|
50
|
+
$stdout.string,
|
51
|
+
"No backtrace should be printed to stdout" )
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_development
|
56
|
+
Web::config[:error_style] = :development
|
57
|
+
|
58
|
+
Web::open do
|
59
|
+
raise "this is a test error"
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_equal( '500', Web::status )
|
63
|
+
|
64
|
+
assert_match( /^RuntimeError: this is a test error/,
|
65
|
+
$stderr.string,
|
66
|
+
"Error printed to stderr" )
|
67
|
+
assert_match( /<b style='font-size:20px'>this is a test error<\/b>/,
|
68
|
+
$stdout.string,
|
69
|
+
"Error printed with html to stdout" )
|
70
|
+
assert_match( /test.error.handling.rb/,
|
71
|
+
$stdout.string,
|
72
|
+
"backtrace printed" )
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_content_type
|
76
|
+
Web::config[:error_style] = :development
|
77
|
+
|
78
|
+
Web::open do
|
79
|
+
Web::content_type = "application/ms-excel"
|
80
|
+
raise "this is a test error"
|
81
|
+
end
|
82
|
+
|
83
|
+
assert_match( /Content-Type: text\/html/,
|
84
|
+
$stdout.string,
|
85
|
+
"Content-Type Changed back to text/html" )
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,352 @@
|
|
1
|
+
|
2
|
+
class TestFormReader2 < Test::Unit::TestCase
|
3
|
+
# for each kind of html element
|
4
|
+
# * test the parsed html element handles "assert_include" properly
|
5
|
+
# * test submit the html element
|
6
|
+
# a few important bits:
|
7
|
+
# * handle multiple elements in a form properly.
|
8
|
+
# i.e. just because a field isn't name="field[]"
|
9
|
+
# doesn't mean that multiple params on a field are lost.
|
10
|
+
# also, you should be able to have multiple elements with the
|
11
|
+
# same name, but different types
|
12
|
+
# this should work exactly the same for simple text elements.
|
13
|
+
# this will work very differently for select elements,
|
14
|
+
# testing of which IMHO is broken
|
15
|
+
#
|
16
|
+
# More notes from patrick:
|
17
|
+
# There are two dimensions of "multiples" on a form
|
18
|
+
# * single or multiple elements in the html
|
19
|
+
# * a request by the programmer that elements be returned as a array or as a string
|
20
|
+
#
|
21
|
+
# I have some simple templating constructs in here to help write the tests.
|
22
|
+
# I'm not using Narflates b/c this templating is only to support these tests;
|
23
|
+
# the FormReader code works on just html
|
24
|
+
#
|
25
|
+
|
26
|
+
include Web::Testing
|
27
|
+
|
28
|
+
def setup
|
29
|
+
@parser = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def make_form( content )
|
33
|
+
@parser = FormReader.new( "<form name='aForm'>" + content + "</form>" )
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_fields
|
37
|
+
@parser.get_fields( "aForm" )
|
38
|
+
end
|
39
|
+
|
40
|
+
def merge_fields( edited_fields={} )
|
41
|
+
@parser.merge_fields( "aForm", edited_fields )
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_options
|
45
|
+
@parser.get_options( "aForm" )
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_blank_form
|
49
|
+
make_form ""
|
50
|
+
assert_equal( {}, get_fields )
|
51
|
+
assert_equal( {}, merge_fields )
|
52
|
+
assert_raises( Web::Testing::FieldNotFoundException ) {
|
53
|
+
merge_fields( "missing" => "element" )
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# -----------------------------------------
|
59
|
+
# the text elements should behave similarly
|
60
|
+
# -----------------------------------------
|
61
|
+
|
62
|
+
def test_plain_input
|
63
|
+
do_text_tests <<-HTML
|
64
|
+
<input name="{name}" value="{value}">
|
65
|
+
HTML
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_text
|
69
|
+
do_text_tests <<-HTML
|
70
|
+
<input type="text" name="{name}" value="{value}">
|
71
|
+
HTML
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_password
|
75
|
+
do_text_tests <<-HTML
|
76
|
+
<input type="password" name="{name}" value="{value}">
|
77
|
+
HTML
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_textarea
|
81
|
+
do_text_tests <<-HTML
|
82
|
+
<textarea name="{name}">
|
83
|
+
{value}
|
84
|
+
</textarea>
|
85
|
+
HTML
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_hidden
|
89
|
+
do_text_tests <<-HTML
|
90
|
+
<input type="hidden" name="{name}" value="{value}">
|
91
|
+
HTML
|
92
|
+
end
|
93
|
+
|
94
|
+
def make_text_field( pattern, name, value )
|
95
|
+
pattern.gsub( /\{name\}/i, name ).gsub( /\{value\}/i, value )
|
96
|
+
end
|
97
|
+
|
98
|
+
def do_text_tests( field_pattern )
|
99
|
+
make_form( make_text_field( field_pattern, "atextfield", "avalue" ) )
|
100
|
+
|
101
|
+
assert_includes( { "atextfield" => "avalue" }, get_fields )
|
102
|
+
assert_equal( { "atextfield" => ["avalue"] }, merge_fields )
|
103
|
+
|
104
|
+
assert_equal( { "atextfield" => ["other"] },
|
105
|
+
merge_fields( "atextfield" => "other" ) )
|
106
|
+
assert_equal( { "atextfield" => ["other"] },
|
107
|
+
merge_fields( :atextfield => "other" ) )
|
108
|
+
|
109
|
+
assert_raises( FormMergeError ) {
|
110
|
+
merge_fields( "atextfield" => [ "one", "two" ] )
|
111
|
+
}
|
112
|
+
|
113
|
+
# multiple elements. Note that it doesn't matters
|
114
|
+
# how the programmer wants the cgi to return results,
|
115
|
+
# s/he still tests multiple elements the same
|
116
|
+
# i.e. "field" and "field[]" behave the same
|
117
|
+
# when asserting content on a form or merging elements
|
118
|
+
make_form( make_text_field( field_pattern, "atextfield[]", "two" ) +
|
119
|
+
make_text_field( field_pattern, "atextfield[]", "one" ) )
|
120
|
+
|
121
|
+
assert_includes( { "atextfield[]" => ["two", "one"] }, get_fields )
|
122
|
+
assert_equal( { "atextfield[]" => ["two", "one"] }, merge_fields )
|
123
|
+
|
124
|
+
make_form( make_text_field( field_pattern, "atextfield", "two" ) +
|
125
|
+
make_text_field( field_pattern, "atextfield", "one" ) )
|
126
|
+
|
127
|
+
assert_includes( { "atextfield" =>["two", "one"] }, get_fields )
|
128
|
+
assert_equal( { "atextfield" => ["two", "one"] }, merge_fields )
|
129
|
+
|
130
|
+
# if you merge a multiple with a string,
|
131
|
+
# the string replaces the first element
|
132
|
+
# in the multiple
|
133
|
+
assert_equal( { "atextfield" => ["first", "one"] },
|
134
|
+
merge_fields( :atextfield => "first" ) )
|
135
|
+
assert_equal( { "atextfield" => ["first", "second"] },
|
136
|
+
merge_fields( :atextfield => ["first", "second"] ) )
|
137
|
+
assert_raises( FormMergeError ) {
|
138
|
+
merge_fields( :atextfield => ["first", "second", "third"] )
|
139
|
+
}
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
# -----------------------------------------
|
144
|
+
# file uploads may be odd
|
145
|
+
# -----------------------------------------
|
146
|
+
|
147
|
+
def test_file
|
148
|
+
make_form( make_file_field( "file" ) )
|
149
|
+
assert_includes( { "file" => "" }, get_fields )
|
150
|
+
### do browsers send the file field when
|
151
|
+
### nothing was entered?
|
152
|
+
assert_equal( {"file" => [""] }, merge_fields )
|
153
|
+
|
154
|
+
upload = Web::Upload.new( File.new( "test/web/testfiles/text" ),
|
155
|
+
"content-type",
|
156
|
+
"original-filename" )
|
157
|
+
assert_equal( { "file" => [upload] },
|
158
|
+
merge_fields( :file => upload ) )
|
159
|
+
end
|
160
|
+
|
161
|
+
def make_file_field( name )
|
162
|
+
"<input type=\"file\" name=\"#{name}\">"
|
163
|
+
end
|
164
|
+
|
165
|
+
# -----------------------------------------
|
166
|
+
# use the same api for:
|
167
|
+
# single selects and radio buttons
|
168
|
+
# multi selects and checkboxes
|
169
|
+
# since they more or less are used
|
170
|
+
# to say same thing on a form
|
171
|
+
# -----------------------------------------
|
172
|
+
|
173
|
+
def test_select
|
174
|
+
do_select_tests <<-HTML
|
175
|
+
<select name="{name}">
|
176
|
+
{option}<option {checked}selected{endchecked}>{value}</option>{endoption}
|
177
|
+
</select>
|
178
|
+
HTML
|
179
|
+
|
180
|
+
do_select_tests <<-HTML
|
181
|
+
<select name="{name}">
|
182
|
+
{option}<option value="{value}" {checked}selected{endchecked}></option>{endoption}
|
183
|
+
</select>
|
184
|
+
HTML
|
185
|
+
do_multiselect_tests <<-HTML
|
186
|
+
<select name="{name}" multiple>
|
187
|
+
{option}<option {checked}selected{endchecked}>{value}</option>{endoption}
|
188
|
+
</select>
|
189
|
+
HTML
|
190
|
+
|
191
|
+
# select field + select field = two different select fields
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_radio_and_checkbox
|
196
|
+
do_select_tests <<-HTML
|
197
|
+
{option}<input type="radio" name="{name}" value="{value}" {checked}checked{endchecked}>{endoption}
|
198
|
+
HTML
|
199
|
+
|
200
|
+
do_select_tests <<-HTML
|
201
|
+
<select name="{name}">
|
202
|
+
{option}<option value="{value}" {checked}selected{endchecked}></option>{endoption}
|
203
|
+
</select>
|
204
|
+
HTML
|
205
|
+
|
206
|
+
do_multiselect_tests <<-HTML
|
207
|
+
<select name="{name}" multiple>
|
208
|
+
{option}<option {checked}selected{endchecked}>{value}</option>{endoption}
|
209
|
+
</select>
|
210
|
+
HTML
|
211
|
+
|
212
|
+
# select field + select field = two different select fields
|
213
|
+
|
214
|
+
# checkboxes + checkboxes = one big group of checkboxes
|
215
|
+
# that can return multiple values
|
216
|
+
|
217
|
+
# radio buttons + radio buttons = one big group of radio buttons
|
218
|
+
# that can return one value
|
219
|
+
|
220
|
+
# checkboxes + radio buttons = ?????
|
221
|
+
end
|
222
|
+
|
223
|
+
def make_select_field( pattern, name, values )
|
224
|
+
pattern.gsub!( /\{NAME\}/i, name )
|
225
|
+
pattern =~ /\{OPTION\}(.*)\{ENDOPTION\}/si
|
226
|
+
option_pattern = $1
|
227
|
+
options = ""
|
228
|
+
values.each{ |k,v|
|
229
|
+
options += option_pattern.gsub( /\{VALUE\}/i, k ). \
|
230
|
+
gsub( if v
|
231
|
+
/\{CHECKED\}|\{ENDCHECKED\}/i
|
232
|
+
else
|
233
|
+
/\{CHECKED\}.*\{ENDCHECKED\}/i
|
234
|
+
end, "" )
|
235
|
+
}
|
236
|
+
pattern.gsub( /\{OPTION\}.*\{ENDOPTION\}/i, options )
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
def do_select_tests( pattern )
|
241
|
+
make_form( make_select_field( pattern,
|
242
|
+
"field",
|
243
|
+
{"first" => true,
|
244
|
+
"second" => false } ) )
|
245
|
+
|
246
|
+
assert_includes( { "field" => "first" }, get_fields )
|
247
|
+
assert_equal( { "field" => ["first"] }, merge_fields )
|
248
|
+
assert_equal( { "field" => ["second"] },
|
249
|
+
merge_fields( "field" => select("second") ) )
|
250
|
+
assert_raises( FormMergeError ) {
|
251
|
+
merge_fields( "field" => select("missing value") )
|
252
|
+
}
|
253
|
+
|
254
|
+
assert_raises( FormMergeError ) {
|
255
|
+
merge_fields( "field" => select("first", "second") )
|
256
|
+
}
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
def do_multiselect_tests( pattern )
|
261
|
+
make_form( make_select_field( pattern,
|
262
|
+
"field",
|
263
|
+
{"first" => true,
|
264
|
+
"second" => false,
|
265
|
+
"third" => true } ) )
|
266
|
+
assert_includes( { "field" => ["first", "third"] }, get_fields )
|
267
|
+
assert_includes( { "field" => ["first", "second", "third"] }, get_options )
|
268
|
+
assert_equal( { "field" => ["first", "third"] }, merge_fields )
|
269
|
+
|
270
|
+
# three cases for merge_fields with selects:
|
271
|
+
# using the select function:
|
272
|
+
# * a single text value adds to the selected values
|
273
|
+
assert_equal( { "field" => ["first", "second", "third" ] },
|
274
|
+
merge_fields( "field" => select("second") ) )
|
275
|
+
# * an multiples add to the selected values
|
276
|
+
assert_equal( { "field" => ["first", "second", "third" ] },
|
277
|
+
merge_fields( "field" => select("second","third") ) )
|
278
|
+
|
279
|
+
# * a hash turns values on and off
|
280
|
+
assert_equal( { "field" => ["second", "third"] },
|
281
|
+
merge_fields( "field" => {"first" => false,
|
282
|
+
"second" => true } ) )
|
283
|
+
assert_equal( { "field" => ["second", "third"] },
|
284
|
+
merge_fields( "field" => select("first" => false,
|
285
|
+
"second" => true ) ) )
|
286
|
+
|
287
|
+
|
288
|
+
assert_raises( FormMergeError ) {
|
289
|
+
merge_fields( "field" => "not using select method" )
|
290
|
+
}
|
291
|
+
|
292
|
+
assert_raises( FormMergeError ) {
|
293
|
+
merge_fields( "field" => select("missing value") )
|
294
|
+
}
|
295
|
+
|
296
|
+
#assert_raises( FormMergeError ) {
|
297
|
+
# merge_fields( "field" => ["first", "second"] )
|
298
|
+
#}
|
299
|
+
|
300
|
+
end
|
301
|
+
|
302
|
+
# -----------------------------------------
|
303
|
+
# test checkboxes as booleans
|
304
|
+
# -----------------------------------------
|
305
|
+
|
306
|
+
def test_boolean_checkbox
|
307
|
+
html = ""
|
308
|
+
|
309
|
+
{"first" => true,
|
310
|
+
"second" => false,
|
311
|
+
"third" => true }.each{ |k, v|
|
312
|
+
|
313
|
+
html += "<input type=\"checkbox\" name=\"#{k}\"";
|
314
|
+
html += " checked" if (v)
|
315
|
+
html += ">";
|
316
|
+
|
317
|
+
}
|
318
|
+
|
319
|
+
make_form( html )
|
320
|
+
|
321
|
+
assert_includes( {"first" => [true ],
|
322
|
+
"second" => [false],
|
323
|
+
"third" => [true ] }, get_fields )
|
324
|
+
assert_equal( {"first" => [true ],
|
325
|
+
"third" => [true ] }, merge_fields )
|
326
|
+
|
327
|
+
# how to check a checkbox...
|
328
|
+
assert_equal( {"first" => [true ],
|
329
|
+
"second" => [true],
|
330
|
+
"third" => [true ] },
|
331
|
+
merge_fields( "second" => true ) )
|
332
|
+
|
333
|
+
# how to uncheck a check box
|
334
|
+
assert_equal( {"second" => [true],
|
335
|
+
"third" => [true ] },
|
336
|
+
merge_fields( "first" => false,
|
337
|
+
"second" => true ) )
|
338
|
+
|
339
|
+
end
|
340
|
+
|
341
|
+
# -----------------------------------------
|
342
|
+
# test blending different kinds
|
343
|
+
# of elements into the same
|
344
|
+
# "field" or "field[]"
|
345
|
+
# -----------------------------------------
|
346
|
+
|
347
|
+
# -----------------------------------------
|
348
|
+
# test fields with narflate style names,
|
349
|
+
# i.e. "field[1].name" / etc
|
350
|
+
# -----------------------------------------
|
351
|
+
|
352
|
+
end
|