Skip to content

Commit

Permalink
Simplify and localize the test fixtures in order to get back to 100% …
Browse files Browse the repository at this point in the history
…coverage.

This also makes the documentation more explicit about what's required.
  • Loading branch information
jamadden committed Nov 17, 2017
1 parent f32f227 commit 4a22c32
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 55 deletions.
27 changes: 23 additions & 4 deletions docs/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,33 @@ requests, be it a cookie or some id mangled into the URL.

.. testsetup::

from zope.session.tests import setUp
from zope.testing import cleanup
from zope.session.session import RAMSessionDataContainer
setUp(RAMSessionDataContainer)
from io import StringIO
from zope.component import provideAdapter
from zope.component import provideUtility
from zope.publisher.http import HTTPRequest
from zope.publisher.interfaces import IRequest
from zope.session.http import CookieClientIdManager
from zope.session.interfaces import IClientId
from zope.session.interfaces import IClientIdManager
from zope.session.interfaces import ISession
from zope.session.interfaces import ISessionDataContainer
from zope.session.session import ClientId
from zope.session.session import PersistentSessionDataContainer
from zope.session.session import Session
cleanup.setUp()
provideAdapter(ClientId, (IRequest,), IClientId)
provideAdapter(Session, (IRequest,), ISession)
provideUtility(CookieClientIdManager(), IClientIdManager)
sdc = RAMSessionDataContainer()
for product_id in ('', 'products.foo', 'products.bar'):
provideUtility(sdc, ISessionDataContainer, product_id)

.. testcleanup::

from zope.session.tests import tearDown
tearDown()
from zope.testing import cleanup
cleanup.tearDown()

The `IClientIdManager` Utility provides this unique id. It is
responsible for propagating this id so that future requests from the
Expand Down
50 changes: 38 additions & 12 deletions src/zope/session/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,20 @@ class ClientId(text_type):
"""
Default implementation of `zope.session.interfaces.IClientId`
>>> from zope.session import tests
>>> request = tests.setUp()
>>> from zope.publisher.http import HTTPRequest
>>> from io import BytesIO
>>> request = HTTPRequest(BytesIO(), {}, None)
>>> from zope.session.interfaces import IClientIdManager
>>> from zope.session.http import CookieClientIdManager
>>> zope.component.provideUtility(CookieClientIdManager(), IClientIdManager)
>>> id1 = ClientId(request)
>>> id2 = ClientId(request)
>>> id1 == id2
True
>>> tests.tearDown()
>>> from zope.testing import cleanup
>>> cleanup.tearDown()
"""

Expand Down Expand Up @@ -401,10 +406,20 @@ def get(self, pkg_id, default=None):
"""
Get session data.
>>> from zope.session import tests
>>> request = tests.setUp(PersistentSessionDataContainer)
>>> from zope.publisher.interfaces import IRequest
>>> from zope.publisher.http import HTTPRequest
>>> from io import BytesIO
>>> from zope.session.interfaces import IClientIdManager, IClientId
>>> from zope.session.interfaces import ISessionDataContainer
>>> from zope.session.http import CookieClientIdManager
>>> zope.component.provideUtility(CookieClientIdManager(), IClientIdManager)
>>> zope.component.provideAdapter(ClientId, (IRequest,), IClientId)
>>> sdc = PersistentSessionDataContainer()
>>> zope.component.provideUtility(sdc, ISessionDataContainer, '')
>>> request = HTTPRequest(BytesIO(), {}, None)
If we use get we get None or default returned if the pkg_id
If we use `get` we get `None` or *default* returned if the *pkg_id*
is not there.
>>> session = Session(request).get('not.there', 'default')
Expand All @@ -425,7 +440,8 @@ def get(self, pkg_id, default=None):
>>> session = Session(request).get('not.there')
>>> session is None
False
>>> tests.tearDown()
>>> import zope.testing.cleanup
>>> zope.testing.cleanup.tearDown()
"""


