<NME> message_spec.rb
<BEF> # encoding: utf-8

require_relative "../../spec_helper"

require "rack/mock"
require "rango/controller"
require "rango/mixins/message"
require "rango/mixins/rendering"

# HACK because of rSpec, the trouble was:
# TestController.method_defined?(:context) => true
Rango::Controller.send(:undef_method, :context)

class TestController < Rango::Controller
  include Rango::MessageMixin
end

describe Rango::MessageMixin do
  before(:each) do
    @env = Rack::MockRequest.env_for("/?msg")
    @controller = TestController.new(@env)
  end

  describe ".included" do
    it "should not do anything if method context isn't defined" do
      @controller.should_not respond_to(:context)
    end

    class ExplicitRenderingController < Rango::Controller
      include Rango::ExplicitRendering
      include Rango::MessageMixin
    end

    it "should add message to context if method context is defined" do
      controller = ExplicitRenderingController.new(@env)
      controller.context.should have_key(:message)
    end
  end

  describe "#message" do
    before(:each) do
      @env = Rack::MockRequest.env_for("/")
    end

    it "should" do
      @env["QUERY_STRING"] = "msg=Hello%20There%21"
      controller = TestController.new(@env)
      controller.message.should eql("Hello There!")
    end

    it "should" do
      @env["QUERY_STRING"] = "msg%5Berror%5D%3DHello%20There%21"
      controller = TestController.new(@env)
      controller.message[:error].should eql("Hello There!")
    end

    it "should" do
      @env["QUERY_STRING"] = "msg%5Berror%5D=Hello%20There%21&msg%5Bnotice%5D=Welcome%21"
      controller = TestController.new(@env)
      controller.message[:error].should eql("Hello There!")
      controller.message[:notice].should eql("Welcome!")
    end
  end

  describe "#redirect" do
    before(:each) do
      @env  = Rack::MockRequest.env_for("/")
      Posts = Class.new(Rango::Controller) { include Rango::MessageMixin }
      @controller = Posts.new(@env)
    end

    it "should be satisfied just with url" do
      @controller.redirect("/")
      @controller.status.should eql(302)
      @controller.headers["Location"].should eql("http://example.org/")
    end

    it "should be satisfied just with url" do
      @controller.redirect("/", "Try again")
      @controller.headers["Location"].should eql("http://example.org/?msg=Try%20again")
    end

    it "should be satisfied just with url" do
      @controller.redirect("/", error: "Try again")
      @controller.headers["Location"].should eql("http://example.org/?msg[error]=Try%20again")
    end
  end
end

<MSG> Controller#redirect raise a Redirection exception now

<DFF> @@ -64,25 +64,35 @@ describe Rango::MessageMixin do
 
   describe "#redirect" do
     before(:each) do
-      @env  = Rack::MockRequest.env_for("/")
-      Posts = Class.new(Rango::Controller) { include Rango::MessageMixin }
-      @controller = Posts.new(@env)
+      @env        = Rack::MockRequest.env_for("/")
+      @controller = TestController.new(@env)
     end
 
     it "should be satisfied just with url" do
-      @controller.redirect("/")
-      @controller.status.should eql(302)
-      @controller.headers["Location"].should eql("http://example.org/")
+      begin
+        @controller.redirect("/")
+      rescue Rango::Exceptions::Redirection => redirection
+        redirection.status.should eql(303)
+        redirection.headers["Location"].should eql("http://example.org")
+      end
     end
 
     it "should be satisfied just with url" do
-      @controller.redirect("/", "Try again")
-      @controller.headers["Location"].should eql("http://example.org/?msg=Try%20again")
+      begin
+        @controller.redirect("/", "Try again")
+      rescue Rango::Exceptions::Redirection => redirection
+        redirection.status.should eql(303)
+        redirection.headers["Location"].should eql("http://example.org/?msg=Try%20again")
+      end
     end
 
     it "should be satisfied just with url" do
-      @controller.redirect("/", error: "Try again")
-      @controller.headers["Location"].should eql("http://example.org/?msg[error]=Try%20again")
+      begin
+        @controller.redirect("/", error: "Try again")
+      rescue Rango::Exceptions::Redirection => redirection
+        redirection.status.should eql(303)
+        redirection.headers["Location"].should eql("http://example.org/?msg[error]=Try%20again")
+      end
     end
   end
 end

Controller#redirect raise a Redirection exception now