diff options
author | Mike Crute <mcrute@gmail.com> | 2015-07-17 20:45:17 -0700 |
---|---|---|
committer | Mike Crute <mcrute@gmail.com> | 2015-07-17 20:45:17 -0700 |
commit | 9a2e05f3f2cbc2075d0bb1a192708f255dee6095 (patch) | |
tree | 54029033eeb519327b3dc38087b759d6a6e3196c /tests | |
parent | 199d4901b4b8a152e16c77186b566138fafa1718 (diff) | |
download | pydora-9a2e05f3f2cbc2075d0bb1a192708f255dee6095.tar.bz2 pydora-9a2e05f3f2cbc2075d0bb1a192708f255dee6095.tar.xz pydora-9a2e05f3f2cbc2075d0bb1a192708f255dee6095.zip |
Add tests for base models
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_pandora/test_models.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/tests/test_pandora/test_models.py b/tests/test_pandora/test_models.py new file mode 100644 index 0000000..fda25d4 --- /dev/null +++ b/tests/test_pandora/test_models.py | |||
@@ -0,0 +1,129 @@ | |||
1 | from unittest import TestCase | ||
2 | from datetime import datetime | ||
3 | |||
4 | import pandora.models as m | ||
5 | |||
6 | class TestField(TestCase): | ||
7 | |||
8 | def test_defaults(self): | ||
9 | field = m.Field("name") | ||
10 | |||
11 | self.assertEqual("name", field.field) | ||
12 | self.assertIsNone(field.default) | ||
13 | self.assertIsNone(field.formatter) | ||
14 | |||
15 | |||
16 | class TestModelMetaClass(TestCase): | ||
17 | |||
18 | class TestModel(m.with_metaclass(m.ModelMetaClass, object)): | ||
19 | |||
20 | foo = "bar" | ||
21 | a_field = m.Field("testing") | ||
22 | __field__ = m.Field("testing") | ||
23 | |||
24 | def test_metaclass_defines_fields(self): | ||
25 | self.assertTrue("a_field" in self.TestModel._fields) | ||
26 | self.assertFalse("foo" in self.TestModel._fields) | ||
27 | |||
28 | def test_metaclass_ignores_dunder_fields(self): | ||
29 | self.assertFalse("__field__" in self.TestModel._fields) | ||
30 | |||
31 | |||
32 | class TestPandoraModel(TestCase): | ||
33 | |||
34 | JSON_DATA = { "field2": ["test2"], "field3": 41 } | ||
35 | |||
36 | class TestModel(m.PandoraModel): | ||
37 | |||
38 | THE_LIST = [] | ||
39 | |||
40 | field1 = m.Field("field1", default="a string") | ||
41 | field2 = m.Field("field2", default=THE_LIST) | ||
42 | field3 = m.Field("field3", formatter=lambda c, x: x + 1) | ||
43 | |||
44 | class NoFieldsModel(m.PandoraModel): | ||
45 | pass | ||
46 | |||
47 | class ExtraReprModel(m.PandoraModel): | ||
48 | |||
49 | def __repr__(self): | ||
50 | return self._base_repr("Foo") | ||
51 | |||
52 | def test_json_to_date(self): | ||
53 | expected = datetime(2015, 7, 18, 3, 8, 17) | ||
54 | result = m.PandoraModel.json_to_date(None, { "time": 1437188897616 }) | ||
55 | # Python2.7 doesn't restore microseconds and we don't care about | ||
56 | # it anyhow so just remove it for this test | ||
57 | self.assertEqual(expected, result.replace(microsecond=0)) | ||
58 | |||
59 | def test_init_sets_defaults(self): | ||
60 | model = self.TestModel(None) | ||
61 | self.assertEqual(model.field1, "a string") | ||
62 | |||
63 | def test_init_creates_new_instances_of_mutable_types(self): | ||
64 | model = self.TestModel(None) | ||
65 | self.assertEqual(model.field2, []) | ||
66 | self.assertFalse(model.field2 is self.TestModel.THE_LIST) | ||
67 | |||
68 | def test_populate_fields(self): | ||
69 | result = self.TestModel.from_json(None, self.JSON_DATA) | ||
70 | self.assertEqual("a string", result.field1) | ||
71 | self.assertEqual(["test2"], result.field2) | ||
72 | |||
73 | def test_populate_fields_calls_formatter(self): | ||
74 | result = self.TestModel.from_json(None, self.JSON_DATA) | ||
75 | self.assertEqual(42, result.field3) | ||
76 | |||
77 | def test_from_json_list(self): | ||
78 | json_list = [self.JSON_DATA, self.JSON_DATA] | ||
79 | result = self.TestModel.from_json_list(None, json_list) | ||
80 | self.assertEqual(2, len(result)) | ||
81 | self.assertEqual("a string", result[1].field1) | ||
82 | |||
83 | def test_repr(self): | ||
84 | expected = "TestModel(field1='a string', field2=['test2'], field3=42)" | ||
85 | result = self.TestModel.from_json(None, self.JSON_DATA) | ||
86 | self.assertEqual(expected, repr(result)) | ||
87 | |||
88 | def test_repr_with_extra(self): | ||
89 | expected = "ExtraReprModel(None, Foo)" | ||
90 | result = self.ExtraReprModel.from_json(None, self.JSON_DATA) | ||
91 | self.assertEqual(expected, repr(result)) | ||
92 | |||
93 | def test_repr_with_no_fields(self): | ||
94 | expected = "NoFieldsModel(None)" | ||
95 | result = self.NoFieldsModel.from_json(None, self.JSON_DATA) | ||
96 | self.assertEqual(expected, repr(result)) | ||
97 | |||
98 | |||
99 | class TestSubModel(m.PandoraModel): | ||
100 | |||
101 | fieldS1 = m.Field("fieldS1") | ||
102 | |||
103 | |||
104 | class TestPandoraListModel(TestCase): | ||
105 | |||
106 | JSON_DATA = { | ||
107 | "field1": 42, | ||
108 | "field2": [{"fieldS1": "Foo" }, { "fieldS1": "Bar" }] | ||
109 | } | ||
110 | |||
111 | class TestModel(m.PandoraListModel): | ||
112 | |||
113 | __list_key__ = "field2" | ||
114 | __list_model__ = TestSubModel | ||
115 | |||
116 | field1 = m.Field("field1") | ||
117 | |||
118 | def test_creates_sub_models(self): | ||
119 | result = self.TestModel.from_json(None, self.JSON_DATA) | ||
120 | self.assertEqual(42, result.field1) | ||
121 | self.assertEqual(2, len(result)) | ||
122 | self.assertEqual("Foo", result[0].fieldS1) | ||
123 | self.assertEqual("Bar", result[1].fieldS1) | ||
124 | |||
125 | def test_repr(self): | ||
126 | expected = ("TestModel(field1=42, [TestSubModel(fieldS1='Foo'), " | ||
127 | "TestSubModel(fieldS1='Bar')])") | ||
128 | result = self.TestModel.from_json(None, self.JSON_DATA) | ||
129 | self.assertEqual(expected, repr(result)) | ||