mosquito 0.1.3 → 0.1.4
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.
- data/CHANGELOG +11 -1
- data/Manifest.txt +2 -0
- data/Rakefile +24 -0
- data/lib/mosquito.rb +121 -79
- data/public/bare.rb +0 -1
- data/public/blog.rb +11 -7
- data/public/blog/controllers.rb +4 -0
- data/public/blog/views.rb +1 -0
- data/test/sage_advice_cases/parsing_arrays.rb +0 -3
- data/test/test_bare.rb +28 -7
- data/test/test_blog.rb +22 -13
- data/test/test_fixtures.rb +72 -0
- data/test/test_helpers.rb +2 -1
- data/test/test_mock_request.rb +33 -7
- data/test/test_mock_upload.rb +1 -0
- metadata +86 -73
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 0.1.4 - The glass slipper release
|
2
|
+
|
3
|
+
* Compatibility with Camping 2.0 (development version) and Camping 1.5
|
4
|
+
* Fix that newer Rails assert_select wants to know content_type
|
5
|
+
* Final solution to the fixture problems. We now setup and teardown properly.
|
6
|
+
* Fixed a bug that would occur when using an absolute URL (with scheme and host)
|
7
|
+
and query strings.
|
8
|
+
* Do not use eval for running the application because it fumbles the backtrace
|
9
|
+
|
1
10
|
== 0.1.3 - The little fairy release
|
2
11
|
|
3
12
|
* You can use an absolute URL with scheme and all instead of path-only abbreviation
|
@@ -15,7 +24,8 @@
|
|
15
24
|
* for querystrings
|
16
25
|
* for postvars
|
17
26
|
* and yes, for uploads too
|
18
|
-
* On that note, added a Mosquito::MockUpload to quickly simulate an uploaded file. The file will be filled with random text,
|
27
|
+
* On that note, added a Mosquito::MockUpload to quickly simulate an uploaded file. The file will be filled with random text,
|
28
|
+
so roll your own if you need concrete file content.
|
19
29
|
* We are Camping 1.5 compatible
|
20
30
|
* You can now do 'test "should do this"' and pass a block of assertions.
|
21
31
|
* More tests for better coverage of mosquito.rb
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
$: << 'lib'
|
2
|
+
$:.reject! { |e| e.include? 'TextMate' }
|
2
3
|
|
3
4
|
require 'rubygems'
|
4
5
|
require 'hoe'
|
@@ -16,6 +17,10 @@ Hoe.new('Mosquito', Mosquito::VERSION) do |p|
|
|
16
17
|
p.summary = "A Camping test library."
|
17
18
|
p.changes = p.paragraphs_of('CHANGELOG', 0..1).join("\n\n")
|
18
19
|
p.url = "http://mosquito.rubyforge.org"
|
20
|
+
p.remote_rdoc_dir = '' # Release to root on rubyforge
|
21
|
+
# We need that so that Hoe does not grab Camping's own distro tests
|
22
|
+
p.test_globs = ['test/test_*.rb']
|
23
|
+
p.rsync_args << ' --exclude=statsvn/'
|
19
24
|
p.rdoc_pattern = /README|CHANGELOG|mosquito/
|
20
25
|
p.clean_globs = ['**.log', 'coverage', 'coverage.data', 'test/test.log', 'email.txt']
|
21
26
|
p.extra_deps = ['activerecord', 'activesupport', 'camping']
|
@@ -38,3 +43,22 @@ begin
|
|
38
43
|
end
|
39
44
|
rescue LoadError
|
40
45
|
end
|
46
|
+
|
47
|
+
require 'rake/testtask'
|
48
|
+
|
49
|
+
|
50
|
+
multicamp_tasks = Dir.glob(File.dirname(__FILE__) + '/test/camping-dist/camping-*/lib').sort.map do | path |
|
51
|
+
distname = File.basename(File.dirname(path))
|
52
|
+
libs = path[(File.dirname(__FILE__) + '/').length..-1]
|
53
|
+
|
54
|
+
desc "Run tests with #{distname}"
|
55
|
+
Rake::TestTask.new("test-with-#{distname}") do |t|
|
56
|
+
t.libs << "test" << libs
|
57
|
+
t.pattern = 'test/test_*.rb'
|
58
|
+
t.verbose = true
|
59
|
+
end
|
60
|
+
"test-with-#{distname}"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Run with multiple Camping versions"
|
64
|
+
task :multicamp => multicamp_tasks
|
data/lib/mosquito.rb
CHANGED
@@ -11,7 +11,7 @@ stringio
|
|
11
11
|
).each { |lib| require lib }
|
12
12
|
|
13
13
|
module Mosquito
|
14
|
-
VERSION = '0.1.
|
14
|
+
VERSION = '0.1.4'
|
15
15
|
|
16
16
|
# For various methods that need to generate random text
|
17
17
|
def self.garbage(amount) #:nodoc:
|
@@ -23,6 +23,9 @@ module Mosquito
|
|
23
23
|
str.join
|
24
24
|
end
|
25
25
|
|
26
|
+
# URL escape on both Camping versions
|
27
|
+
def self.esc(t); Camping.escape(t.to_s) rescue Rack::Utils.escape(t.to_s); end
|
28
|
+
|
26
29
|
# Will be raised if you try to test for something Camping does not support.
|
27
30
|
# Kind of a safeguard in the deep ocean of metaified Ruby goodness.
|
28
31
|
class SageAdvice < RuntimeError; end
|
@@ -36,60 +39,44 @@ module Mosquito
|
|
36
39
|
end
|
37
40
|
|
38
41
|
def self.unstash #:nodoc:
|
39
|
-
x, @stashed = @stashed, nil
|
42
|
+
(x, @stashed = @stashed, nil).shift
|
43
|
+
end
|
44
|
+
|
45
|
+
module Dusty
|
46
|
+
##
|
47
|
+
# From Jay Fields.
|
48
|
+
#
|
49
|
+
# Allows tests to be specified as a block.
|
50
|
+
#
|
51
|
+
# test "should do this and that" do
|
52
|
+
# ...
|
53
|
+
# end
|
54
|
+
|
55
|
+
def test(name, &block)
|
56
|
+
test_name = :"test_#{name.gsub(' ','_')}"
|
57
|
+
raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
|
58
|
+
define_method test_name, &block
|
59
|
+
end
|
40
60
|
end
|
41
61
|
end
|
42
62
|
|
43
|
-
|
63
|
+
returning(:adapter => 'sqlite3', :database => ":memory:") do | config |
|
64
|
+
ActiveRecord::Base.establish_connection config
|
65
|
+
ActiveRecord::Base.configurations['test'] = config.stringify_keys
|
66
|
+
end
|
67
|
+
|
44
68
|
ActiveRecord::Base.logger = Logger.new("test/test.log") rescue Logger.new("test.log")
|
45
69
|
|
46
70
|
# This needs to be set relative to the file where the test comes from, NOT relative to the
|
47
71
|
# mosquito itself
|
48
72
|
Test::Unit::TestCase.fixture_path = "test/fixtures/"
|
49
73
|
|
50
|
-
class Test::Unit::TestCase #:nodoc:
|
51
|
-
def create_fixtures(*table_names)
|
52
|
-
if block_given?
|
53
|
-
self.class.fixtures(*table_names) { |*anything| yield(*anything) }
|
54
|
-
else
|
55
|
-
self.class.fixtures(*table_names)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.fixtures(*table_names)
|
60
|
-
if block_given?
|
61
|
-
Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield }
|
62
|
-
else
|
63
|
-
Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
##
|
68
|
-
# From Jay Fields.
|
69
|
-
#
|
70
|
-
# Allows tests to be specified as a block.
|
71
|
-
#
|
72
|
-
# test "should do this and that" do
|
73
|
-
# ...
|
74
|
-
# end
|
75
|
-
|
76
|
-
def self.test(name, &block)
|
77
|
-
test_name = :"test_#{name.gsub(' ','_')}"
|
78
|
-
raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
|
79
|
-
define_method test_name, &block
|
80
|
-
end
|
81
|
-
|
82
|
-
# Turn off transactional fixtures if you're working with MyISAM tables in MySQL
|
83
|
-
self.use_transactional_fixtures = true
|
84
|
-
# Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david)
|
85
|
-
self.use_instantiated_fixtures = false
|
86
|
-
end
|
87
|
-
|
88
74
|
# Mock request is used for composing the request body and headers
|
89
75
|
class Mosquito::MockRequest
|
90
76
|
# Should be a StringIO. However, you got some assignment methods that will
|
91
77
|
# stuff it with encoded parameters for you
|
92
78
|
attr_accessor :body
|
79
|
+
attr_reader :headers
|
93
80
|
|
94
81
|
DEFAULT_HEADERS = {
|
95
82
|
'SERVER_NAME' => 'test.host',
|
@@ -114,10 +101,11 @@ class Mosquito::MockRequest
|
|
114
101
|
'HTTP_CONNECTION' => 'keep-alive',
|
115
102
|
'REQUEST_METHOD' => 'GET',
|
116
103
|
}
|
117
|
-
|
104
|
+
|
105
|
+
|
118
106
|
def initialize
|
119
107
|
@headers = DEFAULT_HEADERS.with_indifferent_access # :-)
|
120
|
-
@body = StringIO.new('
|
108
|
+
@body = StringIO.new('')
|
121
109
|
end
|
122
110
|
|
123
111
|
# Returns the hash of headers
|
@@ -203,9 +191,27 @@ class Mosquito::MockRequest
|
|
203
191
|
"msqto-" + Mosquito::garbage(16)
|
204
192
|
end
|
205
193
|
|
194
|
+
# Return a hash that can be used as a Rack request
|
195
|
+
def to_rack_request
|
196
|
+
returning({}) do | inp |
|
197
|
+
inp.merge! @headers
|
198
|
+
inp.merge! 'rack.input' => @body,
|
199
|
+
'rack.version' => [0,1],
|
200
|
+
'rack.errors' => STDERR,
|
201
|
+
'rack.url_scheme' => 'http',
|
202
|
+
'CONTENT_LENGTH' => @body.string.length.to_s # Rack throws an error when it does not proper clen
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
# Return an array of Camping arguments
|
207
|
+
def to_camping_args
|
208
|
+
[@body, self]
|
209
|
+
end
|
210
|
+
|
206
211
|
private
|
212
|
+
|
207
213
|
# Quickly URL-escape something
|
208
|
-
def esc(t);
|
214
|
+
def esc(t); Mosquito.esc(t); end
|
209
215
|
|
210
216
|
# Extracts an array of values from a deeply-nested hash
|
211
217
|
def extract_values(hash_or_a)
|
@@ -243,7 +249,7 @@ class Mosquito::MockRequest
|
|
243
249
|
def uploaded_file_segment(key, upload_io, boundary)
|
244
250
|
<<-EOF
|
245
251
|
--#{boundary}\r
|
246
|
-
Content-Disposition: form-data; name="#{key}"; filename="#{
|
252
|
+
Content-Disposition: form-data; name="#{key}"; filename="#{Mosquito.esc(upload_io.original_filename)}"\r
|
247
253
|
Content-Type: #{upload_io.content_type}\r
|
248
254
|
Content-Length: #{upload_io.size}\r
|
249
255
|
\r
|
@@ -365,11 +371,16 @@ module Mosquito::Proboscis #:nodoc:
|
|
365
371
|
end
|
366
372
|
|
367
373
|
module Camping
|
368
|
-
|
374
|
+
|
375
|
+
# The basic Mosquito-wielding test case with some infrastructure
|
369
376
|
class Test < Test::Unit::TestCase
|
370
|
-
|
371
|
-
|
372
|
-
|
377
|
+
class << self; include Mosquito::Dusty; end
|
378
|
+
|
379
|
+
def test_default; end #:nodoc
|
380
|
+
|
381
|
+
# This is needed because Rails fixtures actually try to setup twice
|
382
|
+
def self.use_transactional_fixtures; false; end
|
383
|
+
|
373
384
|
# The reverse of the reverse of the reverse of assert(condition)
|
374
385
|
def deny(condition, message='')
|
375
386
|
assert !condition, message
|
@@ -408,11 +419,15 @@ module Camping
|
|
408
419
|
class WebTest < Test
|
409
420
|
|
410
421
|
# Gives you access to the instance variables assigned by the controller
|
411
|
-
|
412
|
-
|
413
|
-
|
422
|
+
def assigns(key = nil)
|
423
|
+
@assigns ||= Camping::H.new
|
424
|
+
key ? @assigns[key] : @assigns
|
425
|
+
end
|
426
|
+
|
427
|
+
def test_default; end #:nodoc
|
414
428
|
|
415
429
|
def setup
|
430
|
+
super
|
416
431
|
@class_name_abbr = self.class.name.gsub(/^Test/, '')
|
417
432
|
@request = Mosquito::MockRequest.new
|
418
433
|
@cookies, @response, @assigns = {}, {}, {}
|
@@ -424,29 +439,29 @@ module Camping
|
|
424
439
|
end
|
425
440
|
|
426
441
|
# Send a POST request to a URL. All requests except GET will allow
|
427
|
-
# setting verbatim
|
442
|
+
# setting verbatim request body as the third argument instead
|
428
443
|
# of a hash.
|
429
444
|
def post(url, post_vars={})
|
430
445
|
send_request url, post_vars, 'POST'
|
431
446
|
end
|
432
447
|
|
433
448
|
# Send a DELETE request to a URL. All requests except GET will allow
|
434
|
-
# setting verbatim
|
449
|
+
# setting verbatim request body as the third argument instead
|
435
450
|
# of a hash.
|
436
451
|
def delete(url, vars={})
|
437
452
|
send_request url, vars, 'DELETE'
|
438
453
|
end
|
439
454
|
|
440
455
|
# Send a PUT request to a URL. All requests except GET will allow
|
441
|
-
# setting verbatim
|
456
|
+
# setting verbatim request body as the third argument instead
|
442
457
|
# of a hash.
|
443
458
|
def put(url, vars={})
|
444
459
|
send_request url, vars, 'PUT'
|
445
460
|
end
|
446
461
|
|
447
|
-
# Send
|
462
|
+
# Send the request. We will try to guess what you meant - if there are uploads to be
|
448
463
|
# processed it's not going to be a GET, that's for sure.
|
449
|
-
def send_request(
|
464
|
+
def send_request(composite_url, post_vars, method)
|
450
465
|
|
451
466
|
if method.to_s.downcase == "get"
|
452
467
|
@request.query_string_params = post_vars
|
@@ -455,41 +470,56 @@ module Camping
|
|
455
470
|
end
|
456
471
|
|
457
472
|
# If there is some stuff in the URL to be used as a query string, why ignore it?
|
458
|
-
|
459
|
-
|
460
|
-
relativize_url!(url)
|
473
|
+
relative_url, qs_from_url = relativize_url(composite_url)
|
461
474
|
|
462
475
|
@request.append_to_query_string(qs_from_url) if qs_from_url
|
463
476
|
|
464
477
|
# We do allow the user to override that one
|
465
478
|
@request['REQUEST_METHOD'] = method
|
466
479
|
|
480
|
+
# Make the Camping app route our request
|
467
481
|
@request['SCRIPT_NAME'] = '/' + @class_name_abbr.downcase
|
468
|
-
@request['PATH_INFO'] = '/' + url
|
469
482
|
|
483
|
+
# PATH_INFO is used for internal routing by Camping. We have to always pass
|
484
|
+
# the leading slash
|
485
|
+
@request['PATH_INFO'] = ensure_one_leading_slash(relative_url)
|
486
|
+
|
487
|
+
# We need to munge this because the PATH_INFO has changed
|
470
488
|
@request['REQUEST_URI'] = [@request.SCRIPT_NAME, @request.PATH_INFO].join('').squeeze('/')
|
471
489
|
unless @request['QUERY_STRING'].blank?
|
472
490
|
@request['REQUEST_URI'] += ('?' + @request['QUERY_STRING'])
|
473
491
|
end
|
474
492
|
|
475
493
|
if @cookies
|
476
|
-
@request['HTTP_COOKIE'] = @cookies.map {|k,v| "#{k}=#{
|
494
|
+
@request['HTTP_COOKIE'] = @cookies.map {|k,v| "#{k}=#{Mosquito.esc(v)}" }.join('; ')
|
477
495
|
end
|
478
496
|
|
497
|
+
# Get the Camping app
|
498
|
+
app_module = Kernel.const_get(@class_name_abbr)
|
499
|
+
|
479
500
|
# Inject the proboscis if we haven't already done so
|
480
|
-
|
481
|
-
|
501
|
+
app_module.send(:include, Mosquito::Proboscis) unless app_module.ancestors.include?(Mosquito::Proboscis)
|
502
|
+
|
503
|
+
# Run the request.
|
504
|
+
@response = if app_module.respond_to?(:run) # Camping < 2.0
|
505
|
+
app_module.run(*@request.to_camping_args)
|
506
|
+
else # Camping 2.0
|
507
|
+
app_module.call(@request.to_rack_request).pop # Serve a Rack::Response object
|
508
|
+
end
|
509
|
+
|
510
|
+
# Add content_type accessor for Rails assert_select
|
511
|
+
eval("class << @response; def content_type; @headers['Content-Type']; end; end")
|
482
512
|
|
483
|
-
#
|
484
|
-
@response =
|
513
|
+
# Downgrade the disguised Mab into a string
|
514
|
+
@response.body = @response.body.to_s
|
485
515
|
@assigns = Mosquito::unstash
|
486
516
|
|
487
517
|
# We need to restore the cookies separately so that the app
|
488
518
|
# restores our session on the next request. We retrieve cookies and
|
489
519
|
# the session in their assigned form instead of parsing the headers and
|
490
520
|
# doing a deserialization cycle
|
491
|
-
@cookies = @assigns
|
492
|
-
@state = @assigns
|
521
|
+
@cookies = @assigns.cookies || H[{}]
|
522
|
+
@state = @assigns.state || H[{}]
|
493
523
|
|
494
524
|
if @response.headers['X-Sendfile']
|
495
525
|
@response.body = File.read(@response.headers['X-Sendfile'])
|
@@ -547,8 +577,13 @@ module Camping
|
|
547
577
|
|
548
578
|
# Checks that Camping sent us a cookie to attach a session
|
549
579
|
def assert_session_started
|
550
|
-
|
551
|
-
"
|
580
|
+
if Camping.respond_to?(:call) # Camping 2.0 prefers cookie sessions
|
581
|
+
assert_not_nil @cookies["camping_hash"],
|
582
|
+
"The session hash cookie was empty although session should have started"
|
583
|
+
else
|
584
|
+
assert_not_nil @cookies["camping_sid"],
|
585
|
+
"The session ID cookie was empty although session should have started"
|
586
|
+
end
|
552
587
|
end
|
553
588
|
|
554
589
|
# The reverse of +assert_session_started+
|
@@ -558,26 +593,33 @@ module Camping
|
|
558
593
|
end
|
559
594
|
|
560
595
|
private
|
596
|
+
# Ensure that we have a URL with one leading slash
|
597
|
+
def ensure_one_leading_slash(url)
|
598
|
+
['/', url.to_s].join.gsub(/^(\/+)/, '/')
|
599
|
+
end
|
600
|
+
|
561
601
|
def extract_redirection_url
|
562
|
-
|
563
|
-
|
602
|
+
# We parse once more because Camping 2 sends a String (Rack does not want a URI) and 1.5 sends URI
|
603
|
+
loc = URI.parse(@response.headers['Location'].to_s)
|
604
|
+
path_seg = loc.path.gsub(%r!/#{@class_name_abbr.downcase}!, '')
|
564
605
|
loc.query ? (path_seg + "?" + loc.query).to_s : path_seg.to_s
|
565
606
|
end
|
566
607
|
|
567
|
-
def relativize_url
|
568
|
-
|
569
|
-
|
570
|
-
unless p.host == @request.domain
|
608
|
+
def relativize_url(url)
|
609
|
+
parsed = URI.parse(url)
|
610
|
+
if !parsed.scheme.blank? && parsed.host != @request.domain
|
571
611
|
raise ::Mosquito::NonLocalRequest,
|
572
|
-
|
612
|
+
"You tried to callout to '#{parsed}' which is outside of the test domain (#{@request.domain})"
|
573
613
|
end
|
574
|
-
|
614
|
+
# Now remove the path
|
615
|
+
parsed.path.gsub!(/^\/#{@class_name_abbr.downcase}\//, '/')
|
616
|
+
[parsed.path, parsed.query]
|
575
617
|
end
|
576
618
|
end
|
577
619
|
|
578
620
|
# Used to test the models - no infrastructure will be created for running the request
|
579
621
|
class ModelTest < Test
|
580
|
-
def
|
622
|
+
def test_default; end #:nodoc
|
581
623
|
end
|
582
624
|
|
583
625
|
# Deprecated but humane
|
data/public/bare.rb
CHANGED
data/public/blog.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require 'camping'
|
6
|
-
|
3
|
+
begin
|
4
|
+
if Camping.respond_to?(:call) # Camping 2
|
5
|
+
require 'camping/ar/session'
|
6
|
+
else
|
7
|
+
require 'camping/session'
|
8
|
+
end
|
9
|
+
end
|
7
10
|
|
8
11
|
Camping.goes :Blog
|
9
12
|
|
10
|
-
|
11
|
-
require
|
12
|
-
require
|
13
|
+
$:.unshift File.dirname(__FILE__)
|
14
|
+
require 'blog/models'
|
15
|
+
require 'blog/views'
|
16
|
+
require 'blog/controllers'
|
13
17
|
|
14
18
|
Blog::Models.schema do
|
15
19
|
create_table :blog_posts, :force => true do |t|
|
data/public/blog/controllers.rb
CHANGED
data/public/blog/views.rb
CHANGED
data/test/test_bare.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/switcher"
|
1
2
|
require File.dirname(__FILE__) + "/../lib/mosquito"
|
2
3
|
require File.dirname(__FILE__) + "/../public/bare"
|
3
4
|
|
@@ -19,14 +20,14 @@ class TestBare < Camping::FunctionalTest
|
|
19
20
|
assert_match_body %r!Charles!
|
20
21
|
end
|
21
22
|
|
22
|
-
test "should get page with success" do
|
23
|
+
test "should get sample page with success" do
|
23
24
|
get '/sample'
|
24
25
|
assert_response :success
|
25
26
|
assert_no_session
|
26
27
|
assert_match_body %r!<p>A sample page</p>!
|
27
28
|
end
|
28
29
|
|
29
|
-
|
30
|
+
test "should place the passed query params in the querystring" do
|
30
31
|
get '/sample', :somevar => 10
|
31
32
|
assert_equal '/bare/sample?somevar=10', @request['REQUEST_URI']
|
32
33
|
end
|
@@ -36,27 +37,47 @@ class TestBare < Camping::FunctionalTest
|
|
36
37
|
assert_no_match_body /Rubber\s+Bubblegum\s+Burt Reynolds\s+Hippopotamus/
|
37
38
|
end
|
38
39
|
|
40
|
+
test "should ensure single leading slash" do
|
41
|
+
assert_equal '/foo', self.send(:ensure_one_leading_slash, "foo")
|
42
|
+
assert_equal '/foo', self.send(:ensure_one_leading_slash, "//////foo")
|
43
|
+
assert_equal '/foo/bar', self.send(:ensure_one_leading_slash, "//////foo/bar")
|
44
|
+
assert_equal '/', self.send(:ensure_one_leading_slash, nil)
|
45
|
+
end
|
46
|
+
|
39
47
|
test "should return error" do
|
40
|
-
|
41
|
-
|
48
|
+
if Camping.respond_to?(:call)
|
49
|
+
# Camping on Rack reraises the errors which are caught by Rack's exception displayer
|
50
|
+
assert_raise(RuntimeError) { get '/error' }
|
51
|
+
else
|
52
|
+
assert_nothing_raised { get '/error' }
|
53
|
+
assert_response :error
|
54
|
+
end
|
42
55
|
end
|
43
56
|
|
44
57
|
test "should return 404 error" do
|
45
58
|
get '/error404'
|
46
59
|
assert_response 404
|
47
60
|
end
|
48
|
-
|
49
|
-
|
61
|
+
|
62
|
+
test "should be able to assign verbatim POST payload" do
|
50
63
|
post '/sample', 'foo=bar&plain=flat'
|
51
64
|
@request.body.rewind
|
52
65
|
assert_equal 'foo=bar&plain=flat', @request.body.read
|
66
|
+
assert_equal( {"foo"=>"bar", "plain"=>"flat"}, @assigns.input)
|
53
67
|
end
|
54
|
-
|
68
|
+
|
55
69
|
test "should redirect" do
|
56
70
|
get '/redirect'
|
57
71
|
assert_redirected_to '/faq'
|
58
72
|
end
|
59
73
|
|
74
|
+
test "should coerce Mab in response to a String" do
|
75
|
+
assert_nothing_raised { get '/non-existing-something-something' }
|
76
|
+
assert_nothing_raised do
|
77
|
+
assert_kind_of String, @response.body
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
60
81
|
# test "should send file" do
|
61
82
|
# get '/file'
|
62
83
|
# assert_response :success
|
data/test/test_blog.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/switcher"
|
1
2
|
require File.dirname(__FILE__) + "/../lib/mosquito"
|
2
3
|
require File.dirname(__FILE__) + "/../public/blog"
|
3
4
|
Blog.create
|
@@ -19,7 +20,7 @@ class TestBlog < Camping::FunctionalTest
|
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
+
def test_cookies_should_be_stored_and_loaded
|
23
24
|
get '/cookies'
|
24
25
|
assert_cookie 'awesome_cookie', 'camping for good'
|
25
26
|
assert_equal @state.awesome_data, 'camping for good'
|
@@ -27,7 +28,7 @@ class TestBlog < Camping::FunctionalTest
|
|
27
28
|
assert_equal @state.awesome_data, 'camping for good'
|
28
29
|
end
|
29
30
|
|
30
|
-
def
|
31
|
+
def test_cookies_should_be_persisted_across_requests_with_proper_escaping
|
31
32
|
@cookies["asgård"] = 'Wøbble'
|
32
33
|
get '/cookies'
|
33
34
|
assert_equal 'asgård=W%C3%B8bble', @request['HTTP_COOKIE'], "The cookie val shouldbe escaped"
|
@@ -39,27 +40,25 @@ class TestBlog < Camping::FunctionalTest
|
|
39
40
|
assert_equal 'Wøbble', @cookies["asgård"]
|
40
41
|
end
|
41
42
|
|
42
|
-
def
|
43
|
+
def test_get_without_arguments_should_just_call_the_app_index
|
43
44
|
get
|
44
45
|
assert_response :success
|
45
|
-
assert_match_body
|
46
|
+
assert_match_body /Welcome to the blog/
|
46
47
|
assert_not_equal @state.awesome_data, 'camping for good'
|
47
|
-
assert_kind_of Array, @assigns[:posts]
|
48
|
-
assert_kind_of Post, assigns[:posts].first
|
49
48
|
end
|
50
49
|
|
51
|
-
def
|
50
|
+
def test_calling_view_should_fetch_view
|
52
51
|
get '/view/1'
|
53
52
|
assert_response :success
|
54
53
|
assert_match_body %r!The quick fox jumped over the lazy dog!
|
55
54
|
end
|
56
55
|
|
57
|
-
def
|
58
|
-
get 'styles.css'
|
56
|
+
def test_calling_styles_should_give_us_the_CSS
|
57
|
+
get '/styles.css'
|
59
58
|
assert_match_body %r!Utopia!
|
60
59
|
end
|
61
60
|
|
62
|
-
def
|
61
|
+
def test_calling_edit_should_render_login
|
63
62
|
get '/edit/1'
|
64
63
|
assert_response :success
|
65
64
|
assert_match_body 'login'
|
@@ -139,7 +138,7 @@ class TestBlog < Camping::FunctionalTest
|
|
139
138
|
assert_equal 'Called put', @response.body
|
140
139
|
end
|
141
140
|
|
142
|
-
def
|
141
|
+
def test_calling_with_an_absolute_url_should_relativize
|
143
142
|
assert_equal 'test.host', @request.domain
|
144
143
|
put 'http://test.host/blog/rest'
|
145
144
|
assert_nothing_raised do
|
@@ -147,11 +146,21 @@ class TestBlog < Camping::FunctionalTest
|
|
147
146
|
end
|
148
147
|
end
|
149
148
|
|
149
|
+
def test_calling_with_an_absolute_url_and_querystring_should_relativize_and_pass_parameters
|
150
|
+
assert_equal 'test.host', @request.domain
|
151
|
+
get 'http://test.host/blog/rest?one=2&foo=bar'
|
152
|
+
assert_nothing_raised do
|
153
|
+
assert_equal 'Called get', @response.body
|
154
|
+
end
|
155
|
+
assert_equal({"one"=>'2', "foo"=>"bar"}, @assigns.input)
|
156
|
+
end
|
157
|
+
|
150
158
|
def test_calling_with_an_absolute_url_outside_of_the_default_test_host_must_raise
|
151
159
|
assert_equal 'test.host', @request.domain
|
152
|
-
assert_raise(Mosquito::NonLocalRequest) do
|
153
|
-
|
160
|
+
non_local = assert_raise(Mosquito::NonLocalRequest) do
|
161
|
+
get 'http://yahoo.com/blog/rest'
|
154
162
|
end
|
163
|
+
assert_equal "You tried to callout to 'http://yahoo.com/blog/rest' which is outside of the test domain (test.host)", non_local.message
|
155
164
|
end
|
156
165
|
|
157
166
|
def test_calling_with_an_absolute_url_outside_of_the_custom_test_host_must_raise
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/switcher"
|
2
|
+
require File.dirname(__FILE__) + '/test_helpers'
|
3
|
+
require File.dirname(__FILE__) + '/../public/blog'
|
4
|
+
|
5
|
+
Blog.create
|
6
|
+
include Blog::Models
|
7
|
+
|
8
|
+
class SomeTest < Camping::Test
|
9
|
+
fixtures :blog_posts
|
10
|
+
def setup
|
11
|
+
super
|
12
|
+
@parent_done = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_setup_has_ran
|
16
|
+
assert_not_nil @parent_done, "This variable is set in setup"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module FixtureReloadingTests
|
21
|
+
def test_fixtures_reloaded_after_run_say_a
|
22
|
+
assert_equal 2, Post.count, "The test should start with 2 preloaded Posts"
|
23
|
+
Post.delete_all
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_fixtures_reloaded_after_run_say_b
|
27
|
+
assert_equal 2, Post.count, "The test should start with 2 preloaded Posts"
|
28
|
+
Post.delete_all
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Sec < SomeTest; end
|
33
|
+
class Third < SomeTest; end
|
34
|
+
class Fourth < SomeTest
|
35
|
+
include FixtureReloadingTests
|
36
|
+
end
|
37
|
+
|
38
|
+
# This exploits something that Rails considers an edge case but what is essential for us
|
39
|
+
# - inheriting test cases with setup that also use fixtures
|
40
|
+
class FixturedTest < Camping::WebTest
|
41
|
+
def setup
|
42
|
+
super
|
43
|
+
@setup_in_parent = true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class InheritedFixturedTest < FixturedTest
|
48
|
+
fixtures :blog_posts
|
49
|
+
def setup
|
50
|
+
super
|
51
|
+
@setup_in_child = true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class ThirdInheritedFixturedTest < InheritedFixturedTest
|
56
|
+
def setup
|
57
|
+
super
|
58
|
+
@setup_in_third = true
|
59
|
+
end
|
60
|
+
include FixtureReloadingTests
|
61
|
+
end
|
62
|
+
|
63
|
+
class FourthInherited < ThirdInheritedFixturedTest
|
64
|
+
include FixtureReloadingTests
|
65
|
+
|
66
|
+
def test_case_setup_properly
|
67
|
+
assert_not_nil @request, "The setup for Mosquito web test should have been done"
|
68
|
+
assert_not_nil @setup_in_parent, "The first setup in the chain should have happened"
|
69
|
+
assert_not_nil @setup_in_child, "The second setup in the chain should have happsened"
|
70
|
+
assert_not_nil @setup_in_third, "The third setup in the chain should have happened"
|
71
|
+
end
|
72
|
+
end
|
data/test/test_helpers.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/switcher"
|
1
2
|
require File.dirname(__FILE__) + "/../lib/mosquito"
|
2
3
|
|
3
4
|
class TestHelpers < Camping::ModelTest
|
4
5
|
# http://rubyforge.org/tracker/index.php?func=detail&aid=8921&group_id=351&atid=1416
|
5
6
|
def test_supports_old_style_and_new_style_fixture_generation
|
6
|
-
assert self.respond_to?(:create_fixtures), "Oldstyle method
|
7
|
+
assert !self.respond_to?(:create_fixtures), "Oldstyle method is removed"
|
7
8
|
assert self.class.respond_to?(:fixtures), "Newstyle method should work"
|
8
9
|
end
|
9
10
|
|
data/test/test_mock_request.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/switcher"
|
1
2
|
require File.dirname(__FILE__) + "/../lib/mosquito"
|
2
3
|
|
3
4
|
$KCODE = 'u'
|
@@ -39,6 +40,11 @@ class TestMockRequest < Test::Unit::TestCase
|
|
39
40
|
assert_equal 'test.host', @req.to_hash['SERVER_NAME']
|
40
41
|
assert_equal 'test.host', @req.to_hash['HTTP_HOST']
|
41
42
|
end
|
43
|
+
|
44
|
+
def test_headers_mirrors_to_hash
|
45
|
+
assert_respond_to @req, :headers
|
46
|
+
assert_equal @req.headers, @req.to_hash
|
47
|
+
end
|
42
48
|
|
43
49
|
def test_envars_translate_to_readers
|
44
50
|
%w( server_name path_info accept_encoding user_agent
|
@@ -206,9 +212,9 @@ class TestMockRequest < Test::Unit::TestCase
|
|
206
212
|
]
|
207
213
|
|
208
214
|
ref_segments.each_with_index do | ref, idx |
|
209
|
-
if ref
|
215
|
+
if ref === String
|
210
216
|
assert_equal ref, output[idx], "The segment #{idx} should be #{ref}"
|
211
|
-
elsif ref
|
217
|
+
elsif ref === Regexp
|
212
218
|
assert_match ref, output[idx], "The segment #{idx} should match #{ref}"
|
213
219
|
end
|
214
220
|
end
|
@@ -240,10 +246,13 @@ class TestMockRequestWithRoundtrip < Test::Unit::TestCase
|
|
240
246
|
|
241
247
|
assert_equal "john", @parsed_input["name"]
|
242
248
|
assert_kind_of Hash, @parsed_input["somefile"]
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
249
|
+
|
250
|
+
ef = @parsed_input["somefile"].with_indifferent_access
|
251
|
+
|
252
|
+
assert_equal "somefile", ef["name"]
|
253
|
+
assert_equal "pic.jpg", ef["filename"]
|
254
|
+
assert_equal "image/jpeg", ef["type"]
|
255
|
+
assert_kind_of Tempfile, ef["tempfile"]
|
247
256
|
|
248
257
|
|
249
258
|
@req.post_params = {:hello => "welcome", :name => "john", :arrayed => [1, 2, 3], :somefile => "instead" }
|
@@ -280,11 +289,28 @@ class TestMockRequestWithRoundtrip < Test::Unit::TestCase
|
|
280
289
|
ref = {"name"=>"john", "hello"=>"welæcome", "data"=>{"values"=>["1", "2", "3"]}}
|
281
290
|
assert_equal ref, @parsed_input, "Camping should have parsed our input like so"
|
282
291
|
end
|
292
|
+
|
293
|
+
|
294
|
+
def test_to_rack_request
|
295
|
+
@req.post_params = {:hello => "welæcome", :name => "john", :data => {:values => [1,2,3] } }
|
296
|
+
rack_r = @req.to_rack_request
|
297
|
+
|
298
|
+
assert_kind_of Hash, rack_r
|
299
|
+
assert_equal "http", rack_r['rack.url_scheme']
|
300
|
+
assert_kind_of StringIO, rack_r['rack.input']
|
301
|
+
assert_equal [0,1], rack_r['rack.version']
|
302
|
+
assert_equal '74', rack_r['CONTENT_LENGTH']
|
303
|
+
end
|
304
|
+
|
283
305
|
private
|
284
306
|
def run_request!
|
285
307
|
@req.body.rewind
|
286
308
|
begin
|
287
|
-
Sniffer.
|
309
|
+
if Sniffer.respond_to?(:call)
|
310
|
+
Sniffer.call(@req.to_rack_request)
|
311
|
+
else
|
312
|
+
Sniffer.run(@req.body, @req.to_hash)
|
313
|
+
end
|
288
314
|
rescue Sniffer::Controllers::ParamPeeker::Messenger => e
|
289
315
|
@parsed_input = e.packet
|
290
316
|
end
|
data/test/test_mock_upload.rb
CHANGED
metadata
CHANGED
@@ -1,106 +1,119 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: mosquito
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-09-24 00:00:00 -07:00
|
8
|
-
summary: A Camping test library.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: boss@topfunky.com
|
12
|
-
homepage: http://mosquito.rubyforge.org
|
13
|
-
rubyforge_project: mosquito
|
14
|
-
description: A library for writing tests for your Camping app.
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.1.4
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Geoffrey Grosenbach
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- Manifest.txt
|
35
|
-
- README.txt
|
36
|
-
- Rakefile
|
37
|
-
- lib/mosquito.rb
|
38
|
-
- public/bare.rb
|
39
|
-
- public/blog.rb
|
40
|
-
- public/blog/controllers.rb
|
41
|
-
- public/blog/models.rb
|
42
|
-
- public/blog/views.rb
|
43
|
-
- test/fixtures/blog_comments.yml
|
44
|
-
- test/fixtures/blog_posts.yml
|
45
|
-
- test/fixtures/blog_users.yml
|
46
|
-
- test/sage_advice_cases/parsing_arrays.rb
|
47
|
-
- test/test_bare.rb
|
48
|
-
- test/test_blog.rb
|
49
|
-
- test/test_helpers.rb
|
50
|
-
- test/test_mock_request.rb
|
51
|
-
- test/test_mock_upload.rb
|
52
|
-
test_files:
|
53
|
-
- test/test_bare.rb
|
54
|
-
- test/test_blog.rb
|
55
|
-
- test/test_helpers.rb
|
56
|
-
- test/test_mock_request.rb
|
57
|
-
- test/test_mock_upload.rb
|
58
|
-
rdoc_options:
|
59
|
-
- --main
|
60
|
-
- README.txt
|
61
|
-
extra_rdoc_files:
|
62
|
-
- Manifest.txt
|
63
|
-
- README.txt
|
64
|
-
executables: []
|
65
|
-
|
66
|
-
extensions: []
|
67
|
-
|
68
|
-
requirements: []
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
69
11
|
|
12
|
+
date: 2008-11-17 00:00:00 -08:00
|
13
|
+
default_executable:
|
70
14
|
dependencies:
|
71
15
|
- !ruby/object:Gem::Dependency
|
72
16
|
name: activerecord
|
17
|
+
type: :runtime
|
73
18
|
version_requirement:
|
74
|
-
version_requirements: !ruby/object:Gem::
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
20
|
requirements:
|
76
|
-
- - "
|
21
|
+
- - ">="
|
77
22
|
- !ruby/object:Gem::Version
|
78
|
-
version: 0
|
23
|
+
version: "0"
|
79
24
|
version:
|
80
25
|
- !ruby/object:Gem::Dependency
|
81
26
|
name: activesupport
|
27
|
+
type: :runtime
|
82
28
|
version_requirement:
|
83
|
-
version_requirements: !ruby/object:Gem::
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
84
30
|
requirements:
|
85
|
-
- - "
|
31
|
+
- - ">="
|
86
32
|
- !ruby/object:Gem::Version
|
87
|
-
version: 0
|
33
|
+
version: "0"
|
88
34
|
version:
|
89
35
|
- !ruby/object:Gem::Dependency
|
90
36
|
name: camping
|
37
|
+
type: :runtime
|
91
38
|
version_requirement:
|
92
|
-
version_requirements: !ruby/object:Gem::
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
40
|
requirements:
|
94
|
-
- - "
|
41
|
+
- - ">="
|
95
42
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0
|
43
|
+
version: "0"
|
97
44
|
version:
|
98
45
|
- !ruby/object:Gem::Dependency
|
99
46
|
name: hoe
|
47
|
+
type: :development
|
100
48
|
version_requirement:
|
101
|
-
version_requirements: !ruby/object:Gem::
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
50
|
requirements:
|
103
51
|
- - ">="
|
104
52
|
- !ruby/object:Gem::Version
|
105
|
-
version: 1.
|
53
|
+
version: 1.8.2
|
106
54
|
version:
|
55
|
+
description: A library for writing tests for your Camping app.
|
56
|
+
email: boss@topfunky.com
|
57
|
+
executables: []
|
58
|
+
|
59
|
+
extensions: []
|
60
|
+
|
61
|
+
extra_rdoc_files:
|
62
|
+
- Manifest.txt
|
63
|
+
- README.txt
|
64
|
+
files:
|
65
|
+
- CHANGELOG
|
66
|
+
- MIT-LICENSE
|
67
|
+
- Manifest.txt
|
68
|
+
- README.txt
|
69
|
+
- Rakefile
|
70
|
+
- lib/mosquito.rb
|
71
|
+
- public/bare.rb
|
72
|
+
- public/blog.rb
|
73
|
+
- public/blog/controllers.rb
|
74
|
+
- public/blog/models.rb
|
75
|
+
- public/blog/views.rb
|
76
|
+
- test/fixtures/blog_comments.yml
|
77
|
+
- test/fixtures/blog_posts.yml
|
78
|
+
- test/fixtures/blog_users.yml
|
79
|
+
- test/sage_advice_cases/parsing_arrays.rb
|
80
|
+
- test/test_bare.rb
|
81
|
+
- test/test_blog.rb
|
82
|
+
- test/test_helpers.rb
|
83
|
+
- test/test_mock_request.rb
|
84
|
+
- test/test_mock_upload.rb
|
85
|
+
- test/test_fixtures.rb
|
86
|
+
has_rdoc: true
|
87
|
+
homepage: http://mosquito.rubyforge.org
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options:
|
90
|
+
- --main
|
91
|
+
- README.txt
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: "0"
|
105
|
+
version:
|
106
|
+
requirements: []
|
107
|
+
|
108
|
+
rubyforge_project: mosquito
|
109
|
+
rubygems_version: 1.3.1
|
110
|
+
signing_key:
|
111
|
+
specification_version: 2
|
112
|
+
summary: A Camping test library.
|
113
|
+
test_files:
|
114
|
+
- test/test_bare.rb
|
115
|
+
- test/test_blog.rb
|
116
|
+
- test/test_fixtures.rb
|
117
|
+
- test/test_helpers.rb
|
118
|
+
- test/test_mock_request.rb
|
119
|
+
- test/test_mock_upload.rb
|