1from unittest.mock import Mock
2
3from django.db.models import NOT_PROVIDED
4from django.test import TestCase
5
6from model_utils.fields import UrlsafeTokenField
7
8
9class UrlsaftTokenFieldTests(TestCase):
10    def test_editable_default(self):
11        field = UrlsafeTokenField()
12        self.assertFalse(field.editable)
13
14    def test_editable(self):
15        field = UrlsafeTokenField(editable=True)
16        self.assertTrue(field.editable)
17
18    def test_max_length_default(self):
19        field = UrlsafeTokenField()
20        self.assertEqual(field.max_length, 128)
21
22    def test_max_length(self):
23        field = UrlsafeTokenField(max_length=256)
24        self.assertEqual(field.max_length, 256)
25
26    def test_factory_default(self):
27        field = UrlsafeTokenField()
28        self.assertIsNone(field._factory)
29
30    def test_factory_not_callable(self):
31        with self.assertRaises(TypeError):
32            UrlsafeTokenField(factory='INVALID')
33
34    def test_get_default(self):
35        field = UrlsafeTokenField()
36        value = field.get_default()
37        self.assertEqual(len(value), field.max_length)
38
39    def test_get_default_with_non_default_max_length(self):
40        field = UrlsafeTokenField(max_length=64)
41        value = field.get_default()
42        self.assertEqual(len(value), 64)
43
44    def test_get_default_with_factory(self):
45        token = 'SAMPLE_TOKEN'
46        factory = Mock(return_value=token)
47        field = UrlsafeTokenField(factory=factory)
48        value = field.get_default()
49
50        self.assertEqual(value, token)
51        factory.assert_called_once_with(field.max_length)
52
53    def test_no_default_param(self):
54        field = UrlsafeTokenField(default='DEFAULT')
55        self.assertIs(field.default, NOT_PROVIDED)
56
57    def test_deconstruct(self):
58        def test_factory():
59            pass
60        instance = UrlsafeTokenField(factory=test_factory)
61        name, path, args, kwargs = instance.deconstruct()
62        new_instance = UrlsafeTokenField(*args, **kwargs)
63        self.assertIs(instance._factory, new_instance._factory)
64        self.assertIs(test_factory, new_instance._factory)
65