Wes Gamble
2008-Oct-03 15:29 UTC
Confusion about HTTP header content during functional tests
I''m seeing some header output from various HTTP requests and responses that doesn''t make sense to me. I have a couple of functional tests that appear to work ok. In the course of writing them, I went ahead and created a couple of methods to dump the request and response headers to help me debug and added them to test_helper.rb. They are below: def debug_request puts "\nREQUEST HEADERS\n" @request.headers.each do |header, value| puts "Header: #{header}\tValue: #{value}" end end def debug_response puts "\nRESPONSE HEADERS\n" @response.headers.each do |header, value| puts "Header: #{header}\tValue: #{value}" end end Most of my tests require that the user be logged in before they can do anything, so I have a "login" method in test_helper.rb as well that does a login - I then use this in my setup methods in my various tests. Here''s one of my tests - note the inclusion of debug_request/debug_response in it: class DraftInvoiceSpreadsheetsControllerTest < ActionController::TestCase def setup super login end def test_get_template filename = ''invoice_template.xlt'' assert_not_nil(File.new("#{RAILS_ROOT}/public/#{filename}"), "Excel template doesn''t exist") get :get_template debug_request debug_response assert_response(:success) assert_equal(@response.headers[''type''], "application/octet-stream", "Mime type is incorrect.") assert_equal(@response.headers[''Content-Disposition''], "attachment; filename=\"#{filename}\"", "Attachment should have filename #{filename}") assert_equal(@response.headers[''Content-Transfer-Encoding''], ''binary'', "Content should be binary") end end The output of debug_request is: REQUEST HEADERS Header: REMOTE_ADDR Value: 0.0.0.0 Header: SERVER_PORT Value: 80 Header: REQUEST_METHOD Value: GET Header: REQUEST_URI Value: /account/login?login=admin&password=demo and the output of debug_response is: RESPONSE HEADERS Header: Cache-Control Value: private Header: cookie Value: Header: Status Value: 200 OK Header: Location Value: http://test.host/user Header: X-Runtime Value: 0.02122 Header: type Value: application/octet-stream Header: Content-Length Value: 47104 Header: Content-Disposition Value: attachment; filename="invoice_template.xlt" Header: Content-Transfer-Encoding Value: binary When I look at this output, I end up with the following questions: 1) Why is the request showing the first request to /account/login instead of the request to :get_template? 2) Why is the method on that request to /account/login showing as a GET instead of a POST? 3) Why is the Location header on the response showing to be what it would be right after a login? It almost looks like the @request and @response headers are only updated across multiple requests in the same functional tests and not reset. The Content-Length, Content-Disposition, and Content-Transfer-Encoding are clearly from my :get_template request, which is asking for an Excel template file. If I call debug_request/debug_response right after the login in addition to where I call it above, the output is different (shows methods as POST instead of GET for example). It definitely looks like the @request and @response headers are added to/updated and not cleared between requests. Can anyone shed any light on how @request and @response are modified/handled during functional tests? Thanks, Wes -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-03 15:40 UTC
Re: Confusion about HTTP header content during functional tests
On 3 Oct 2008, at 16:29, Wes Gamble wrote:> > When I look at this output, I end up with the following questions: > > 1) Why is the request showing the first request to /account/login > instead of the request to :get_template? > > 2) Why is the method on that request to /account/login showing as a > GET > instead of a POST? > > 3) Why is the Location header on the response showing to be what it > would be right after a login? >Does your login method actually do a request? that would explain everything. @request, @response etc... are not reset if you perform multiple requests from a single functional test. Fred>--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Wes Gamble
2008-Oct-03 15:59 UTC
Re: Confusion about HTTP header content during functional tests
Frederick Cheung wrote:> On 3 Oct 2008, at 16:29, Wes Gamble wrote: > >> 3) Why is the Location header on the response showing to be what it >> would be right after a login? >> > > Does your login method actually do a request? that would explain > everything. @request, @response etc... are not reset if you perform > multiple requests from a single functional test. > > FredYeah it does. Here''s the login method: def login(user = ''blah'', password = ''blah'') old_controller = @controller @controller = AccountController.new post :login, :login => user, :password => password assert_response(:redirect) assert_equal(flash[:notice], "Logged in successfully", "Should be logged in.") @controller = old_controller end Thanks, Fred. Just verifying. Wes -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-03 16:30 UTC
Re: Confusion about HTTP header content during functional tests
Well you cab either create fresh controller/request/response objects, or (what I would do) change your login helper to just fake up the session to make it looked like the person is logged in (play with @request.session ) Sent from my iPhone On 3 Oct 2008, at 16:59, Wes Gamble <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> > Frederick Cheung wrote: >> On 3 Oct 2008, at 16:29, Wes Gamble wrote: >> >>> 3) Why is the Location header on the response showing to be what it >>> would be right after a login? >>> >> >> Does your login method actually do a request? that would explain >> everything. @request, @response etc... are not reset if you perform >> multiple requests from a single functional test. >> >> Fred > > Yeah it does. Here''s the login method: > > def login(user = ''blah'', password = ''blah'') > old_controller = @controller > @controller = AccountController.new > post :login, :login => user, :password => password > assert_response(:redirect) > assert_equal(flash[:notice], "Logged in successfully", "Should be > logged in.") > @controller = old_controller > end > > Thanks, Fred. Just verifying. > > Wes > -- > Posted via http://www.ruby-forum.com/. > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Wes Gamble
2008-Oct-03 18:04 UTC
Re: Confusion about HTTP header content during functional tests
I saw that you can just manipulate the session data to handle this, and that is simpler. But of course, I''m stubborn and I preferred the idea of actually "doing" the login as part of the functional test. I have worked around it, and here''s the code that does it: def login(user = ''blah'', password = ''blah'') old_controller = @controller @controller = AccountController.new post :login, :login => user, :password => password assert_response(:redirect) assert_equal(flash[:notice], "Logged in successfully", "Should be logged in.") @controller = old_controller reset_request_and_response end #This allows the debug_request and debug_response methods to be used in a multi-request functional test #and actually show the correct information. def reset_request_and_response #Store the current request @previous_request = @request #Make new request and response objects @controller.request = @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new #Move the session data over so we don''t lose any context. @previous_request.session.data.each do |k, v| @request.session[k] = v end end The "login" method calls "reset_request_and_response" which creates a new TestRequest and TestResponse and moves the session data over so that, among other things, the request knows that it is still logged in. Then the dumps of the request and response look correct given the request that I''m really interested in. Also, now you could have multi-request functional tests if you wanted to (although strictly speaking, you probably shouldn''t since each test should test only one interaction). Wes -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-03 18:41 UTC
Re: Confusion about HTTP header content during functional tests
On Oct 3, 7:04 pm, Wes Gamble <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Also, now you could have multi-request functional tests if you wanted toAlso known as an integration test :-) Fred> (although strictly speaking, you probably shouldn''t since each test > should test only one interaction). > > Wes > > -- > Posted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---