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

Last change on this file since 3152 was 3152, checked in by zidane, 9 years ago

fixes pep8

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