How do I manipulate the session data in an integration test? We have a controller that manipulates session data, and I want to see, passing in certain session data, what comes out. The session is available in integration tests through module ActionController::TestProcess def session @response.session end So if I perform session[:new_key] = ''new_value'' session.update get ''/some_controller/some_action'' assert_nil session[:new_key] this will pass, in other words, it is not possible to manipulate the session used for the __next__ request in this manner. One can only inspect the session What can I do? Stephan -- 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 -~----------~----~----~----~------~----~------~--~---
shouldn''t that be @request.session, not @response.session? On Jul 30, 2:17 pm, Stephan Wehner <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> How do I manipulate the session data in an integration test? > > We have a controller that manipulates session data, and I want to see, > passing in certain session data, what comes out. > > The session is available in integration tests through module > ActionController::TestProcess > > def session > @response.session > end > > So if I perform > > session[:new_key] = ''new_value'' > session.update > > get ''/some_controller/some_action'' > > assert_nil session[:new_key] > > this will pass, in other words, it is not possible to manipulate the > session used for the __next__ request in this manner. One can only > inspect the session > > What can I do? > > Stephan > -- > 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Jeff Emminger wrote:> shouldn''t that be @request.session, not @response.session? >Thanks for your reply, I''m not clear what you are referring to. The snippet def session @response.session end that I pasted is from the module, ActionController::TestProcess Either way, I set @request.session[:new_key] = ''new_value'' and it doesn''t survive calling get ''/some_controller/some_action'' The integration test re-initializes the session object for each request. Still stuck -- Stephan -- 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 -~----------~----~----~----~------~----~------~--~---
ah... i actually haven''t used integration tests yet anyway ;-) came across this though, seems to deal with simulating multiple users in an integration test... perhaps it will give you some ideas http://weblog.jamisbuck.org/2006/3/9/integration-testing-in-rails-1-1 On Jul 30, 6:25 pm, Stephan Wehner <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Jeff Emminger wrote: > > shouldn''t that be @request.session, not @response.session? > > Thanks for your reply, I''m not clear what you are referring to. The > snippet > > def session > @response.session > end > > that I pasted is from the module, ActionController::TestProcess > > Either way, I set @request.session[:new_key] = ''new_value'' and it > doesn''t survive calling > > get ''/some_controller/some_action'' > > The integration test re-initializes the session object for each request. > > Still stuck -- > > Stephan > -- > 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Jeff Emminger wrote:> ah... i actually haven''t used integration tests yet anyway ;-) > > came across this though, seems to deal with simulating multiple users > in an integration test... perhaps it will give you some ideas > http://weblog.jamisbuck.org/2006/3/9/integration-testing-in-rails-1-1 > > > On Jul 30, 6:25 pm, Stephan Wehner <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>Well, thanks -- they talk about sessions as in "user sessions" ("Bob logs in, Bob does this, Stacey logs in, Stacey does that...). Whereas I''m looking at the CGI::Session object that is stored on the server side, and available as @response.session / @request.session or just session. Stephan -- 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 -~----------~----~----~----~------~----~------~--~---
I ran into the same problem and never really found a good answer via the test objects. The only solution I saw was to actually update the session via a controller. I defined a new action in one of my controllers from within test_helper (so the action does not exist when actually runnning the application). I also had to create an entry in routes. Maybe there''s a better way to update routes while testing. So from my integration test I can do the following and verfiy: assert(session[:fake].nil?, "starts empty") v = ''Yuck'' get ''/user_session'', :fake => v assert_equal(v, session[:fake], "value was set") assert(session[:foo].nil?, "starts empty") v_id = ''2'' get ''/user_session'', :foo_id => v_id assert_equal(v, session[:fake], "previous value still set") assert(!session[:foo].nil?, , "object entry exists") assert_equal(v_id.to_i, session[:foo].id, "correct object set") <test_helper.rb> ENV["RAILS_ENV"] = "test" require File.expand_path(File.dirname(__FILE__) + "/../config/environment") require ''test_help'' require ''my_controller'' # Need to be able to set session values for integration tests class MyController def user_session ignore = [''action'', ''controller''] params.each do | key, value| unless ignore.include?(key) if (pos = key.index(''_id'')).nil? session[key.to_sym] = value else new_key = key[0,pos] find_class = new_key.classify.constantize session[new_key.to_sym] = find_class.find(value.to_i) end end end redirect_to "/" end end class Test::Unit::TestCase <rest of standard test_helper follows> Added to routes.rb: map.user_session ''user_session'', :controller => ''my'', :action => ''user_session'' -- 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 -~----------~----~----~----~------~----~------~--~---
Gary Winklosky wrote:> I ran into the same problem and never really found a good answer via the > test objects. The only solution I saw was to actually update the > session via a controller. I defined a new action in one of my > controllers from within test_helper (so the action does not exist when > actually runnning the application). I also had to create an entry in > routes. Maybe there''s a better way to update routes while testing.Yes, I took the same route, although it seems wrong. I also couldn''t figure out what happens to the session objects during integration testing; except it looked like they were copied from one application call to the next and not reused. Here is the class I added to test/integration. In my case I was interested in setting a timestamp. So there is a separate method for that, "set_time_value". One might like to have a method "set_session_value" available in an IntegrationTest. This method could just invoke the get ''/session_set/...'' This would hide this rather clumsy implementation. ------- BEGIN FILE test/integration/session_set_controller.rb ------------ ActionController::Routing.possible_controllers << ''session_set'' class SessionSetController < ApplicationController # # Found it impossible to manipulate session values from within an integration test. # # Add # # require File.dirname(__FILE__) + ''/session_set_controller'' # # Invoke # # get ''/session_set/set_value, :key=>''your_key'', :value=>''your_value'' # def set_value session[params[:key].to_sym] = params[:value] render :nothing => true end def set_time_value session[params[:key].to_sym] = Time.parse(params[:value]) render :nothing => true end end ------- END FILE test/integration/session_set_controller.rb ------------ Related Note: I find the use of the term "session" within integration tests a bit unfortunate (open_session, etc), since there are also these session objects, which are however different. Maybe replace by "user_session" ? Stephan -- 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 -~----------~----~----~----~------~----~------~--~---
I did see how to get something into the request''s env for integration testing: get ''/next_page'', nil, {"HTTP_REFERER" => ''http://localhost:20/last_page''} -- 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 -~----------~----~----~----~------~----~------~--~---