source: products/quintagroup.plonegooglesitemaps/trunk/quintagroup/plonegooglesitemaps/tests/testNewsSitemaps.py @ 2750

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

#229: Added test for functions used in additional_maps in news sitemaps view

  • Property svn:eol-style set to native
File size: 11.4 KB
Line 
1from base import *
2from DateTime import DateTime
3from Missing import MV
4
5from zope.publisher.browser import TestRequest
6from zope.component import queryMultiAdapter
7from zope.component import adapts, provideAdapter
8from zope.annotation.interfaces import IAttributeAnnotatable
9from zope.component import getSiteManager, getGlobalSiteManager
10from zope.interface import implements, Interface, classImplements
11from archetypes.schemaextender.field import ExtensionField
12from archetypes.schemaextender.interfaces import ISchemaExtender
13
14from Products.CMFPlone.utils import _createObjectByType
15from Products.Archetypes.public import StringField
16from Products.ATContentTypes.content.newsitem import ATNewsItem
17
18class TestNewsSitemapsXML(FunctionalTestCase):
19
20    def afterSetUp(self):
21        super(TestNewsSitemapsXML, self).afterSetUp()
22        # Create news sitemaps
23        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
24                            sitemapType="news", portalTypes=("News Item",))
25        self.portal["news-sitemaps"].at_post_create_script()
26        # Add testing news item to portal
27        self.pubdate = (DateTime()+1).strftime("%Y-%m-%d")
28        self.my_news = _createObjectByType('News Item', self.portal, id='my_news')
29        self.my_news.edit(text="Test news item", title="First news (test)", language="ua",
30                          effectiveDate=self.pubdate, gsm_access="Registration",
31                          gsm_genres=("PressRelease",), gsm_stock="NASDAQ:AMAT, BOM:500325")
32        self.workflow.doActionFor(self.my_news, "publish")
33        self.reParse()
34
35    def reParse(self):
36        # Parse news sitemap
37        self.sitemap = self.publish("/"+self.portal.absolute_url(1) + "/news-sitemaps",
38                                    "%s:%s" % (portal_owner, default_password)).getBody()
39        parsed_sitemap = parse(self.sitemap)
40        self.start = parsed_sitemap["start"]
41        self.data = parsed_sitemap["data"]
42
43    def test_urlset(self):
44        self.assert_("urlset" in self.start.keys())
45        urlset = self.start["urlset"]
46        self.assertEqual(urlset.get("xmlns", ""), "http://www.sitemaps.org/schemas/sitemap/0.9")
47        self.assertEqual(urlset.get("xmlns:n", ""), "http://www.google.com/schemas/sitemap-news/0.9")
48
49    def test_url(self):
50        self.assert_("url" in self.start.keys())
51
52    def test_loc(self):
53        self.assert_("loc" in self.start.keys())
54        self.assert_(self.portal.absolute_url() + "/my_news" in self.data)
55
56    def test_nnews(self):
57        self.assert_("n:news" in self.start.keys())
58       
59    def test_npublication(self):
60        self.assert_("n:publication" in self.start.keys())
61        self.assert_("n:name" in self.start.keys())
62        self.assert_("First news" in self.data, "No 'First news' in data")
63        self.assert_("n:language" in self.start.keys())
64        self.assert_("ua" in self.data, "No 'ua' in data")
65
66    def test_npublication_date(self):
67        self.assert_("n:publication_date" in self.start.keys())
68        self.assert_(self.pubdate in self.data, "No %s in data" % self.pubdate)
69       
70    def test_ntitle(self):
71        self.assert_("n:title" in self.start.keys())
72        self.assert_("First news (test)" in self.data, "No 'First news (test)' in data")
73
74    def test_naccess(self):
75        # Test when access present
76        self.assert_("n:access" in self.start.keys())
77        self.assert_("Registration" in self.data, "No 'Registration' in data")
78
79    def test_ngenres(self):
80        # Test when genres present
81        self.assert_("n:genres" in self.start.keys())
82        self.assert_("PressRelease" in self.data, "No 'PressRelease' in data")
83
84    def test_ngenresMultiple(self):
85        # Test multiple genres
86        self.my_news.edit(gsm_genres=("PressRelease", "Blog"))
87        self.my_news.reindexObject()
88        self.reParse()
89        self.assert_("n:genres" in self.start.keys())
90        self.assert_("PressRelease, Blog" in self.data, "No 'PressRelease, Blog' in data")
91
92    def test_ngenresEmpty(self):
93        # No genres should present if it's not updated
94        self.my_news.edit(gsm_genres=[])
95        self.my_news.reindexObject()
96        self.reParse()
97        self.assertNotEqual("n:genres" in self.start.keys(), True)
98
99    def test_ngenresForNotExtended(self):
100        # No genres should present for not extended content type
101        my_doc = _createObjectByType('Document', self.portal, id='my_doc')
102        my_doc.edit(text="Test document")
103        self.workflow.doActionFor(my_doc, "publish")
104        self.portal["news-sitemaps"].edit(portalTypes=("Document",))
105        self.reParse()
106        self.assertNotEqual("n:genres" in self.start.keys(), True)
107
108    def test_nstock_tickers(self):
109        # Test n:stock_tickers
110        self.assert_("n:stock_tickers" in self.start.keys())
111        self.assert_("NASDAQ:AMAT, BOM:500325" in self.data, "No 'NASDAQ:AMAT, BOM:500325' in data")
112
113
114class TestNewsSitemapsXMLDefaultObject(FunctionalTestCase):
115
116    def afterSetUp(self):
117        super(TestNewsSitemapsXMLDefaultObject, self).afterSetUp()
118        # Create news sitemaps
119        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
120                            sitemapType="news", portalTypes=("News Item",))
121        self.portal["news-sitemaps"].at_post_create_script()
122        # Add minimal testing news item to portal
123        self.pubdate = (DateTime()+1).strftime("%Y-%m-%d")
124        self.my_news = _createObjectByType('News Item', self.portal, id='my_news')
125        self.my_news.edit(effectiveDate=self.pubdate)
126        self.workflow.doActionFor(self.my_news, "publish")
127        self.reParse()
128
129    def reParse(self):
130        # Parse news sitemap
131        self.sitemap = self.publish("/"+self.portal.absolute_url(1) + "/news-sitemaps",
132                                    "%s:%s" % (portal_owner, default_password)).getBody()
133        parsed_sitemap = parse(self.sitemap)
134        self.start = parsed_sitemap["start"]
135        self.data = parsed_sitemap["data"]
136
137    def test_nnews(self):
138        self.assert_("n:news" in self.start.keys())
139       
140    def test_npublication(self):
141        self.assert_("n:publication" in self.start.keys())
142        self.assert_("n:name" in self.start.keys())
143        self.assert_("my_news" in self.data, "No 'First news' in data")
144        self.assert_("n:language" in self.start.keys())
145        self.assert_("en" in self.data, "No 'en' in data")
146
147    def test_npublication_date(self):
148        self.assert_("n:publication_date" in self.start.keys())
149        self.assert_(self.pubdate in self.data, "No %s in data" % self.pubdate)
150       
151    def test_ntitle(self):
152        self.assert_("n:title" in self.start.keys())
153        self.assert_("my_news" in self.data, "No 'First news (test)' in data")
154
155    def test_no_naccess(self):
156        self.assert_("n:access" not in self.start.keys())
157
158    def test_no_ngenres(self):
159        self.assert_("n:genres" not in self.start.keys())
160
161    def test_no_keywords(self):
162        self.assert_("n:keywords" not in self.start.keys())
163
164    def test_no_keywords(self):
165        self.assert_("n:stock_tickers" not in self.start.keys())
166
167
168class TestSchemaExtending(TestCase):
169
170    def afterSetUp(self):
171        super(TestSchemaExtending, self).afterSetUp()
172        self.my_doc = _createObjectByType('Document', self.portal, id='my_doc')
173        self.my_news = _createObjectByType('News Item', self.portal, id='my_news')
174
175    def testExtendNewsItemByDefault(self):
176        # Neither of object has extended fields
177        self.assertNotEqual(self.my_news.getField("gsm_access"), None)
178        self.assertNotEqual(self.my_news.getField("gsm_genres"), None)
179        self.assertNotEqual(self.my_news.getField("gsm_stock"), None)
180        self.assertEqual(self.my_doc.getField("gsm_access"), None)
181        self.assertEqual(self.my_doc.getField("gsm_genres"), None)
182        self.assertEqual(self.my_doc.getField("gsm_stock"), None)
183   
184    def testRegistrationOnLocalSM(self):
185        """SchemaExtender adapters must be registered
186           in Local SiteManager only.
187        """
188        localsm = getSiteManager(self.portal)
189        globalsm = getGlobalSiteManager()
190        # Now register SchemaExtender adapter and
191        # check if it present in Local SiteManger only
192        self.assertNotEqual(localsm, globalsm)
193        self.assertNotEqual(localsm.queryAdapter(
194                self.my_news, ISchemaExtender,
195                name="quintagroup.plonegooglesitemaps.newssitemapextender"), None)
196        self.assertEqual(globalsm.queryAdapter(
197                self.my_news, ISchemaExtender,
198                name="quintagroup.plonegooglesitemaps.newssitemapextender"), None)
199
200
201##
202## Mock objects for TestNotOverrideExistingSchemaExtender
203## Test Case
204##
205
206class ITestTaggable(Interface):
207    """Taggable content
208    """
209
210class ExtendableStringField(ExtensionField, StringField):
211    """An extendable string field."""
212
213class TestExtender(object):
214    adapts(ITestTaggable)
215    implements(ISchemaExtender)
216
217    def __init__(self, context):
218        self.context = context
219
220    def getFields(self):
221        return [ExtendableStringField("testField",),]
222
223from quintagroup.plonegooglesitemaps.interfaces import INewsSitemapProvider
224class TestNotOverrideExistingSchemaExtender(TestCase):
225    """ Test if another schemaextender has been defined for the
226        IATNewsItem take in account by the system.
227    """
228    def prepareContent(self):
229       
230        classImplements(ATNewsItem, ITestTaggable)
231        provideAdapter(TestExtender, name=u"archetypes.schemaextender.test.adapter")
232
233        self.portal.invokeFactory('News Item', 'taggable-news')
234        self.taggable_news = getattr(self.portal, 'taggable-news')
235
236    def testCorrectSchemaExtending(self):
237        self.prepareContent()
238        self.assert_(ITestTaggable.providedBy(self.taggable_news))
239        self.assert_(INewsSitemapProvider.providedBy(self.taggable_news))
240        schema = self.taggable_news.Schema().keys()
241        self.assert_("gsm_access" in schema, "no 'gsm_access' in schema: %s" % schema)
242        self.assert_("testField" in schema, "no 'testField' in schema: %s" % schema)
243
244
245
246classImplements(TestRequest, IAttributeAnnotatable)
247
248class TestAdditionalMaps(TestCase):
249    """Test bug in processing Missing value in functions,
250       defined in additional_maps property.
251    """
252    mv_keys = ['Date', 'Subject', 'getId', 'Language',
253               'gsm_access', 'gsm_genres', 'gsm_stock']
254
255    def afterSetUp(self):
256        super(TestAdditionalMaps, self).afterSetUp()
257        # Create news sitemaps
258        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
259                            sitemapType="news")
260        context = self.portal['news-sitemaps']
261        self.nsmv = queryMultiAdapter((context, TestRequest()), name="news-sitemap.xml")
262
263        self.brain = self.portal.portal_catalog(portal_type="Document")[0]
264        for k in self.mv_keys:
265            self.brain[k] = MV
266       
267    def testAdditionalMaps(self):
268        for n,func in self.nsmv.additional_maps:
269            try:
270                v = func(self.brain)
271            except Exception, e:
272                self.fail("Wrong processing 'Missing' value for '%s': %s"
273                          % (n, str(e)))
274               
275               
276def test_suite():
277    from unittest import TestSuite, makeSuite
278    suite = TestSuite()
279    suite.addTest(makeSuite(TestNewsSitemapsXML))
280    suite.addTest(makeSuite(TestNewsSitemapsXMLDefaultObject))
281    suite.addTest(makeSuite(TestSchemaExtending))
282    suite.addTest(makeSuite(TestNotOverrideExistingSchemaExtender))
283    suite.addTest(makeSuite(TestAdditionalMaps))
284    return suite
Note: See TracBrowser for help on using the repository browser.