1 # These tests exercise CGI::Session::ActiveRecordStore, so you're going to
2 # need AR in a sibling directory to AP and have SQLite installed.
3 require 'active_record_unit'
4 require 'action_controller/session/active_record_store'
6 module CommonActiveRecordStoreTests
8 s
= session_class
.new(:session_id => '1234', :data => { 'foo' => 'bar' })
9 assert_equal
'bar', s
.data['foo']
11 assert_equal
'bar', s
.data['foo']
13 assert_not_nil t
= session_class
.find_by_session_id('1234')
15 assert_equal
'bar', t
.data['foo']
18 def test_reload_same_session
20 reloaded
= CGI
::Session.new(CGI
.new
, 'session_id' => @new_session.session_id
, 'database_manager' => CGI
::Session::ActiveRecordStore)
21 assert_equal
'bar', reloaded
['foo']
24 def test_tolerates_close_close
25 assert_nothing_raised
do
32 class ActiveRecordStoreTest
< ActiveRecordTestCase
33 include CommonActiveRecordStoreTests
36 CGI
::Session::ActiveRecordStore::Session
44 session_class
.create_table
!
46 ENV['REQUEST_METHOD'] = 'GET'
47 ENV['REQUEST_URI'] = '/'
48 CGI
::Session::ActiveRecordStore.session_class
= session_class
51 @new_session = CGI
::Session.new(@cgi, 'database_manager' => CGI
::Session::ActiveRecordStore, 'new_session' => true)
52 @new_session['foo'] = 'bar'
55 # this test only applies for eager session saving
56 # def test_another_instance
57 # @another = CGI::Session.new(@cgi, 'session_id' => @new_session.session_id, 'database_manager' => CGI::Session::ActiveRecordStore)
58 # assert_equal @new_session.session_id, @another.session_id
61 def test_model_attribute
62 assert_kind_of CGI
::Session::ActiveRecordStore::Session, @new_session.model
63 assert_equal({ 'foo' => 'bar' }, @new_session.model
.data)
66 def test_save_unloaded_session
67 c
= session_class
.connection
68 bogus_class
= c
.quote(ActiveSupport
::Base64.encode64("\004\010o:\vBlammo\000"))
69 c
.insert("INSERT INTO #{session_class.table_name} ('#{session_id_column}', 'data') VALUES ('abcdefghijklmnop', #{bogus_class})")
71 sess
= session_class
.find_by_session_id('abcdefghijklmnop')
75 # because the session is not loaded, the save should be a no-op. If it
76 # isn't, this'll try and unmarshall the bogus class, and should get an error.
77 assert_nothing_raised
{ sess
.save
}
81 session_class
.drop_table
!
85 class ColumnLimitTest
< ActiveRecordTestCase
87 @session_class = CGI
::Session::ActiveRecordStore::Session
88 @session_class.create_table
!
92 @session_class.drop_table
!
95 def test_protection_from_data_larger_than_column
96 # Can't test this unless there is a limit
97 return unless limit
= @session_class.data_column_size_limit
98 too_big
= ':(' * limit
99 s
= @session_class.new(:session_id => '666', :data => {'foo' => too_big
})
101 assert_raise(ActionController
::SessionOverflowError) { s
.save
}
105 class DeprecatedActiveRecordStoreTest
< ActiveRecordStoreTest
106 def session_id_column
111 session_class
.connection
.execute
'create table old_sessions (id integer primary key, sessid text unique, data text)'
112 session_class
.table_name
= 'old_sessions'
113 session_class
.send
:setup_sessid_compatibility!
115 ENV['REQUEST_METHOD'] = 'GET'
116 CGI
::Session::ActiveRecordStore.session_class
= session_class
118 @new_session = CGI
::Session.new(CGI
.new
, 'database_manager' => CGI
::Session::ActiveRecordStore, 'new_session' => true)
119 @new_session['foo'] = 'bar'
123 session_class
.connection
.execute
'drop table old_sessions'
124 session_class
.table_name
= 'sessions'
128 class SqlBypassActiveRecordStoreTest
< ActiveRecordStoreTest
130 unless defined? @session_class
131 @session_class = CGI
::Session::ActiveRecordStore::SqlBypass
132 @session_class.connection
= CGI
::Session::ActiveRecordStore::Session.connection
137 def test_model_attribute
138 assert_kind_of CGI
::Session::ActiveRecordStore::SqlBypass, @new_session.model
139 assert_equal({ 'foo' => 'bar' }, @new_session.model
.data)