slim 1.3.0 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +9 -5
- data/CHANGES +23 -0
- data/Gemfile +13 -2
- data/README.md +346 -105
- data/Rakefile +21 -9
- data/lib/slim.rb +3 -3
- data/lib/slim/boolean_attributes.rb +67 -0
- data/lib/slim/command.rb +23 -23
- data/lib/slim/control_structures.rb +57 -0
- data/lib/slim/embedded_engine.rb +80 -43
- data/lib/slim/end_inserter.rb +1 -1
- data/lib/slim/engine.rb +21 -15
- data/lib/slim/filter.rb +0 -6
- data/lib/slim/grammar.rb +2 -7
- data/lib/slim/interpolation.rb +1 -1
- data/lib/slim/logic_less/filter.rb +8 -8
- data/lib/slim/logic_less/wrapper.rb +1 -1
- data/lib/slim/parser.rb +51 -52
- data/lib/slim/splat_attributes.rb +112 -0
- data/lib/slim/translator.rb +13 -12
- data/lib/slim/version.rb +1 -1
- data/slim.gemspec +1 -1
- data/test/{slim → core}/helper.rb +3 -7
- data/test/{slim → core}/test_code_blocks.rb +0 -0
- data/test/{slim → core}/test_code_escaping.rb +4 -4
- data/test/{slim → core}/test_code_evaluation.rb +3 -112
- data/test/{slim → core}/test_code_output.rb +0 -0
- data/test/{slim → core}/test_code_structure.rb +0 -0
- data/test/{slim → core}/test_embedded_engines.rb +8 -3
- data/test/{slim → core}/test_encoding.rb +0 -0
- data/test/core/test_html_attributes.rb +218 -0
- data/test/{slim → core}/test_html_escaping.rb +17 -0
- data/test/{slim → core}/test_html_structure.rb +13 -98
- data/test/{slim → core}/test_parser_errors.rb +24 -15
- data/test/{slim → core}/test_pretty.rb +0 -0
- data/test/{slim → core}/test_ruby_errors.rb +7 -0
- data/test/{slim → core}/test_slim_template.rb +0 -0
- data/test/{slim → core}/test_text_interpolation.rb +2 -2
- data/test/core/test_thread_options.rb +18 -0
- data/test/{slim/logic_less → logic_less}/test_logic_less.rb +21 -0
- data/test/{slim/logic_less → logic_less}/test_wrapper.rb +3 -3
- data/test/rails/app/controllers/slim_controller.rb +4 -2
- data/test/rails/app/views/parents/_form.html.slim +1 -0
- data/test/rails/app/views/parents/edit.html.slim +2 -1
- data/test/rails/app/views/parents/new.html.slim +2 -1
- data/test/rails/app/views/slim/thread_options.html.slim +1 -0
- data/test/rails/test/test_slim.rb +6 -4
- data/test/{slim/translator → translator}/test_translator.rb +0 -0
- metadata +44 -82
- data/lib/slim/compiler.rb +0 -194
- data/test/rails/app/views/slim/nil.html.slim +0 -1
- data/test/slim/test_chain_manipulation.rb +0 -42
@@ -37,4 +37,21 @@ p class="#{x}" test #{content}
|
|
37
37
|
}
|
38
38
|
assert_html 'Hello World from @env escaped & Hello World from @env', source
|
39
39
|
end
|
40
|
+
|
41
|
+
def test_html_quoted_attr_escape
|
42
|
+
source = %q{
|
43
|
+
p id="&" class=="&"
|
44
|
+
}
|
45
|
+
|
46
|
+
assert_html '<p class="&" id="&"></p>', source
|
47
|
+
assert_html '<p class="&" id="&"></p>', source, :escape_quoted_attrs => true
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_html_ruby_attr_escape
|
51
|
+
source = %q{
|
52
|
+
p id=('&'.to_s) class==('&'.to_s)
|
53
|
+
}
|
54
|
+
|
55
|
+
assert_html '<p class="&" id="&"></p>', source
|
56
|
+
end
|
40
57
|
end
|
@@ -293,10 +293,10 @@ p(id="marvin" class="" data-info="Illudium Q-36")= output_number
|
|
293
293
|
|
294
294
|
def test_dynamic_empty_attribute
|
295
295
|
source = %q{
|
296
|
-
p(id="marvin" class=nil
|
296
|
+
p(id="marvin" class=nil nonempty=("".to_s) data-info="Illudium Q-36")= output_number
|
297
297
|
}
|
298
298
|
|
299
|
-
assert_html '<p data-info="Illudium Q-36" id="marvin">1337</p>', source
|
299
|
+
assert_html '<p data-info="Illudium Q-36" id="marvin" nonempty="">1337</p>', source
|
300
300
|
end
|
301
301
|
|
302
302
|
def test_closed_tag
|
@@ -478,102 +478,17 @@ input[value=succ_x]
|
|
478
478
|
assert_html %{<input value="1" /><input value="2" />}, source
|
479
479
|
end
|
480
480
|
|
481
|
-
def
|
481
|
+
def test_html_line_indicator
|
482
482
|
source = %q{
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
assert_html '<h1 a="The letter a" b="The letter b">This is my title</h1>', source
|
495
|
-
end
|
496
|
-
|
497
|
-
def test_splat_tag_name
|
498
|
-
source = %q{
|
499
|
-
*{:tag => 'h1', :id => 'title'} This is my title
|
500
|
-
}
|
501
|
-
|
502
|
-
assert_html '<h1 id="title">This is my title</h1>', source
|
503
|
-
end
|
504
|
-
|
505
|
-
|
506
|
-
def test_splat_empty_tag_name
|
507
|
-
source = %q{
|
508
|
-
*{:tag => '', :id => 'test'} This is my title
|
509
|
-
}
|
510
|
-
|
511
|
-
assert_html '<div id="test">This is my title</div>', source, :remove_empty_attrs => true
|
512
|
-
assert_html '<div id="test">This is my title</div>', source, :remove_empty_attrs => false
|
513
|
-
end
|
514
|
-
|
515
|
-
def test_closed_splat_tag
|
516
|
-
source = %q{
|
517
|
-
*hash / This is my title
|
518
|
-
}
|
519
|
-
|
520
|
-
assert_html '<div a="The letter a" b="The letter b"/>', source
|
521
|
-
end
|
522
|
-
|
523
|
-
def test_splat_with_id_shortcut
|
524
|
-
source = %q{
|
525
|
-
#myid*hash This is my title
|
526
|
-
}
|
527
|
-
|
528
|
-
assert_html '<div a="The letter a" b="The letter b" id="myid">This is my title</div>', source
|
529
|
-
end
|
530
|
-
|
531
|
-
def test_splat_with_class_shortcut
|
532
|
-
source = %q{
|
533
|
-
.myclass*hash This is my title
|
534
|
-
}
|
535
|
-
|
536
|
-
assert_html '<div a="The letter a" b="The letter b" class="myclass">This is my title</div>', source
|
537
|
-
end
|
538
|
-
|
539
|
-
def test_splat_with_id_and_class_shortcuts
|
540
|
-
source = %q{
|
541
|
-
#myid.myclass*hash This is my title
|
542
|
-
}
|
543
|
-
|
544
|
-
assert_html '<div a="The letter a" b="The letter b" class="myclass" id="myid">This is my title</div>', source
|
545
|
-
end
|
546
|
-
|
547
|
-
def test_splat_with_class_merging
|
548
|
-
source = %q{
|
549
|
-
#myid.myclass *{:class => [:secondclass, %w(x y z)]} *hash This is my title
|
550
|
-
}
|
551
|
-
|
552
|
-
assert_html '<div a="The letter a" b="The letter b" class="myclass secondclass x y z" id="myid">This is my title</div>', source
|
553
|
-
end
|
554
|
-
|
555
|
-
def test_splat_with_boolean_attribute
|
556
|
-
source = %q{
|
557
|
-
*{:disabled => true, :empty1 => false, :empty2 => '', :empty3 => nil} This is my title
|
558
|
-
}
|
559
|
-
|
560
|
-
assert_html '<div disabled="disabled">This is my title</div>', source
|
561
|
-
assert_html '<div disabled="disabled" empty1="" empty2="" empty3="">This is my title</div>', source, :remove_empty_attrs => false
|
562
|
-
end
|
563
|
-
|
564
|
-
def test_splat_merging_with_arrays
|
565
|
-
source = %q{
|
566
|
-
*{:a => 1, :b => 2} *[[:c, 3], [:d, 4]] *[[:e, 5], [:f, 6]] This is my title
|
567
|
-
}
|
568
|
-
|
569
|
-
assert_html '<div a="1" b="2" c="3" d="4" e="5" f="6">This is my title</div>', source
|
570
|
-
end
|
571
|
-
|
572
|
-
def test_splat_with_other_attributes
|
573
|
-
source = %q{
|
574
|
-
h1 data-id="123" *hash This is my title
|
575
|
-
}
|
576
|
-
|
577
|
-
assert_html '<h1 a="The letter a" b="The letter b" data-id="123">This is my title</h1>', source
|
483
|
+
<html>
|
484
|
+
head
|
485
|
+
meta name="keywords" content=hello_world
|
486
|
+
- if true
|
487
|
+
<p>#{hello_world}</p>
|
488
|
+
span = hello_world
|
489
|
+
</html>
|
490
|
+
}
|
491
|
+
|
492
|
+
assert_html '<html><head><meta content="Hello World from @env" name="keywords" /></head><p>Hello World from @env</p><span>Hello World from @env</span></html>', source
|
578
493
|
end
|
579
494
|
end
|
@@ -7,7 +7,7 @@ doctype 5
|
|
7
7
|
div Invalid
|
8
8
|
}
|
9
9
|
|
10
|
-
assert_syntax_error "Unexpected indentation\n test.slim, Line 3\n div Invalid\n ^\n", source, :file => 'test.slim'
|
10
|
+
assert_syntax_error "Unexpected indentation\n test.slim, Line 3, Column 2\n div Invalid\n ^\n", source, :file => 'test.slim'
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_unexpected_indentation
|
@@ -16,7 +16,7 @@ doctype 5
|
|
16
16
|
div Invalid
|
17
17
|
}
|
18
18
|
|
19
|
-
assert_syntax_error "Unexpected indentation\n (__TEMPLATE__), Line 3\n div Invalid\n ^\n", source
|
19
|
+
assert_syntax_error "Unexpected indentation\n (__TEMPLATE__), Line 3, Column 2\n div Invalid\n ^\n", source
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_unexpected_text_indentation
|
@@ -26,7 +26,7 @@ p
|
|
26
26
|
text
|
27
27
|
}
|
28
28
|
|
29
|
-
assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\n (__TEMPLATE__), Line 4\n text\n ^\n", source
|
29
|
+
assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\n (__TEMPLATE__), Line 4, Column 3\n text\n ^\n", source
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_unexpected_text_indentation_in_tag
|
@@ -42,7 +42,7 @@ ul
|
|
42
42
|
li b
|
43
43
|
}
|
44
44
|
|
45
|
-
assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\nAre you trying to nest a child tag in a tag containing text? Use | for the text block!\n (__TEMPLATE__), Line 4\n ul\n ^\n", source
|
45
|
+
assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\nAre you trying to nest a child tag in a tag containing text? Use | for the text block!\n (__TEMPLATE__), Line 4, Column 4\n ul\n ^\n", source
|
46
46
|
end
|
47
47
|
|
48
48
|
def test_malformed_indentation
|
@@ -52,7 +52,7 @@ p
|
|
52
52
|
div Invalid
|
53
53
|
}
|
54
54
|
|
55
|
-
assert_syntax_error "Malformed indentation\n (__TEMPLATE__), Line 4\n div Invalid\n ^\n", source
|
55
|
+
assert_syntax_error "Malformed indentation\n (__TEMPLATE__), Line 4, Column 1\n div Invalid\n ^\n", source
|
56
56
|
end
|
57
57
|
|
58
58
|
def test_unknown_line_indicator
|
@@ -64,7 +64,7 @@ p
|
|
64
64
|
?invalid
|
65
65
|
}
|
66
66
|
|
67
|
-
assert_syntax_error "Unknown line indicator\n (__TEMPLATE__), Line 6\n ?invalid\n ^\n", source
|
67
|
+
assert_syntax_error "Unknown line indicator\n (__TEMPLATE__), Line 6, Column 2\n ?invalid\n ^\n", source
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_expected_closing_delimiter
|
@@ -73,7 +73,16 @@ p
|
|
73
73
|
img(src="img.jpg" title={title}
|
74
74
|
}
|
75
75
|
|
76
|
-
assert_syntax_error "Expected closing delimiter )\n (__TEMPLATE__), Line 3\n img(src=\"img.jpg\" title={title}\n ^\n", source
|
76
|
+
assert_syntax_error "Expected closing delimiter )\n (__TEMPLATE__), Line 3, Column 33\n img(src=\"img.jpg\" title={title}\n ^\n", source
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_expected_closing_quote
|
80
|
+
source = %q{
|
81
|
+
p
|
82
|
+
img(src="img.jpg
|
83
|
+
}
|
84
|
+
|
85
|
+
assert_syntax_error "Expected closing quote \"\n (__TEMPLATE__), Line 3, Column 18\n img(src=\"img.jpg\n ^\n", source
|
77
86
|
end
|
78
87
|
|
79
88
|
def test_expected_closing_attribute_delimiter
|
@@ -82,7 +91,7 @@ p
|
|
82
91
|
img src=[hash[1] + hash[2]
|
83
92
|
}
|
84
93
|
|
85
|
-
assert_syntax_error "Expected closing delimiter ]\n (__TEMPLATE__), Line 3\n img src=[hash[1] + hash[2]\n ^\n", source
|
94
|
+
assert_syntax_error "Expected closing delimiter ]\n (__TEMPLATE__), Line 3, Column 28\n img src=[hash[1] + hash[2]\n ^\n", source
|
86
95
|
end
|
87
96
|
|
88
97
|
def test_expected_attribute
|
@@ -91,7 +100,7 @@ p
|
|
91
100
|
img(src='img.png' whatsthis?!)
|
92
101
|
}
|
93
102
|
|
94
|
-
assert_syntax_error "Expected attribute\n (__TEMPLATE__), Line 3\n img(src='img.png' whatsthis?!)\n ^\n", source
|
103
|
+
assert_syntax_error "Expected attribute\n (__TEMPLATE__), Line 3, Column 20\n img(src='img.png' whatsthis?!)\n ^\n", source
|
95
104
|
end
|
96
105
|
|
97
106
|
def test_invalid_empty_attribute
|
@@ -100,7 +109,7 @@ p
|
|
100
109
|
img{src= }
|
101
110
|
}
|
102
111
|
|
103
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src= }\n ^\n", source
|
112
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3, Column 10\n img{src= }\n ^\n", source
|
104
113
|
end
|
105
114
|
|
106
115
|
def test_invalid_empty_attribute2
|
@@ -109,7 +118,7 @@ p
|
|
109
118
|
img{src=}
|
110
119
|
}
|
111
120
|
|
112
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src=}\n ^\n", source
|
121
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3, Column 10\n img{src=}\n ^\n", source
|
113
122
|
end
|
114
123
|
|
115
124
|
def test_invalid_empty_attribute3
|
@@ -118,7 +127,7 @@ p
|
|
118
127
|
img src=
|
119
128
|
}
|
120
129
|
|
121
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img src=\n ^\n", source
|
130
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3, Column 10\n img src=\n ^\n", source
|
122
131
|
end
|
123
132
|
|
124
133
|
def test_missing_tag_in_block_expansion
|
@@ -126,18 +135,18 @@ p
|
|
126
135
|
html: body:
|
127
136
|
}
|
128
137
|
|
129
|
-
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2\n html: body:\n ^\n", source
|
138
|
+
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2, Column 11\n html: body:\n ^\n", source
|
130
139
|
end
|
131
140
|
|
132
141
|
def test_invalid_tag_in_block_expansion
|
133
142
|
source = %{
|
134
143
|
html: body: /comment
|
135
144
|
}
|
136
|
-
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2\n html: body: /comment\n ^\n", source
|
145
|
+
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2, Column 12\n html: body: /comment\n ^\n", source
|
137
146
|
|
138
147
|
source = %{
|
139
148
|
html: body:/comment
|
140
149
|
}
|
141
|
-
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2\n html: body:/comment\n ^\n", source
|
150
|
+
assert_syntax_error "Expected tag\n (__TEMPLATE__), Line 2, Column 11\n html: body:/comment\n ^\n", source
|
142
151
|
end
|
143
152
|
end
|
File without changes
|
@@ -207,4 +207,11 @@ div
|
|
207
207
|
}
|
208
208
|
assert_runtime_error 'Multiple id attributes specified', source
|
209
209
|
end
|
210
|
+
|
211
|
+
# def test_invalid_option
|
212
|
+
# render('', :foobar => 42)
|
213
|
+
# raise Exception, 'ArgumentError expected'
|
214
|
+
# rescue ArgumentError => ex
|
215
|
+
# assert_equal 'Option :foobar is not supported by Slim::Engine', ex.message
|
216
|
+
# end
|
210
217
|
end
|
File without changes
|
@@ -59,7 +59,7 @@ p Message: #{message('hello', "user #{output_number}")}
|
|
59
59
|
| #{evil_method}
|
60
60
|
}
|
61
61
|
|
62
|
-
assert_html '<script>do_something_evil();<
|
62
|
+
assert_html '<script>do_something_evil();</script>', source
|
63
63
|
end
|
64
64
|
|
65
65
|
def test_interpolation_without_escaping
|
@@ -74,6 +74,6 @@ p Message: #{message('hello', "user #{output_number}")}
|
|
74
74
|
source = %q{
|
75
75
|
| #{(evil_method)}
|
76
76
|
}
|
77
|
-
assert_html '<script>do_something_evil();<
|
77
|
+
assert_html '<script>do_something_evil();</script>', source
|
78
78
|
end
|
79
79
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSlimThreadOptions < TestSlim
|
4
|
+
def test_thread_options
|
5
|
+
source = %q{p.test}
|
6
|
+
|
7
|
+
assert_html '<p class="test"></p>', source
|
8
|
+
assert_html "<p class='test'></p>", source, :attr_wrapper => "'"
|
9
|
+
|
10
|
+
Slim::Engine.with_options(:attr_wrapper => "'") do
|
11
|
+
assert_html "<p class='test'></p>", source
|
12
|
+
assert_html '<p class="test"></p>', source, :attr_wrapper => '"'
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_html '<p class="test"></p>', source
|
16
|
+
assert_html "<p class='test'></p>", source, :attr_wrapper => "'"
|
17
|
+
end
|
18
|
+
end
|
@@ -2,6 +2,17 @@ require 'helper'
|
|
2
2
|
require 'slim/logic_less'
|
3
3
|
|
4
4
|
class TestSlimLogicLess < TestSlim
|
5
|
+
class Scope
|
6
|
+
def initialize
|
7
|
+
@hash = {
|
8
|
+
:person => [
|
9
|
+
{ :name => 'Joe', },
|
10
|
+
{ :name => 'Jack', }
|
11
|
+
]
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
5
16
|
def test_symbol_access
|
6
17
|
source = %q{
|
7
18
|
p
|
@@ -19,6 +30,16 @@ p
|
|
19
30
|
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => hash, :dictionary_access => :symbol
|
20
31
|
end
|
21
32
|
|
33
|
+
def test_dictionary_option
|
34
|
+
source = %q{
|
35
|
+
p
|
36
|
+
- person
|
37
|
+
.name = name
|
38
|
+
}
|
39
|
+
|
40
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => Scope.new, :dictionary => '@hash', :dictionary_access => :symbol
|
41
|
+
end
|
42
|
+
|
22
43
|
def test_string_access
|
23
44
|
source = %q{
|
24
45
|
p
|
@@ -8,7 +8,7 @@ p
|
|
8
8
|
- person
|
9
9
|
.name = name
|
10
10
|
}
|
11
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
11
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :dictionary => 'ViewEnv.new'
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_with_array
|
@@ -18,14 +18,14 @@ ul
|
|
18
18
|
li = name
|
19
19
|
li = city
|
20
20
|
}
|
21
|
-
assert_html '<ul><li>Andy</li><li>Atlanta</li><li>Fred</li><li>Melbourne</li><li>Daniel</li><li>Karlsruhe</li></ul>', source, :
|
21
|
+
assert_html '<ul><li>Andy</li><li>Atlanta</li><li>Fred</li><li>Melbourne</li><li>Daniel</li><li>Karlsruhe</li></ul>', source, :dictionary => 'ViewEnv.new'
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_method
|
25
25
|
source = %q{
|
26
26
|
a href=output_number Link
|
27
27
|
}
|
28
|
-
assert_html '<a href="1337">Link</a>', source, :
|
28
|
+
assert_html '<a href="1337">Link</a>', source, :dictionary => 'ViewEnv.new'
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
h1 Edit
|
2
|
+
= render "form"
|
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
h1 New
|
2
|
+
= render "form"
|
@@ -0,0 +1 @@
|
|
1
|
+
p@empty Test
|
@@ -45,9 +45,11 @@ class TestSlim < ActionDispatch::IntegrationTest
|
|
45
45
|
assert_html "<p>1337</p>"
|
46
46
|
end
|
47
47
|
|
48
|
-
test "render
|
49
|
-
get "slim/
|
50
|
-
assert_html
|
48
|
+
test "render thread_options" do
|
49
|
+
get "slim/thread_options", :attr => 'role'
|
50
|
+
assert_html '<p role="empty">Test</p>'
|
51
|
+
get "slim/thread_options", :attr => 'id' # Overwriting doesn't work because of caching
|
52
|
+
assert_html '<p role="empty">Test</p>'
|
51
53
|
end
|
52
54
|
|
53
55
|
test "content_for" do
|
@@ -59,7 +61,7 @@ class TestSlim < ActionDispatch::IntegrationTest
|
|
59
61
|
post "parents", 'parent[name]' => "p1", 'parent[children_attributes][0][name]' => "c1"
|
60
62
|
get "parents/1/edit"
|
61
63
|
|
62
|
-
assert_match(%r{<form accept-charset="UTF-8" action="/parents/1" class="edit_parent" enctype="multipart/form-data" id="edit_parent_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="[^"]+" /></div><h1>Parent</h1><input id="parent_name" name="parent\[name\]" size="30" type="text" value="p1" /><h2>Children</h2><ul><li><input id="parent_children_attributes_0_name" name="parent\[children_attributes\]\[0\]\[name\]" size="30" type="text" value="c1" /></li><input id="parent_children_attributes_0_id" name="parent\[children_attributes\]\[0\]\[id\]" type="hidden" value="1" /></ul></form>}, @response.body)
|
64
|
+
assert_match(%r{<div class="content"><h1>Edit</h1><h2>Form</h2><form accept-charset="UTF-8" action="/parents/1" class="edit_parent" enctype="multipart/form-data" id="edit_parent_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="[^"]+" /></div><h1>Parent</h1><input id="parent_name" name="parent\[name\]" size="30" type="text" value="p1" /><h2>Children</h2><ul><li><input id="parent_children_attributes_0_name" name="parent\[children_attributes\]\[0\]\[name\]" size="30" type="text" value="c1" /></li><input id="parent_children_attributes_0_id" name="parent\[children_attributes\]\[0\]\[id\]" type="hidden" value="1" /></ul></form></div>}, @response.body)
|
63
65
|
end
|
64
66
|
|
65
67
|
protected
|