web/lib/django/contrib/sessions/tests.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 r"""
       
     2 
       
     3 >>> from django.conf import settings
       
     4 >>> from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
       
     5 >>> from django.contrib.sessions.backends.cache import SessionStore as CacheSession
       
     6 >>> from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession
       
     7 >>> from django.contrib.sessions.backends.file import SessionStore as FileSession
       
     8 >>> from django.contrib.sessions.backends.base import SessionBase
       
     9 >>> from django.contrib.sessions.models import Session
       
    10 
       
    11 >>> db_session = DatabaseSession()
       
    12 >>> db_session.modified
       
    13 False
       
    14 >>> db_session.get('cat')
       
    15 >>> db_session['cat'] = "dog"
       
    16 >>> db_session.modified
       
    17 True
       
    18 >>> db_session.pop('cat')
       
    19 'dog'
       
    20 >>> db_session.pop('some key', 'does not exist')
       
    21 'does not exist'
       
    22 >>> db_session.save()
       
    23 >>> db_session.exists(db_session.session_key)
       
    24 True
       
    25 >>> db_session.delete(db_session.session_key)
       
    26 >>> db_session.exists(db_session.session_key)
       
    27 False
       
    28 
       
    29 >>> db_session['foo'] = 'bar'
       
    30 >>> db_session.save()
       
    31 >>> db_session.exists(db_session.session_key)
       
    32 True
       
    33 >>> prev_key = db_session.session_key
       
    34 >>> db_session.flush()
       
    35 >>> db_session.exists(prev_key)
       
    36 False
       
    37 >>> db_session.session_key == prev_key
       
    38 False
       
    39 >>> db_session.modified, db_session.accessed
       
    40 (True, True)
       
    41 >>> db_session['a'], db_session['b'] = 'c', 'd'
       
    42 >>> db_session.save()
       
    43 >>> prev_key = db_session.session_key
       
    44 >>> prev_data = db_session.items()
       
    45 >>> db_session.cycle_key()
       
    46 >>> db_session.session_key == prev_key
       
    47 False
       
    48 >>> db_session.items() == prev_data
       
    49 True
       
    50 
       
    51 # Submitting an invalid session key (either by guessing, or if the db has
       
    52 # removed the key) results in a new key being generated.
       
    53 >>> Session.objects.filter(pk=db_session.session_key).delete()
       
    54 >>> db_session = DatabaseSession(db_session.session_key)
       
    55 >>> db_session.save()
       
    56 >>> DatabaseSession('1').get('cat')
       
    57 
       
    58 #
       
    59 # Cached DB session tests
       
    60 #
       
    61 
       
    62 >>> cdb_session = CacheDBSession()
       
    63 >>> cdb_session.modified
       
    64 False
       
    65 >>> cdb_session['cat'] = "dog"
       
    66 >>> cdb_session.modified
       
    67 True
       
    68 >>> cdb_session.pop('cat')
       
    69 'dog'
       
    70 >>> cdb_session.pop('some key', 'does not exist')
       
    71 'does not exist'
       
    72 >>> cdb_session.save()
       
    73 >>> cdb_session.exists(cdb_session.session_key)
       
    74 True
       
    75 >>> cdb_session.delete(cdb_session.session_key)
       
    76 >>> cdb_session.exists(cdb_session.session_key)
       
    77 False
       
    78 
       
    79 #
       
    80 # File session tests.
       
    81 #
       
    82 
       
    83 # Do file session tests in an isolated directory, and kill it after we're done.
       
    84 >>> original_session_file_path = settings.SESSION_FILE_PATH
       
    85 >>> import tempfile
       
    86 >>> temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp()
       
    87 
       
    88 >>> file_session = FileSession()
       
    89 >>> file_session.modified
       
    90 False
       
    91 >>> file_session['cat'] = "dog"
       
    92 >>> file_session.modified
       
    93 True
       
    94 >>> file_session.pop('cat')
       
    95 'dog'
       
    96 >>> file_session.pop('some key', 'does not exist')
       
    97 'does not exist'
       
    98 >>> file_session.save()
       
    99 >>> file_session.exists(file_session.session_key)
       
   100 True
       
   101 >>> file_session.delete(file_session.session_key)
       
   102 >>> file_session.exists(file_session.session_key)
       
   103 False
       
   104 >>> FileSession('1').get('cat')
       
   105 
       
   106 >>> file_session['foo'] = 'bar'
       
   107 >>> file_session.save()
       
   108 >>> file_session.exists(file_session.session_key)
       
   109 True
       
   110 >>> prev_key = file_session.session_key
       
   111 >>> file_session.flush()
       
   112 >>> file_session.exists(prev_key)
       
   113 False
       
   114 >>> file_session.session_key == prev_key
       
   115 False
       
   116 >>> file_session.modified, file_session.accessed
       
   117 (True, True)
       
   118 >>> file_session['a'], file_session['b'] = 'c', 'd'
       
   119 >>> file_session.save()
       
   120 >>> prev_key = file_session.session_key
       
   121 >>> prev_data = file_session.items()
       
   122 >>> file_session.cycle_key()
       
   123 >>> file_session.session_key == prev_key
       
   124 False
       
   125 >>> file_session.items() == prev_data
       
   126 True
       
   127 
       
   128 >>> Session.objects.filter(pk=file_session.session_key).delete()
       
   129 >>> file_session = FileSession(file_session.session_key)
       
   130 >>> file_session.save()
       
   131 
       
   132 # Make sure the file backend checks for a good storage dir
       
   133 >>> settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
       
   134 >>> FileSession()
       
   135 Traceback (innermost last):
       
   136     ...
       
   137 ImproperlyConfigured: The session storage path '/if/this/directory/exists/you/have/a/weird/computer' doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data.
       
   138 
       
   139 # Clean up after the file tests
       
   140 >>> settings.SESSION_FILE_PATH = original_session_file_path
       
   141 >>> import shutil
       
   142 >>> shutil.rmtree(temp_session_store)
       
   143 
       
   144 #
       
   145 # Cache-based tests
       
   146 # NB: be careful to delete any sessions created; stale sessions fill up the
       
   147 # /tmp and eventually overwhelm it after lots of runs (think buildbots)
       
   148 #
       
   149 
       
   150 >>> cache_session = CacheSession()
       
   151 >>> cache_session.modified
       
   152 False
       
   153 >>> cache_session['cat'] = "dog"
       
   154 >>> cache_session.modified
       
   155 True
       
   156 >>> cache_session.pop('cat')
       
   157 'dog'
       
   158 >>> cache_session.pop('some key', 'does not exist')
       
   159 'does not exist'
       
   160 >>> cache_session.save()
       
   161 >>> cache_session.delete(cache_session.session_key)
       
   162 >>> cache_session.exists(cache_session.session_key)
       
   163 False
       
   164 >>> cache_session['foo'] = 'bar'
       
   165 >>> cache_session.save()
       
   166 >>> cache_session.exists(cache_session.session_key)
       
   167 True
       
   168 >>> prev_key = cache_session.session_key
       
   169 >>> cache_session.flush()
       
   170 >>> cache_session.exists(prev_key)
       
   171 False
       
   172 >>> cache_session.session_key == prev_key
       
   173 False
       
   174 >>> cache_session.modified, cache_session.accessed
       
   175 (True, True)
       
   176 >>> cache_session['a'], cache_session['b'] = 'c', 'd'
       
   177 >>> cache_session.save()
       
   178 >>> prev_key = cache_session.session_key
       
   179 >>> prev_data = cache_session.items()
       
   180 >>> cache_session.cycle_key()
       
   181 >>> cache_session.session_key == prev_key
       
   182 False
       
   183 >>> cache_session.items() == prev_data
       
   184 True
       
   185 >>> cache_session = CacheSession()
       
   186 >>> cache_session.save()
       
   187 >>> key = cache_session.session_key
       
   188 >>> cache_session.exists(key)
       
   189 True
       
   190 
       
   191 >>> Session.objects.filter(pk=cache_session.session_key).delete()
       
   192 >>> cache_session = CacheSession(cache_session.session_key)
       
   193 >>> cache_session.save()
       
   194 >>> cache_session.delete(cache_session.session_key)
       
   195 
       
   196 >>> s = SessionBase()
       
   197 >>> s._session['some key'] = 'exists' # Pre-populate the session with some data
       
   198 >>> s.accessed = False   # Reset to pretend this wasn't accessed previously
       
   199 
       
   200 >>> s.accessed, s.modified
       
   201 (False, False)
       
   202 
       
   203 >>> s.pop('non existant key', 'does not exist')
       
   204 'does not exist'
       
   205 >>> s.accessed, s.modified
       
   206 (True, False)
       
   207 
       
   208 >>> s.setdefault('foo', 'bar')
       
   209 'bar'
       
   210 >>> s.setdefault('foo', 'baz')
       
   211 'bar'
       
   212 
       
   213 >>> s.accessed = False  # Reset the accessed flag
       
   214 
       
   215 >>> s.pop('some key')
       
   216 'exists'
       
   217 >>> s.accessed, s.modified
       
   218 (True, True)
       
   219 
       
   220 >>> s.pop('some key', 'does not exist')
       
   221 'does not exist'
       
   222 
       
   223 
       
   224 >>> s.get('update key', None)
       
   225 
       
   226 # test .update()
       
   227 >>> s.modified = s.accessed = False   # Reset to pretend this wasn't accessed previously
       
   228 >>> s.update({'update key':1})
       
   229 >>> s.accessed, s.modified
       
   230 (True, True)
       
   231 >>> s.get('update key', None)
       
   232 1
       
   233 
       
   234 # test .has_key()
       
   235 >>> s.modified = s.accessed = False   # Reset to pretend this wasn't accessed previously
       
   236 >>> s.has_key('update key')
       
   237 True
       
   238 >>> s.accessed, s.modified
       
   239 (True, False)
       
   240 
       
   241 # test .values()
       
   242 >>> s = SessionBase()
       
   243 >>> s.values()
       
   244 []
       
   245 >>> s.accessed
       
   246 True
       
   247 >>> s['x'] = 1
       
   248 >>> s.values()
       
   249 [1]
       
   250 
       
   251 # test .iterkeys()
       
   252 >>> s.accessed = False
       
   253 >>> i = s.iterkeys()
       
   254 >>> hasattr(i,'__iter__')
       
   255 True
       
   256 >>> s.accessed
       
   257 True
       
   258 >>> list(i)
       
   259 ['x']
       
   260 
       
   261 # test .itervalues()
       
   262 >>> s.accessed = False
       
   263 >>> i = s.itervalues()
       
   264 >>> hasattr(i,'__iter__')
       
   265 True
       
   266 >>> s.accessed
       
   267 True
       
   268 >>> list(i)
       
   269 [1]
       
   270 
       
   271 # test .iteritems()
       
   272 >>> s.accessed = False
       
   273 >>> i = s.iteritems()
       
   274 >>> hasattr(i,'__iter__')
       
   275 True
       
   276 >>> s.accessed
       
   277 True
       
   278 >>> list(i)
       
   279 [('x', 1)]
       
   280 
       
   281 # test .clear()
       
   282 >>> s.modified = s.accessed = False
       
   283 >>> s.items()
       
   284 [('x', 1)]
       
   285 >>> s.clear()
       
   286 >>> s.items()
       
   287 []
       
   288 >>> s.accessed, s.modified
       
   289 (True, True)
       
   290 
       
   291 #########################
       
   292 # Custom session expiry #
       
   293 #########################
       
   294 
       
   295 >>> from django.conf import settings
       
   296 >>> from datetime import datetime, timedelta
       
   297 
       
   298 >>> td10 = timedelta(seconds=10)
       
   299 
       
   300 # A normal session has a max age equal to settings
       
   301 >>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
       
   302 True
       
   303 
       
   304 # So does a custom session with an idle expiration time of 0 (but it'll expire
       
   305 # at browser close)
       
   306 >>> s.set_expiry(0)
       
   307 >>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
       
   308 True
       
   309 
       
   310 # Custom session idle expiration time
       
   311 >>> s.set_expiry(10)
       
   312 >>> delta = s.get_expiry_date() - datetime.now()
       
   313 >>> delta.seconds in (9, 10)
       
   314 True
       
   315 >>> age = s.get_expiry_age()
       
   316 >>> age in (9, 10)
       
   317 True
       
   318 
       
   319 # Custom session fixed expiry date (timedelta)
       
   320 >>> s.set_expiry(td10)
       
   321 >>> delta = s.get_expiry_date() - datetime.now()
       
   322 >>> delta.seconds in (9, 10)
       
   323 True
       
   324 >>> age = s.get_expiry_age()
       
   325 >>> age in (9, 10)
       
   326 True
       
   327 
       
   328 # Custom session fixed expiry date (fixed datetime)
       
   329 >>> s.set_expiry(datetime.now() + td10)
       
   330 >>> delta = s.get_expiry_date() - datetime.now()
       
   331 >>> delta.seconds in (9, 10)
       
   332 True
       
   333 >>> age = s.get_expiry_age()
       
   334 >>> age in (9, 10)
       
   335 True
       
   336 
       
   337 # Set back to default session age
       
   338 >>> s.set_expiry(None)
       
   339 >>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
       
   340 True
       
   341 
       
   342 # Allow to set back to default session age even if no alternate has been set
       
   343 >>> s.set_expiry(None)
       
   344 
       
   345 
       
   346 # We're changing the setting then reverting back to the original setting at the
       
   347 # end of these tests.
       
   348 >>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
       
   349 >>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
       
   350 
       
   351 # Custom session age
       
   352 >>> s.set_expiry(10)
       
   353 >>> s.get_expire_at_browser_close()
       
   354 False
       
   355 
       
   356 # Custom expire-at-browser-close
       
   357 >>> s.set_expiry(0)
       
   358 >>> s.get_expire_at_browser_close()
       
   359 True
       
   360 
       
   361 # Default session age
       
   362 >>> s.set_expiry(None)
       
   363 >>> s.get_expire_at_browser_close()
       
   364 False
       
   365 
       
   366 >>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
       
   367 
       
   368 # Custom session age
       
   369 >>> s.set_expiry(10)
       
   370 >>> s.get_expire_at_browser_close()
       
   371 False
       
   372 
       
   373 # Custom expire-at-browser-close
       
   374 >>> s.set_expiry(0)
       
   375 >>> s.get_expire_at_browser_close()
       
   376 True
       
   377 
       
   378 # Default session age
       
   379 >>> s.set_expiry(None)
       
   380 >>> s.get_expire_at_browser_close()
       
   381 True
       
   382 
       
   383 >>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close
       
   384 """
       
   385 
       
   386 if __name__ == '__main__':
       
   387     import doctest
       
   388     doctest.testmod()