Files @ ac57053ecf58
Branch filter:

Location: symposion_app/vendor/registrasion/registrasion/tests/test_batch.py

Joel Addison
Ignore withdrawn proposals for random choice
import pytz

from registrasion.tests.test_cart import RegistrationCartTestCase

from registrasion.controllers.batch import BatchController

UTC = pytz.timezone('UTC')


class BatchTestCase(RegistrationCartTestCase):

    def test_no_caches_outside_of_batches(self):
        cache_1 = BatchController.get_cache(self.USER_1)
        cache_2 = BatchController.get_cache(self.USER_2)

        # Identity testing is important here
        self.assertIsNot(cache_1, cache_2)

    def test_cache_clears_at_batch_exit(self):
        with BatchController.batch(self.USER_1):
            cache_1 = BatchController.get_cache(self.USER_1)

        cache_2 = BatchController.get_cache(self.USER_1)

        self.assertIsNot(cache_1, cache_2)

    def test_caches_identical_within_nestings(self):
        with BatchController.batch(self.USER_1):
            cache_1 = BatchController.get_cache(self.USER_1)

            with BatchController.batch(self.USER_2):
                cache_2 = BatchController.get_cache(self.USER_1)

            cache_3 = BatchController.get_cache(self.USER_1)

        self.assertIs(cache_1, cache_2)
        self.assertIs(cache_2, cache_3)

    def test_caches_are_independent_for_different_users(self):
        with BatchController.batch(self.USER_1):
            cache_1 = BatchController.get_cache(self.USER_1)

            with BatchController.batch(self.USER_2):
                cache_2 = BatchController.get_cache(self.USER_2)

        self.assertIsNot(cache_1, cache_2)

    def test_cache_clears_are_independent_for_different_users(self):
        with BatchController.batch(self.USER_1):
            cache_1 = BatchController.get_cache(self.USER_1)

            with BatchController.batch(self.USER_2):
                cache_2 = BatchController.get_cache(self.USER_2)

            with BatchController.batch(self.USER_2):
                cache_3 = BatchController.get_cache(self.USER_2)

            cache_4 = BatchController.get_cache(self.USER_1)

        self.assertIs(cache_1, cache_4)
        self.assertIsNot(cache_1, cache_2)
        self.assertIsNot(cache_2, cache_3)

    def test_new_caches_for_new_batches(self):
        with BatchController.batch(self.USER_1):
            cache_1 = BatchController.get_cache(self.USER_1)

        with BatchController.batch(self.USER_1):
            cache_2 = BatchController.get_cache(self.USER_1)

            with BatchController.batch(self.USER_1):
                cache_3 = BatchController.get_cache(self.USER_1)

        self.assertIs(cache_2, cache_3)
        self.assertIsNot(cache_1, cache_2)

    def test_memoisation_happens_in_batch_context(self):
        with BatchController.batch(self.USER_1):
            output_1 = self._memoiseme(self.USER_1)

            with BatchController.batch(self.USER_1):
                output_2 = self._memoiseme(self.USER_1)

        self.assertIs(output_1, output_2)

    def test_memoisaion_does_not_happen_outside_batch_context(self):
        output_1 = self._memoiseme(self.USER_1)
        output_2 = self._memoiseme(self.USER_1)

        self.assertIsNot(output_1, output_2)

    def test_memoisation_is_user_independent(self):
        with BatchController.batch(self.USER_1):
            output_1 = self._memoiseme(self.USER_1)
            with BatchController.batch(self.USER_2):
                output_2 = self._memoiseme(self.USER_2)
                output_3 = self._memoiseme(self.USER_1)

        self.assertIsNot(output_1, output_2)
        self.assertIs(output_1, output_3)

    def test_memoisation_clears_outside_batches(self):
        with BatchController.batch(self.USER_1):
            output_1 = self._memoiseme(self.USER_1)

        with BatchController.batch(self.USER_1):
            output_2 = self._memoiseme(self.USER_1)

        self.assertIsNot(output_1, output_2)

    @classmethod
    @BatchController.memoise
    def _memoiseme(self, user):
        return object()

    def test_batch_end_functionality_is_called(self):
        class Ender(object):
            end_count = 0

            def end_batch(self):
                self.end_count += 1

        @BatchController.memoise
        def get_ender(user):
            return Ender()

        # end_batch should get called once on exiting the batch
        with BatchController.batch(self.USER_1):
            ender = get_ender(self.USER_1)
        self.assertEquals(1, ender.end_count)

        # end_batch should get called once on exiting the batch
        # no matter how deep the object gets cached
        with BatchController.batch(self.USER_1):
            with BatchController.batch(self.USER_1):
                ender = get_ender(self.USER_1)
        self.assertEquals(1, ender.end_count)