diff --git a/test/Services/Install/InstallerTest.php b/test/Services/Install/InstallerTest.php index 38942a7b..363f61aa 100644 --- a/test/Services/Install/InstallerTest.php +++ b/test/Services/Install/InstallerTest.php @@ -26,10 +26,13 @@ namespace SP\Tests\Services\Install; use DI\Container; use PHPUnit\Framework\TestCase; +use SP\Config\Config; use SP\Core\Exceptions\SPException; +use SP\Services\Crypt\MasterPassService; use SP\Services\Install\InstallData; use SP\Services\Install\Installer; use SP\Storage\Database\DatabaseConnectionData; +use SP\Storage\Database\DBUtil; use SP\Storage\Database\MySQLHandler; use function SP\Test\setupContext; @@ -40,6 +43,8 @@ use function SP\Test\setupContext; */ class InstallerTest extends TestCase { + const DB_NAME = 'syspass_test'; + /** * @var Container */ @@ -67,41 +72,67 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('root'); $params->setDbAdminPass('syspass'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('syspass-db'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); $installer->run($params); - $dbData = self::$dic->get(DatabaseConnectionData::class); + $configData = self::$dic->get(Config::class)->getConfigData(); - $this->assertEquals($params->getDbName(), $dbData->getDbName()); - $this->assertEquals($params->getDbHost(), $dbData->getDbHost()); - $this->assertEquals(3306, $dbData->getDbPort()); - $this->assertTrue(preg_match('/sp_\w+/', $dbData->getDbUser()) === 1); - $this->assertNotEmpty($dbData->getDbPass()); + $this->assertEquals($params->getDbName(), $configData->getDbName()); + $this->assertEquals($params->getDbHost(), $configData->getDbHost()); + $this->assertEquals(3306, $configData->getDbPort()); + $this->assertTrue(preg_match('/sp_\w+/', $configData->getDbUser()) === 1); + $this->assertNotEmpty($configData->getDbPass()); + $this->assertEquals($params->getSiteLang(), $configData->getSiteLang()); - $this->dropDatabase(); + $this->assertTrue(self::$dic->get(MasterPassService::class)->checkMasterPassword($params->getMasterPassword())); + + $this->dropDatabase(self::DB_NAME); + $this->dropUser($configData->getDbUser(), SELF_IP_ADDRESS); + $this->dropUser($configData->getDbUser(), SELF_HOSTNAME); } /** + * @param $database + * * @throws \SP\Storage\Database\DatabaseException */ - private function dropDatabase() + private function dropDatabase($database) { - $data = new DatabaseConnectionData(); - $data->setDbHost('syspass-db'); - $data->setDbUser('root'); - $data->setDbPass('syspass'); + $this->getConnection() + ->query(sprintf('DROP DATABASE `%s`', $database)); + } - $mysql = new MySQLHandler($data); - $mysql->getConnectionSimple() - ->query('DROP DATABASE syspass_test'); + /** + * @return \PDO + * @throws \SP\Storage\Database\DatabaseException + */ + private function getConnection() + { + $data = (new DatabaseConnectionData()) + ->setDbHost('syspass-db') + ->setDbUser('root') + ->setDbPass('syspass'); + + return (new MySQLHandler($data))->getConnectionSimple(); + } + + /** + * @param $user + * @param $host + * + * @throws \SP\Storage\Database\DatabaseException + */ + private function dropUser($user, $host) + { + $this->getConnection() + ->query(sprintf('DROP USER \'%s\'@\'%s\'', $user, $host)); } /** @@ -116,13 +147,12 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('root'); $params->setDbAdminPass('syspass'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('fail'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); @@ -144,13 +174,12 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('root'); $params->setDbAdminPass('syspass'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('192.168.0.1'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); @@ -172,13 +201,12 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('root'); $params->setDbAdminPass('syspass'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('syspass-db:3307'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); @@ -200,13 +228,12 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('toor'); $params->setDbAdminPass('syspass'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('syspass-db'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); @@ -228,13 +255,12 @@ class InstallerTest extends TestCase $params = new InstallData(); $params->setDbAdminUser('root'); $params->setDbAdminPass('test'); - $params->setDbName('syspass_test'); + $params->setDbName(self::DB_NAME); $params->setDbHost('syspass-db'); $params->setAdminLogin('admin'); $params->setAdminPass('syspass_admin'); $params->setMasterPassword('00123456789'); $params->setSiteLang('en_US'); - $params->setHostingMode(false); $installer = self::$dic->get(Installer::class); @@ -244,6 +270,72 @@ class InstallerTest extends TestCase $installer->run($params); } + /** + * @throws \DI\DependencyException + * @throws \DI\NotFoundException + * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException + * @throws \SP\Core\Exceptions\InvalidArgumentException + * @throws \SP\Core\Exceptions\SPException + */ + public function testHostingMode() + { + $this->createDatabase(self::DB_NAME); + $this->createUser('syspass_user', '123456', self::DB_NAME); + + $params = new InstallData(); + $params->setDbAdminUser('syspass_user'); + $params->setDbAdminPass('123456'); + $params->setDbName(self::DB_NAME); + $params->setDbHost('syspass-db'); + $params->setAdminLogin('admin'); + $params->setAdminPass('syspass_admin'); + $params->setMasterPassword('00123456789'); + $params->setSiteLang('en_US'); + $params->setHostingMode(true); + + $installer = self::$dic->get(Installer::class); + $installer->run($params); + + $this->assertTrue(DBUtil::checkDatabaseExist(self::$dic->get(MySQLHandler::class), self::DB_NAME)); + + $configData = self::$dic->get(Config::class)->getConfigData(); + + $this->assertEquals($params->getDbName(), $configData->getDbName()); + $this->assertEquals($params->getDbHost(), $configData->getDbHost()); + $this->assertEquals(3306, $configData->getDbPort()); + $this->assertNotEmpty($configData->getDbPass()); + $this->assertEquals($params->getSiteLang(), $configData->getSiteLang()); + + $this->assertTrue(self::$dic->get(MasterPassService::class)->checkMasterPassword($params->getMasterPassword())); + + $this->dropDatabase(self::DB_NAME); + $this->dropUser('syspass_user', SELF_IP_ADDRESS); + } + + /** + * @param $database + * + * @throws \SP\Storage\Database\DatabaseException + */ + private function createDatabase($database) + { + $this->getConnection() + ->query(sprintf('CREATE DATABASE `%s`', $database)); + } + + /** + * @param $user + * @param $pass + * @param $database + * + * @throws \SP\Storage\Database\DatabaseException + */ + private function createUser($user, $pass, $database) + { + $this->getConnection() + ->query(sprintf('GRANT ALL PRIVILEGES ON `%s`.* TO \'%s\'@\'%s\' IDENTIFIED BY \'%s\'', $database, $user, SELF_IP_ADDRESS, $pass)); + } + protected function tearDown() { @unlink(CONFIG_FILE); diff --git a/test/bootstrap.php b/test/bootstrap.php index 09cfef3c..10ff108c 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -44,7 +44,8 @@ define('CONFIG_FILE', CONFIG_PATH . DIRECTORY_SEPARATOR . 'config.xml'); define('ACTIONS_FILE', CONFIG_PATH . DIRECTORY_SEPARATOR . 'actions.xml'); define('CACHE_PATH', RESOURCE_DIR . DIRECTORY_SEPARATOR . 'cache'); define('LOG_FILE', TMP_DIR . DIRECTORY_SEPARATOR . 'test.log'); -define('SELF_IP_ADDRESS', '172.17.0.4'); +define('SELF_IP_ADDRESS', getRealIpAddress()); +define('SELF_HOSTNAME', gethostbyaddr(SELF_IP_ADDRESS)); require APP_ROOT . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; require APP_ROOT . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'BaseFunctions.php'; @@ -67,6 +68,14 @@ if (!function_exists('\gettext')) { } } +/** + * @return string + */ +function getRealIpAddress() +{ + return trim(shell_exec('ip a s eth0 | awk \'$1 == "inet" {print $2}\' | cut -d"/" -f1')); +} + /** * Configura el contexto de la aplicación para los tests *