[2337] | 1 | import unittest |
---|
| 2 | from types import ListType, TupleType, DictionaryType |
---|
[2340] | 3 | from Products.Archetypes.tests.utils import makeContent |
---|
[2337] | 4 | |
---|
| 5 | from quintagroup.referencedatagridfield.tests.base import TestCase |
---|
[2340] | 6 | |
---|
[2337] | 7 | from quintagroup.referencedatagridfield import ReferenceDataGridWidget |
---|
| 8 | |
---|
| 9 | |
---|
[2339] | 10 | class TestField(TestCase): |
---|
[2338] | 11 | """ ReferenceDataGridField unit tests """ |
---|
[2337] | 12 | |
---|
| 13 | def afterSetUp(self): |
---|
[2339] | 14 | self.loginAsPortalOwner() |
---|
[2337] | 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): |
---|
[2338] | 34 | data = [{"uid": self.doc.UID(), "link": "http://test.link", "title": "test"},] |
---|
[2337] | 35 | # if data set: |
---|
| 36 | # result is list with dictionary items, as in DataGridField |
---|
[2338] | 37 | self.field.set(self.demo, data) |
---|
[2337] | 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 | |
---|
[2338] | 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 |
---|
[2337] | 54 | |
---|
[2338] | 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 | |
---|
[2340] | 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 | |
---|
[2337] | 149 | def test_suite(): |
---|
| 150 | return unittest.TestSuite([ |
---|
[2339] | 151 | unittest.makeSuite(TestField), |
---|
[2340] | 152 | unittest.makeSuite(TestFieldBugs), |
---|
[2337] | 153 | ]) |
---|