connect_to_test_db(); } // The $transactuion variable is needed to hold the transaction until the // function returns. $transaction = new \DbaTransaction(\DBA::$dba); $this->loadFixtures(); // Make sure app config is reset and loaded from fixtures \App::$config = array(); \Zotlabs\Lib\Config::Load('system'); $result = parent::run($result); return $result; } /** * Connect to the test database, * * By default it will connect to a MySQL database with the following settings: * * - HZ_TEST_DB_HOST: db * - HZ_TEST_DB_PORT: default * - HZ_TEST_DB_USER: test_user * - HZ_TEST_DB_PASS: hubzilla * - HZ_TEST_DB_DATABASE: hubzilla_test_db * - HZ_TEST_DB_TYPE: mysql (can also be "postgres") * - HZ_TEST_DB_CHARSET: UTF8 * * All of these settings can be overridden by the test runner by setting ENV vars * named as above with the values you want to override. */ protected function connect_to_test_db() : void { if ( !\DBA::$dba ) { \DBA::dba_factory( getenv('HZ_TEST_DB_HOST') ?: 'localhost', // Use default port for db type if none specified getenv('HZ_TEST_DB_PORT'), getenv('HZ_TEST_DB_USER') ?: 'test_user', getenv('HZ_TEST_DB_PASS') ?: 'hubzilla', getenv('HZ_TEST_DB_DATABASE') ?: 'hubzilla_test_db', self::dbtype(getenv('HZ_TEST_DB_TYPE')), getenv('HZ_TEST_DB_CHARSET') ?: 'UTF8', false); if ( !\DBA::$dba->connected ) { $msg = "Unable to connect to db! "; if(file_exists('dbfail.out')) { $msg .= file_get_contents('dbfail.out'); } throw new \Exception($msg); } \DBA::$dba->dbg(true); } } /** * Return the database type from a string. * * @param string $type The database type, can be either mysql or postgres. * * @return The database type constant matching the passed in type, or DBTYPE_MYSQL * if $type is empty or invalid. */ private static function dbtype(string $type): int { if (trim(strtolower($type)) === 'postgres') { return DBTYPE_POSTGRES; } else { return DBTYPE_MYSQL; } } /** * Load database fixtures from the fixture path. */ private function loadFixtures() : void { $files = glob(__DIR__ . '/includes/dba/_files/*.yml'); if ($files === false || empty($files)) { error_log('[-] ' . __METHOD__ . ': No fixtures found! :('); } array_walk($files, fn($file) => $this->loadFixture($file)); } /** * Load database fixtures from a specific file. * * The file must be a yaml file named the same as the table in the database * it should populate. * * The file also need to have a root key with the same name as the table. * Under which it contains an array of rows that should be inserted into * the db table. * * @param string $file The path and filename of the fixture to load. * The path name is relative to the current working * directory of the process, which should normally * be the Hubzilla root directory. */ private function loadFixture($file) : void { $table_name = basename($file, '.yml'); $this->fixtures[$table_name] = yaml_parse_file($file)[$table_name]; foreach ($this->fixtures[$table_name] as $entry) { $query = 'INSERT INTO ' . dbesc($table_name) . '(' . implode(',', array_keys($entry)) . ') VALUES(' . implode(',', array_map(fn($val) => "'{$val}'", array_values($entry))) . ')'; q($query); } } }