1############################################################################## 2# 3# Copyright (c) 2001, 2002 Zope Foundation and Contributors. 4# All Rights Reserved. 5# 6# This software is subject to the provisions of the Zope Public License, 7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. 8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED 9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS 11# FOR A PARTICULAR PURPOSE. 12# 13############################################################################## 14"""Test Browser Languages detector 15""" 16import unittest 17 18from zope.publisher.browser import BrowserLanguages 19from zope.publisher.browser import CacheableBrowserLanguages 20from zope.publisher.browser import ModifiableBrowserLanguages 21from zope.publisher.browser import NotCompatibleAdapterError 22 23# Note: The expected output is in order of preference, 24# empty 'q=' means 'q=1', and if theres more than one 25# empty, we assume they are in order of preference. 26data = [ 27 ('da, en, pt', ['da', 'en', 'pt']), 28 ('da, en;q=.9, en-gb;q=1.0, en-us', ['da', 'en-gb', 'en-us', 'en']), 29 ('pt_BR; q=0.6, pt_PT; q = .7, en-gb', ['en-gb', 'pt-pt', 'pt-br']), 30 ('en-us, en_GB;q=0.9, en, pt_BR; q=1.0', ['en-us', 'en', 'pt-br', 'en-gb']), 31 ('ro,en-us;q=0.8,es;q=0.5,fr;q=0.3', ['ro', 'en-us', 'es', 'fr']), 32 ('ro,en-us;q=0,es;q=0.5,fr;q=0,ru;q=1,it', ['ro', 'ru', 'it', 'es']) 33 ] 34 35class TestRequest(dict): 36 37 def __init__(self, languages): 38 self.annotations = {} 39 self.localized = False 40 self["HTTP_ACCEPT_LANGUAGE"] = languages 41 42 def setupLocale(self): 43 self.localized = True 44 45class BrowserLanguagesTest(unittest.TestCase): 46 47 def factory(self, request): 48 return BrowserLanguages(request) 49 50 def test_browser_language_handling(self): 51 for req, expected in data: 52 request = TestRequest(req) 53 browser_languages = self.factory(request) 54 self.assertEqual(list(browser_languages.getPreferredLanguages()), 55 expected) 56 57class CacheableBrowserLanguagesTests(BrowserLanguagesTest): 58 59 def factory(self, request): 60 return CacheableBrowserLanguages(request) 61 62 def test_cached_languages(self): 63 eq = self.failUnlessEqual 64 request = TestRequest("da, en, pt") 65 browser_languages = self.factory(request) 66 eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"]) 67 request["HTTP_ACCEPT_LANGUAGE"] = "ru, en" 68 eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"]) 69 70class ModifiableBrowserLanguagesTests(CacheableBrowserLanguagesTests): 71 72 def factory(self, request): 73 return ModifiableBrowserLanguages(request) 74 75 def test_setPreferredLanguages(self): 76 eq = self.failUnlessEqual 77 request = TestRequest("da, en, pt") 78 browser_languages = self.factory(request) 79 eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"]) 80 browser_languages.setPreferredLanguages(["ru", "en"]) 81 self.failUnless(request.localized) 82 eq(list(browser_languages.getPreferredLanguages()), ["ru", "en"]) 83 84 def test_conflicting_adapters(self): 85 request = TestRequest("da, en, pt") 86 not_compatible_browser_languages = BrowserLanguages(request) 87 browser_languages = self.factory(request) 88 self.assertRaises(NotCompatibleAdapterError, 89 browser_languages.setPreferredLanguages, ["ru", "en"]) 90 91 92def test_suite(): 93 suite = unittest.TestSuite() 94 suite.addTest(unittest.makeSuite(BrowserLanguagesTest)) 95 suite.addTest(unittest.makeSuite(CacheableBrowserLanguagesTests)) 96 suite.addTest(unittest.makeSuite(ModifiableBrowserLanguagesTests)) 97 return suite 98