* */ namespace Combodo\iTop\Test\UnitTest\Application\Search; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; use Query; use QueryOQL; /** * 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 * @runTestsInSeparateProcesses * @preserveGlobalState disabled * @backupGlobals disabled */ class QueryTest extends ItopDataTestCase { // disable transaction to avoid data inconsistency between test and call to export (outside test scope) const USE_TRANSACTION = false; // user for exportation process const USER = 'dani2'; const PASSWORD = '1TopCombodo+'; private $oUser; /** @inheritDoc */ public function setUp(): void { parent::setUp(); // create export user $this->CreateExportUser(); } /** * Create new user for export authentication purpose. */ private function CreateExportUser() { $oAdminProfile = MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", array('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(); return $oQuery; } /** * Test query export V1 usage. * * @param string $sDescription query description * @param string $sOql query oql phrase * * @dataProvider getQueryProvider */ public function testQueryExportV1Usage(string $sDescription, string $sOql) { // create query OQL $oQuery = $this->CreateQueryOQL($this->dataName(), $sDescription, $sOql); // 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); } /** * 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 array( 'Export #1' => array('query without params', 'SELECT Person'), 'Export #2' => array('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); // execute curl $result = curl_exec($curl); // close curl curl_close($curl); return $result; } /** @inheritDoc */ protected function tearDown(): void { $this->oUser->DBDelete(); } }