sinatra-tests 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +165 -12
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/sinatra/tests.rb +4 -2
- data/lib/sinatra/tests/rspec/matchers.rb +224 -0
- data/lib/sinatra/tests/rspec/shared_specs.rb +342 -0
- data/sinatra-tests.gemspec +22 -17
- data/spec/sinatra/tests/rspec/matchers_spec.rb +274 -0
- data/spec/sinatra/tests/test_case_spec.rb +0 -15
- data/spec/sinatra/tests/tests_spec.rb +30 -0
- data/spec/spec_helper.rb +7 -9
- metadata +52 -26
- data/lib/sinatra/tests/init.rb +0 -174
- data/lib/sinatra/tests/shared_specs.rb +0 -450
@@ -0,0 +1,342 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
module Tests
|
5
|
+
|
6
|
+
module RSpec
|
7
|
+
|
8
|
+
# == Shared Specs
|
9
|
+
#
|
10
|
+
# === DEBUG
|
11
|
+
#
|
12
|
+
# * <b><tt>it_should_behave_like "debug => app.methods"</tt></b>
|
13
|
+
#
|
14
|
+
# dumps a list of methods for the current <tt>app</tt>
|
15
|
+
#
|
16
|
+
# * <b><tt>it_should_behave_like "debug"</tt></b>
|
17
|
+
#
|
18
|
+
# tests the body output for a <tt><debug></tt> tag.
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# === RESPONSE
|
22
|
+
#
|
23
|
+
# * <b><tt>it_should_behave_like "HTTP headers"</tt></b>
|
24
|
+
#
|
25
|
+
# checks that we got a 200 status (OK), and content-type is <tt>text/html</tt>
|
26
|
+
#
|
27
|
+
# * <b><tt>it_should_behave_like "HTML"</tt></b>
|
28
|
+
#
|
29
|
+
# checks that we got a 200 status (OK), and content-type is <tt>text/html</tt>
|
30
|
+
#
|
31
|
+
# * <b><tt>it_should_behave_like "CSS"</tt></b>
|
32
|
+
#
|
33
|
+
# checks that we got a 200 status (OK), and content-type is <tt>text/css</tt>
|
34
|
+
#
|
35
|
+
#
|
36
|
+
# === HTML OUTPUT
|
37
|
+
#
|
38
|
+
# * <b><tt>it_should_behave_like "div#main-content"</tt></b>
|
39
|
+
#
|
40
|
+
# checks that the page has a <tt><div id="main-content"></div></tt>
|
41
|
+
#
|
42
|
+
# * <b><tt>it_should_behave_like "div#main-content > h2"</tt></b>
|
43
|
+
#
|
44
|
+
# checks that the page has an <tt><h2></tt> tag within the <tt><div id="main-content"></div></tt>
|
45
|
+
#
|
46
|
+
#
|
47
|
+
# ==== ADMIN SECTION
|
48
|
+
#
|
49
|
+
# * <b><tt>it_should_behave_like "div.admin-section-header > div.actions > h4 with HELP"</tt></b>
|
50
|
+
#
|
51
|
+
# checks that the page has an...
|
52
|
+
#
|
53
|
+
#
|
54
|
+
# ==== FORMS
|
55
|
+
#
|
56
|
+
# * <b><tt>it_should_behave_like "forms > faux method > input.hidden"</tt></b>
|
57
|
+
#
|
58
|
+
# checks that the page has a form with a <tt><input type="hidden"...></tt> tag
|
59
|
+
#
|
60
|
+
module SharedSpecs
|
61
|
+
|
62
|
+
include Sinatra::Tests::RSpec::Matchers
|
63
|
+
|
64
|
+
# :stopdoc:
|
65
|
+
|
66
|
+
share_examples_for 'MyTestApp' do
|
67
|
+
|
68
|
+
before(:each) do
|
69
|
+
class ::Test::Unit::TestCase
|
70
|
+
def app; ::MyTestApp.new ; end
|
71
|
+
end
|
72
|
+
@app = app
|
73
|
+
end
|
74
|
+
|
75
|
+
after(:each) do
|
76
|
+
class ::Test::Unit::TestCase
|
77
|
+
def app; nil ; end
|
78
|
+
end
|
79
|
+
@app = nil
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "Sanity" do
|
83
|
+
|
84
|
+
it "should be a MyTestApp kind of app" do
|
85
|
+
# FIXME:: HACK to prevent errors due to stupid Rack::CommonLogger error, when testing.
|
86
|
+
unless app.class == MyTestApp
|
87
|
+
pending "app.class returns [#{app.class}]"
|
88
|
+
else
|
89
|
+
app.class.should == MyTestApp
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# it_should_behave_like "debug => app.methods"
|
94
|
+
|
95
|
+
end #/ Sanity
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
share_examples_for 'MyAdminTestApp' do
|
100
|
+
|
101
|
+
before(:each) do
|
102
|
+
class ::Test::Unit::TestCase
|
103
|
+
def app; ::MyAdminTestApp.new ; end
|
104
|
+
end
|
105
|
+
@app = app
|
106
|
+
end
|
107
|
+
|
108
|
+
after(:each) do
|
109
|
+
class ::Test::Unit::TestCase
|
110
|
+
def app; nil ; end
|
111
|
+
end
|
112
|
+
@app = nil
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "Sanity" do
|
116
|
+
|
117
|
+
it "should be a MyAdminTestApp kind of app" do
|
118
|
+
# FIXME:: HACK to prevent errors due to stupid Rack::CommonLogger error, when testing.
|
119
|
+
unless app.class == MyAdminTestApp
|
120
|
+
pending "app.class returns [#{app.class}]"
|
121
|
+
else
|
122
|
+
app.class.should == MyAdminTestApp
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# it_should_behave_like "debug => app.methods"
|
127
|
+
|
128
|
+
end #/ Sanity
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
# :startdoc:
|
133
|
+
|
134
|
+
# it_should_behave_like "debug => app.methods"
|
135
|
+
#
|
136
|
+
share_examples_for "debug => app.methods" do
|
137
|
+
it "app should have the right methods" do
|
138
|
+
app.methods.sort.should == 'debug => app.methods.sort'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
share_examples_for "debug" do
|
143
|
+
|
144
|
+
it "should output the whole html" do
|
145
|
+
body.should have_tag('debug')
|
146
|
+
end
|
147
|
+
|
148
|
+
end #/debug
|
149
|
+
|
150
|
+
share_examples_for "HTTP headers" do
|
151
|
+
|
152
|
+
it "should return status: 200" do
|
153
|
+
assert response.ok?
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should return 'text/html'" do
|
157
|
+
response.headers['Content-Type'].should == 'text/html'
|
158
|
+
# assert_equal('text/html', last_response.headers['Content-Type'])
|
159
|
+
end
|
160
|
+
|
161
|
+
end #/headers
|
162
|
+
|
163
|
+
share_examples_for "HTML" do
|
164
|
+
|
165
|
+
it "should return status: 200" do
|
166
|
+
assert response.ok?
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should return 'text/html'" do
|
170
|
+
response.headers['Content-Type'].should == 'text/html'
|
171
|
+
end
|
172
|
+
|
173
|
+
end #/HTML
|
174
|
+
|
175
|
+
share_examples_for "CSS" do
|
176
|
+
|
177
|
+
it "should return status: 200" do
|
178
|
+
assert response.ok?
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should return 'text/css'" do
|
182
|
+
response.headers['Content-Type'].should == 'text/css'
|
183
|
+
end
|
184
|
+
|
185
|
+
end #/HTML
|
186
|
+
|
187
|
+
|
188
|
+
###### HTML OUTPUT #######
|
189
|
+
|
190
|
+
share_examples_for 'div#main-content' do
|
191
|
+
it "should have a div#main-content tag" do
|
192
|
+
body.should have_tag('div#main-content')
|
193
|
+
end
|
194
|
+
end #/div
|
195
|
+
|
196
|
+
share_examples_for 'div#main-content > h2' do
|
197
|
+
it "should have a div#main-content h2 tag" do
|
198
|
+
body.should have_tag('div#main-content > h2', :count => 1)
|
199
|
+
end
|
200
|
+
end #/share_examples_for
|
201
|
+
|
202
|
+
|
203
|
+
###### ADMIN SECTIONS #######
|
204
|
+
|
205
|
+
share_examples_for 'div.admin-section-header > div.actions > h4 with HELP' do
|
206
|
+
it "should have div.admin-section-header > div.actions > h4 with HELP" do
|
207
|
+
body.should have_tag('div.admin-section-header > div.actions > h4') do |h4|
|
208
|
+
h4.inner_text.should match(/\s*HELP$/)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
|
214
|
+
###### FORMS ########
|
215
|
+
|
216
|
+
# share_examples_for 'forms > faux method > input.hidden[@value=put|delete]' do
|
217
|
+
share_examples_for 'forms > faux method > input.hidden' do
|
218
|
+
it "should have a faux method input hidden with method = PUT or DELETE" do
|
219
|
+
body.should match(/<input (name="_method"\s*|type="hidden"\s*|value="(put|delete)"\s*){3}>/)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
|
224
|
+
###### CSS ########
|
225
|
+
|
226
|
+
share_examples_for 'get_all_css_requests("/css")' do
|
227
|
+
|
228
|
+
it_should_behave_like "CSS [screen, print]"
|
229
|
+
|
230
|
+
it_should_behave_like "CSS [ie]"
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
share_examples_for 'get_all_css_requests("/css") (NO IE)' do
|
235
|
+
|
236
|
+
it_should_behave_like "CSS [screen, print]"
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
share_examples_for 'CSS [screen, print]' do
|
241
|
+
|
242
|
+
describe "CSS - GET /css/screen.css" do
|
243
|
+
|
244
|
+
before(:each) do
|
245
|
+
get("/css/screen.css")
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should return status: 200" do
|
249
|
+
assert response.ok?
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should return 'text/css'" do
|
253
|
+
# response.headers['Content-Type'].should == 'text/css;charset=utf-8'
|
254
|
+
response.headers['Content-Type'].should == 'text/css'
|
255
|
+
end
|
256
|
+
|
257
|
+
describe "the CSS" do
|
258
|
+
|
259
|
+
# it_should_behave_like "debug"
|
260
|
+
|
261
|
+
it "should NOT have a Sass::SyntaxError" do
|
262
|
+
body.should_not match(/Sass::SyntaxError/)
|
263
|
+
end
|
264
|
+
|
265
|
+
# TODO:: Need to write further tests here
|
266
|
+
# it "should have further tests"
|
267
|
+
|
268
|
+
end #/ the CSS
|
269
|
+
|
270
|
+
end #/CSS - GET /css/screen.css
|
271
|
+
|
272
|
+
describe "CSS - GET /css/print.css" do
|
273
|
+
|
274
|
+
before(:each) do
|
275
|
+
get("/css/print.css")
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should return status: 200" do
|
279
|
+
assert response.ok?
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should return 'text/css'" do
|
283
|
+
# response.headers['Content-Type'].should == 'text/css;charset=utf-8'
|
284
|
+
response.headers['Content-Type'].should == 'text/css'
|
285
|
+
end
|
286
|
+
|
287
|
+
describe "the CSS" do
|
288
|
+
|
289
|
+
# it_should_behave_like "debug"
|
290
|
+
|
291
|
+
it "should NOT have a Sass::SyntaxError" do
|
292
|
+
body.should_not match(/Sass::SyntaxError/)
|
293
|
+
end
|
294
|
+
|
295
|
+
# TODO:: Need to write further tests here
|
296
|
+
# it "should have further tests"
|
297
|
+
|
298
|
+
end #/ the CSS
|
299
|
+
|
300
|
+
end #/CSS - GET /css/print.css
|
301
|
+
|
302
|
+
end
|
303
|
+
|
304
|
+
share_examples_for 'CSS [ie]' do
|
305
|
+
|
306
|
+
describe "CSS - GET /css/ie.css" do
|
307
|
+
|
308
|
+
before(:each) do
|
309
|
+
get("/css/ie.css")
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should return status: 200" do
|
313
|
+
assert response.ok?
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should return 'text/css'" do
|
317
|
+
# response.headers['Content-Type'].should == 'text/css;charset=utf-8' # tilt version
|
318
|
+
response.headers['Content-Type'].should == 'text/css'
|
319
|
+
end
|
320
|
+
|
321
|
+
describe "the CSS" do
|
322
|
+
|
323
|
+
# it_should_behave_like "debug"
|
324
|
+
|
325
|
+
it "should NOT have a Sass::SyntaxError" do
|
326
|
+
body.should_not match(/Sass::SyntaxError/)
|
327
|
+
end
|
328
|
+
|
329
|
+
# TODO:: Need to write further tests here
|
330
|
+
# it "should have further tests"
|
331
|
+
|
332
|
+
end #/ the CSS
|
333
|
+
|
334
|
+
end #/CSS - GET /css/print.css
|
335
|
+
|
336
|
+
end
|
337
|
+
|
338
|
+
|
339
|
+
end #/module SharedSpecs
|
340
|
+
end #/module RSpec
|
341
|
+
end #/module Tests
|
342
|
+
end #/module Sinatra
|
data/sinatra-tests.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sinatra-tests}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["kematzy"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-02-23}
|
13
13
|
s.email = %q{kematzy@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -23,20 +23,24 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
25
|
"lib/sinatra/tests.rb",
|
26
|
-
"lib/sinatra/tests/
|
27
|
-
"lib/sinatra/tests/shared_specs.rb",
|
26
|
+
"lib/sinatra/tests/rspec/matchers.rb",
|
27
|
+
"lib/sinatra/tests/rspec/shared_specs.rb",
|
28
28
|
"lib/sinatra/tests/test_case.rb",
|
29
29
|
"sinatra-tests.gemspec",
|
30
|
+
"spec/sinatra/tests/rspec/matchers_spec.rb",
|
30
31
|
"spec/sinatra/tests/test_case_spec.rb",
|
32
|
+
"spec/sinatra/tests/tests_spec.rb",
|
31
33
|
"spec/spec_helper.rb"
|
32
34
|
]
|
33
35
|
s.homepage = %q{http://github.com/kematzy/sinatra-tests}
|
34
36
|
s.rdoc_options = ["--charset=UTF-8"]
|
35
37
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version = %q{1.3.
|
38
|
+
s.rubygems_version = %q{1.3.6}
|
37
39
|
s.summary = %q{Sinatra::Tests is a repository of common Test/RSpec helpers}
|
38
40
|
s.test_files = [
|
39
|
-
"spec/sinatra/tests/
|
41
|
+
"spec/sinatra/tests/rspec/matchers_spec.rb",
|
42
|
+
"spec/sinatra/tests/test_case_spec.rb",
|
43
|
+
"spec/sinatra/tests/tests_spec.rb",
|
40
44
|
"spec/spec_helper.rb"
|
41
45
|
]
|
42
46
|
|
@@ -46,19 +50,20 @@ Gem::Specification.new do |s|
|
|
46
50
|
|
47
51
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
48
52
|
s.add_runtime_dependency(%q<sinatra>, [">= 0.10.1"])
|
49
|
-
s.add_runtime_dependency(%q<rack-test>, [">= 0.
|
50
|
-
s.add_runtime_dependency(%q<rspec>, [">= 1.
|
51
|
-
s.add_runtime_dependency(%q<rspec_hpricot_matchers>, [">= 1.0
|
53
|
+
s.add_runtime_dependency(%q<rack-test>, [">= 0.5.3"])
|
54
|
+
s.add_runtime_dependency(%q<rspec>, [">= 1.3.0"])
|
55
|
+
s.add_runtime_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
|
52
56
|
else
|
53
57
|
s.add_dependency(%q<sinatra>, [">= 0.10.1"])
|
54
|
-
s.add_dependency(%q<rack-test>, [">= 0.
|
55
|
-
s.add_dependency(%q<rspec>, [">= 1.
|
56
|
-
s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0
|
58
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
59
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
60
|
+
s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
|
57
61
|
end
|
58
62
|
else
|
59
63
|
s.add_dependency(%q<sinatra>, [">= 0.10.1"])
|
60
|
-
s.add_dependency(%q<rack-test>, [">= 0.
|
61
|
-
s.add_dependency(%q<rspec>, [">= 1.
|
62
|
-
s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0
|
64
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
65
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
66
|
+
s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
|
63
67
|
end
|
64
68
|
end
|
69
|
+
|
@@ -0,0 +1,274 @@
|
|
1
|
+
|
2
|
+
require "#{File.dirname(File.dirname(File.expand_path(__FILE__)))}/../../spec_helper"
|
3
|
+
|
4
|
+
|
5
|
+
describe "Sinatra" do
|
6
|
+
|
7
|
+
it_should_behave_like "MyTestApp"
|
8
|
+
|
9
|
+
describe "Tests" do
|
10
|
+
|
11
|
+
describe "RSpec" do
|
12
|
+
|
13
|
+
describe "Matchers" do
|
14
|
+
|
15
|
+
describe "#be_even" do
|
16
|
+
|
17
|
+
it "should return true when even" do
|
18
|
+
1.should_not be_even
|
19
|
+
2.should be_even
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should raise an Exception when not even" do
|
23
|
+
lambda { 1.should be_even }.should raise_error(Exception, /"an even number" but got 1/)
|
24
|
+
end
|
25
|
+
|
26
|
+
end #/ #be_even
|
27
|
+
|
28
|
+
describe "#have_a_page_title" do
|
29
|
+
|
30
|
+
it "should return true when there is a page title" do
|
31
|
+
erb_app "<head><title>It works</title></head>"
|
32
|
+
body.should have_a_page_title('It works')
|
33
|
+
erb_app "<head><title>Home | Default Site Title</title></head>"
|
34
|
+
body.should have_a_page_title('Home | Default Site Title')
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should raise an Exception when the searched for page title contains entities" do
|
38
|
+
lambda {
|
39
|
+
erb_app "<head><title>Home & Default Site Title</title></head>"
|
40
|
+
body.should have_a_page_title('Home & Default Site Title')
|
41
|
+
}.should raise_error(Exception)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should NOT raise an Exception when the searched for page title contains decoded entities" do
|
45
|
+
lambda {
|
46
|
+
erb_app "<head><title>Home & Default Site Title</title></head>"
|
47
|
+
body.should have_a_page_title('Home & Default Site Title')
|
48
|
+
}.should_not raise_error(Exception)
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should raise an Exception when the page titles are NOT the same" do
|
53
|
+
erb_app "<head><title>It still works</title></head>"
|
54
|
+
lambda {
|
55
|
+
body.should have_a_page_title('It works')
|
56
|
+
}.should raise_error(Exception)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return true when the page title is empty" do
|
60
|
+
erb_app "<head><title></title></head>"
|
61
|
+
body.should have_a_page_title('')
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return true when given a RegExp that matches " do
|
65
|
+
erb_app "<head><title>It works</title></head>"
|
66
|
+
body.should have_a_page_title(/^It /)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should raise an Exception when given a RegExp that does NOT match" do
|
70
|
+
erb_app "<head><title>It works</title></head>"
|
71
|
+
lambda {
|
72
|
+
body.should have_a_page_title(/^It does not match/)
|
73
|
+
}.should raise_error(Exception, /<head><title>It works<\/title><\/head>\nto have an element matching "head > title" with inner text \/\^It does not match\/, but found 0/m)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should raise an Exception when there is no <head> elment" do
|
77
|
+
erb_app "<title>It works</title>"
|
78
|
+
lambda {
|
79
|
+
body.should have_a_page_title(/^It works/)
|
80
|
+
}.should raise_error(Exception, /<title>It works<\/title>\nto have an element matching "head > title" with inner text \/\^It works\/, but did not/m)
|
81
|
+
end
|
82
|
+
|
83
|
+
end #/ #have_a_page_title
|
84
|
+
|
85
|
+
describe "#have_a_page_header" do
|
86
|
+
|
87
|
+
it "should return true when there is a page header" do
|
88
|
+
erb_app "<%= '<h2>Page Header</h2>' %>"
|
89
|
+
body.should have_a_page_header('Page Header')
|
90
|
+
erb_app "<%= '<h2 class=\"page-header\">Page Header</h2>' %>"
|
91
|
+
body.should have_a_page_header('Page Header')
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should raise an error when the page headers are NOT the same" do
|
95
|
+
erb_app "<%= '<h2>Page Header</h2>' %>"
|
96
|
+
lambda {
|
97
|
+
body.should have_a_page_header('Different Page Header')
|
98
|
+
}.should raise_error(Exception)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should return true when the page header is empty" do
|
102
|
+
erb_app "<h2></h2>"
|
103
|
+
body.should have_a_page_header('')
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return true when given a RegExp that matches " do
|
107
|
+
erb_app "<h2>Page Header</h2>"
|
108
|
+
body.should have_a_page_header(/^Page /)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should raise an Exception when given a RegExp that does NOT match" do
|
112
|
+
erb_app "<h2>Page Header</h2>"
|
113
|
+
lambda {
|
114
|
+
body.should have_a_page_header(/^Different Page Header/)
|
115
|
+
}.should raise_error(Exception, /<h2>Page Header<\/h2>\nto have 1 elements matching "h2" with inner text \/\^Different Page Header\/, but found 0/m)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should accept dynamic page headers" do
|
119
|
+
erb_app "<%= '<h1>Page Header</h1>' %>"
|
120
|
+
body.should have_a_page_header('Page Header','h1')
|
121
|
+
erb_app "<%= '<div id=\"main-content\"><h2>Page Header</h2></div>' %>"
|
122
|
+
body.should have_a_page_header('Page Header','div#main-content > h2')
|
123
|
+
erb_app "<%= '<span class=\"page-header\">Page Header</span>' %>"
|
124
|
+
body.should have_a_page_header('Page Header','span.page-header')
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should raise an Exception when there are more than one page header" do
|
128
|
+
erb_app "<h2>Page Header1</h2><h2>Page Header2</h2><h2>Page Header3</h2>"
|
129
|
+
lambda {
|
130
|
+
body.should have_a_page_header(/^Page Header/)
|
131
|
+
}.should raise_error(Exception, /<h2>Page Header1<\/h2><h2>Page Header2<\/h2><h2>Page Header3<\/h2>\nto have 1 elements matching "h2" with inner text \/\^Page Header\/, but found 3/m)
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end #/ #have_a_page_header
|
136
|
+
|
137
|
+
describe "#have_a_td_actions" do
|
138
|
+
|
139
|
+
before(:each) do
|
140
|
+
@html = %Q[
|
141
|
+
<table id="posts-table">
|
142
|
+
<tbody>
|
143
|
+
<tr>
|
144
|
+
<td id="post-actions-98" class="actions">
|
145
|
+
<a href="/posts/98/edit" class="ui-btn edit-link" title="edit post">EDIT</a> |
|
146
|
+
<a href="/posts/98" class="ui-btn delete-link" title="delete post">DELETE</a>
|
147
|
+
</td>
|
148
|
+
</tr>
|
149
|
+
<tr>
|
150
|
+
<td id="post-actions-99" class="actions">
|
151
|
+
<a href="/posts/99/edit" class="ui-btn edit-link" title="edit post">EDIT</a> |
|
152
|
+
<a href="/posts/99" class="ui-btn delete-link" title="delete post">DELETE</a>
|
153
|
+
</td>
|
154
|
+
</tr>
|
155
|
+
</tbody>
|
156
|
+
</table>]
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should return true when looking for a simple model only" do
|
161
|
+
erb_app @html
|
162
|
+
# body.should have_tag(:debug)
|
163
|
+
body.should have_a_td_actions(:post)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should return true when providing a buttons array" do
|
167
|
+
erb_app @html
|
168
|
+
# body.should have_tag(:debug)
|
169
|
+
body.should have_a_td_actions(:post, %w(edit))
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should raise an Exception when asking for buttons that are NOT present" do
|
173
|
+
lambda {
|
174
|
+
erb_app @html
|
175
|
+
# body.should have_tag(:debug)
|
176
|
+
body.should have_a_td_actions(:post,%w(delete edit show))
|
177
|
+
}.should raise_error(Exception)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should have more tests here...."
|
181
|
+
|
182
|
+
end #/ #have_a_td_actions
|
183
|
+
|
184
|
+
describe "#have_a_ui_btn" do
|
185
|
+
|
186
|
+
it "should return true for an Edit button with (div, :edit,:post, 'EDIT')" do
|
187
|
+
erb_app '<%= "<div><a href=\"/posts/99/edit\" class=\"ui-btn edit-link\" title=\"edit post\">EDIT</a></div>" %>'
|
188
|
+
body.should have_a_ui_btn('div', :edit, :post, 'EDIT')
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should return true for an Edit button without link text (div, :edit,:post)" do
|
192
|
+
erb_app '<%= "<div><a href=\"/posts/99/edit\" class=\"ui-btn edit-link some-other-class\" title=\"edit post with extra text\">EDIT</a></div>" %>'
|
193
|
+
body.should have_a_ui_btn('div', :edit, :post)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should return true for a Delete button with (div, :delete,:post, 'DELETE')" do
|
197
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn delete-link\" title=\"delete post\">DELETE</a></div>" %>'
|
198
|
+
body.should have_a_ui_btn('div', :delete, :post, 'DELETE')
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should return true for a Delete button without link text (div, :delete,:post)" do
|
202
|
+
erb_app '<%= "<div><a href=\"/photos/99\" class=\"ui-btn delete-link some-other-class\" title=\"delete photo with extra text\">DELETE</a></div>" %>'
|
203
|
+
body.should have_a_ui_btn('div', :delete, :photo)
|
204
|
+
erb_app '<%= "<div><a href=\"/photos/99\" class=\"ui-btn delete-link some-other-class\" title=\"delete photo with extra text\"></a></div>" %>'
|
205
|
+
body.should have_a_ui_btn('div', :delete, :photo,'')
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should return true for a Show button with custom link text" do
|
209
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn show-link\" title=\"show post\">Custom</a></div>" %>'
|
210
|
+
body.should have_a_ui_btn('div', :show, :post, 'Custom')
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should raise an Exception when given wrong arguments" do
|
214
|
+
lambda {
|
215
|
+
erb_app '<%= "<div><a href=\"/photos/99\" class=\"ui-btn delete-link\" title=\"delete photo\">DELETE</a></div>" %>'
|
216
|
+
body.should have_a_ui_btn('div', nil, :photo)
|
217
|
+
}.should raise_error(Exception)
|
218
|
+
end
|
219
|
+
|
220
|
+
end #/ #have_a_ui_btn
|
221
|
+
|
222
|
+
describe "#have_an_edit_btn" do
|
223
|
+
|
224
|
+
it "should return true when there is an edit_btn with 'EDIT'" do
|
225
|
+
erb_app '<%= "<div><a href=\"/posts/99/edit\" class=\"ui-btn edit-link\" title=\"edit post\">EDIT</a></div>" %>'
|
226
|
+
body.should have_an_edit_btn('div', :post)
|
227
|
+
erb_app '<%= "<div><a href=\"/posts/99/edit\" class=\"ui-btn edit-link some-other-class\" title=\"edit post with extra text\">EDIT</a></div>" %>'
|
228
|
+
body.should have_an_edit_btn('div', :post)
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should return true when there is an edit_btn with custom text" do
|
232
|
+
erb_app '<%= "<div><a href=\"/posts/99/edit\" class=\"ui-btn edit-link\" title=\"edit post\">Custom</a></div>" %>'
|
233
|
+
body.should have_an_edit_btn('div', :post, 'Custom')
|
234
|
+
end
|
235
|
+
|
236
|
+
end #/ #have_an_edit_btn
|
237
|
+
|
238
|
+
describe "#have_a_delete_btn" do
|
239
|
+
|
240
|
+
it "should return true when there is an delete_btn with 'DELETE'" do
|
241
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn delete-link\" title=\"delete post\">DELETE</a></div>" %>'
|
242
|
+
body.should have_a_delete_btn('div', :post)
|
243
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn delete-link some-other-class\" title=\"delete post with extra text\">DELETE</a></div>" %>'
|
244
|
+
body.should have_a_delete_btn('div', :post)
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should return true when there is an delete_btn with custom text" do
|
248
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn delete-link\" title=\"delete post\">Custom</a></div>" %>'
|
249
|
+
body.should have_a_delete_btn('div', :post, 'Custom')
|
250
|
+
end
|
251
|
+
|
252
|
+
end #/ #have_an_edit_btn
|
253
|
+
|
254
|
+
describe "#have_a_show_btn" do
|
255
|
+
|
256
|
+
it "should return true when there is an show_btn with 'Show'" do
|
257
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn show-link\" title=\"show post\">SHOW</a></div>" %>'
|
258
|
+
body.should have_a_show_btn('div', :post)
|
259
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn show-link some-other-class\" title=\"show post with extra text\">SHOW</a></div>" %>'
|
260
|
+
body.should have_a_show_btn('div', :post)
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should return true when there is an show_btn with custom text" do
|
264
|
+
erb_app '<%= "<div><a href=\"/posts/99\" class=\"ui-btn show-link\" title=\"show post\">Custom</a></div>" %>'
|
265
|
+
body.should have_a_show_btn('div', :post, 'Custom')
|
266
|
+
end
|
267
|
+
|
268
|
+
end #/ #have_an_edit_btn
|
269
|
+
|
270
|
+
end #/ Matchers
|
271
|
+
|
272
|
+
end #/ RSpec
|
273
|
+
end #/ Tests
|
274
|
+
end #/ Sinatra
|