211 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
import os
 | 
						|
import shutil
 | 
						|
import tempfile
 | 
						|
import unittest
 | 
						|
import configparser
 | 
						|
 | 
						|
from ankisyncd.users import SimpleUserManager, SqliteUserManager
 | 
						|
from ankisyncd.users import get_user_manager
 | 
						|
 | 
						|
import helpers.server_utils
 | 
						|
 | 
						|
class FakeUserManager(SimpleUserManager):
 | 
						|
    def __init__(self, config):
 | 
						|
        pass
 | 
						|
 | 
						|
class BadUserManager:
 | 
						|
    pass
 | 
						|
 | 
						|
class UserManagerFactoryTest(unittest.TestCase):
 | 
						|
    def test_get_user_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 SqliteUserManager
 | 
						|
        config['sync_app'].update(server_paths)
 | 
						|
        self.assertTrue(type(get_user_manager(config['sync_app']) == SqliteUserManager))
 | 
						|
 | 
						|
        # No value defaults to SimpleUserManager
 | 
						|
        config.remove_option("sync_app", "auth_db_path")
 | 
						|
        self.assertTrue(type(get_user_manager(config['sync_app'])) == SimpleUserManager)
 | 
						|
 | 
						|
        # A conf-specified UserManager is loaded
 | 
						|
        config.set("sync_app", "user_manager", 'test_users.FakeUserManager')
 | 
						|
        self.assertTrue(type(get_user_manager(config['sync_app'])) == FakeUserManager)
 | 
						|
 | 
						|
        # Should fail at load time if the class doesn't inherit from  SimpleUserManager
 | 
						|
        config.set("sync_app", "user_manager", 'test_users.BadUserManager')
 | 
						|
        with self.assertRaises(TypeError):
 | 
						|
            um = get_user_manager(config['sync_app'])
 | 
						|
 | 
						|
        # Add the auth_db_path back, it should take precedence over BadUserManager
 | 
						|
        config['sync_app'].update(server_paths)
 | 
						|
        self.assertTrue(type(get_user_manager(config['sync_app']) == SqliteUserManager))
 | 
						|
 | 
						|
 | 
						|
