[devtools] make PostgresTestDataBaseHandler start its own postgresql
Don't depend on postgresql already running on the system, or on a static
config.
To use this, set the configcls attribute of your CubicWebTC-derived test
class to PostgresApptestConfiguration.
Caveats:
- this won't work with several tests running concurrently from the
same directory, since each would start its own cluster with a shared
data directory and stomp on each other's toes
- you need initdb/pg_ctl in $PATH, e.g /usr/lib/postgresql/$version/bin
on Debian/Ubuntu systems.
Closes #3489631
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>.fromlogilab.common.testlibimportTestCase,unittest_main,tag,Tagsfromcubicweb.devtools.fakeimportFakeRequestdef_test_cache(hin,hout,method='GET'):"""forge and process an HTTP request using given headers in/out and method, then return it once its .is_client_cache_valid() method has been called. req.status_out is None if the page should have been calculated. """# forge requestreq=FakeRequest(method=method)forkey,valueinhin:req._headers_in.addRawHeader(key,str(value))forkey,valueinhout:req.headers_out.addRawHeader(key,str(value))# processreq.status_out=Nonereq.is_client_cache_valid()returnreqclassHTTPCache(TestCase):"""Check that the http cache logiac work as expected (as far as we understood the RFC) """tags=TestCase.tags|Tags('http','cache')defassertCache(self,expected,status,situation=''):"""simple assert for nicer message"""ifexpected!=status:ifexpectedisNone:expected="MODIFIED"ifstatusisNone:status="MODIFIED"msg='expected %r got %r'%(expected,status)ifsituation:msg="%s - when: %s"%(msg,situation)self.fail(msg)deftest_IN_none_OUT_none(self):#: test that no caching is requested when not data is available#: on any sidereq=_test_cache((),())self.assertIsNone(req.status_out)deftest_IN_Some_OUT_none(self):#: test that no caching is requested when no data is available#: server (origin) sidehin=[('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,())self.assertIsNone(req.status_out)hin=[('if-none-match','babar/huitre'),]req=_test_cache(hin,())self.assertIsNone(req.status_out)hin=[('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),('if-none-match','babar/huitre'),]req=_test_cache(hin,())self.assertIsNone(req.status_out)deftest_IN_none_OUT_Some(self):#: test that no caching is requested when no data is provided#: by the clienthout=[('last-modified','Sat, 14 Apr 2012 14:39:32 GM'),]req=_test_cache((),hout)self.assertIsNone(req.status_out)hout=[('etag','babar/huitre'),]req=_test_cache((),hout)self.assertIsNone(req.status_out)hout=[('last-modified','Sat, 14 Apr 2012 14:39:32 GM'),('etag','babar/huitre'),]req=_test_cache((),hout)self.assertIsNone(req.status_out)@tag('last_modified')deftest_last_modified_newer(self):#: test the proper behavior of modification date only# newerhin=[('if-modified-since','Sat, 13 Apr 2012 14:39:32 GM'),]hout=[('last-modified','Sat, 14 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'origin is newer than client')@tag('last_modified')deftest_last_modified_older(self):# olderhin=[('if-modified-since','Sat, 15 Apr 2012 14:39:32 GM'),]hout=[('last-modified','Sat, 14 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'origin is older than client')@tag('last_modified')deftest_last_modified_same(self):# samehin=[('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]hout=[('last-modified','Sat, 14 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'origin is equal to client')@tag('etag')deftest_etag_mismatch(self):#: test the proper behavior of etag only# etag mismatchhin=[('if-none-match','babar'),]hout=[('etag','celestine'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'etag mismatch')@tag('etag')deftest_etag_match(self):# etag matchhin=[('if-none-match','babar'),]hout=[('etag','babar'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'etag match')# etag match in multiplehin=[('if-none-match','loutre'),('if-none-match','babar'),]hout=[('etag','babar'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'etag match in multiple')# client use "*" as etaghin=[('if-none-match','*'),]hout=[('etag','babar'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'client use "*" as etag')@tag('etag','last_modified')deftest_both(self):#: test the proper behavior of etag only# both wronghin=[('if-none-match','babar'),('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]hout=[('etag','loutre'),('last-modified','Sat, 15 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'both wrong')@tag('etag','last_modified')deftest_both_etag_mismatch(self):# both etag mismatchhin=[('if-none-match','babar'),('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]hout=[('etag','loutre'),('last-modified','Sat, 13 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'both but etag mismatch')@tag('etag','last_modified')deftest_both_but_modified(self):# both but modifiedhin=[('if-none-match','babar'),('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]hout=[('etag','babar'),('last-modified','Sat, 15 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'both but modified')@tag('etag','last_modified')deftest_both_ok(self):# both okhin=[('if-none-match','babar'),('if-modified-since','Sat, 14 Apr 2012 14:39:32 GM'),]hout=[('etag','babar'),('last-modified','Sat, 13 Apr 2012 14:39:32 GM'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'both ok')@tag('etag','HEAD')deftest_head_verb(self):#: check than FOUND 200 is properly raise without content on HEAD request#: This logic does not really belong here :-/# modifiedhin=[('if-none-match','babar'),]hout=[('etag','rhino/really-not-babar'),]req=_test_cache(hin,hout,method='HEAD')self.assertCache(200,req.status_out,'modifier HEAD verb')# not modifiedhin=[('if-none-match','babar'),]hout=[('etag','babar'),]req=_test_cache(hin,hout,method='HEAD')self.assertCache(304,req.status_out,'not modifier HEAD verb')@tag('etag','POST')deftest_post_verb(self):# modifiedhin=[('if-none-match','babar'),]hout=[('etag','rhino/really-not-babar'),]req=_test_cache(hin,hout,method='POST')self.assertCache(None,req.status_out,'modifier HEAD verb')# not modifiedhin=[('if-none-match','babar'),]hout=[('etag','babar'),]req=_test_cache(hin,hout,method='POST')self.assertCache(412,req.status_out,'not modifier HEAD verb')@tag('expires')deftest_expires_added(self):#: Check that Expires header is added:#: - when the page is modified#: - when none was already presenthin=[('if-none-match','babar'),]hout=[('etag','rhino/really-not-babar'),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'modifier HEAD verb')value=req.headers_out.getHeader('expires')self.assertIsNotNone(value)@tag('expires')deftest_expires_not_added(self):#: Check that Expires header is not added if NOT-MODIFIEDhin=[('if-none-match','babar'),]hout=[('etag','babar'),]req=_test_cache(hin,hout)self.assertCache(304,req.status_out,'not modifier HEAD verb')value=req.headers_out.getHeader('expires')self.assertIsNone(value)@tag('expires')deftest_expires_no_overwrite(self):#: Check that cache does not overwrite existing Expires headerhin=[('if-none-match','babar'),]DATE='Sat, 13 Apr 2012 14:39:32 GM'hout=[('etag','rhino/really-not-babar'),('expires',DATE),]req=_test_cache(hin,hout)self.assertCache(None,req.status_out,'not modifier HEAD verb')value=req.headers_out.getRawHeaders('expires')self.assertEqual(value,[DATE])if__name__=='__main__':unittest_main()