source: products/collective.referencedatagridfield/trunk/collective/referencedatagridfield/tests/testField.py @ 3358

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

Rename all quintagroup occurence to collective, remove copyright from LICENSE.txt, update keywords, author in setup.py

  • 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 collective.referencedatagridfield.tests.base import TestCase
6
7from collective.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.