Expand All @@ -445,11 +461,20 @@ def __getitem__(self, pkg_id):
"""
Get or create session data.
>>> from zope.publisher.interfaces import IRequest
>>> from zope.publisher.http import HTTPRequest
>>> from zope.session import tests
>>> from io import StringIO
>>> request = tests.setUp(PersistentSessionDataContainer)
>>> request2 = HTTPRequest(StringIO(u''), {}, None)
>>> from io import BytesIO
>>> from zope.session.interfaces import IClientIdManager, IClientId
>>> from zope.session.http import CookieClientIdManager
>>> from zope.session.interfaces import ISessionDataContainer
>>> zope.component.provideUtility(CookieClientIdManager(), IClientIdManager)
>>> zope.component.provideAdapter(ClientId, (IRequest,), IClientId)
>>> sdc = PersistentSessionDataContainer()
>>> for product_id in ('', 'products.foo', 'products.bar'):
... zope.component.provideUtility(sdc, ISessionDataContainer, product_id)
>>> request = HTTPRequest(BytesIO(), {}, None)
>>> request2 = HTTPRequest(BytesIO(), {}, None)
>>> ISession.providedBy(Session(request))
True
Expand Down Expand Up @@ -483,7 +508,8 @@ def __getitem__(self, pkg_id):
>>> session3['color']
'vomit'
>>> tests.tearDown()
>>> from zope.testing import cleanup
>>> cleanup.tearDown()
"""
sdc = self._sdc(pkg_id)
Expand Down
52 changes: 13 additions & 39 deletions src/zope/session/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,51 +16,14 @@
import unittest
from zope.testing import cleanup

def setUp(session_data_container_class=None):
from io import StringIO
from zope.component import provideAdapter
from zope.component import provideUtility
from zope.publisher.http import HTTPRequest
from zope.publisher.interfaces import IRequest
from zope.session.http import CookieClientIdManager
from zope.session.interfaces import IClientId
from zope.session.interfaces import IClientIdManager
from zope.session.interfaces import ISession
from zope.session.interfaces import ISessionDataContainer
from zope.session.session import ClientId
from zope.session.session import PersistentSessionDataContainer
from zope.session.session import Session
cleanup.setUp()
if session_data_container_class is None:
session_data_container_class = PersistentSessionDataContainer
provideAdapter(ClientId, (IRequest,), IClientId)
provideAdapter(Session, (IRequest,), ISession)
provideUtility(CookieClientIdManager(), IClientIdManager)
sdc = session_data_container_class()
for product_id in ('', 'products.foo', 'products.bar', 'products.baz'):
provideUtility(sdc, ISessionDataContainer, product_id)
request = HTTPRequest(StringIO(), {}, None)
return request

def tearDown(_test=None):
cleanup.tearDown()

# Test the code in our API documentation is correct
def docSetUp(test):
from zope.session.session import RAMSessionDataContainer
test.globs['request'] = setUp(RAMSessionDataContainer)


def tearDownTransaction(test):
import transaction
transaction.abort()


class TestSessions(cleanup.CleanUp, unittest.TestCase):

def setUp(self):
self.request = setUp()

def test_conflicts(self):
# The SessionData objects have been plagued with unnecessary
# ConflictErrors. The current implementation makes the most common source
Expand Down Expand Up @@ -123,9 +86,20 @@ def testSessionIterationBug(self):
# NotImplementedError and TypeError, respectively, in order to avoid
# an infinite loop if iteration or a test for containment is
# attempted on an instance.

from io import BytesIO
from zope.publisher.http import HTTPRequest
from zope.publisher.interfaces import IRequest
from zope.component import provideAdapter
from zope.component import provideUtility
from zope.session.interfaces import IClientId
from zope.session.interfaces import IClientIdManager
from zope.session.http import CookieClientIdManager
import zope.session.session
request = self.request

provideUtility(CookieClientIdManager(), IClientIdManager)
provideAdapter(zope.session.session.ClientId, (IRequest,), IClientId)

request = HTTPRequest(BytesIO(), {}, None)
session = zope.session.session.Session(request)
with self.assertRaises(TypeError):
'blah' in session
Expand Down

0 comments on commit 4a22c32

Please sign in to comment.