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

Last change on this file since 3510 was 3510, checked in by potar, 8 years ago

Merged sitemap_date branch into trunk

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