[server] prevent returning closed cursor to the database pool
In since c8c6ad8 init_repository use repo.internal_cnx() instead of
repo.system_source.get_connection() so it use the pool and we should not close
cursors from the pool before returning it back. Otherwise we may have
"connection already closed" error.
This bug only trigger when connection-pool-size = 1. Since we are moving to use
a dynamic pooler we need to get this fixed.
This does not occur with sqlite since the connection wrapper instantiate new
cursor everytime, but this occur with other databases.
from os.path import join
from shutil import rmtree
from cubicweb.pyramid.test import PyramidCWTest
class LoginTestLangUrlPrefix(PyramidCWTest):
@classmethod
def setUpClass(cls):
super(LoginTestLangUrlPrefix, cls).setUpClass()
cls.config.global_set_option('language-mode', 'url-prefix')
def test_login_password_login_lang_prefix(self):
res = self.webapp.post('/fr/login', {
'__login': self.admlogin, '__password': self.admpassword})
self.assertEqual(res.status_int, 303)
res = self.webapp.get('/fr/login')
self.assertEqual(res.status_int, 303)
class LoginTest(PyramidCWTest):
settings = {'cubicweb.bwcompat': True}
def test_login_form(self):
res = self.webapp.get('/login')
self.assertIn('__login', res.text)
def test_login_password_login(self):
res = self.webapp.post('/login', {
'__login': self.admlogin, '__password': self.admpassword})
self.assertEqual(res.status_int, 303)
res = self.webapp.get('/login')
self.assertEqual(res.status_int, 303)
def test_login_password_login_cookie_expires(self):
res = self.webapp.post('/login', {
'__login': self.admlogin, '__password': self.admpassword})
self.assertEqual(res.status_int, 303)
cookies = self.webapp.cookiejar._cookies['localhost.local']['/']
self.assertNotIn('pauth_tkt', cookies)
self.assertIn('auth_tkt', cookies)
self.assertIsNone(cookies['auth_tkt'].expires)
res = self.webapp.get('/logout')
self.assertEqual(res.status_int, 303)
self.assertNotIn('auth_tkt', cookies)
self.assertNotIn('pauth_tkt', cookies)
res = self.webapp.post('/login', {
'__login': self.admlogin, '__password': self.admpassword,
'__setauthcookie': 1})
self.assertEqual(res.status_int, 303)
cookies = self.webapp.cookiejar._cookies['localhost.local']['/']
self.assertNotIn('auth_tkt', cookies)
self.assertIn('pauth_tkt', cookies)
self.assertIsNotNone(cookies['pauth_tkt'].expires)
def test_login_bad_password(self):
self.config.i18ncompile(['en', 'fr'])
try:
self.config._gettext_init()
res = self.webapp.post(
'/login',
{'__login': self.admlogin, '__password': 'empty'},
headers={'Accept-Language': 'fr'},
status=403)
finally:
rmtree(join(self.config.apphome, 'i18n'))
self.assertIn(u"\xc9chec de l'authentification", res.text)
if __name__ == '__main__':
from unittest import main
main()