-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
redirect_to_matcher.rb
60 lines (49 loc) · 1.39 KB
/
redirect_to_matcher.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
module Shoulda # :nodoc:
module ActionController # :nodoc:
# Ensures a controller redirected to the given url.
#
# Example:
#
# it { should redirect_to('http://somewhere.com') }
# it { should redirect_to(users_path) }
def redirect_to(url_or_description, &block)
RedirectToMatcher.new(url_or_description, self, &block)
end
class RedirectToMatcher # :nodoc:
def initialize(url_or_description, context, &block)
if block
@url_block = block
@location = @url_or_description
else
@url = url_or_description
@location = @url
end
@context = context
end
def in_context(context)
@context = context
self
end
def matches?(controller)
@controller = controller
redirects_to_url?
end
attr_reader :failure_message, :negative_failure_message
def description
"redirect to #{@location}"
end
private
def redirects_to_url?
@url = @context.instance_eval(&@url_block) if @url_block
begin
@context.send(:assert_redirected_to, @url)
@negative_failure_message = "Didn't expect to redirect to #{@url}"
true
rescue Test::Unit::AssertionFailedError => error
@failure_message = error.message
false
end
end
end
end
end