def test_equality_custom_fields_to_ignore(self):
        config = ExampleConfig(changed_by=self.user, string_field='first')
        config.save()

        # id, change_date, and changed_by will all be different for a newly created entry
        self.assertTrue(
            ExampleConfig.equal_to_current({"string_field": "first"}))
        self.assertFalse(
            ExampleConfig.equal_to_current({"string_field": "first"},
                                           fields_to_ignore=("change_date",
                                                             "changed_by")))
        self.assertFalse(
            ExampleConfig.equal_to_current({"string_field": "first"},
                                           fields_to_ignore=("id",
                                                             "changed_by")))
        self.assertFalse(
            ExampleConfig.equal_to_current({"string_field": "first"},
                                           fields_to_ignore=("change_date",
                                                             "id")))

        # Test the ability to ignore a different field ("int_field").
        self.assertFalse(
            ExampleConfig.equal_to_current({
                "string_field": "first",
                "int_field": 20
            }))
        self.assertTrue(
            ExampleConfig.equal_to_current(
                {
                    "string_field": "first",
                    "int_field": 20
                },
                fields_to_ignore=("id", "change_date", "changed_by",
                                  "int_field")))
    def test_insert(self):
        self.assertEqual("", ExampleConfig.current().string_field)

        request = self.factory.post('/config/ExampleConfig',
                                    {"string_field": "string_value"})
        request.user = self.user
        __ = self.current_view(request)

        self.assertEqual("string_value", ExampleConfig.current().string_field)
        self.assertEqual(self.user, ExampleConfig.current().changed_by)
    def test_no_config_empty_cache(self):
        # First time reads from the database
        with self.assertNumQueries(1):
            current = ExampleConfig.current()
            self.assertEqual(current.int_field, 10)
            self.assertEqual(current.string_field, '')

        # Follow-on request reads from cache with no database request.
        with self.assertNumQueries(0):
            cached_current = ExampleConfig.current()
            self.assertEqual(cached_current.int_field, 10)
            self.assertEqual(cached_current.string_field, '')
    def test_always_insert(self):
        config = ExampleConfig(changed_by=self.user, string_field='first')
        config.save()
        config.string_field = 'second'
        config.save()

        self.assertEqual(2, ExampleConfig.objects.all().count())
    def test_multiple_inserts(self):
        for i in six.moves.range(3):  # pylint: disable=no-member
            self.assertEqual(i, ExampleConfig.objects.all().count())

            request = self.factory.post('/config/ExampleConfig',
                                        {"string_field": str(i)})
            request.user = self.user
            response = self.current_view(request)
            self.assertEqual(201, response.status_code)

            self.assertEqual(i + 1, ExampleConfig.objects.all().count())
            self.assertEqual(str(i), ExampleConfig.current().string_field)
    def test_get_current(self):
        request = self.factory.get('/config/ExampleConfig')
        request.user = self.user
        response = self.current_view(request)
        self.assertEqual('', response.data['string_field'])
        self.assertEqual(10, response.data['int_field'])
        self.assertEqual(None, response.data['changed_by'])
        self.assertEqual(False, response.data['enabled'])
        self.assertEqual(None, response.data['change_date'])

        ExampleConfig(string_field='string_value', int_field=20).save()

        response = self.current_view(request)
        self.assertEqual('string_value', response.data['string_field'])
        self.assertEqual(20, response.data['int_field'])
    def test_cache_set(self):
        # Nothing is cached, so we take a database hit for this.
        with self.assertNumQueries(1):
            default = ExampleConfig.current()
            self.assertEqual(default.string_field, '')

        first = ExampleConfig(changed_by=self.user)
        first.string_field = 'first'
        first.save()

        # The save() call above should have invalidated the cache, so we expect
        # to see a query to get the current config value.
        with self.assertNumQueries(1):
            current = ExampleConfig.current()
            self.assertEqual(current.string_field, 'first')
    def test_cache_set(self):
        with self.assertNumQueries(1):
            default = ExampleConfig.current('left', 'right', self.user)
            self.assertEqual(default.string_field, '')

        first = ExampleKeyedConfig(
            changed_by=self.user,
            left='left',
            right='right',
            user=self.user,
            string_field='first',
        )
        first.save()

        # Cache is invalidated by the save above, so another query is made.
        with self.assertNumQueries(1):
            ExampleKeyedConfig.current('left', 'right', self.user)
    def test_config_ordering(self):
        with freeze_time('2012-01-01'):
            first = ExampleConfig(changed_by=self.user)
            first.string_field = 'first'
            first.save()

        second = ExampleConfig(changed_by=self.user)
        second.string_field = 'second'
        second.save()

        self.assertEqual(ExampleConfig.current().string_field, 'second')
 def test_cache_key_name(self):
     self.assertEqual(ExampleConfig.cache_key_name(),
                      'configuration/ExampleConfig/current')
    def test_equality(self):
        config = ExampleConfig(changed_by=self.user, string_field='first')
        config.save()

        self.assertTrue(
            ExampleConfig.equal_to_current({"string_field": "first"}))
        self.assertTrue(
            ExampleConfig.equal_to_current({
                "string_field": "first",
                "enabled": False
            }))
        self.assertTrue(
            ExampleConfig.equal_to_current({
                "string_field": "first",
                "int_field": 10
            }))

        self.assertFalse(
            ExampleConfig.equal_to_current({
                "string_field": "first",
                "enabled": True
            }))
        self.assertFalse(
            ExampleConfig.equal_to_current({
                "string_field": "first",
                "int_field": 20
            }))
        self.assertFalse(
            ExampleConfig.equal_to_current({"string_field": "second"}))

        self.assertFalse(ExampleConfig.equal_to_current({}))