Skip to content
Extraits de code Groupes Projets
AutoSuggestAPITest.php 5,49 ko
Newer Older
  • Learn to ignore specific revisions
  • mattab's avatar
    mattab a validé
    <?php
    /**
     * Piwik - Open source web analytics
     *
     * @link    http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     */
    
    mattab's avatar
    mattab a validé
    
    /**
     * testing a the auto suggest API for all known segments
     */
    class Test_Piwik_Integration_AutoSuggestAPITest extends IntegrationTestCase
    {
        public static $fixture = null; // initialized below class definition
    
        protected static $processed = 0;
        protected static $skipped = array();
    
        /**
         * @dataProvider getApiForTesting
         * @group        Integration
         */
        public function testApi($api, $params)
        {
            $this->runApiTests($api, $params);
        }
    
        public function getApiForTesting()
        {
    
    mattab's avatar
    mattab a validé
    
            // on Travis this test seg faults for no reason eg: https://github.com/piwik/piwik/commit/94d0ce393b2c496cda571571a0425af846406fda
            $isPhp53 = strpos(PHP_VERSION, '5.3') == 0;
            if($isPhp53) {
                $this->markTestSkipped("Skipping this test as it seg faults on php 5.3 (bug triggered on travis)");
            }
    
    mattab's avatar
    mattab a validé
            // we will test all segments from all plugins
    
            Fixture::loadAllPlugins();
    
    mattab's avatar
    mattab a validé
    
            $idSite = self::$fixture->idSite;
            $apiForTesting = array();
    
    
            $segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata(self::$fixture->idSite);
    
    mattab's avatar
    mattab a validé
            foreach ($segments as $segment) {
    
    mattab's avatar
    mattab a validé
                $apiForTesting[] = $this->getApiForTestingForSegment($idSite, $segment['segment']);
            }
    
    
    mattab's avatar
    mattab a validé
            // Skip the test on Mysqli as it fails due to rounding Float errors on latitude/longitude
    
    mattab's avatar
    mattab a validé
            $skipThisTest = getenv('MYSQL_ADAPTER') != 'MYSQLI';
    
            if ($skipThisTest) {
    
    mattab's avatar
    mattab a validé
                $apiForTesting[] = array('Live.getLastVisitsDetails',
                                         array('idSite' => $idSite,
    
    mattab's avatar
    mattab a validé
                                               'date'   => '1998-07-12,today',
                                               'period' => 'range',
    
    mattab's avatar
    mattab a validé
                                               'otherRequestParameters' => array('filter_limit' => 1000)));
    
    mattab's avatar
    mattab a validé
    
            }
    
    mattab's avatar
    mattab a validé
            return $apiForTesting;
        }
    
    
        /**
         * @param $idSite
         * @param $segment
         * @return array
         */
        protected function getApiForTestingForSegment($idSite, $segment)
        {
            return array('API.getSuggestedValuesForSegment',
                         array('idSite'                 => $idSite,
                               'testSuffix'             => '_' . $segment,
                               'otherRequestParameters' => array('segmentName' => $segment)));
        }
    
        /**
         * @depends      testApi
         * @dataProvider getAnotherApiForTesting
         * @group        Integration
         */
        public function testAnotherApi($api, $params)
        {
            // Get the top segment value
    
    mattab's avatar
    mattab a validé
                'method=API.getSuggestedValuesForSegment'
                    . '&segmentName=' . $params['segmentToComplete']
                    . '&idSite=' . $params['idSite']
                    . '&format=php&serialize=0'
            );
            $response = $request->process();
    
            $this->checkRequestResponse($response);
    
    mattab's avatar
    mattab a validé
            $topSegmentValue = @$response[0];
    
    
    mattab's avatar
    mattab a validé
            if ($topSegmentValue !== false && !is_null($topSegmentValue)) {
    
    mattab's avatar
    mattab a validé
                // Now build the segment request
                $segmentValue = rawurlencode(html_entity_decode($topSegmentValue));
                $params['segment'] = $params['segmentToComplete'] . '==' . $segmentValue;
                unset($params['segmentToComplete']);
                $this->runApiTests($api, $params);
                self::$processed++;
            } else {
                self::$skipped[] = $params['segmentToComplete'];
            }
    
        }
    
        public function getAnotherApiForTesting()
        {
            $apiForTesting = array();
    
            $segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata(self::$fixture->idSite);
    
    mattab's avatar
    mattab a validé
            foreach ($segments as $segment) {
                $apiForTesting[] = array('VisitsSummary.get',
                                         array('idSite'            => self::$fixture->idSite,
                                               'date'              => date("Y-m-d", strtotime(self::$fixture->dateTime)) . ',today',
                                               'period'            => 'range',
                                               'testSuffix'        => '_' . $segment['segment'],
                                               'segmentToComplete' => $segment['segment']));
    
    mattab's avatar
    mattab a validé
            }
            return $apiForTesting;
        }
    
        /**
    
    mattab's avatar
    mattab a validé
         * @depends      testAnotherApi
         */
        public function testCheckOtherTestsWereComplete()
        {
            // Check that only a few haven't been tested specifically (these are all custom variables slots since we only test slot 1, 2, 5 (see the fixture))
    
    mattab's avatar
    mattab a validé
            $maximumSegmentsToSkip = 11;
            $this->assertTrue(count(self::$skipped) <= $maximumSegmentsToSkip, 'SKIPPED ' . count(self::$skipped) . ' segments --> some segments had no "auto-suggested values"
    
    mattab's avatar
    mattab a validé
                but we should try and test the autosuggest for all new segments. Segments skipped were: ' . implode(', ', self::$skipped));
    
            // and check that most others have been tested
    
    mattab's avatar
    mattab a validé
            $minimumSegmentsToTest = 46;
    
    mattab's avatar
    mattab a validé
            $this->assertTrue(self::$processed >= $minimumSegmentsToTest, 'PROCESSED ' . self::$processed . ' segments --> it seems some segments "auto-suggested values" haven\'t been tested as we were expecting');
    
    mattab's avatar
    mattab a validé
        }
    }
    
    Test_Piwik_Integration_AutoSuggestAPITest::$fixture = new Test_Piwik_Fixture_ManyVisitsWithGeoIP();
    
    Test_Piwik_Integration_AutoSuggestAPITest::$fixture->dateTime = Date::yesterday()->subDay(30)->getDatetime();