Flamefork-shoulda 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +169 -0
- data/Rakefile +72 -0
- data/bin/convert_to_should_syntax +42 -0
- data/lib/shoulda/action_controller/helpers.rb +47 -0
- data/lib/shoulda/action_controller/macros.rb +277 -0
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
- data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
- data/lib/shoulda/action_controller/matchers.rb +37 -0
- data/lib/shoulda/action_controller.rb +24 -0
- data/lib/shoulda/action_mailer/assertions.rb +38 -0
- data/lib/shoulda/action_mailer.rb +6 -0
- data/lib/shoulda/action_view/macros.rb +56 -0
- data/lib/shoulda/action_view.rb +6 -0
- data/lib/shoulda/active_record/assertions.rb +69 -0
- data/lib/shoulda/active_record/helpers.rb +40 -0
- data/lib/shoulda/active_record/macros.rb +588 -0
- data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
- data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
- data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
- data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
- data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
- data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
- data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
- data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
- data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
- data/lib/shoulda/active_record/matchers.rb +42 -0
- data/lib/shoulda/active_record.rb +12 -0
- data/lib/shoulda/assertions.rb +59 -0
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +304 -0
- data/lib/shoulda/helpers.rb +8 -0
- data/lib/shoulda/macros.rb +73 -0
- data/lib/shoulda/private_helpers.rb +20 -0
- data/lib/shoulda/proc_extensions.rb +14 -0
- data/lib/shoulda/rails.rb +13 -0
- data/lib/shoulda/rspec.rb +11 -0
- data/lib/shoulda/tasks/list_tests.rake +29 -0
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
- data/lib/shoulda/tasks.rb +3 -0
- data/lib/shoulda/test_unit.rb +14 -0
- data/lib/shoulda.rb +9 -0
- data/rails/init.rb +7 -0
- data/test/README +36 -0
- data/test/fail_macros.rb +34 -0
- data/test/fixtures/addresses.yml +3 -0
- data/test/fixtures/friendships.yml +0 -0
- data/test/fixtures/posts.yml +5 -0
- data/test/fixtures/products.yml +0 -0
- data/test/fixtures/taggings.yml +0 -0
- data/test/fixtures/tags.yml +9 -0
- data/test/fixtures/users.yml +6 -0
- data/test/functional/posts_controller_test.rb +125 -0
- data/test/functional/users_controller_test.rb +19 -0
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
- data/test/matchers/active_record/association_matcher_test.rb +258 -0
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
- data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
- data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
- data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
- data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
- data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
- data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
- data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
- data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
- data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
- data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
- data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
- data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
- data/test/matchers/controller/route_matcher_test.rb +58 -0
- data/test/matchers/controller/set_session_matcher_test.rb +31 -0
- data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
- data/test/model_builder.rb +106 -0
- data/test/other/autoload_macro_test.rb +18 -0
- data/test/other/context_test.rb +145 -0
- data/test/other/convert_to_should_syntax_test.rb +63 -0
- data/test/other/helpers_test.rb +241 -0
- data/test/other/private_helpers_test.rb +34 -0
- data/test/other/should_test.rb +266 -0
- data/test/rails_root/app/controllers/application.rb +25 -0
- data/test/rails_root/app/controllers/posts_controller.rb +86 -0
- data/test/rails_root/app/controllers/users_controller.rb +84 -0
- data/test/rails_root/app/helpers/application_helper.rb +3 -0
- data/test/rails_root/app/helpers/posts_helper.rb +2 -0
- data/test/rails_root/app/helpers/users_helper.rb +2 -0
- data/test/rails_root/app/models/address.rb +7 -0
- data/test/rails_root/app/models/flea.rb +3 -0
- data/test/rails_root/app/models/friendship.rb +4 -0
- data/test/rails_root/app/models/pets/dog.rb +10 -0
- data/test/rails_root/app/models/post.rb +12 -0
- data/test/rails_root/app/models/product.rb +12 -0
- data/test/rails_root/app/models/tag.rb +8 -0
- data/test/rails_root/app/models/tagging.rb +4 -0
- data/test/rails_root/app/models/treat.rb +3 -0
- data/test/rails_root/app/models/user.rb +29 -0
- data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails_root/app/views/posts/index.rhtml +25 -0
- data/test/rails_root/app/views/posts/new.rhtml +26 -0
- data/test/rails_root/app/views/posts/show.rhtml +18 -0
- data/test/rails_root/app/views/users/edit.rhtml +22 -0
- data/test/rails_root/app/views/users/index.rhtml +22 -0
- data/test/rails_root/app/views/users/new.rhtml +21 -0
- data/test/rails_root/app/views/users/show.rhtml +13 -0
- data/test/rails_root/config/boot.rb +109 -0
- data/test/rails_root/config/database.yml +4 -0
- data/test/rails_root/config/environment.rb +14 -0
- data/test/rails_root/config/environments/test.rb +0 -0
- data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
- data/test/rails_root/config/initializers/shoulda.rb +8 -0
- data/test/rails_root/config/routes.rb +6 -0
- data/test/rails_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails_root/db/schema.rb +0 -0
- data/test/rails_root/public/404.html +30 -0
- data/test/rails_root/public/422.html +30 -0
- data/test/rails_root/public/500.html +30 -0
- data/test/rails_root/script/console +3 -0
- data/test/rails_root/script/generate +3 -0
- data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
- data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
- data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
- data/test/rspec_test.rb +207 -0
- data/test/test_helper.rb +35 -0
- data/test/unit/address_test.rb +10 -0
- data/test/unit/dog_test.rb +10 -0
- data/test/unit/flea_test.rb +6 -0
- data/test/unit/friendship_test.rb +6 -0
- data/test/unit/post_test.rb +19 -0
- data/test/unit/product_test.rb +27 -0
- data/test/unit/tag_test.rb +15 -0
- data/test/unit/tagging_test.rb +6 -0
- data/test/unit/user_test.rb +70 -0
- metadata +258 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RespondWithMatcherTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller responding with success" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { render :text => "text", :status => 200 }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept responding with 200" do
|
|
11
|
+
assert_accepts respond_with(200), @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept responding with :success" do
|
|
15
|
+
assert_accepts respond_with(:success), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject responding with another status" do
|
|
19
|
+
assert_rejects respond_with(:error), @controller
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "a controller responding with redirect" do
|
|
24
|
+
setup do
|
|
25
|
+
@controller = build_response { render :text => "text", :status => 301 }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "accept responding with 301" do
|
|
29
|
+
assert_accepts respond_with(301), @controller
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "accept responding with :redirect" do
|
|
33
|
+
assert_accepts respond_with(:redirect), @controller
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "reject responding with another status" do
|
|
37
|
+
assert_rejects respond_with(:error), @controller
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "a controller responding with missing" do
|
|
42
|
+
setup do
|
|
43
|
+
@controller = build_response { render :text => "text", :status => 404 }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
should "accept responding with 404" do
|
|
47
|
+
assert_accepts respond_with(404), @controller
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
should "accept responding with :missing" do
|
|
51
|
+
assert_accepts respond_with(:missing), @controller
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
should "reject responding with another status" do
|
|
55
|
+
assert_rejects respond_with(:success), @controller
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "a controller responding with error" do
|
|
60
|
+
setup do
|
|
61
|
+
@controller = build_response { render :text => "text", :status => 500 }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "accept responding with 500" do
|
|
65
|
+
assert_accepts respond_with(500), @controller
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "accept responding with :error" do
|
|
69
|
+
assert_accepts respond_with(:error), @controller
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
should "reject responding with another status" do
|
|
73
|
+
assert_rejects respond_with(:success), @controller
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "a controller responding with not implemented" do
|
|
78
|
+
setup do
|
|
79
|
+
@controller = build_response { render :text => "text", :status => 501 }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
should "accept responding with 501" do
|
|
83
|
+
assert_accepts respond_with(501), @controller
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
should "accept responding with :not_implemented" do
|
|
87
|
+
assert_accepts respond_with(:not_implemented), @controller
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "reject responding with another status" do
|
|
91
|
+
assert_rejects respond_with(:success), @controller
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "a controller raising an error" do
|
|
96
|
+
setup do
|
|
97
|
+
@controller = build_response { raise RailsError }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
should "reject responding with any status" do
|
|
101
|
+
assert_rejects respond_with(:success), @controller
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class RouteToMatcherTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "given a controller with a defined route" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = define_controller('Examples').new
|
|
8
|
+
define_routes do |map|
|
|
9
|
+
map.connect 'examples/:id', :controller => 'examples',
|
|
10
|
+
:action => 'example'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept routing the correct path to the correct parameters" do
|
|
15
|
+
assert_accepts route(:get, '/examples/1').
|
|
16
|
+
to(:action => 'example', :id => '1'),
|
|
17
|
+
@controller
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
should "accept a symbol controller" do
|
|
21
|
+
assert_accepts route(:get, '/examples/1').
|
|
22
|
+
to(:controller => :examples,
|
|
23
|
+
:action => 'example',
|
|
24
|
+
:id => '1'),
|
|
25
|
+
self
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "accept a symbol action" do
|
|
29
|
+
assert_accepts route(:get, '/examples/1').
|
|
30
|
+
to(:action => :example, :id => '1'),
|
|
31
|
+
@controller
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
should "accept a non-string parameter" do
|
|
35
|
+
assert_accepts route(:get, '/examples/1').
|
|
36
|
+
to(:action => 'example', :id => 1),
|
|
37
|
+
@controller
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
should "reject an undefined route" do
|
|
41
|
+
assert_rejects route(:get, '/bad_route').to(:var => 'value'), @controller
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
should "reject a route for another controller" do
|
|
45
|
+
@other = define_controller('Other').new
|
|
46
|
+
assert_rejects route(:get, '/examples/1').
|
|
47
|
+
to(:action => 'example', :id => '1'),
|
|
48
|
+
@other
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
should "reject a route for different parameters" do
|
|
52
|
+
assert_rejects route(:get, '/examples/1').
|
|
53
|
+
to(:action => 'other', :id => '1'),
|
|
54
|
+
@controller
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class SetSessionMatcherTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that sets a session variable" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { session[:var] = 'value' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept assigning to that variable" do
|
|
11
|
+
assert_accepts set_session(:var), @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept assigning the correct value to that variable" do
|
|
15
|
+
assert_accepts set_session(:var).to('value'), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "reject assigning another value to that variable" do
|
|
19
|
+
assert_rejects set_session(:var).to('other'), @controller
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "reject assigning to another variable" do
|
|
23
|
+
assert_rejects set_session(:other), @controller
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "accept assigning nil to another variable" do
|
|
27
|
+
assert_accepts set_session(:other).to(nil), @controller
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class SetTheFlashMatcherTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
context "a controller that sets a flash message" do
|
|
6
|
+
setup do
|
|
7
|
+
@controller = build_response { flash[:notice] = 'value' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "accept setting any flash message" do
|
|
11
|
+
assert_accepts set_the_flash, @controller
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "accept setting the exact flash message" do
|
|
15
|
+
assert_accepts set_the_flash.to('value'), @controller
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "accept setting a matched flash message" do
|
|
19
|
+
assert_accepts set_the_flash.to(/value/), @controller
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "reject setting a different flash message" do
|
|
23
|
+
assert_rejects set_the_flash.to('other'), @controller
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "reject setting a different pattern" do
|
|
27
|
+
assert_rejects set_the_flash.to(/other/), @controller
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "a controller that doesn't set a flash message" do
|
|
32
|
+
setup do
|
|
33
|
+
@controller = build_response
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "reject setting any flash message" do
|
|
37
|
+
assert_rejects set_the_flash, @controller
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
class Test::Unit::TestCase
|
|
2
|
+
def create_table(table_name, &block)
|
|
3
|
+
connection = ActiveRecord::Base.connection
|
|
4
|
+
|
|
5
|
+
begin
|
|
6
|
+
connection.execute("DROP TABLE IF EXISTS #{table_name}")
|
|
7
|
+
connection.create_table(table_name, &block)
|
|
8
|
+
@created_tables ||= []
|
|
9
|
+
@created_tables << table_name
|
|
10
|
+
connection
|
|
11
|
+
rescue Exception => e
|
|
12
|
+
connection.execute("DROP TABLE IF EXISTS #{table_name}")
|
|
13
|
+
raise e
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def define_constant(class_name, base, &block)
|
|
18
|
+
class_name = class_name.to_s.camelize
|
|
19
|
+
|
|
20
|
+
klass = Class.new(base)
|
|
21
|
+
Object.const_set(class_name, klass)
|
|
22
|
+
|
|
23
|
+
klass.class_eval(&block) if block_given?
|
|
24
|
+
|
|
25
|
+
@defined_constants ||= []
|
|
26
|
+
@defined_constants << class_name
|
|
27
|
+
|
|
28
|
+
klass
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def define_model_class(class_name, &block)
|
|
32
|
+
define_constant(class_name, ActiveRecord::Base, &block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def define_model(name, columns = {}, &block)
|
|
36
|
+
class_name = name.to_s.pluralize.classify
|
|
37
|
+
table_name = class_name.tableize
|
|
38
|
+
|
|
39
|
+
create_table(table_name) do |table|
|
|
40
|
+
columns.each do |name, type|
|
|
41
|
+
table.column name, type
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
define_model_class(class_name, &block)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def define_controller(class_name, &block)
|
|
49
|
+
class_name = class_name.to_s
|
|
50
|
+
class_name << 'Controller' unless class_name =~ /Controller$/
|
|
51
|
+
define_constant(class_name, ActionController::Base, &block)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def define_routes(&block)
|
|
55
|
+
@replaced_routes = ActionController::Routing::Routes
|
|
56
|
+
new_routes = ActionController::Routing::RouteSet.new
|
|
57
|
+
silence_warnings do
|
|
58
|
+
ActionController::Routing.const_set('Routes', new_routes)
|
|
59
|
+
end
|
|
60
|
+
new_routes.draw(&block)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def build_response(&block)
|
|
64
|
+
klass = define_controller('Examples')
|
|
65
|
+
block ||= lambda { render :nothing => true }
|
|
66
|
+
klass.class_eval { define_method(:example, &block) }
|
|
67
|
+
define_routes do |map|
|
|
68
|
+
map.connect 'examples', :controller => 'examples', :action => 'example'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
@controller = klass.new
|
|
72
|
+
@request = ActionController::TestRequest.new
|
|
73
|
+
@response = ActionController::TestResponse.new
|
|
74
|
+
get :example
|
|
75
|
+
|
|
76
|
+
@controller
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def teardown_with_models
|
|
80
|
+
if @defined_constants
|
|
81
|
+
@defined_constants.each do |class_name|
|
|
82
|
+
Object.send(:remove_const, class_name)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if @created_tables
|
|
87
|
+
@created_tables.each do |table_name|
|
|
88
|
+
ActiveRecord::Base.
|
|
89
|
+
connection.
|
|
90
|
+
execute("DROP TABLE IF EXISTS #{table_name}")
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
if @replaced_routes
|
|
95
|
+
ActionController::Routing::Routes.clear!
|
|
96
|
+
silence_warnings do
|
|
97
|
+
ActionController::Routing.const_set('Routes', @replaced_routes)
|
|
98
|
+
end
|
|
99
|
+
@replaced_routes.reload!
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
teardown_without_models
|
|
103
|
+
end
|
|
104
|
+
alias_method :teardown_without_models, :teardown
|
|
105
|
+
alias_method :teardown, :teardown_with_models
|
|
106
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class AutoloadMacroTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
context "The macro auto-loader" do
|
|
5
|
+
should "load macros from the plugins" do
|
|
6
|
+
assert self.class.respond_to?('plugin_macro')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
should "load macros from the gems" do
|
|
10
|
+
assert self.class.respond_to?('gem_macro')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
should "load custom macros from ROOT/test/shoulda_macros" do
|
|
14
|
+
assert self.class.respond_to?('custom_macro')
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class ContextTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
def self.context_macro(&blk)
|
|
6
|
+
context "with a subcontext made by a macro" do
|
|
7
|
+
setup { @context_macro = :foo }
|
|
8
|
+
|
|
9
|
+
merge_block &blk
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# def self.context_macro(&blk)
|
|
14
|
+
# context "with a subcontext made by a macro" do
|
|
15
|
+
# setup { @context_macro = :foo }
|
|
16
|
+
# yield # <- this doesn't work.
|
|
17
|
+
# end
|
|
18
|
+
# end
|
|
19
|
+
|
|
20
|
+
context "context with setup block" do
|
|
21
|
+
setup do
|
|
22
|
+
@blah = "blah"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
should "run the setup block" do
|
|
26
|
+
assert_equal "blah", @blah
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "have name set right" do
|
|
30
|
+
assert_match(/^test: context with setup block/, self.to_s)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "and a subcontext" do
|
|
34
|
+
setup do
|
|
35
|
+
@blah = "#{@blah} twice"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "be named correctly" do
|
|
39
|
+
assert_match(/^test: context with setup block and a subcontext should be named correctly/, self.to_s)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "run the setup blocks in order" do
|
|
43
|
+
assert_equal @blah, "blah twice"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context_macro do
|
|
48
|
+
should "have name set right" do
|
|
49
|
+
assert_match(/^test: context with setup block with a subcontext made by a macro should have name set right/, self.to_s)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
should "run the setup block of that context macro" do
|
|
53
|
+
assert_equal :foo, @context_macro
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "run the setup block of the main context" do
|
|
57
|
+
assert_equal "blah", @blah
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context "another context with setup block" do
|
|
64
|
+
setup do
|
|
65
|
+
@blah = "foo"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "have @blah == 'foo'" do
|
|
69
|
+
assert_equal "foo", @blah
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
should "have name set right" do
|
|
73
|
+
assert_match(/^test: another context with setup block/, self.to_s)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "context with method definition" do
|
|
78
|
+
setup do
|
|
79
|
+
def hello; "hi"; end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
should "be able to read that method" do
|
|
83
|
+
assert_equal "hi", hello
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
should "have name set right" do
|
|
87
|
+
assert_match(/^test: context with method definition/, self.to_s)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context "another context" do
|
|
92
|
+
should "not define @blah" do
|
|
93
|
+
assert_nil @blah
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "context with multiple setups and/or teardowns" do
|
|
98
|
+
|
|
99
|
+
cleanup_count = 0
|
|
100
|
+
|
|
101
|
+
2.times do |i|
|
|
102
|
+
setup { cleanup_count += 1 }
|
|
103
|
+
teardown { cleanup_count -= 1 }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
2.times do |i|
|
|
107
|
+
should "call all setups and all teardowns (check ##{i + 1})" do
|
|
108
|
+
assert_equal 2, cleanup_count
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "subcontexts" do
|
|
113
|
+
|
|
114
|
+
2.times do |i|
|
|
115
|
+
setup { cleanup_count += 1 }
|
|
116
|
+
teardown { cleanup_count -= 1 }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
2.times do |i|
|
|
120
|
+
should "also call all setups and all teardowns in parent and subcontext (check ##{i + 1})" do
|
|
121
|
+
assert_equal 4, cleanup_count
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
should_eventually "pass, since it's unimplemented" do
|
|
130
|
+
flunk "what?"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
should_eventually "not require a block when using should_eventually"
|
|
134
|
+
should "pass without a block, as that causes it to piggyback to should_eventually"
|
|
135
|
+
|
|
136
|
+
context "context for testing should piggybacking" do
|
|
137
|
+
should "call should_eventually as we are not passing a block"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context "context" do
|
|
141
|
+
context "with nested subcontexts" do
|
|
142
|
+
should_eventually "only print this statement once for a should_eventually"
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
|
|
3
|
+
class ConvertToShouldSyntaxTest < Test::Unit::TestCase # :nodoc:
|
|
4
|
+
|
|
5
|
+
BEFORE_FIXTURE = <<-EOS
|
|
6
|
+
class DummyTest < Test::Unit::TestCase
|
|
7
|
+
|
|
8
|
+
should "Not change this_word_with_underscores" do
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_should_be_working
|
|
12
|
+
assert true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_some_cool_stuff
|
|
16
|
+
assert true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def non_test_method
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
EOS
|
|
24
|
+
|
|
25
|
+
AFTER_FIXTURE = <<-EOS
|
|
26
|
+
class DummyTest < Test::Unit::TestCase
|
|
27
|
+
|
|
28
|
+
should "Not change this_word_with_underscores" do
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "be working" do
|
|
32
|
+
assert true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
should "RENAME ME: test some cool stuff" do
|
|
36
|
+
assert true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def non_test_method
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
EOS
|
|
44
|
+
|
|
45
|
+
FIXTURE_PATH = "./convert_to_should_syntax_fixture.dat"
|
|
46
|
+
|
|
47
|
+
RUBY = ENV['RUBY'] || 'ruby'
|
|
48
|
+
|
|
49
|
+
def test_convert_to_should_syntax
|
|
50
|
+
File.open(FIXTURE_PATH, "w") {|f| f.write(BEFORE_FIXTURE)}
|
|
51
|
+
cmd = "#{RUBY} #{File.join(File.dirname(__FILE__), '../../bin/convert_to_should_syntax')} #{FIXTURE_PATH}"
|
|
52
|
+
output = `#{cmd}`
|
|
53
|
+
File.unlink($1) if output.match(/has been stored in '([^']+)/)
|
|
54
|
+
assert_match(/has been converted/, output)
|
|
55
|
+
result = IO.read(FIXTURE_PATH)
|
|
56
|
+
assert_equal result, AFTER_FIXTURE
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def teardown
|
|
60
|
+
File.unlink(FIXTURE_PATH)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|