require 'teststrap' require 'casclient/frameworks/rails/filter' require 'action_controller' context CASClient::Frameworks::Rails::Filter do helper(:controller_with_session) do |session, request| controller = Object.new stub(controller).session {session} stub(controller).request {request} stub(controller).url_for {"bogusurl"} stub(controller).params {{:ticket => "bogusticket", :renew => false}} controller end setup do CASClient::Frameworks::Rails::Filter.configure( :cas_base_url => 'http://test.local/', :logger => stub! ) end context "fake user without attributes" do setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') } should 'set the session user on #filter' do setup { Hash.new } CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil)) topic end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com' teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) } end context "fake user with attributes" do setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) } should 'set the session user and attributes on #filter' do setup { Hash.new } CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil)) topic end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' } teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) } end context "new service ticket successfully" do should("return successfully from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} pgt = CASClient::ProxyGrantingTicket.new( "PGT-1308586001r9573FAD5A8C62E134A4AA93273F226BD3F0C3A983DCCCD176", "PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B") raw_text = " rich.yarger@vibes.com PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B " response = CASClient::ValidationResponse.new(raw_text) any_instance_of(CASClient::Client, :request_cas_response => response) any_instance_of(CASClient::Client, :retrieve_proxy_granting_ticket => pgt) controller = controller_with_session(topic,mock_request) CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(true) end context "new service ticket with invalid service ticket" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} raw_text = " Some Error Text " response = CASClient::ValidationResponse.new(raw_text) any_instance_of(CASClient::Client, :request_cas_response => response) stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"} controller = controller_with_session(topic,mock_request) CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(false) end context "no new service ticket but with last service ticket" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"} controller = controller_with_session(topic,mock_request) stub(controller).params {{}} CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(false) end context "no new service ticket sent through gateway, gatewaying off" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"} CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = false controller = controller_with_session(topic,mock_request) controller.session[:cas_sent_to_gateway] = true stub(controller).params {{}} CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(false) end context "no new service ticket sent through gateway, gatewaying on" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = true controller = controller_with_session(topic,mock_request) controller.session[:cas_sent_to_gateway] = true stub(controller).params {{}} CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(true) end context "new service ticket with no PGT" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} raw_text = " rich.yarger@vibes.com PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B " response = CASClient::ValidationResponse.new(raw_text) any_instance_of(CASClient::Client, :request_cas_response => response) any_instance_of(CASClient::Client, :retrieve_proxy_granting_ticket => lambda{raise CASClient::CASException}) controller = controller_with_session(topic,mock_request) CASClient::Frameworks::Rails::Filter.filter(controller) end.raises(CASClient::CASException) end context "new service ticket, but cannot connect to CASServer" do should("return failure from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} any_instance_of(CASClient::Client, :request_cas_response => lambda{raise "Some exception"}) controller = controller_with_session(topic,mock_request) CASClient::Frameworks::Rails::Filter.filter(controller) end.raises(RuntimeError) end context "reuse service ticket successfully" do should("return successfully from filter") do setup { Hash.new } mock_request = ActionController::Request.new({}) mock(mock_request).post? {true} mock_client = CASClient::Client.new() mock(mock_client).request_cas_response().never mock(mock_client).retrieve_proxy_granting_ticket().never CASClient::Frameworks::Rails::Filter.send(:class_variable_set, :@@client, mock_client) topic[:cas_last_valid_ticket] = 'bogusticket' topic[:cas_last_valid_ticket_service] = 'bogusurl' controller = controller_with_session(topic,mock_request) CASClient::Frameworks::Rails::Filter.filter(controller) end.equals(true) end end