class SimpleUserManagerTest(unittest.TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        self.user_manager = SimpleUserManager()
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        self._user_manager = None
 | 
						|
 | 
						|
    def test_authenticate(self):
 | 
						|
        good_test_un = 'username'
 | 
						|
        good_test_pw = 'password'
 | 
						|
        bad_test_un = 'notAUsername'
 | 
						|
        bad_test_pw = 'notAPassword'
 | 
						|
 | 
						|
        self.assertTrue(self.user_manager.authenticate(good_test_un,
 | 
						|
                                                       good_test_pw))
 | 
						|
        self.assertTrue(self.user_manager.authenticate(bad_test_un,
 | 
						|
                                                       bad_test_pw))
 | 
						|
        self.assertTrue(self.user_manager.authenticate(good_test_un,
 | 
						|
                                                       bad_test_pw))
 | 
						|
        self.assertTrue(self.user_manager.authenticate(bad_test_un,
 | 
						|
                                                       good_test_pw))
 | 
						|
 | 
						|
    def test_userdir(self):
 | 
						|
        username = 'my_username'
 | 
						|
        dirname = self.user_manager.userdir(username)
 | 
						|
        self.assertEqual(dirname, username)
 | 
						|
 | 
						|
 | 
						|
class SqliteUserManagerTest(unittest.TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        basedir = tempfile.mkdtemp(prefix=self.__class__.__name__)
 | 
						|
        self.basedir = basedir
 | 
						|
        self.auth_db_path = os.path.join(basedir, "auth.db")
 | 
						|
        self.collection_path = os.path.join(basedir, "collections")
 | 
						|
        self.user_manager = SqliteUserManager(self.auth_db_path,
 | 
						|
                                              self.collection_path)
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        shutil.rmtree(self.basedir)
 | 
						|
        self.user_manager = None
 | 
						|
 | 
						|
    def test_auth_db_exists(self):
 | 
						|
        self.assertFalse(self.user_manager.auth_db_exists())
 | 
						|
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.assertTrue(self.user_manager.auth_db_exists())
 | 
						|
 | 
						|
        os.unlink(self.auth_db_path)
 | 
						|
        self.assertFalse(self.user_manager.auth_db_exists())
 | 
						|
 | 
						|
    def test_user_list(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
 | 
						|
        self.assertEqual(self.user_manager.user_list(), [])
 | 
						|
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
        self.assertEqual(self.user_manager.user_list(), [username])
 | 
						|
 | 
						|
    def test_user_exists(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
        self.assertTrue(self.user_manager.user_exists(username))
 | 
						|
 | 
						|
        self.user_manager.del_user(username)
 | 
						|
        self.assertFalse(self.user_manager.user_exists(username))
 | 
						|
 | 
						|
    def test_del_user(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        collection_dir_path = os.path.join(self.collection_path, username)
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
        self.user_manager.del_user(username)
 | 
						|
 | 
						|
        # User should be gone.
 | 
						|
        self.assertFalse(self.user_manager.user_exists(username))
 | 
						|
        # User's collection dir should still be there.
 | 
						|
        self.assertTrue(os.path.isdir(collection_dir_path))
 | 
						|
 | 
						|
    def test_add_user(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        expected_dir_path = os.path.join(self.collection_path, username)
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
 | 
						|
        self.assertFalse(os.path.exists(expected_dir_path))
 | 
						|
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
 | 
						|
        # User db entry and collection dir should be present.
 | 
						|
        self.assertTrue(self.user_manager.user_exists(username))
 | 
						|
        self.assertTrue(os.path.isdir(expected_dir_path))
 | 
						|
 | 
						|
    def test_add_users(self):
 | 
						|
        users_data = [("my_first_username", "my_first_password"),
 | 
						|
                      ("my_second_username", "my_second_password")]
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_users(users_data)
 | 
						|
 | 
						|
        user_list = self.user_manager.user_list()
 | 
						|
        self.assertIn("my_first_username", user_list)
 | 
						|
        self.assertIn("my_second_username", user_list)
 | 
						|
        self.assertTrue(os.path.isdir(os.path.join(self.collection_path,
 | 
						|
                                                   "my_first_username")))
 | 
						|
        self.assertTrue(os.path.isdir(os.path.join(self.collection_path,
 | 
						|
                                                   "my_second_username")))
 | 
						|
 | 
						|
    def test__add_user_to_auth_db(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
 | 
						|
        self.assertTrue(self.user_manager.user_exists(username))
 | 
						|
 | 
						|
    def test_create_auth_db(self):
 | 
						|
        self.assertFalse(os.path.exists(self.auth_db_path))
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.assertTrue(os.path.isfile(self.auth_db_path))
 | 
						|
 | 
						|
    def test__create_user_dir(self):
 | 
						|
        username = "my_username"
 | 
						|
        expected_dir_path = os.path.join(self.collection_path, username)
 | 
						|
        self.assertFalse(os.path.exists(expected_dir_path))
 | 
						|
        self.user_manager._create_user_dir(username)
 | 
						|
        self.assertTrue(os.path.isdir(expected_dir_path))
 | 
						|
 | 
						|
    def test_authenticate(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
 | 
						|
        self.assertTrue(self.user_manager.authenticate(username,
 | 
						|
                                                       password))
 | 
						|
 | 
						|
    def test_set_password_for_user(self):
 | 
						|
        username = "my_username"
 | 
						|
        password = "my_password"
 | 
						|
        new_password = "my_new_password"
 | 
						|
 | 
						|
        self.user_manager.create_auth_db()
 | 
						|
        self.user_manager.add_user(username, password)
 | 
						|
 | 
						|
        self.user_manager.set_password_for_user(username, new_password)
 | 
						|
        self.assertFalse(self.user_manager.authenticate(username,
 | 
						|
                                                        password))
 | 
						|
        self.assertTrue(self.user_manager.authenticate(username,
 | 
						|
                                                       new_password))
 | 
						|
 |