* */ namespace Combodo\iTop\Test\UnitTest\Application\Search; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; use Query; use QueryOQL; use utils; /** * This test creates call export on requests and check request usage counter. * * Transaction are disabled to avoid data inconsistency between test and call to export (outside test scope) * All objects created in this test will be deleted by the test. * * @group iTopQuery */ class QueryTest extends ItopDataTestCase { // disable transaction to avoid data inconsistency between test and call to export (outside test scope) public const USE_TRANSACTION = false; // user for exportation process public const USER = 'dani2'; public const PASSWORD = '1TopCombodo+'; private $oUser; /** @inheritDoc */ public function setUp(): void { parent::setUp(); $this->SetNonPublicStaticProperty(utils::class, 'sAbsoluteUrlAppRootCache', null); // create export user $this->CreateExportUser(); } /** * Create new user for export authentication purpose. */ private function CreateExportUser() { $oAdminProfile = MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", ['name' => 'Administrator'], true); $this->oUser = $this->CreateUser(self::USER, $oAdminProfile->GetKey(), self::PASSWORD); } /** * Create an OQL query to list Person objects. * * @param string $sName query name * @param string $sDescription query description * @param string $sOql query oql phrase * @param string|null $sFields fields to export */ private function CreateQueryOQL(string $sName, string $sDescription, string $sOql, string $sFields = null): QueryOQL { $oQuery = new QueryOQL(); $oQuery->Set('name', $sName); $oQuery->Set('description', $sDescription); $oQuery->Set('oql', $sOql); if ($sFields != null) { $oQuery->Set('fields', $sFields); } $oQuery->DBInsert(); $this->assertFalse($oQuery->IsNew()); return $oQuery; } /** * Test query export V2 usage. * * @param string $sDescription query description * @param string $sOql query oql phrase * * @dataProvider getQueryProvider */ public function testQueryExportV2Usage(string $sDescription, string $sOql) { // create query OQL $oQuery = $this->CreateQueryOQL($this->dataName(), $sDescription, $sOql, 'first_name'); // call export service $this->CallExportService($oQuery); // reload to update counter (done by export process) $oQuery->Reload(); // extract counter $iResult = $oQuery->Get('export_count'); // delete the query $oQuery->DBDelete(); // test $this->assertEquals(1, $iResult); } /** * Data provide for test. * * @return array */ public function getQueryProvider() { return [ 'Export #1' => ['query without params', 'SELECT Person'], 'Export #2' => ['query with params', "SELECT Person WHERE first_name LIKE 'B%'"], ]; } /** * Call export for given query object. * * @param \Query $oQuery * * @return bool|string */ private function CallExportService(Query $oQuery) { // compute request url $url = $oQuery->GetExportUrl(); // open curl $curl = curl_init(); // curl options curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, self::USER.':'.self::PASSWORD); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Force disable of certificate check as most of dev / test env have a self-signed certificate curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // execute curl $result = curl_exec($curl); if (curl_errno($curl)) { $info = curl_getinfo($curl); var_export($info); var_dump([ 'url' => $url, 'app_root_url:' => MetaModel::GetConfig()->Get('app_root_url'), 'GetAbsoluteUrlAppRoot:' => \utils::GetAbsoluteUrlAppRoot(), ]); } // close curl curl_close($curl); return $result; } /** @inheritDoc */ protected function tearDown(): void { $this->oUser->DBDelete(); parent::tearDown(); } }