Skip to content
Extraits de code Groupes Projets
TrackerTest.php 12 ko
Newer Older
  • Learn to ignore specific revisions
  •  * Piwik - free/libre analytics platform
    
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     */
    
    use Piwik\Application\Kernel\GlobalSettingsProvider;
    
    use Piwik\Config;
    
    Thomas Steur's avatar
    Thomas Steur a validé
    use Piwik\EventDispatcher;
    use Piwik\Piwik;
    use Piwik\Plugin;
    use Piwik\SettingsServer;
    
    use Piwik\Tests\Framework\Fixture;
    use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
    
    Thomas Steur's avatar
    Thomas Steur a validé
    use Piwik\Tracker\RequestSet;
    use Piwik\Tracker\Request;
    
    class TestTracker extends Tracker
    {
        public function __construct()
        {
            $this->isInstalled = true;
        }
    
        public function setIsNotInstalled()
        {
            $this->isInstalled = false;
        }
    
        public function disconnectDatabase()
        {
            parent::disconnectDatabase();
        }
    }
    
    diosmosis's avatar
    diosmosis a validé
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
     * @group TrackerTest
     * @group Tracker
    
    class TrackerTest extends IntegrationTestCase
    
    Thomas Steur's avatar
    Thomas Steur a validé
        /**
         * @var TestTracker
         */
        private $tracker;
    
        /**
         * @var Request
         */
        private $request;
    
    
        public function setUp()
        {
            parent::setUp();
    
    Thomas Steur's avatar
    Thomas Steur a validé
    
            Fixture::createWebsite('2014-01-01 00:00:00');
    
            $this->tracker = new TestTracker();
            $this->request = $this->buildRequest(array('idsite' => 1));
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function tearDown()
    
    diosmosis's avatar
    diosmosis a validé
        {
    
            $this->restoreConfigFile();
            if($this->tracker) {
                $this->tracker->disconnectDatabase();
            }
    
    Thomas Steur's avatar
    Thomas Steur a validé
            if (array_key_exists('PIWIK_TRACKER_DEBUG', $GLOBALS)) {
                unset($GLOBALS['PIWIK_TRACKER_DEBUG']);
            }
            parent::tearDown();
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_isInstalled_shouldReturnTrue_AsPiwikIsInstalled()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertTrue($this->tracker->isInstalled());
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_shouldRecordStatistics_shouldReturnTrue_IfEnabled_WhichItIsByDefault()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertTrue($this->tracker->shouldRecordStatistics());
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_shouldRecordStatistics_shouldReturnFalse_IfEnabledButNotInstalled()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->tracker->setIsNotInstalled();
            $this->assertFalse($this->tracker->shouldRecordStatistics());
        }
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_shouldRecordStatistics_shouldReturnFalse_IfDisabledButInstalled()
        {
            $oldConfig = Tracker\TrackerConfig::getConfigValue('record_statistics');
            Tracker\TrackerConfig::setConfigValue('record_statistics', 0);
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertFalse($this->tracker->shouldRecordStatistics());
    
    Thomas Steur's avatar
    Thomas Steur a validé
            Tracker\TrackerConfig::setConfigValue('record_statistics', $oldConfig); // reset
        }
    
        public function test_loadTrackerEnvironment_shouldSetGlobalsDebugVar_WhichShouldBeDisabledByDefault()
        {
            $this->assertTrue(!array_key_exists('PIWIK_TRACKER_DEBUG', $GLOBALS));
    
            Tracker::loadTrackerEnvironment();
    
            $this->assertFalse($GLOBALS['PIWIK_TRACKER_DEBUG']);
        }
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_loadTrackerEnvironment_shouldSetGlobalsDebugVar()
        {
            $this->assertTrue(!array_key_exists('PIWIK_TRACKER_DEBUG', $GLOBALS));
    
            $oldConfig = Tracker\TrackerConfig::getConfigValue('debug');
            Tracker\TrackerConfig::setConfigValue('debug', 1);
    
    Thomas Steur's avatar
    Thomas Steur a validé
            Tracker::loadTrackerEnvironment();
            $this->assertTrue($this->tracker->isDebugModeEnabled());
    
    Thomas Steur's avatar
    Thomas Steur a validé
            Tracker\TrackerConfig::setConfigValue('debug', $oldConfig); // reset
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertTrue($GLOBALS['PIWIK_TRACKER_DEBUG']);
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_loadTrackerEnvironment_shouldEnableTrackerMode()
    
            $this->assertTrue(!array_key_exists('PIWIK_TRACKER_DEBUG', $GLOBALS));
    
            $this->assertFalse(SettingsServer::isTrackerApiRequest());
    
            Tracker::loadTrackerEnvironment();
    
            $this->assertTrue(SettingsServer::isTrackerApiRequest());
        }
    
        public function test_loadTrackerEnvironment_shouldNotThrow_whenConfigNotFound()
        {
            $this->assertTrue(!array_key_exists('PIWIK_TRACKER_DEBUG', $GLOBALS));
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertFalse(SettingsServer::isTrackerApiRequest());
    
            $this->assertTrue(is_readable(Config::getInstance()->getLocalPath()));
    
    
            $this->removeConfigFile();
    
    
            $this->assertFalse(is_readable(Config::getInstance()->getLocalPath()));
    
    Thomas Steur's avatar
    Thomas Steur a validé
            Tracker::loadTrackerEnvironment();
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertTrue(SettingsServer::isTrackerApiRequest());
        }
    
        protected function restoreConfigFile()
        {
            $backupConfig = $this->getLocalConfigPathMoved();
            $localConfig = $this->getLocalConfigPath();
            @shell_exec("mv $backupConfig $localConfig 2> /dev/null");
        }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_isDatabaseConnected_shouldReturnFalse_IfNotConnected()
        {
            $this->tracker->disconnectDatabase();
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertFalse($this->tracker->isDatabaseConnected());
        }
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_getDatabase_shouldReturnDbInstance()
        {
            $db = $this->tracker->getDatabase();
    
            $this->assertInstanceOf('Piwik\\Tracker\\Db', $db);
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_isDatabaseConnected_shouldReturnTrue_WhenDbIsConnected()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $db = $this->tracker->getDatabase(); // make sure connected
            $this->assertNotEmpty($db);
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertTrue($this->tracker->isDatabaseConnected());
        }
    
        public function test_disconnectDatabase_shouldDisconnectDb()
        {
            $this->tracker->getDatabase(); // make sure connected
            $this->assertTrue($this->tracker->isDatabaseConnected());
    
            $this->tracker->disconnectDatabase();
    
            $this->assertFalse($this->tracker->isDatabaseConnected());
        }
    
        public function test_trackRequest_shouldNotTrackAnything_IfRequestIsEmpty()
        {
            $called = false;
            Piwik::addAction('Tracker.makeNewVisitObject', function () use (&$called) {
                $called = true;
            });
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->tracker->trackRequest(new Request(array()));
    
            $this->assertFalse($called);
        }
    
        public function test_trackRequest_shouldTrack_IfRequestIsNotEmpty()
        {
            $called = false;
            Piwik::addAction('Tracker.makeNewVisitObject', function () use (&$called) {
                $called = true;
            });
    
            $this->tracker->trackRequest($this->request);
    
            $this->assertTrue($called);
        }
    
        public function test_trackRequest_shouldIncreaseLoggedRequestsCounter()
        {
            $this->tracker->trackRequest($this->request);
            $this->assertSame(1, $this->tracker->getCountOfLoggedRequests());
    
            $this->tracker->trackRequest($this->request);
            $this->assertSame(2, $this->tracker->getCountOfLoggedRequests());
        }
    
        public function test_trackRequest_shouldIncreaseLoggedRequestsCounter_EvenIfRequestIsEmpty()
        {
            $request = $this->buildRequest(array());
            $this->assertTrue($request->isEmptyRequest());
    
            $this->tracker->trackRequest($request);
            $this->assertSame(1, $this->tracker->getCountOfLoggedRequests());
    
            $this->tracker->trackRequest($request);
            $this->assertSame(2, $this->tracker->getCountOfLoggedRequests());
        }
    
        public function test_trackRequest_shouldActuallyTrack()
        {
            $request = $this->buildRequest(array('idsite' => 1, 'url' => 'http://www.example.com', 'action_name' => 'test', 'rec' => 1));
            $this->tracker->trackRequest($request);
    
            $this->assertActionEquals('test', 1);
            $this->assertActionEquals('example.com', 2);
        }
    
    
        public function test_trackRequest_shouldTrackOutlinkWithFragment()
        {
            $request = $this->buildRequest(array('idsite' => 1, 'link' => 'http://example.com/outlink#fragment-here', 'rec' => 1));
            $this->tracker->trackRequest($request);
    
            $this->assertActionEquals('http://example.com/outlink#fragment-here', 1);
        }
    
        public function test_trackRequest_shouldTrackDownloadWithFragment()
        {
            $request = $this->buildRequest(array('idsite' => 1, 'download' => 'http://example.com/file.zip#fragment-here&pk_campaign=Campaign param accepted here', 'rec' => 1));
            $this->tracker->trackRequest($request);
    
            $this->assertActionEquals('http://example.com/file.zip#fragment-here&pk_campaign=Campaign param accepted here', 1);
        }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_main_shouldReturnEmptyPiwikResponse_IfNoRequestsAreGiven()
        {
            $requestSet = $this->getEmptyRequestSet();
            $requestSet->setRequests(array());
    
            $response = $this->tracker->main($this->getDefaultHandler(), $requestSet);
    
            $expected = "<a href='/'>Piwik</a> is a free/libre web <a href='http://piwik.org'>analytics</a> that lets you keep control of your data.";
            $this->assertEquals($expected, $response);
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_main_shouldReturnApiResponse_IfRequestsAreGiven()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $response = $this->tracker->main($this->getDefaultHandler(), $this->getRequestSetWithRequests());
    
    Thomas Steur's avatar
    Thomas Steur a validé
        }
    
        public function test_main_shouldReturnNotReturnAnyApiResponse_IfImageIsDisabled()
        {
            $_GET['send_image'] = '0';
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $response = $this->tracker->main($this->getDefaultHandler(), $this->getRequestSetWithRequests());
    
            unset($_GET['send_image']);
    
            $this->assertEquals('', $response);
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_main_shouldActuallyTrackNumberOfTrackedRequests()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertSame(0, $this->tracker->getCountOfLoggedRequests());
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->tracker->main($this->getDefaultHandler(), $this->getRequestSetWithRequests());
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertSame(2, $this->tracker->getCountOfLoggedRequests());
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_main_shouldNotTrackAnythingButStillReturnApiResponse_IfNotInstalledOrShouldNotRecordStats()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->tracker->setIsNotInstalled();
            $response = $this->tracker->main($this->getDefaultHandler(), $this->getRequestSetWithRequests());
    
            Fixture::checkResponse($response);
            $this->assertSame(0, $this->tracker->getCountOfLoggedRequests());
        }
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_main_shouldReadValuesFromGETandPOSTifNoRequestSet()
        {
            $_GET  = array('idsite' => '1');
            $_POST = array('url' => 'http://localhost/post');
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $requestSet = $this->getEmptyRequestSet();
            $response   = $this->tracker->main($this->getDefaultHandler(), $requestSet);
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $_GET  = array();
            $_POST = array();
    
    Thomas Steur's avatar
    Thomas Steur a validé
            Fixture::checkResponse($response);
            $this->assertSame(1, $this->tracker->getCountOfLoggedRequests());
    
            $identifiedRequests = $requestSet->getRequests();
            $this->assertCount(1, $identifiedRequests);
            $this->assertEquals(array('idsite' => '1', 'url' => 'http://localhost/post'),
                                $identifiedRequests[0]->getParams());
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function getDefaultHandler()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            return new Tracker\Handler();
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function getEmptyRequestSet()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            return new RequestSet();
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function getRequestSetWithRequests()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $requestSet = $this->getEmptyRequestSet();
            $requestSet->setRequests(array(
                $this->buildRequest(array('idsite' => '1', 'url' => 'http://localhost')),
                $this->buildRequest(array('idsite' => '1', 'url' => 'http://localhost/test'))
            ));
    
            return $requestSet;
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function assertActionEquals($expected, $idaction)
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $actionName = Tracker::getDatabase()->fetchOne("SELECT name FROM " . Common::prefixTable('log_action') . " WHERE idaction = ?", array($idaction));
            $this->assertEquals($expected, $actionName);
    
    Thomas Steur's avatar
    Thomas Steur a validé
    
        private function buildRequest($params)
        {
            return new Request($params);
        }
    
    
        /**
         * @return string
         */
        protected function getLocalConfigPath()
        {
            return PIWIK_USER_PATH . "/config/config.ini.php ";
        }
    
        /**
         * @return string
         */
        protected function getLocalConfigPathMoved()
        {
            return PIWIK_USER_PATH . "/config/tmp-config.ini.php";
        }
    
        /**
         * @return array
         */
        protected function removeConfigFile()
        {
            $localConfig = $this->getLocalConfigPath();
            $backupConfig = $this->getLocalConfigPathMoved();
            shell_exec("mv $localConfig $backupConfig");
            return array($localConfig, $backupConfig);
        }