1 | import unittest |
---|
2 | from types import ListType, TupleType, DictionaryType |
---|
3 | from Products.Archetypes.tests.utils import makeContent |
---|
4 | |
---|
5 | from quintagroup.referencedatagridfield.tests.base import TestCase |
---|
6 | |
---|
7 | from quintagroup.referencedatagridfield import ReferenceDataGridWidget |
---|
8 | |
---|
9 | |
---|
10 | class TestField(TestCase): |
---|
11 | """ ReferenceDataGridField unit tests """ |
---|
12 | |
---|
13 | def afterSetUp(self): |
---|
14 | self.loginAsPortalOwner() |
---|
15 | self.createDemo() |
---|
16 | self.refcat = self.portal.reference_catalog |
---|
17 | self.field = self.demo.getField('demo_rdgf') |
---|
18 | |
---|
19 | def testColumnProperties(self): |
---|
20 | self.assertEqual(hasattr(self.field, "columns"), True) |
---|
21 | for column in ['title', 'link', 'uid']: |
---|
22 | self.assertEqual(column in self.field.columns, True) |
---|
23 | |
---|
24 | def testWidget(self): |
---|
25 | self.assertEqual(type(self.field.widget), ReferenceDataGridWidget) |
---|
26 | |
---|
27 | def testGetInitial(self): |
---|
28 | # If no data set - emty list must be returned |
---|
29 | field_data = self.field.get(self.demo) |
---|
30 | self.assertEqual(type(field_data), ListType) |
---|
31 | self.assertEqual(len(field_data), 0) |
---|
32 | |
---|
33 | def testGet(self): |
---|
34 | data = [{"uid": self.doc.UID(), "link": "http://test.link", "title": "test"},] |
---|
35 | # if data set: |
---|
36 | # result is list with dictionary items, as in DataGridField |
---|
37 | self.field.set(self.demo, data) |
---|
38 | |
---|
39 | field_data = self.field.get(self.demo) |
---|
40 | self.assertEqual(type(field_data), ListType) |
---|
41 | self.assertEqual(len(field_data), 1) |
---|
42 | |
---|
43 | # items in list is Dictionary |
---|
44 | item_data = field_data[0] |
---|
45 | self.assertEqual(type(item_data), DictionaryType) |
---|
46 | # Dictionary contains uid, link, title keys |
---|
47 | self.assertEqual(item_data.has_key("uid"), True) |
---|
48 | self.assertEqual(item_data.has_key("link"), True) |
---|
49 | self.assertEqual(item_data.has_key("title"), True) |
---|
50 | |
---|
51 | def getData(self, key, index=0): |
---|
52 | data = self.field.get(self.demo) |
---|
53 | return data and data[index].get(key, None) or None |
---|
54 | |
---|
55 | def getRefsCount(self): |
---|
56 | return len(self.refcat.getReferences(self.demo, self.field.relationship)) |
---|
57 | |
---|
58 | def testSetUID(self): |
---|
59 | # link always must present in the data |
---|
60 | row = {"uid": "", "link": "/"} |
---|
61 | data = [row,] |
---|
62 | # If set unexistent UID - UID - not set |
---|
63 | row['uid'] = "123" |
---|
64 | self.field.set(self.demo, data) |
---|
65 | self.assertEqual(self.getData("uid"), None) |
---|
66 | # No references to the object |
---|
67 | self.assertEqual(self.getRefsCount(), 0) |
---|
68 | |
---|
69 | # If link is not remote url and passed uid of existent object - uid is saved |
---|
70 | row["uid"] = self.doc.UID() |
---|
71 | self.field.set(self.demo, data) |
---|
72 | self.assertEqual(self.getData("uid"), self.doc.UID()) |
---|
73 | # Also reference added to the object catalog |
---|
74 | self.assertEqual(self.getRefsCount(), 1) |
---|
75 | |
---|
76 | def testSetTitleForLink(self): |
---|
77 | row = {"link": "http://google.com"} |
---|
78 | data = [row,] |
---|
79 | # If there is title data with external link - it is stored in the field |
---|
80 | row["title"] = "google" |
---|
81 | self.field.set(self.demo, data) |
---|
82 | self.assertEqual(self.getData("title"), "google") |
---|
83 | |
---|
84 | # If No title specified for the external link title will be equals to link |
---|
85 | row["title"] = "" |
---|
86 | self.field.set(self.demo, data) |
---|
87 | self.assertEqual(self.getData("title"), "http://google.com") |
---|
88 | |
---|
89 | self.assertEqual(self.getRefsCount(), 0) |
---|
90 | |
---|
91 | def testSetTitleForUID(self): |
---|
92 | row = {"uid": self.doc.UID(), "link": "/"} |
---|
93 | data = [row,] |
---|
94 | # If there is title data with correct uid - it is stored in the field |
---|
95 | row["title"] = "Custom Title" |
---|
96 | self.field.set(self.demo, data) |
---|
97 | self.assertEqual(self.getData("title"), "Custom Title") |
---|
98 | |
---|
99 | # If No title specified with correct portal UID object - |
---|
100 | # title will be get from the object |
---|
101 | row["title"] = "" |
---|
102 | self.field.set(self.demo, data) |
---|
103 | self.assertEqual(self.getData("title"), "Test Document") |
---|
104 | |
---|
105 | def testNoLink(self): |
---|
106 | # Link is key data for the field. |
---|
107 | # If no link present in the data - no data will be saved |
---|
108 | # even with correct uid. |
---|
109 | data = [{"uid": self.doc.UID(), "title": "Title"},] |
---|
110 | self.field.set(self.demo, data) |
---|
111 | self.assertEqual(self.field.get(self.demo), []) |
---|
112 | # If a external link present in the data - it will be saved |
---|
113 | data = [{"link": "http://google.com"},] |
---|
114 | self.field.set(self.demo, data) |
---|
115 | self.assertEqual(self.getData("link"), "http://google.com") |
---|
116 | |
---|
117 | |
---|
118 | class TestFieldBugs(TestCase): |
---|
119 | """ ReferenceDataGridField unit tests for bugs """ |
---|
120 | |
---|
121 | def afterSetUp(self): |
---|
122 | self.loginAsPortalOwner() |
---|
123 | # minimal demo content creation |
---|
124 | self.demo = makeContent(self.portal, portal_type="ReferenceDataGridDemoType", id="demo") |
---|
125 | self.field = self.demo.getField('demo_rdgf') |
---|
126 | |
---|
127 | def testGetNotInitializedField(self): |
---|
128 | self.field.getStorage().unset('demo_rdgf', self.demo) |
---|
129 | try: |
---|
130 | data = self.field.get(self.demo) |
---|
131 | except KeyError, e: |
---|
132 | self.fail(str(e) + " on getting data from not initialized field") |
---|
133 | |
---|
134 | def testDelLinkedObject(self): |
---|
135 | doc = makeContent(self.portal, portal_type="Document", id="doc") |
---|
136 | data = {"uid": doc.UID(), "link": doc.absolute_url(1)} |
---|
137 | self.field.set(self.demo, data) |
---|
138 | |
---|
139 | res = self.field.get(self.demo) |
---|
140 | self.assertEqual(res[0]["uid"], doc.UID()) |
---|
141 | |
---|
142 | self.portal.manage_delObjects(ids=["doc",]) |
---|
143 | try: |
---|
144 | res = self.field.get(self.demo) |
---|
145 | except AttributeError, e: |
---|
146 | self.fail(str(e) + " on getting data when linked object was delited") |
---|
147 | self.assertEqual(len(res), 0, "Not removed data with link to deleted object") |
---|
148 | |
---|
149 | def test_suite(): |
---|
150 | return unittest.TestSuite([ |
---|
151 | unittest.makeSuite(TestField), |
---|
152 | unittest.makeSuite(TestFieldBugs), |
---|
153 | ]) |
---|