import re import unittest from Products.PloneTestCase.PloneTestCase import portal_owner from Products.PloneTestCase.PloneTestCase import default_password from quintagroup.referencedatagridfield.tests.base import TestCase from quintagroup.referencedatagridfield.tests.base import FunctionalTestCase from quintagroup.referencedatagridfield import ReferenceDataGridWidget class TestWidgetView(FunctionalTestCase): """ ReferenceDataGridWidget unit tests """ def afterSetUp(self): self.loginAsPortalOwner() # Prevent section links sp = self.portal.portal_properties.site_properties sp._updateProperty("disable_nonfolderish_sections", True) # Prepare testing data and data for functional test self.createDemo(wfaction="publish") self.demo_path = "/" + self.demo.absolute_url(1) self.basic_auth = ':'.join((portal_owner,default_password)) # Regexp for getting links self.relink = re.compile("]*?href=\"(.*?)\"[^>]*?>\s*(.*?)\s*", re.I|re.S|re.M) def test_LinkDefaultTitle(self): self.demo.edit(demo_rdgf=[{"link": "http://google.com"}]) html = self.publish(self.demo_path, self.basic_auth).getBody() links = dict(self.relink.findall(html)) self.assertEqual(links.has_key("http://google.com"), True) self.assertEqual("http://google.com" in links["http://google.com"], True) def test_LinkCustomTitle(self): self.demo.edit(demo_rdgf=[{"link": "http://google.com", "title": "Google"}]) html = self.publish(self.demo_path, self.basic_auth).getBody() links = dict(self.relink.findall(html)) self.assertEqual(links.has_key("http://google.com"), True) self.assertEqual("Google" in links["http://google.com"], True) def test_UIDDefaultTitle(self): data = [{"uid": self.doc.UID(), "link": self.doc.absolute_url(1)}] self.demo.edit(demo_rdgf=data) html = self.publish(self.demo_path, self.basic_auth).getBody() links = dict(self.relink.findall(html)) doc_url = self.doc.absolute_url() doc_title = self.doc.Title() self.assertEqual(links.has_key(doc_url), True) self.assertEqual(doc_title in links[doc_url], True) def test_UIDCustomTitle(self): data = [{"uid": self.doc.UID(), "link": self.doc.absolute_url(1), "title": "Custom Title"},] self.demo.edit(demo_rdgf=data) html = self.publish(self.demo_path, self.basic_auth).getBody() links = dict(self.relink.findall(html)) doc_url = self.doc.absolute_url() self.assertEqual(links.has_key(doc_url), True) self.assertEqual("Custom Title" in links[doc_url], True) def test_LinksOrder(self): relink = re.compile("]*?href=\"(.*?)\"[^>]*?>", re.I|re.S) data = [{"link": "http://google.com"}, {"uid": self.doc.UID(), "link": self.doc.absolute_url(1)}] # First check in one order self.demo.edit(demo_rdgf=data) html = self.publish(self.demo_path, self.basic_auth).getBody() links = relink.findall(html) idx1 = links.index("http://google.com") idx2 = links.index(self.doc.absolute_url()) self.assertEqual( idx1 < idx2, True) # Now reverse rows order data.reverse() self.demo.edit(demo_rdgf=data) html = self.publish(self.demo_path, self.basic_auth).getBody() links = relink.findall(html) idx1 = links.index("http://google.com") idx2 = links.index(self.doc.absolute_url()) self.assertEqual( idx1 > idx2, True) class TestWidgetEditPresence(FunctionalTestCase): """ Test presence of columns and button in edit mode of ReferenceDataGridWidget. """ def afterSetUp(self): self.loginAsPortalOwner() # Prepare test data self.createDemo() self.demo.edit(demo_rdgf=[{"link": "http://google.com"}]) # Prepare html for test edit form edit_path = "/%s/edit" % self.demo.absolute_url(1) basic_auth = ':'.join((portal_owner,default_password)) self.html = self.publish(edit_path, basic_auth).getBody() def test_columnsPresence(self): # Get ReferenceDataGridField field inputs without hidden template row for add new data reinput = re.compile("]*?name=\"demo_rdgf\.(.*?):records\"[^>]*?)>", re.I|re.S) inputs = dict([(v,k) for k,v in reinput.findall(self.html) if not "demo_rdgf_new" in k]) # Title and Link columns is visible self.assertEqual('type="text"' in inputs["title"], True) self.assertEqual('type="text"' in inputs["link"], True) # UID column is hidden self.assertEqual('type="hidden"' in inputs["uid"], True) def test_addButtonPresence(self): # Button for adding reference also must present rebutt = re.compile("]*type=\"button\"\s*[^>]*>", re.I|re.S) buttons = filter(lambda k:not "_new" in k, rebutt.findall(self.html)) # Add... button must present self.assertEqual('value="Add..."' in buttons[0], True) class TestWidgetResources(TestCase): """Tests of widget resources.""" def afterSetUp(self): self.widget_props = ReferenceDataGridWidget._properties self.rdgw_skin_ids = self.portal.portal_skins.referencedatagridfield.objectIds() def test_helperJS(self): helper_js = self.widget_props.get("helper_js", "") self.assertEqual("referencedatagridwidget.js" in helper_js, True) self.assertEqual("referencedatagridwidget.js" in self.rdgw_skin_ids, True) def test_helperCSS(self): helper_css = self.widget_props.get("helper_css", "") self.assertEqual("referencedatagridwidget.css" in helper_css, True) self.assertEqual("referencedatagridwidget.css" in self.rdgw_skin_ids, True) def test_suite(): return unittest.TestSuite([ unittest.makeSuite(TestWidgetView), unittest.makeSuite(TestWidgetResources), unittest.makeSuite(TestWidgetEditPresence), ])