Opened 22 months ago

Closed 16 months ago

Last modified 4 months ago

#21357 closed Bug (fixed)

Test client session does not behave as stated in the django documentation.

Reported by: aaronmerriam@… Owned by: nobody
Component: Testing framework Version: master
Severity: Normal Keywords:
Cc: bmispelon@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

In the documentation for testing, it states that you can run the following code to manually insert values into the test client session.

def test_something(self):
    session = self.client.session
    session['somekey'] = 'test'
    session.save()

https://docs.djangoproject.com/en/1.5/topics/testing/overview/#django.test.client.Client.session

In actuality, self.client.session is of type dict and a calling save() raises an AttributeError.

Change History (7)

comment:1 Changed 22 months ago by bmispelon

  • Cc bmispelon@… added
  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted
  • Version changed from 1.5 to master

I can reproduce this issue.

It looks like the nature of client.session can depend on the settings [1] which might be what's causing the discrepancy here.

I'm not sure if that's indicative of a bug in the test client (maybe it should return something other than a plain dict if contrib.sessions is not installed) or if it's a documentation issue (in which case it should be mentionned that the given code only works with contrib.sessions installed).

In any case, I'm marking this as accepted.

Thanks for the report.

[1] https://github.com/django/django/blob/ed516a5fc8061615ec94bee37425d4fee8ca872b/django/test/client.py#L373-L382

comment:2 Changed 22 months ago by Harm Geerts <hgeerts@…>

There also seems to be a regression in that code from the commit https://github.com/django/django/commit/36b164d838c3de168defe9f1ebc02ea1abc790be

>>> from django.test.client import Client
>>> client = Client()
>>> client.session
{}
>>> client.session['var'] = 'val'
>>> client.session
{}
>>> 

A test case which tested the above used to exist but was removed in https://github.com/django/django/commit/a935e834433cfc691882c2bbf1249a39abecd35b

comment:3 Changed 22 months ago by prestontimmons

I added a pull request with a fix for this:

https://github.com/django/django/pull/1832

For reference, this issue was reported in #15740. That was marked as a duplicate of #10899, but I no longer think that is correct. While the feature in #10899 would fix this case, the behavior it tries to add is more clever than it needs to be.

comment:4 Changed 16 months ago by timo

  • Has patch set
  • Patch needs improvement set

Test on PR does not currently pass (possibly due to upstream changes since the PR was submitted).

comment:5 Changed 16 months ago by Tim Graham <timograham@…>

  • Resolution set to fixed
  • Status changed from new to closed

In be88b062afaa58559bb12623e8ed8843f07b97a1:

Fixed #21357 -- Fixed test client session initialization.

The test client will now create a session when it is first accessed
if no session already exists.

comment:6 Changed 4 months ago by sbaechler

The fix has only been added to the 1.8 branch. In Django 1.7 the behavior is still not the same as stated in the documentation.
https://docs.djangoproject.com/en/1.7/topics/testing/tools/#persistent-state

comment:7 Changed 4 months ago by Tim Graham <timograham@…>

In d42cbde0:

[1.7.x] Refs #21357 -- Added a working session example to the docs.

Note: See TracTickets for help on using tickets.
Back to Top