source: products/quintagroup.referencedatagridfield/branches/plone4/quintagroup/referencedatagridfield/tests/testField.py @ 2340

Last change on this file since 2340 was 2340, checked in by mylan, 14 years ago

Added tests for possible bugs in field processing

  • Property svn:eol-style set to native
File size: 5.7 KB
Line 
1import unittest
2from types import ListType, TupleType, DictionaryType
3from Products.Archetypes.tests.utils import makeContent
4
5from quintagroup.referencedatagridfield.tests.base import TestCase
6
7from quintagroup.referencedatagridfield import ReferenceDataGridWidget
8
9
10class 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
118class 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
149def test_suite():
150    return unittest.TestSuite([
151        unittest.makeSuite(TestField),
152        unittest.makeSuite(TestFieldBugs),
153        ])
Note: See TracBrowser for help on using the repository browser.