124 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# -*- coding: utf-8 -*-
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import tempfile
							 | 
						||
| 
								 | 
							
								import sqlite3
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								import configparser
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ankisyncd.sessions import SimpleSessionManager
							 | 
						||
| 
								 | 
							
								from ankisyncd.sessions import SqliteSessionManager
							 | 
						||
| 
								 | 
							
								from ankisyncd.sessions import get_session_manager
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ankisyncd.sync_app import SyncUserSession
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import helpers.server_utils
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FakeSessionManager(SimpleSessionManager):
							 | 
						||
| 
								 | 
							
								    def __init__(self, config):
							 | 
						||
| 
								 | 
							
								        pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class BadSessionManager:
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SessionManagerFactoryTest(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    def test_get_session_manager(self):
							 | 
						||
| 
								 | 
							
								        # Get absolute path to development ini file.
							 | 
						||
| 
								 | 
							
								        script_dir = os.path.dirname(os.path.realpath(__file__))
							 | 
						||
| 
								 | 
							
								        ini_file_path = os.path.join(script_dir,
							 | 
						||
| 
								 | 
							
								                                     "assets",
							 | 
						||
| 
								 | 
							
								                                     "test.conf")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Create temporary files and dirs the server will use.
							 | 
						||
| 
								 | 
							
								        server_paths = helpers.server_utils.create_server_paths()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        config = configparser.ConfigParser()
							 | 
						||
| 
								 | 
							
								        config.read(ini_file_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Use custom files and dirs in settings. Should be SqliteSessionManager
							 | 
						||
| 
								 | 
							
								        config['sync_app'].update(server_paths)
							 | 
						||
| 
								 | 
							
								        self.assertTrue(type(get_session_manager(config['sync_app']) == SqliteSessionManager))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # No value defaults to SimpleSessionManager
							 | 
						||
| 
								 | 
							
								        config.remove_option("sync_app", "session_db_path")
							 | 
						||
| 
								 | 
							
								        self.assertTrue(type(get_session_manager(config['sync_app'])) == SimpleSessionManager)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # A conf-specified SessionManager is loaded
							 | 
						||
| 
								 | 
							
								        config.set("sync_app", "session_manager", 'test_sessions.FakeSessionManager')
							 | 
						||
| 
								 | 
							
								        self.assertTrue(type(get_session_manager(config['sync_app'])) == FakeSessionManager)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Should fail at load time if the class doesn't inherit from  SimpleSessionManager
							 | 
						||
| 
								 | 
							
								        config.set("sync_app", "session_manager", 'test_sessions.BadSessionManager')
							 | 
						||
| 
								 | 
							
								        with self.assertRaises(TypeError):
							 | 
						||
| 
								 | 
							
								            sm = get_session_manager(config['sync_app'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Add the session_db_path back, it should take precedence over BadSessionManager
							 | 
						||
| 
								 | 
							
								        config['sync_app'].update(server_paths)
							 | 
						||
| 
								 | 
							
								        self.assertTrue(type(get_session_manager(config['sync_app'])) == SqliteSessionManager)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SimpleSessionManagerTest(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    test_hkey = '1234567890'
							 | 
						||
| 
								 | 
							
								    sdir = tempfile.mkdtemp(suffix="_session")
							 | 
						||
| 
								 | 
							
								    os.rmdir(sdir)
							 | 
						||
| 
								 | 
							
								    test_session = SyncUserSession('testName', sdir, None, None)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager = SimpleSessionManager()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def tearDown(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager = None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_save(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager.save(self.test_hkey, self.test_session)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.sessionManager.sessions[self.test_hkey].name,
							 | 
						||
| 
								 | 
							
								                         self.test_session.name)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.sessionManager.sessions[self.test_hkey].path,
							 | 
						||
| 
								 | 
							
								                         self.test_session.path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_delete(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager.save(self.test_hkey, self.test_session)
							 | 
						||
| 
								 | 
							
								        self.assertTrue(self.test_hkey in self.sessionManager.sessions)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.sessionManager.delete(self.test_hkey)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertTrue(self.test_hkey not in self.sessionManager.sessions)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_load(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager.save(self.test_hkey, self.test_session)
							 | 
						||
| 
								 | 
							
								        self.assertTrue(self.test_hkey in self.sessionManager.sessions)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        loaded_session = self.sessionManager.load(self.test_hkey)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(loaded_session.name, self.test_session.name)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(loaded_session.path, self.test_session.path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SqliteSessionManagerTest(SimpleSessionManagerTest):
							 | 
						||
| 
								 | 
							
								    file_descriptor, _test_sess_db_path = tempfile.mkstemp(suffix=".db")
							 | 
						||
| 
								 | 
							
								    os.close(file_descriptor)
							 | 
						||
| 
								 | 
							
								    os.unlink(_test_sess_db_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        self.sessionManager = SqliteSessionManager(self._test_sess_db_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def tearDown(self):
							 | 
						||
| 
								 | 
							
								        if os.path.exists(self._test_sess_db_path):
							 | 
						||
| 
								 | 
							
								            os.remove(self._test_sess_db_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_save(self):
							 | 
						||
| 
								 | 
							
								        SimpleSessionManagerTest.test_save(self)
							 | 
						||
| 
								 | 
							
								        self.assertTrue(os.path.exists(self._test_sess_db_path))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        conn = sqlite3.connect(self._test_sess_db_path)
							 | 
						||
| 
								 | 
							
								        cursor = conn.cursor()
							 | 
						||
| 
								 | 
							
								        cursor.execute("SELECT username, path FROM session WHERE hkey=?",
							 | 
						||
| 
								 | 
							
								                       (self.test_hkey,))
							 | 
						||
| 
								 | 
							
								        res = cursor.fetchone()
							 | 
						||
| 
								 | 
							
								        conn.close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(res[0], self.test_session.name)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(res[1], self.test_session.path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |