riot-rails 0.1.0 → 0.2.0.pre
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/.gitignore +4 -0
- data/CHANGELOG +150 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +31 -0
- data/Rakefile +32 -10
- data/VERSION +1 -1
- data/lib/riot/action_controller/context_macros/asserts_response.rb +15 -0
- data/lib/riot/action_controller/context_middleware.rb +48 -0
- data/lib/riot/action_controller/http_methods.rb +19 -0
- data/lib/riot/action_controller.rb +4 -0
- data/lib/riot/active_record/assertion_macros.rb +3 -0
- data/lib/riot/active_record/context_middleware.rb +17 -0
- data/lib/riot/active_record/database_macros.rb +58 -0
- data/lib/riot/active_record/reflection_macros.rb +106 -0
- data/lib/riot/active_record/transactional_middleware.rb +28 -0
- data/lib/riot/active_record/validation_macros.rb +187 -0
- data/lib/riot/active_record.rb +4 -0
- data/lib/riot/rails.rb +1 -0
- data/rails/init.rb +1 -0
- data/riot-rails.gemspec +130 -0
- data/test/action_controller/context_macros/asserts_response_test.rb +35 -0
- data/test/action_controller/context_middleware_test.rb +66 -0
- data/test/action_controller/delete_request_test.rb +45 -0
- data/test/action_controller/get_request_test.rb +37 -0
- data/test/action_controller/post_request_test.rb +45 -0
- data/test/action_controller/put_request_test.rb +45 -0
- data/test/action_controller/restful_delete_request_test.rb +28 -0
- data/test/action_controller/restful_get_request_test.rb +25 -0
- data/test/action_controller/restful_post_request_test.rb +25 -0
- data/test/action_controller/restful_put_request_test.rb +28 -0
- data/test/active_record/allowing_values_test.rb +64 -0
- data/test/active_record/attribute_is_invalid_test.rb +20 -0
- data/test/active_record/belongs_to_test.rb +22 -0
- data/test/active_record/context_middleware_test.rb +18 -0
- data/test/active_record/has_and_belongs_to_many_test.rb +22 -0
- data/test/active_record/has_database_index_on_test.rb +73 -0
- data/test/active_record/has_many_test.rb +22 -0
- data/test/active_record/has_one_test.rb +22 -0
- data/test/active_record/validates_length_of_test.rb +31 -0
- data/test/active_record/validates_presence_of_test.rb +14 -0
- data/test/active_record/validates_uniqueness_of_test.rb +23 -0
- data/test/rails_root/app/controllers/gremlins_controller.rb +21 -0
- data/test/rails_root/app/controllers/parties_controller.rb +17 -0
- data/test/rails_root/app/controllers/rooms_controller.rb +22 -0
- data/{README.md → test/rails_root/app/views/rendered_templates/foo_bar.html.erb} +0 -0
- data/test/rails_root/config/database.yml +4 -0
- data/test/rails_root/config/environment.rb +46 -0
- data/test/rails_root/config/routes.rb +7 -0
- data/test/rails_root/db/schema.rb +8 -0
- data/test/teststrap.rb +84 -0
- data/test/transactional_middleware_test.rb +27 -0
- metadata +154 -26
- data/init.rb +0 -0
- data/install.rb +0 -0
- data/lib/generators/riot_rails/model/model_generator.rb +0 -22
- data/lib/generators/riot_rails/model/templates/fixtures.yml +0 -23
- data/lib/generators/riot_rails/model/templates/riot_test.rb +0 -5
- data/lib/generators/riot_rails.rb +0 -10
@@ -0,0 +1,187 @@
|
|
1
|
+
module RiotRails
|
2
|
+
module ActiveRecord
|
3
|
+
protected
|
4
|
+
|
5
|
+
class ValidationAssertionMacro < Riot::AssertionMacro
|
6
|
+
private
|
7
|
+
def errors_from_writing_value(model, attribute, value)
|
8
|
+
# TODO: Fix me to not use __send__
|
9
|
+
model.__send__(:write_attribute, attribute, value)
|
10
|
+
model.valid?
|
11
|
+
model.errors[attribute]
|
12
|
+
end
|
13
|
+
|
14
|
+
def errors_from_writing_value?(*args)
|
15
|
+
errors_from_writing_value(*args).any?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
public
|
20
|
+
|
21
|
+
# An ActiveRecord assertion that expects to pass with a given value or set of values for a given
|
22
|
+
# attribute.
|
23
|
+
#
|
24
|
+
# rails_context User do
|
25
|
+
# asserts_topic.allows_values_for :email, "a@b.cd"
|
26
|
+
# asserts_topic.allows_values_for :email, "a@b.cd", "e@f.gh"
|
27
|
+
# end
|
28
|
+
class AllowsValuesForMacro < ValidationAssertionMacro
|
29
|
+
register :allows_values_for
|
30
|
+
|
31
|
+
def evaluate(actual, attribute, *values)
|
32
|
+
bad_values = []
|
33
|
+
values.each do |value|
|
34
|
+
bad_values << value if errors_from_writing_value?(actual, attribute, value)
|
35
|
+
end
|
36
|
+
bad_values.empty? ? pass : fail(expected_message(attribute).to_allow_values(bad_values))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# An ActiveRecord assertion that expects to fail with a given value or set of values for a given
|
41
|
+
# attribute.
|
42
|
+
#
|
43
|
+
# rails_context User do
|
44
|
+
# asserts_topic.does_not_allow_values_for :email, "a"
|
45
|
+
# asserts_topic.does_not_allow_values_for :email, "a@b", "e f@g.h"
|
46
|
+
# end
|
47
|
+
class DoesNotAllowValuesForMacro < ValidationAssertionMacro
|
48
|
+
register :does_not_allow_values_for
|
49
|
+
def evaluate(actual, attribute, *values)
|
50
|
+
good_values = []
|
51
|
+
values.each do |value|
|
52
|
+
good_values << value unless errors_from_writing_value?(actual, attribute, value)
|
53
|
+
end
|
54
|
+
good_values.empty? ? pass : fail(expected_message(attribute).not_to_allow_values(good_values))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# An ActiveRecord assertion that expects to fail with invalid value for an attribute. Optionally, the
|
59
|
+
# error message can be provided as the exact string or as regular expression.
|
60
|
+
#
|
61
|
+
# rails_context User do
|
62
|
+
# asserts_topic.is_invalid_when :email, "fake", "is invalid"
|
63
|
+
# asserts_topic.is_invalid_when :email, "another fake", /invalid/
|
64
|
+
# end
|
65
|
+
class IsInvalidWhenMacro < ValidationAssertionMacro
|
66
|
+
register :is_invalid_when
|
67
|
+
|
68
|
+
def evaluate(actual, attribute, value, expected_error=nil)
|
69
|
+
actual_errors = errors_from_writing_value(actual, attribute, value)
|
70
|
+
if actual_errors.empty?
|
71
|
+
fail expected_message(attribute).to_be_invalid_when_value_is(value)
|
72
|
+
elsif expected_error && !has_error_message?(expected_error, actual_errors)
|
73
|
+
fail expected_message(attribute).to_be_invalid_with_error_message(expected_error)
|
74
|
+
else
|
75
|
+
pass new_message.attribute(attribute).is_invalid
|
76
|
+
end
|
77
|
+
end
|
78
|
+
private
|
79
|
+
def has_error_message?(expected, errors)
|
80
|
+
return true unless expected
|
81
|
+
expected.kind_of?(Regexp) ? errors.any? {|e| e =~ expected } : errors.any? {|e| e == expected }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# An ActiveRecord assertion that expects to fail when a given attribute is validated after a nil value
|
86
|
+
# is provided to it.
|
87
|
+
#
|
88
|
+
# rails_context User do
|
89
|
+
# asserts_topic.validates_presence_of(:name)
|
90
|
+
# end
|
91
|
+
class ValidatesPresenceOfMacro < ValidationAssertionMacro
|
92
|
+
register :validates_presence_of
|
93
|
+
|
94
|
+
def evaluate(actual, attribute)
|
95
|
+
if errors_from_writing_value?(actual, attribute, nil)
|
96
|
+
pass new_message.validates_presence_of(attribute)
|
97
|
+
else
|
98
|
+
fail expected_message.to_validate_presence_of(attribute)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# An ActiveRecord assertion that expects to fail with an attribute is not valid for record because the
|
104
|
+
# value of the attribute is not unique. Requires the topic of the context to be a created record; one
|
105
|
+
# that returns false for a call to +new_record?+.
|
106
|
+
#
|
107
|
+
# rails_context User do
|
108
|
+
# setup { User.create(:email => "a@b.cde", ... ) }
|
109
|
+
# asserts_topic.validates_uniqueness_of :email
|
110
|
+
# end
|
111
|
+
class ValidatesUniquenessOfMacro < ValidationAssertionMacro
|
112
|
+
register :validates_uniqueness_of
|
113
|
+
|
114
|
+
def evaluate(actual, attribute)
|
115
|
+
actual_record = actual
|
116
|
+
if actual_record.new_record?
|
117
|
+
fail new_message.must_use_a_persisted_record_when_testing_uniqueness_of(attribute)
|
118
|
+
else
|
119
|
+
copied_model = actual_record.class.new
|
120
|
+
actual_record.attributes.each do |dup_attribute, dup_value|
|
121
|
+
copied_model.__send__(:write_attribute, dup_attribute, dup_value)
|
122
|
+
end
|
123
|
+
copied_value = actual_record.__send__(:read_attribute, attribute)
|
124
|
+
if errors_from_writing_value?(copied_model, attribute, copied_value)
|
125
|
+
pass new_message(attribute).is_unique
|
126
|
+
else
|
127
|
+
fail expected_message.to_fail_because(attribute).is_not_unique
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# An ActiveRecord assertion to test that the length of the value of an attribute must be within a
|
134
|
+
# specified range. Assertion fails if: there are errors when min/max characters are used, there are no
|
135
|
+
# errors when min-1/max+1 characters are used.
|
136
|
+
#
|
137
|
+
# rails_context User do
|
138
|
+
# asserts_topic.validates_length_of :name, (2..36)
|
139
|
+
# end
|
140
|
+
#
|
141
|
+
# TODO: allow for options on what to validate
|
142
|
+
class ValidatesLengthOfMacro < ValidationAssertionMacro
|
143
|
+
register :validates_length_of
|
144
|
+
|
145
|
+
def evaluate(actual, attribute, range)
|
146
|
+
min, max = range.first, range.last
|
147
|
+
[min, max].each do |length|
|
148
|
+
if errors_from_writing_value?(actual, attribute, "r" * length)
|
149
|
+
return fail(new_message(attribute).should_be_able_to_be(length).characters)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
if (min-1) > 0 && !errors_from_writing_value?(actual, attribute, "r" * (min-1))
|
154
|
+
fail new_message(attribute).expected_to_be_more_than(min - 1).characters
|
155
|
+
elsif !errors_from_writing_value?(actual, attribute, "r" * (max+1))
|
156
|
+
fail new_message(attribute).expected_to_be_less_than(max + 1).characters
|
157
|
+
else
|
158
|
+
pass new_message.validates_length_of(attribute).is_within(range)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# An ActiveRecord assertion to test that an attribute is invalid along with the expected error message
|
164
|
+
# (or error message partial). The assumption is that a value has already been set.
|
165
|
+
#
|
166
|
+
# rails_context User do
|
167
|
+
# hookup { topic.bio = "I'm a goofy clown" }
|
168
|
+
# asserts_topic.attribute_is_invalid :bio, "cannot contain adjectives"
|
169
|
+
# end
|
170
|
+
class AttributeIsInvalidMacro < ValidationAssertionMacro
|
171
|
+
register :attribute_is_invalid
|
172
|
+
|
173
|
+
def evaluate(actual, attribute, error_message)
|
174
|
+
actual.valid?
|
175
|
+
errors = actual.errors[attribute]
|
176
|
+
if errors.empty?
|
177
|
+
fail new_message(attribute).expected_to_be_invalid
|
178
|
+
elsif errors.include?(error_message)
|
179
|
+
pass new_message(attribute).is_invalid
|
180
|
+
else
|
181
|
+
fail new_message(attribute).is_invalid.but(error_message).is_not_a_valid_error_message
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
end # ActiveRecord
|
187
|
+
end # RiotRails
|
data/lib/riot/rails.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'riot'
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'riot/rails' if RAILS_ENV == 'test'
|
data/riot-rails.gemspec
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{riot-rails}
|
8
|
+
s.version = "0.2.0.pre"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Justin 'Gus' Knowlden"]
|
12
|
+
s.date = %q{2010-06-13}
|
13
|
+
s.description = %q{Riot specific test support for Rails apps. Protest the slow app.}
|
14
|
+
s.email = %q{gus@gusg.us}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"CHANGELOG",
|
21
|
+
"MIT-LICENSE",
|
22
|
+
"README.markdown",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"lib/riot/action_controller.rb",
|
26
|
+
"lib/riot/action_controller/context_macros/asserts_response.rb",
|
27
|
+
"lib/riot/action_controller/context_middleware.rb",
|
28
|
+
"lib/riot/action_controller/http_methods.rb",
|
29
|
+
"lib/riot/active_record.rb",
|
30
|
+
"lib/riot/active_record/assertion_macros.rb",
|
31
|
+
"lib/riot/active_record/context_middleware.rb",
|
32
|
+
"lib/riot/active_record/database_macros.rb",
|
33
|
+
"lib/riot/active_record/reflection_macros.rb",
|
34
|
+
"lib/riot/active_record/transactional_middleware.rb",
|
35
|
+
"lib/riot/active_record/validation_macros.rb",
|
36
|
+
"lib/riot/rails.rb",
|
37
|
+
"rails/init.rb",
|
38
|
+
"riot-rails.gemspec",
|
39
|
+
"test/action_controller/context_macros/asserts_response_test.rb",
|
40
|
+
"test/action_controller/context_middleware_test.rb",
|
41
|
+
"test/action_controller/delete_request_test.rb",
|
42
|
+
"test/action_controller/get_request_test.rb",
|
43
|
+
"test/action_controller/post_request_test.rb",
|
44
|
+
"test/action_controller/put_request_test.rb",
|
45
|
+
"test/action_controller/restful_delete_request_test.rb",
|
46
|
+
"test/action_controller/restful_get_request_test.rb",
|
47
|
+
"test/action_controller/restful_post_request_test.rb",
|
48
|
+
"test/action_controller/restful_put_request_test.rb",
|
49
|
+
"test/active_record/allowing_values_test.rb",
|
50
|
+
"test/active_record/attribute_is_invalid_test.rb",
|
51
|
+
"test/active_record/belongs_to_test.rb",
|
52
|
+
"test/active_record/context_middleware_test.rb",
|
53
|
+
"test/active_record/has_and_belongs_to_many_test.rb",
|
54
|
+
"test/active_record/has_database_index_on_test.rb",
|
55
|
+
"test/active_record/has_many_test.rb",
|
56
|
+
"test/active_record/has_one_test.rb",
|
57
|
+
"test/active_record/validates_length_of_test.rb",
|
58
|
+
"test/active_record/validates_presence_of_test.rb",
|
59
|
+
"test/active_record/validates_uniqueness_of_test.rb",
|
60
|
+
"test/rails_root/app/controllers/gremlins_controller.rb",
|
61
|
+
"test/rails_root/app/controllers/parties_controller.rb",
|
62
|
+
"test/rails_root/app/controllers/rooms_controller.rb",
|
63
|
+
"test/rails_root/app/views/rendered_templates/foo_bar.html.erb",
|
64
|
+
"test/rails_root/config/database.yml",
|
65
|
+
"test/rails_root/config/environment.rb",
|
66
|
+
"test/rails_root/config/routes.rb",
|
67
|
+
"test/rails_root/db/schema.rb",
|
68
|
+
"test/teststrap.rb",
|
69
|
+
"test/transactional_middleware_test.rb"
|
70
|
+
]
|
71
|
+
s.homepage = %q{http://github.com/thumblemonks/riot-rails}
|
72
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
73
|
+
s.require_paths = ["lib"]
|
74
|
+
s.rubygems_version = %q{1.3.6}
|
75
|
+
s.summary = %q{Riot specific test support for Rails apps}
|
76
|
+
s.test_files = [
|
77
|
+
"test/action_controller/context_macros/asserts_response_test.rb",
|
78
|
+
"test/action_controller/context_middleware_test.rb",
|
79
|
+
"test/action_controller/delete_request_test.rb",
|
80
|
+
"test/action_controller/get_request_test.rb",
|
81
|
+
"test/action_controller/post_request_test.rb",
|
82
|
+
"test/action_controller/put_request_test.rb",
|
83
|
+
"test/action_controller/restful_delete_request_test.rb",
|
84
|
+
"test/action_controller/restful_get_request_test.rb",
|
85
|
+
"test/action_controller/restful_post_request_test.rb",
|
86
|
+
"test/action_controller/restful_put_request_test.rb",
|
87
|
+
"test/active_record/allowing_values_test.rb",
|
88
|
+
"test/active_record/attribute_is_invalid_test.rb",
|
89
|
+
"test/active_record/belongs_to_test.rb",
|
90
|
+
"test/active_record/context_middleware_test.rb",
|
91
|
+
"test/active_record/has_and_belongs_to_many_test.rb",
|
92
|
+
"test/active_record/has_database_index_on_test.rb",
|
93
|
+
"test/active_record/has_many_test.rb",
|
94
|
+
"test/active_record/has_one_test.rb",
|
95
|
+
"test/active_record/validates_length_of_test.rb",
|
96
|
+
"test/active_record/validates_presence_of_test.rb",
|
97
|
+
"test/active_record/validates_uniqueness_of_test.rb",
|
98
|
+
"test/rails_root/app/controllers/gremlins_controller.rb",
|
99
|
+
"test/rails_root/app/controllers/parties_controller.rb",
|
100
|
+
"test/rails_root/app/controllers/rooms_controller.rb",
|
101
|
+
"test/rails_root/config/environment.rb",
|
102
|
+
"test/rails_root/config/routes.rb",
|
103
|
+
"test/rails_root/db/schema.rb",
|
104
|
+
"test/teststrap.rb",
|
105
|
+
"test/transactional_middleware_test.rb"
|
106
|
+
]
|
107
|
+
|
108
|
+
if s.respond_to? :specification_version then
|
109
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
110
|
+
s.specification_version = 3
|
111
|
+
|
112
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
113
|
+
s.add_runtime_dependency(%q<riot>, [">= 0.11.0"])
|
114
|
+
s.add_runtime_dependency(%q<rack-test>, [">= 0.5.3"])
|
115
|
+
s.add_development_dependency(%q<activerecord>, [">= 3.0.0.beta3"])
|
116
|
+
s.add_development_dependency(%q<actionpack>, [">= 3.0.0.beta3"])
|
117
|
+
else
|
118
|
+
s.add_dependency(%q<riot>, [">= 0.11.0"])
|
119
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
120
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0.beta3"])
|
121
|
+
s.add_dependency(%q<actionpack>, [">= 3.0.0.beta3"])
|
122
|
+
end
|
123
|
+
else
|
124
|
+
s.add_dependency(%q<riot>, [">= 0.11.0"])
|
125
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
126
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0.beta3"])
|
127
|
+
s.add_dependency(%q<actionpack>, [">= 3.0.0.beta3"])
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "An asserts_response context macro" do
|
4
|
+
context "for context not representing an ActionController" do
|
5
|
+
setup { Riot::Context.new("Hello") {} }
|
6
|
+
asserts("asserts_response returns") { topic.asserts_response }.raises(NoMethodError)
|
7
|
+
end # for context not representing an ActionController
|
8
|
+
|
9
|
+
helper(:situation) do
|
10
|
+
a_situation = Riot::Situation.new
|
11
|
+
a_situation.helper(:response) { OpenStruct.new(:status => 200) }
|
12
|
+
a_situation
|
13
|
+
end
|
14
|
+
|
15
|
+
setup do
|
16
|
+
Riot::Context.new(RoomsController) {}
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when referenced without arguments" do
|
20
|
+
setup { topic.asserts_response }
|
21
|
+
|
22
|
+
asserts_topic.kind_of(Riot::Assertion)
|
23
|
+
asserts(:to_s).equals("asserts response")
|
24
|
+
|
25
|
+
asserts("the result of assertion responds to :status") do
|
26
|
+
topic.responds_to(:status).run(situation).first
|
27
|
+
end.equals(:pass)
|
28
|
+
end # when referenced without arguments
|
29
|
+
|
30
|
+
context "with method name provided" do
|
31
|
+
setup { topic.asserts_response(:status).equals(200) }
|
32
|
+
asserts(:to_s).equals("asserts response #status")
|
33
|
+
asserts("output of running the test") { topic.run(situation).first }.equals(:pass)
|
34
|
+
end
|
35
|
+
end # An asserts_response context macro
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "ActionController middleware" do
|
4
|
+
setup_test_context
|
5
|
+
|
6
|
+
helper(:assigned) { |var| topic.instance_variable_get(var) }
|
7
|
+
|
8
|
+
context "pre-request state" do
|
9
|
+
setup do
|
10
|
+
situation = Riot::Situation.new
|
11
|
+
topic.context(RoomsController) {}.local_run(Riot::SilentReporter.new, situation)
|
12
|
+
situation
|
13
|
+
end
|
14
|
+
|
15
|
+
asserts(:topic).equals(RoomsController)
|
16
|
+
|
17
|
+
asserts("@app") { assigned(:@app).to_s }.equals { ::Rails.application.to_s }
|
18
|
+
asserts("helper app") { topic.app.to_s }.equals { assigned(:@app).to_s }
|
19
|
+
|
20
|
+
asserts("@env") { assigned(:@env) }.equals({})
|
21
|
+
asserts("helper env") { topic.env }.equals { assigned(:@env) }
|
22
|
+
|
23
|
+
asserts("helper controller") { topic.controller }.equals { assigned(:@controller) }
|
24
|
+
|
25
|
+
asserts("request before any request made") do
|
26
|
+
topic.request
|
27
|
+
end.raises(Exception, "No request made yet")
|
28
|
+
|
29
|
+
asserts("response before any request made") do
|
30
|
+
topic.response
|
31
|
+
end.raises(Exception, "No response since no request made yet")
|
32
|
+
|
33
|
+
asserts_topic.responds_to(:get)
|
34
|
+
asserts_topic.responds_to(:post)
|
35
|
+
asserts_topic.responds_to(:put)
|
36
|
+
asserts_topic.responds_to(:delete)
|
37
|
+
end # pre-request state
|
38
|
+
|
39
|
+
context "post-request state" do
|
40
|
+
setup do
|
41
|
+
situation = Riot::Situation.new
|
42
|
+
topic.context(RoomsController) do
|
43
|
+
setup { get("/rooms") }
|
44
|
+
end.local_run(Riot::SilentReporter.new, situation)
|
45
|
+
situation
|
46
|
+
end
|
47
|
+
|
48
|
+
asserts(:topic).kind_of(Array)
|
49
|
+
asserts(:topic).size(3)
|
50
|
+
asserts("#topic first element response status") { topic.topic[0] }.equals(200)
|
51
|
+
asserts("#topic second element") { topic.topic[1] }.kind_of(Hash)
|
52
|
+
asserts("#topic second element") { topic.topic[1] }.includes("ETag")
|
53
|
+
asserts("#topic last element") { topic.topic[2] }.kind_of(ActionDispatch::Response)
|
54
|
+
|
55
|
+
asserts("helper env") { topic.env }.includes("action_controller.instance")
|
56
|
+
|
57
|
+
asserts("helper controller") { topic.controller }.kind_of(RoomsController)
|
58
|
+
asserts("env['action_controller.instance']") do
|
59
|
+
topic.env["action_controller.instance"]
|
60
|
+
end.kind_of(RoomsController)
|
61
|
+
|
62
|
+
asserts("helper request") { topic.request }.kind_of(Rack::Request)
|
63
|
+
asserts("helper response") { topic.response }.kind_of(Rack::Response)
|
64
|
+
end # post-request state
|
65
|
+
|
66
|
+
end # ActionController middleware
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context RoomsController do
|
4
|
+
|
5
|
+
asserts("DELETEs unknown action for existing controller") do
|
6
|
+
delete "/rooms/blah"
|
7
|
+
end.raises(AbstractController::ActionNotFound, "The action 'blah' could not be found")
|
8
|
+
|
9
|
+
context "for a DELETE request" do
|
10
|
+
helper(:action_name) { env['action_dispatch.request.path_parameters'][:action] }
|
11
|
+
|
12
|
+
context "without parameters" do
|
13
|
+
setup { delete "/rooms/destroy" }
|
14
|
+
|
15
|
+
asserts("request method") { request.request_method }.equals("DELETE")
|
16
|
+
asserts("action name") { action_name }.equals("destroy")
|
17
|
+
asserts("response status") { response.status }.equals(200)
|
18
|
+
asserts("response body") { response.body }.equals { "destroyed #{controller.params.inspect}" }
|
19
|
+
|
20
|
+
context "response headers" do
|
21
|
+
setup { response.headers.keys }
|
22
|
+
asserts_topic.includes("Content-Type")
|
23
|
+
asserts_topic.includes("ETag")
|
24
|
+
asserts_topic.includes("Cache-Control")
|
25
|
+
end # response headers
|
26
|
+
end # without parameters
|
27
|
+
|
28
|
+
context "with parameters" do
|
29
|
+
setup { delete "/rooms/destroy", {:momma => "loves you", "love_you_too" => "mom"} }
|
30
|
+
|
31
|
+
asserts("request method") { request.request_method }.equals("DELETE")
|
32
|
+
asserts("action name") { action_name }.equals("destroy")
|
33
|
+
asserts("response status") { response.status }.equals(200)
|
34
|
+
|
35
|
+
asserts("response body") { response.body }.equals do
|
36
|
+
"destroyed #{controller.params.inspect}"
|
37
|
+
end
|
38
|
+
|
39
|
+
asserts("params") { controller.params }.includes("momma")
|
40
|
+
asserts("params") { controller.params }.includes("love_you_too")
|
41
|
+
end # with parameters
|
42
|
+
|
43
|
+
end # for a DELETE request
|
44
|
+
|
45
|
+
end # RoomsController
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context RoomsController do
|
4
|
+
|
5
|
+
asserts("GETs unknown action for existing controller") do
|
6
|
+
get "/rooms/blah"
|
7
|
+
end.raises(AbstractController::ActionNotFound, "The action 'blah' could not be found")
|
8
|
+
|
9
|
+
context "for a GET request" do
|
10
|
+
helper(:action_name) { env['action_dispatch.request.path_parameters'][:action] }
|
11
|
+
|
12
|
+
context "without parameters" do
|
13
|
+
setup { get "/rooms/index" }
|
14
|
+
|
15
|
+
asserts("action name") { action_name }.equals("index")
|
16
|
+
asserts("response status") { response.status }.equals(200)
|
17
|
+
asserts("response body") { response.body }.equals("foo")
|
18
|
+
asserts("request method") { request.request_method }.equals("GET")
|
19
|
+
|
20
|
+
context "response headers" do
|
21
|
+
setup { response.headers.keys }
|
22
|
+
asserts_topic.includes("Content-Type")
|
23
|
+
asserts_topic.includes("ETag")
|
24
|
+
asserts_topic.includes("Cache-Control")
|
25
|
+
end # response headers
|
26
|
+
end # without parameters
|
27
|
+
|
28
|
+
context "with parameters" do
|
29
|
+
setup { get "/rooms/echo_params", {:name => "Juiceton", :foo => "blaz"} }
|
30
|
+
|
31
|
+
asserts("action name") { action_name }.equals("echo_params")
|
32
|
+
asserts("response body") { response.body }.equals("controller=rooms,foo=blaz,name=Juiceton")
|
33
|
+
end # with with parameters
|
34
|
+
|
35
|
+
end # for a GET request
|
36
|
+
|
37
|
+
end # RoomsController
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context RoomsController do
|
4
|
+
|
5
|
+
asserts("POSTs unknown action for existing controller") do
|
6
|
+
post "/rooms/blah"
|
7
|
+
end.raises(AbstractController::ActionNotFound, "The action 'blah' could not be found")
|
8
|
+
|
9
|
+
context "for a POST request" do
|
10
|
+
helper(:action_name) { env['action_dispatch.request.path_parameters'][:action] }
|
11
|
+
|
12
|
+
context "without parameters" do
|
13
|
+
setup { post "/rooms/create" }
|
14
|
+
|
15
|
+
asserts("request method") { request.request_method }.equals("POST")
|
16
|
+
asserts("action name") { action_name }.equals("create")
|
17
|
+
asserts("response status") { response.status }.equals(200)
|
18
|
+
asserts("response body") { response.body }.equals { "created #{controller.params.inspect}" }
|
19
|
+
|
20
|
+
context "response headers" do
|
21
|
+
setup { response.headers.keys }
|
22
|
+
asserts_topic.includes("Content-Type")
|
23
|
+
asserts_topic.includes("ETag")
|
24
|
+
asserts_topic.includes("Cache-Control")
|
25
|
+
end # response headers
|
26
|
+
end # without parameters
|
27
|
+
|
28
|
+
context "with parameters" do
|
29
|
+
setup { post "/rooms/create", {:momma => "loves you", "love_you_too" => "mom"} }
|
30
|
+
|
31
|
+
asserts("request method") { request.request_method }.equals("POST")
|
32
|
+
asserts("action name") { action_name }.equals("create")
|
33
|
+
asserts("response status") { response.status }.equals(200)
|
34
|
+
|
35
|
+
asserts("response body") { response.body }.equals do
|
36
|
+
"created #{controller.params.inspect}"
|
37
|
+
end
|
38
|
+
|
39
|
+
asserts("params") { controller.params }.includes("momma")
|
40
|
+
asserts("params") { controller.params }.includes("love_you_too")
|
41
|
+
end # with parameters
|
42
|
+
|
43
|
+
end # for a POST request
|
44
|
+
|
45
|
+
end # RoomsController
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context RoomsController do
|
4
|
+
|
5
|
+
asserts("PUTs unknown action for existing controller") do
|
6
|
+
put "/rooms/blah"
|
7
|
+
end.raises(AbstractController::ActionNotFound, "The action 'blah' could not be found")
|
8
|
+
|
9
|
+
context "for a PUT request" do
|
10
|
+
helper(:action_name) { env['action_dispatch.request.path_parameters'][:action] }
|
11
|
+
|
12
|
+
context "without parameters" do
|
13
|
+
setup { put "/rooms/update" }
|
14
|
+
|
15
|
+
asserts("request method") { request.request_method }.equals("PUT")
|
16
|
+
asserts("action name") { action_name }.equals("update")
|
17
|
+
asserts("response status") { response.status }.equals(200)
|
18
|
+
asserts("response body") { response.body }.equals { "updated #{controller.params.inspect}" }
|
19
|
+
|
20
|
+
context "response headers" do
|
21
|
+
setup { response.headers.keys }
|
22
|
+
asserts_topic.includes("Content-Type")
|
23
|
+
asserts_topic.includes("ETag")
|
24
|
+
asserts_topic.includes("Cache-Control")
|
25
|
+
end # response headers
|
26
|
+
end # without parameters
|
27
|
+
|
28
|
+
context "with parameters" do
|
29
|
+
setup { put "/rooms/update", {:momma => "loves you", "love_you_too" => "mom"} }
|
30
|
+
|
31
|
+
asserts("request method") { request.request_method }.equals("PUT")
|
32
|
+
asserts("action name") { action_name }.equals("update")
|
33
|
+
asserts("response status") { response.status }.equals(200)
|
34
|
+
|
35
|
+
asserts("response body") { response.body }.equals do
|
36
|
+
"updated #{controller.params.inspect}"
|
37
|
+
end
|
38
|
+
|
39
|
+
asserts("params") { controller.params }.includes("momma")
|
40
|
+
asserts("params") { controller.params }.includes("love_you_too")
|
41
|
+
end # with parameters
|
42
|
+
|
43
|
+
end # for a PUT request
|
44
|
+
|
45
|
+
end # RoomsController
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "RESTful DELETE request on resource" do
|
4
|
+
|
5
|
+
context GremlinsController do
|
6
|
+
setup { delete("/gremlins/2") }
|
7
|
+
|
8
|
+
asserts("request method") { request.request_method }.equals("DELETE")
|
9
|
+
asserts("controller name") { controller.controller_name }.equals("gremlins")
|
10
|
+
asserts("action name") { controller.action_name }.equals("destroy")
|
11
|
+
asserts("id param") { controller.params["id"] }.equals("2")
|
12
|
+
asserts("response body") { response.body }.equals("spendin' money")
|
13
|
+
end # on a top level resource
|
14
|
+
|
15
|
+
context PartiesController do
|
16
|
+
setup { delete("/gremlins/2/parties/3", "foo" => "bar") }
|
17
|
+
|
18
|
+
asserts("request method") { request.request_method }.equals("DELETE")
|
19
|
+
asserts("controller name") { controller.controller_name }.equals("parties")
|
20
|
+
asserts("action name") { controller.action_name }.equals("destroy")
|
21
|
+
|
22
|
+
asserts("gremlin_id param") { controller.params["gremlin_id"] }.equals("2")
|
23
|
+
asserts("id param") { controller.params["id"] }.equals("3")
|
24
|
+
asserts("foo param") { controller.params["foo"] }.equals("bar")
|
25
|
+
|
26
|
+
asserts("response body") { response.body }.equals("all gone")
|
27
|
+
end # on a nested resource
|
28
|
+
end # RESTful DELETE request
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "RESTful GET request on resource" do
|
4
|
+
|
5
|
+
context GremlinsController do
|
6
|
+
setup { get("/gremlins/1") }
|
7
|
+
|
8
|
+
asserts("request method") { request.request_method }.equals("GET")
|
9
|
+
asserts("controller name") { controller.controller_name }.equals("gremlins")
|
10
|
+
asserts("action name") { controller.action_name }.equals("show")
|
11
|
+
asserts("id param") { controller.params["id"] }.equals("1")
|
12
|
+
asserts("response body") { response.body }.equals("show me the money")
|
13
|
+
end # on a top level resource
|
14
|
+
|
15
|
+
context PartiesController do
|
16
|
+
setup { get("/gremlins/1/parties/2") }
|
17
|
+
|
18
|
+
asserts("request method") { request.request_method }.equals("GET")
|
19
|
+
asserts("controller name") { controller.controller_name }.equals("parties")
|
20
|
+
asserts("action name") { controller.action_name }.equals("show")
|
21
|
+
asserts("gremlin_id param") { controller.params["gremlin_id"] }.equals("1")
|
22
|
+
asserts("id param") { controller.params["id"] }.equals("2")
|
23
|
+
asserts("response body") { response.body }.equals("woot")
|
24
|
+
end # on a nested resource
|
25
|
+
end # RESTful GET request
|