riot_rails 0.0.7 → 0.0.8
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/VERSION +1 -1
- data/lib/riot/action_controller/assertion_macros.rb +102 -78
- data/lib/riot/active_record/assertion_macros.rb +145 -89
- data/riot_rails.gemspec +2 -2
- data/test/action_controller/controller_context_test.rb +1 -1
- data/test/action_controller/redirected_to_test.rb +2 -2
- data/test/action_controller/renders_template_test.rb +4 -4
- data/test/action_controller/renders_test.rb +2 -2
- data/test/action_controller/response_status_test.rb +24 -7
- data/test/active_record/allowing_values_test.rb +33 -4
- data/test/active_record/has_many_test.rb +1 -1
- data/test/active_record/validates_presence_of_test.rb +1 -1
- data/test/active_record/validates_uniqueness_of_test.rb +4 -4
- data/test/teststrap.rb +3 -3
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
@@ -1,85 +1,109 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
module RiotRails
|
2
|
+
module ActionController
|
3
|
+
# Asserts that the body of the response equals or matches the expected expression. Expects actual to
|
4
|
+
# be the controller.
|
5
|
+
#
|
6
|
+
# controller.renders("a bunch of html")
|
7
|
+
# controller.renders(/bunch of/)
|
8
|
+
class RendersMacro < Riot::AssertionMacro
|
9
|
+
register :renders
|
10
|
+
|
11
|
+
def evaluate(actual, expected)
|
12
|
+
actual_body = actual.response.body
|
13
|
+
if (expected.kind_of?(Regexp) ? (actual_body =~ expected) : (expected == actual_body))
|
14
|
+
pass
|
15
|
+
else
|
16
|
+
verb = expected.kind_of?(Regexp) ? "match" : "equal"
|
17
|
+
fail("expected response body #{actual_body.inspect} to #{verb} #{expected.inspect}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Asserts that the name you provide is the basename of the rendered template. For instance, if you
|
23
|
+
# expect the rendered template is named "foo_bar.html.haml" and you pass "foo_bar" into
|
24
|
+
# renders_template, the assertion would pass. If instead you pass "foo" into renders_template, the
|
25
|
+
# assertion will fail. Using Rails' assert_template both assertions would pass
|
26
|
+
#
|
27
|
+
# controlling :things
|
28
|
+
# controller.renders_template(:index)
|
29
|
+
# controller.renders_template("index")
|
30
|
+
# controller.renders_template("index.erb") # fails even if that's the name of the template
|
31
|
+
class RendersTemplateMacro < Riot::AssertionMacro
|
32
|
+
register :renders_template
|
33
|
+
|
34
|
+
def evaluate(actual, expected_name)
|
35
|
+
name = expected_name.to_s
|
36
|
+
actual_template_path = actual.response.rendered[:template].to_s
|
37
|
+
actual_template_name = File.basename(actual_template_path)
|
38
|
+
if actual_template_name.to_s.match(/^#{name}(\.\w+)*$/)
|
39
|
+
pass("renders template #{name.inspect}")
|
40
|
+
else
|
41
|
+
fail("expected template #{name.inspect}, not #{actual_template_path.inspect}")
|
42
|
+
end
|
43
|
+
end
|
14
44
|
end
|
15
|
-
end
|
16
45
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
46
|
+
# Asserts that the HTTP response code equals your expectation. You can use the symbolized form of the
|
47
|
+
# status code or the integer code itself. Not currently supporting status ranges; such as: +:success+,
|
48
|
+
# +:redirect+, etc.
|
49
|
+
#
|
50
|
+
# controller.response_code(:ok)
|
51
|
+
# controller.response_code(200)
|
52
|
+
#
|
53
|
+
# controller.response_code(:not_found)
|
54
|
+
# controller.response_code(404)
|
55
|
+
#
|
56
|
+
# # A redirect
|
57
|
+
# controller.response_code(:found)
|
58
|
+
# controller.response_code(302)
|
59
|
+
#
|
60
|
+
# See +ActionController::StatusCodes+ for the list of available codes.
|
61
|
+
class ResponseCodeMacro < Riot::AssertionMacro
|
62
|
+
register :response_code
|
33
63
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# controller.response_code(:found)
|
46
|
-
# controller.response_code(302)
|
47
|
-
#
|
48
|
-
# See +ActionController::StatusCodes+ for the list of available codes.
|
49
|
-
assertion(:response_code) do |actual, expected_code|
|
50
|
-
if expected_code.kind_of?(Symbol)
|
51
|
-
expected_code = ::ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[expected_code]
|
64
|
+
def evaluate(actual, expected_code)
|
65
|
+
if expected_code.kind_of?(Symbol)
|
66
|
+
expected_code = ::ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[expected_code]
|
67
|
+
end
|
68
|
+
actual_code = actual.response.response_code
|
69
|
+
if expected_code == actual_code
|
70
|
+
pass("returns response code #{expected_code}")
|
71
|
+
else
|
72
|
+
fail("expected response code #{expected_code}, not #{actual_code}")
|
73
|
+
end
|
74
|
+
end
|
52
75
|
end
|
53
|
-
actual_code = actual.response.response_code
|
54
|
-
expected_code == actual_code ? pass : fail("expected response code #{expected_code}, not #{actual_code}")
|
55
|
-
end
|
56
76
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
# Asserts that the response from an action is a redirect and that the path or URL matches your
|
78
|
+
# expectations. If the response code is not in the 300s, the assertion will fail. If the reponse code
|
79
|
+
# is fine, but the redirect-to path or URL do not exactly match your expectation, the assertion will
|
80
|
+
# fail.
|
81
|
+
#
|
82
|
+
# +redirected_to+ expects you to provide your expected path in a lambda. This is so you can use named
|
83
|
+
# routes, which are - as it turns out - handy. It's also what I would expect to be able to do.
|
84
|
+
#
|
85
|
+
# controlling :people
|
86
|
+
# setup do
|
87
|
+
# post :create, :person { ... }
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# controller.redirected_to { person_path(...) }
|
91
|
+
#
|
92
|
+
# PS: There is a difference between saying +named_route_path+ and +named_route_url+ and Riot Rails will
|
93
|
+
# be very strict (read: annoying) about it :)
|
94
|
+
class RedirectedToMacro < Riot::AssertionMacro
|
95
|
+
register :redirected_to
|
96
|
+
def evaluate(actual, expected_redirect)
|
97
|
+
actual_response_code = actual.response.response_code
|
98
|
+
if (300...400).member?(actual_response_code)
|
99
|
+
actual_redirect = actual.url_for(actual.response.redirected_to)
|
100
|
+
msg = "expected to redirect to <#{expected_redirect}>, not <#{actual_redirect}>"
|
101
|
+
expected_redirect == actual_redirect ? pass("redirected to #{expected_redirect}") : fail(msg)
|
102
|
+
else
|
103
|
+
fail("expected response to be a redirect, but was #{actual_response_code}")
|
104
|
+
end
|
105
|
+
end
|
82
106
|
end
|
83
|
-
end
|
84
107
|
|
85
|
-
end #
|
108
|
+
end # ActionController
|
109
|
+
end # RiotRails
|
@@ -1,102 +1,158 @@
|
|
1
|
-
|
1
|
+
module RiotRails
|
2
|
+
module ActiveRecord
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
assertion(:validates_presence_of) do |actual, attribute|
|
11
|
-
msg = "expected to validate presence of #{attribute.inspect}"
|
12
|
-
error_from_writing_value(actual, attribute, nil) ? pass : fail(msg)
|
13
|
-
end
|
4
|
+
class AssertionMacro < ::Riot::AssertionMacro
|
5
|
+
def error_from_writing_value(model, attribute, value)
|
6
|
+
model.write_attribute(attribute, value)
|
7
|
+
model.valid?
|
8
|
+
model.errors.on(attribute)
|
9
|
+
end
|
10
|
+
end
|
14
11
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
12
|
+
# An ActiveRecord assertion that expects to fail when a given attribute is validated after a nil value
|
13
|
+
# is provided to it.
|
14
|
+
#
|
15
|
+
# context "a User" do
|
16
|
+
# setup { User.new }
|
17
|
+
# topic.validates_presence_of(:name)
|
18
|
+
# end
|
19
|
+
class ValidatesPresenceOfMacro < AssertionMacro
|
20
|
+
register :validates_presence_of
|
21
|
+
|
22
|
+
def evaluate(actual, attribute)
|
23
|
+
if error_from_writing_value(actual, attribute, nil)
|
24
|
+
pass("validates presence of #{attribute.inspect}")
|
25
|
+
else
|
26
|
+
fail("expected to validate presence of #{attribute.inspect}")
|
27
|
+
end
|
28
|
+
end
|
27
29
|
end
|
28
|
-
msg = "expected #{attribute.inspect} to allow value(s) #{bad_values.inspect}"
|
29
|
-
bad_values.empty? ? pass : fail(msg)
|
30
|
-
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
31
|
+
# An ActiveRecord assertion that expects to pass with a given value or set of values for a given
|
32
|
+
# attribute.
|
33
|
+
#
|
34
|
+
# context "a User" do
|
35
|
+
# setup { User.new }
|
36
|
+
# topic.allows_values_for :email, "a@b.cd"
|
37
|
+
# topic.allows_values_for :email, "a@b.cd", "e@f.gh"
|
38
|
+
# end
|
39
|
+
class AllowsValuesForMacro < AssertionMacro
|
40
|
+
register :allows_values_for
|
41
|
+
|
42
|
+
def evaluate(actual, attribute, *values)
|
43
|
+
bad_values = []
|
44
|
+
values.each do |value|
|
45
|
+
bad_values << value if error_from_writing_value(actual, attribute, value)
|
46
|
+
end
|
47
|
+
failure_msg = "expected %s to allow value(s) %s"
|
48
|
+
bad_values.empty? ? pass : fail(failure_msg % [attribute.inspect, bad_values.inspect])
|
49
|
+
end
|
44
50
|
end
|
45
|
-
msg = "expected #{attribute.inspect} not to allow value(s) #{good_values.inspect}"
|
46
|
-
good_values.empty? ? pass : fail(msg)
|
47
|
-
end
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
52
|
+
# An ActiveRecord assertion that expects to fail with a given value or set of values for a given
|
53
|
+
# attribute.
|
54
|
+
#
|
55
|
+
# context "a User" do
|
56
|
+
# setup { User.new }
|
57
|
+
# topic.does_not_allow_values_for :email, "a"
|
58
|
+
# topic.does_not_allow_values_for :email, "a@b", "e f@g.h"
|
59
|
+
# end
|
60
|
+
class DoesNotAllowValuesForMacro < AssertionMacro
|
61
|
+
register :does_not_allow_values_for
|
62
|
+
def evaluate(actual, attribute, *values)
|
63
|
+
good_values = []
|
64
|
+
values.each do |value|
|
65
|
+
good_values << value unless error_from_writing_value(actual, attribute, value)
|
66
|
+
end
|
67
|
+
failure_msg = "expected %s not to allow value(s) %s"
|
68
|
+
good_values.empty? ? pass : fail(failure_msg % [attribute.inspect, good_values.inspect])
|
65
69
|
end
|
66
|
-
copied_value = actual_record.read_attribute(attribute)
|
67
|
-
msg = "expected to fail because #{attribute.inspect} is not unique"
|
68
|
-
error_from_writing_value(copied_model, attribute, copied_value) ? pass : fail(msg)
|
69
70
|
end
|
70
|
-
end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
72
|
+
# An ActiveRecord assertion that expects to fail with invalid value for an attribute. Optionally, the
|
73
|
+
# error message can be provided as the exact string or as regular expression.
|
74
|
+
#
|
75
|
+
# context "a User" do
|
76
|
+
# setup { User.new }
|
77
|
+
# topic.is_invalid_when :email, "fake", "is invalid"
|
78
|
+
# topic.is_invalid_when :email, "another fake", /invalid/
|
79
|
+
# end
|
80
|
+
class IsInvalidWhenMacro < AssertionMacro
|
81
|
+
register :is_invalid_when
|
82
|
+
|
83
|
+
def evaluate(actual, attribute, value, expected_error=nil)
|
84
|
+
actual_errors = Array(error_from_writing_value(actual, attribute, value))
|
85
|
+
if actual_errors.empty?
|
86
|
+
fail("expected #{attribute.inspect} to be invalid when value is #{value.inspect}")
|
87
|
+
elsif expected_error && !has_error_message?(expected_error, actual_errors)
|
88
|
+
message = "expected %s to be invalid with error message %s"
|
89
|
+
fail(message % [attribute.inspect, expected_error.inspect])
|
90
|
+
else
|
91
|
+
pass("attribute #{attribute.inspect} is invalid")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
private
|
95
|
+
def has_error_message?(expected, errors)
|
96
|
+
return true unless expected
|
97
|
+
expected.kind_of?(Regexp) ? errors.any? {|e| e =~ expected } : errors.any? {|e| e == expected }
|
98
|
+
end
|
91
99
|
end
|
92
|
-
end
|
93
100
|
|
94
|
-
|
101
|
+
# An ActiveRecord assertion that expects to fail with an attribute is not valid for record because the
|
102
|
+
# value of the attribute is not unique. Requires the topic of the context to be a created record; one
|
103
|
+
# that returns false for a call to +new_record?+.
|
104
|
+
#
|
105
|
+
# context "a User" do
|
106
|
+
# setup { User.create(:email => "a@b.cde", ... ) }
|
107
|
+
# topic.validates_uniqueness_of :email
|
108
|
+
# end
|
109
|
+
class ValidatesUniquenessOfMacro < AssertionMacro
|
110
|
+
register :validates_uniqueness_of
|
111
|
+
|
112
|
+
def evaluate(actual, attribute)
|
113
|
+
actual_record = actual
|
114
|
+
if actual_record.new_record?
|
115
|
+
fail("topic is not a new record when testing uniqueness of #{attribute.inspect}")
|
116
|
+
else
|
117
|
+
copied_model = actual_record.class.new
|
118
|
+
actual_record.attributes.each do |dup_attribute, dup_value|
|
119
|
+
copied_model.write_attribute(dup_attribute, dup_value)
|
120
|
+
end
|
121
|
+
copied_value = actual_record.read_attribute(attribute)
|
122
|
+
if error_from_writing_value(copied_model, attribute, copied_value)
|
123
|
+
pass("#{attribute.inspect} is unique")
|
124
|
+
else
|
125
|
+
fail("expected to fail because #{attribute.inspect} is not unique")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
95
130
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
131
|
+
# An ActiveRecord assertion macro that expects to pass when a given attribute is defined as +has_many+
|
132
|
+
# association. Will fail if an association is not defined for the attribute and if the association is
|
133
|
+
# not +has_many.jekyll
|
134
|
+
#
|
135
|
+
# context "a Room" do
|
136
|
+
# setup { Room.new }
|
137
|
+
#
|
138
|
+
# topic.has_many(:doors)
|
139
|
+
# topic.has_many(:floors) # should probably fail given our current universe :)
|
140
|
+
# end
|
141
|
+
class HasManyMacro < AssertionMacro
|
142
|
+
register :has_many
|
143
|
+
|
144
|
+
def evaluate(actual, attribute)
|
145
|
+
reflection = actual.class.reflect_on_association(attribute)
|
146
|
+
static_msg = "expected #{attribute.inspect} to be a has_many association, but was "
|
147
|
+
if reflection.nil?
|
148
|
+
fail(static_msg + "not")
|
149
|
+
elsif "has_many" != reflection.macro.to_s
|
150
|
+
fail(static_msg + "a #{reflection.macro} instead")
|
151
|
+
else
|
152
|
+
pass("has many #{attribute.inspect}")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
101
156
|
|
102
|
-
end #
|
157
|
+
end # ActiveRecord
|
158
|
+
end # RiotRails
|
data/riot_rails.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{riot_rails}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Justin 'Gus' Knowlden"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-12-29}
|
13
13
|
s.description = %q{Riot specific test support for Rails apps. Protest the slow app.}
|
14
14
|
s.email = %q{gus@gusg.us}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,6 +19,6 @@ context "A controller test" do
|
|
19
19
|
|
20
20
|
asserts("an unknown action call") do
|
21
21
|
get :burberry
|
22
|
-
end.raises(ActionController::UnknownAction, "No action responded to burberry")
|
22
|
+
end.raises(::ActionController::UnknownAction, "No action responded to burberry")
|
23
23
|
|
24
24
|
end # a controller test
|
@@ -14,14 +14,14 @@ context "Asserting the redirect of an action" do
|
|
14
14
|
setup do
|
15
15
|
@situation = Riot::Situation.new
|
16
16
|
context = Riot::Context.new("redirected to") {}
|
17
|
-
context.controlling(:redirected_to).
|
17
|
+
context.controlling(:redirected_to).run(@situation)
|
18
18
|
context
|
19
19
|
end
|
20
20
|
|
21
21
|
context "when doing an actual redirect" do
|
22
22
|
setup_for_assertion_test { get :index }
|
23
23
|
|
24
|
-
assertion_test_passes("when expected url matches actual redirect url") do
|
24
|
+
assertion_test_passes("when expected url matches actual redirect url", "redirected to /gremlins/new") do
|
25
25
|
topic.asserts_controller.redirected_to { new_gremlin_path }
|
26
26
|
end
|
27
27
|
|
@@ -9,14 +9,14 @@ context "Asserting the rendered template for an action" do
|
|
9
9
|
setup do
|
10
10
|
@situation = Riot::Situation.new
|
11
11
|
context = Riot::Context.new("rendered_template") {}
|
12
|
-
context.controlling(:rendered_templates).
|
12
|
+
context.controlling(:rendered_templates).run(@situation)
|
13
13
|
context
|
14
14
|
end
|
15
15
|
|
16
16
|
context "that rendered a template" do
|
17
17
|
setup_for_assertion_test { get :foo_bar }
|
18
18
|
|
19
|
-
assertion_test_passes("when rendered template name matches expectation") do
|
19
|
+
assertion_test_passes("when rendered template name matches expectation", %Q{renders template "foo_bar"}) do
|
20
20
|
topic.asserts_controller.renders_template('foo_bar')
|
21
21
|
end
|
22
22
|
|
@@ -29,11 +29,11 @@ context "Asserting the rendered template for an action" do
|
|
29
29
|
context "that did not render a template, as was expected" do
|
30
30
|
setup_for_assertion_test { get :text_me }
|
31
31
|
|
32
|
-
assertion_test_passes("when providing nil as expectation") do
|
32
|
+
assertion_test_passes("when providing nil as expectation", %Q{renders template ""}) do
|
33
33
|
topic.asserts_controller.renders_template(nil)
|
34
34
|
end
|
35
35
|
|
36
|
-
assertion_test_passes("when providing empty string as expectation") do
|
36
|
+
assertion_test_passes("when providing empty string as expectation", %Q{renders template ""}) do
|
37
37
|
topic.asserts_controller.renders_template("")
|
38
38
|
end
|
39
39
|
end # that did not render a template, as was expected
|
@@ -8,8 +8,8 @@ context "Asserting the body of a response" do
|
|
8
8
|
setup do
|
9
9
|
@situation = Riot::Situation.new
|
10
10
|
context = Riot::Context.new("renders") {}
|
11
|
-
context.controlling(:renders).
|
12
|
-
context.setup { get :index }.
|
11
|
+
context.controlling(:renders).run(@situation)
|
12
|
+
context.setup { get :index }.run(@situation)
|
13
13
|
context
|
14
14
|
end
|
15
15
|
|
@@ -10,15 +10,20 @@ context "Asserting the response status for an action" do
|
|
10
10
|
setup do
|
11
11
|
@situation = Riot::Situation.new
|
12
12
|
context = Riot::Context.new("response status") {}
|
13
|
-
context.controlling(:response_codes).
|
13
|
+
context.controlling(:response_codes).run(@situation)
|
14
14
|
context
|
15
15
|
end
|
16
16
|
|
17
17
|
context "returning OK" do
|
18
18
|
setup_for_assertion_test { get :ok_go }
|
19
19
|
|
20
|
-
assertion_test_passes("when asked if :ok"
|
21
|
-
|
20
|
+
assertion_test_passes("when asked if :ok", "returns response code 200") do
|
21
|
+
topic.asserts_controller.response_code(:ok)
|
22
|
+
end
|
23
|
+
|
24
|
+
assertion_test_passes("when asked if 200", "returns response code 200") do
|
25
|
+
topic.asserts_controller.response_code(200)
|
26
|
+
end
|
22
27
|
|
23
28
|
assertion_test_fails("when CONTINUE returned instead", %Q{expected response code 100, not 200}) do
|
24
29
|
topic.asserts_controller.response_code(100)
|
@@ -27,14 +32,26 @@ context "Asserting the response status for an action" do
|
|
27
32
|
|
28
33
|
context "that is redirecting" do
|
29
34
|
setup_for_assertion_test { get :fffound }
|
30
|
-
|
31
|
-
assertion_test_passes("when asked if
|
35
|
+
|
36
|
+
assertion_test_passes("when asked if :found", "returns response code 302") do
|
37
|
+
topic.asserts_controller.response_code(:found)
|
38
|
+
end
|
39
|
+
|
40
|
+
assertion_test_passes("when asked if 302", "returns response code 302") do
|
41
|
+
topic.asserts_controller.response_code(302)
|
42
|
+
end
|
32
43
|
end # that is redirecting
|
33
44
|
|
34
45
|
context "that has explicit status" do
|
35
46
|
setup_for_assertion_test { get :make_me }
|
36
|
-
|
37
|
-
assertion_test_passes("when asked if
|
47
|
+
|
48
|
+
assertion_test_passes("when asked if :created", "returns response code 201") do
|
49
|
+
topic.asserts_controller.response_code(:created)
|
50
|
+
end
|
51
|
+
|
52
|
+
assertion_test_passes("when asked if 201", "returns response code 201") do
|
53
|
+
topic.asserts_controller.response_code(201)
|
54
|
+
end
|
38
55
|
end # that has explicit status
|
39
56
|
|
40
57
|
end # Asserting the status of a response
|
@@ -6,11 +6,11 @@ context "The allow_values_for assertion macro" do
|
|
6
6
|
|
7
7
|
should("pass when attribute allows a value") do
|
8
8
|
topic.allows_values_for(:email, "a@b.cd").run(Riot::Situation.new)
|
9
|
-
end.equals([:pass])
|
9
|
+
end.equals([:pass, nil])
|
10
10
|
|
11
11
|
should("pass when attribute allows multiple values") do
|
12
12
|
topic.allows_values_for(:email, "a@b.cd", "e@f.gh").run(Riot::Situation.new)
|
13
|
-
end.equals([:pass])
|
13
|
+
end.equals([:pass, nil])
|
14
14
|
|
15
15
|
should("fail when attribute is provided a valid and an invalid value") do
|
16
16
|
topic.allows_values_for(:email, "a", "e@f.gh").run(Riot::Situation.new)
|
@@ -23,13 +23,42 @@ context "The does_not_allow_values_for assertion macro" do
|
|
23
23
|
|
24
24
|
should("pass when attribute does not allow a value") do
|
25
25
|
topic.does_not_allow_values_for(:email, "a").run(Riot::Situation.new)
|
26
|
-
end.equals([:pass])
|
26
|
+
end.equals([:pass, nil])
|
27
27
|
|
28
28
|
should("pass when attribute does not allow multiple values") do
|
29
29
|
topic.does_not_allow_values_for(:email, "a", "e").run(Riot::Situation.new)
|
30
|
-
end.equals([:pass])
|
30
|
+
end.equals([:pass, nil])
|
31
31
|
|
32
32
|
should("fail when attribute is provided a valid and an invalid value") do
|
33
33
|
topic.does_not_allow_values_for(:email, "a", "e@f.gh").run(Riot::Situation.new)
|
34
34
|
end.equals([:fail, %Q{expected :email not to allow value(s) ["e@f.gh"]}])
|
35
35
|
end # The does_not_allow_values_for assertion macro
|
36
|
+
|
37
|
+
context "The is_invalid_when assertion macro" do
|
38
|
+
setup_test_context
|
39
|
+
setup { topic.asserts("room") { Room.new } }
|
40
|
+
|
41
|
+
should("pass when attribute is invalid") do
|
42
|
+
topic.is_invalid_when(:email, "fake").run(Riot::Situation.new)
|
43
|
+
end.equals([:pass, %Q{attribute :email is invalid}])
|
44
|
+
|
45
|
+
should("pass when error message equals one in its list of errors") do
|
46
|
+
topic.is_invalid_when(:email, "fake", "is invalid").run(Riot::Situation.new)
|
47
|
+
end.equals([:pass, %Q{attribute :email is invalid}])
|
48
|
+
|
49
|
+
should("pass when error message matches one in its list of errors") do
|
50
|
+
topic.is_invalid_when(:email, "fake", /invalid/).run(Riot::Situation.new)
|
51
|
+
end.equals([:pass, %Q{attribute :email is invalid}])
|
52
|
+
|
53
|
+
should("fail when attribute is valid") do
|
54
|
+
topic.is_invalid_when(:email, "a@b.cd", "is invalid").run(Riot::Situation.new)
|
55
|
+
end.equals([:fail, %Q{expected :email to be invalid when value is "a@b.cd"}])
|
56
|
+
|
57
|
+
should("fail when exact error message not found") do
|
58
|
+
topic.is_invalid_when(:email, "fake", "can't be blank").run(Riot::Situation.new)
|
59
|
+
end.equals([:fail, %Q{expected :email to be invalid with error message "can't be blank"}])
|
60
|
+
|
61
|
+
should("fail when error message not matched to returned errors") do
|
62
|
+
topic.is_invalid_when(:email, "fake", /blank/).run(Riot::Situation.new)
|
63
|
+
end.equals([:fail, %Q{expected :email to be invalid with error message /blank/}])
|
64
|
+
end # The is_invalid_when assertion macro
|
@@ -6,7 +6,7 @@ context "The has_many assertion macro" do
|
|
6
6
|
|
7
7
|
should("pass when record has a has_many association defined for attribute") do
|
8
8
|
topic.has_many(:doors).run(Riot::Situation.new)
|
9
|
-
end.equals([:pass])
|
9
|
+
end.equals([:pass, "has many :doors"])
|
10
10
|
|
11
11
|
should("fail when record does not have a has_many association defined for attribute") do
|
12
12
|
topic.has_many(:windows).run(Riot::Situation.new)
|
@@ -6,7 +6,7 @@ context "The validates_presence_of assertion macro" do
|
|
6
6
|
|
7
7
|
should("pass when attribute requires presence") do
|
8
8
|
topic.validates_presence_of(:location).run(Riot::Situation.new)
|
9
|
-
end.equals([:pass])
|
9
|
+
end.equals([:pass, "validates presence of :location"])
|
10
10
|
|
11
11
|
should("fail when attribute does not require presence") do
|
12
12
|
topic.validates_presence_of(:contents).run(Riot::Situation.new)
|
@@ -7,17 +7,17 @@ context "The validates_uniqueness_of assertion macro" do
|
|
7
7
|
topic.asserts("room") do
|
8
8
|
Room.new(:email => "foo@bar.baz", :foo => "what")
|
9
9
|
end.validates_uniqueness_of(:email).run(Riot::Situation.new)
|
10
|
-
end.equals([:fail, "topic is not a new record when testing uniqueness of email"])
|
10
|
+
end.equals([:fail, "topic is not a new record when testing uniqueness of :email"])
|
11
11
|
|
12
12
|
should("pass with a persisted record") do
|
13
13
|
topic.asserts("room") do
|
14
14
|
Room.create_with_good_data(:email => "foo@bar.baz")
|
15
15
|
end.validates_uniqueness_of(:email).run(Riot::Situation.new)
|
16
|
-
end.equals([:pass])
|
16
|
+
end.equals([:pass, ":email is unique"])
|
17
17
|
|
18
18
|
should("fail with a persisted record but not validating uniqueness") do
|
19
19
|
topic.asserts("room") do
|
20
|
-
Room.
|
20
|
+
Room.create_with_good_data(:email => "goo@car.caz")
|
21
21
|
end.validates_uniqueness_of(:foo).run(Riot::Situation.new)
|
22
|
-
end.equals([:fail, "
|
22
|
+
end.equals([:fail, "expected to fail because :foo is not unique"])
|
23
23
|
end # The validates_uniqueness_of assertion macro
|
data/test/teststrap.rb
CHANGED
@@ -90,15 +90,15 @@ module RiotRails
|
|
90
90
|
|
91
91
|
def setup_for_assertion_test(&block)
|
92
92
|
setup do
|
93
|
-
topic.setup(&block).
|
93
|
+
topic.setup(&block).run(@situation)
|
94
94
|
topic
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
def assertion_test_passes(description, &block)
|
98
|
+
def assertion_test_passes(description, success_message=nil, &block)
|
99
99
|
should("pass #{description}") do
|
100
100
|
instance_eval(&block).run(@situation)
|
101
|
-
end.equals([:pass])
|
101
|
+
end.equals([:pass, success_message])
|
102
102
|
end
|
103
103
|
|
104
104
|
def assertion_test_fails(description, failure_message, &block)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riot_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin 'Gus' Knowlden
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-29 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|