Skip to content
Extraits de code Groupes Projets
SiteSearchTest.php 14,5 ko
Newer Older
  • Learn to ignore specific revisions
  • mattpiwik's avatar
    mattpiwik 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
     */
    
    /**
     * Testing the various use cases w/ internal Site Search tracking
     */
    class Test_Piwik_Integration_SiteSearch extends IntegrationTestCase
    {
    	protected static $idSite1 = 1;
    	protected static $idSite2 = 2;
    	protected static $idSite3 = 3;
        protected static $dateTime = '2010-01-03 11:22:33';
    
        public static function setUpBeforeClass()
        {
            parent::setUpBeforeClass();
            try {
                self::setUpWebsites();
                self::trackVisits();
            } catch(Exception $e) {
                // Skip whole test suite if an error occurs while setup
                throw new PHPUnit_Framework_SkippedTestSuiteError($e->getMessage());
            }
        }
    
        /**
         * @dataProvider getApiForTesting
         * @group        Integration
         * @group        TwoVisitors_TwoWebsites_DifferentDays
         */
        public function testApi($api, $params)
        {
            $this->runApiTests($api, $params);
        }
    
        protected function getApiToCall()
        {
            return array(
                'Actions.get',
    	        'Actions.getPageUrls',
                'Actions.getPageTitles',
    	        'CustomVariables.getCustomVariables',
    	        'Actions.getSiteSearchKeywords',
    	        'Actions.getSiteSearchCategories',
    	        'Actions.getSiteSearchNoResultKeywords',
    	        'Actions.getPageTitlesFollowingSiteSearch',
    	        'Actions.getPageUrlsFollowingSiteSearch',
            );
        }
    
        public function getApiForTesting()
        {
            $apiToCall       = $this->getApiToCall();
    
            $periods = array('day', 'month');
    
            $result = array(
                // Request data for the last 6 periods and idSite=all
                array($apiToCall, array('idSite'       => 'all',
                                        'date'         => self::$dateTime,
                                        'periods'      => $periods,
                                        'setDateLastN' => true,
    	                                'testSuffix'   => '_AllSites')),
    
    	        // We also test a single period/single site to check that this use case (Reports per idSite in the response) works
    	        array($apiToCall, array(
    		        'idSite'       => self::$idSite1,
    		        'date'         => self::$dateTime,
    		        'periods'      => $periods,
    		        'setDateLastN' => false,
    		        'testSuffix'   => '_NotLastNPeriods')),
            );
    
            // testing metadata API for multiple periods
            foreach ($apiToCall as $api) {
                list($apiModule, $apiAction) = explode(".", $api);
    
                $result[] = array(
                    'API.getProcessedReport', array('idSite'       => self::$idSite1,
                                                    'date'         => self::$dateTime,
                                                    'periods'      => $periods,
                                                    'setDateLastN' => true,
                                                    'apiModule'    => $apiModule,
                                                    'apiAction'    => $apiAction,
                                                    'testSuffix'   => '_' . $api . '_firstSite_lastN')
                );
            }
            return $result;
        }
    
        public function getOutputPrefix()
        {
            return 'SiteSearch';
        }
    
    	/**
    	 * One site with custom search parameters,
    	 * One site using default search parameters,
    	 * One site with disabled site search
    	 */
    	protected static function setUpWebsites()
        {
    	    Piwik_SitesManager_API::getInstance()->setGlobalSearchParameters($searchKeywordParameters='gkwd', $searchCategoryParameters='gcat');
    	    self::createWebsite(Piwik_Date::factory(self::$dateTime)->subHour(200)->getDatetime(), 0, "Site 1 - Site search", $siteurl=false, $search=1, $searchKwd='q,mykwd,p', $searchCat='cats' );
    	    self::createWebsite(Piwik_Date::factory(self::$dateTime)->subHour(400)->getDatetime(), 0, "Site 2 - Site search use default", $siteurl = false, $search=1, $searchKwd='', $searchCat='' );
    	    self::createWebsite(Piwik_Date::factory(self::$dateTime)->subHour(600)->getDatetime(), 0, "Site 3 - No site search", $siteurl = false, $search=0);
        }
    
        protected static function trackVisits()
        {
    	    self::recordVisitorsSite1();
    	    self::recordVisitorSite2();
    	    self::recordVisitorSite3();
    //	    exit;
        }
    
    	protected static function recordVisitorsSite1()
    	{
    		// -
    		// Visitor site1
    		$visitor = self::getTracker(self::$idSite1, self::$dateTime, $defaultInit = true);
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.2)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?q=Search 1  ');
    		self::checkResponse($visitor->doTrackPageView('Site Search results'));
    
    		// Normal page view
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.22)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm');
    		self::checkResponse($visitor->doTrackPageView('Im just a page'));
    
    		// IS_FOLLOWING_SEARCH: Not this time
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.23)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?random=PAGEVIEW, NOT SEARCH&mykwd=&IS_FOLLOWING_SEARCH ONCE');
    		self::checkResponse($visitor->doTrackPageView('This is a pageview, not a Search - IS_FOLLOWING_SEARCH ONCE'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.25)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?standard=query&but=also#hash&q='.urlencode('Search 1'));
    		self::checkResponse($visitor->doTrackPageView('Site Search results - URL Fragment'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.26)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm#q=Search 1&search_count=10');
    		self::checkResponse($visitor->doTrackPageView('Site Search results - URL Fragment'));
    
    
    mattpiwik's avatar
    mattpiwik a validé
    		// &search_count=0 so it's a "No Result" keyword, but it will not appear in the report, because it also has other seraches with results
    		// and the archiving does a MAX()
    
    mattpiwik's avatar
    mattpiwik a validé
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.27)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?hello=world#q=Search 1&search_count=0');
    		self::checkResponse($visitor->doTrackPageView('Site Search results - URL Fragment'));
    
    		// Testing with non urlencoded values
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.3)->getDatetime());
    
    mattpiwik's avatar
    mattpiwik a validé
    		// ALso testing that array[] notation is detected
    		$visitor->setUrl('http://example.org/index.htm?random=param&mykwd[]=Search 2&test&cats= Search Category &search_count=INCORRECT!');
    
    mattpiwik's avatar
    mattpiwik a validé
    		self::checkResponse($visitor->doTrackPageView('Site Search results'));
    
    		// Testing with urlencoded values
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.32)->getDatetime());
    
    mattpiwik's avatar
    mattpiwik a validé
    		// Also testing with random case 'myKwd'
    		$visitor->setUrl('http://example.org/index.htm?random=param&myKwd=Search 1&test&cats='.urlencode(' Search Category '). ' &search_count=0');
    
    mattpiwik's avatar
    mattpiwik a validé
    		self::checkResponse($visitor->doTrackPageView('Site Search results'));
    
    		// IS_FOLLOWING_SEARCH: Yes
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.35)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?random=PAGEVIEW, NOT SEARCH&mykwd=&IS_FOLLOWING_SEARCH ONCE');
    		self::checkResponse($visitor->doTrackPageView('This is a pageview, not a Search - IS_FOLLOWING_SEARCH ONCE'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.4)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?gkwd=SHOULD be a PageView, NOT a search');
    		self::checkResponse($visitor->doTrackPageView('Pageview, not search'));
    
    		$visitor->setUrl('http://example.org/hello?THIS IS A SITE SEARCH TRACKING API, NOT PAGEVIEW!');
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(24.41)->getDatetime());
    		self::checkResponse($visitor->doTrackSiteSearch("Keyword - Tracking API"));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(24.42)->getDatetime());
    		self::checkResponse($visitor->doTrackSiteSearch("Keyword - Tracking API", "Category", $count = 5));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(24.43)->getDatetime());
    		self::checkResponse($visitor->doTrackSiteSearch("No Result Keyword!", "Bad No Result Category :(", $count = 0));
    
    
    mattpiwik's avatar
    mattpiwik a validé
    		// Keyword in iso-8859-15 charset with funny character
    
    mattpiwik's avatar
    mattpiwik a validé
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(24.5)->getDatetime());
    
    mattpiwik's avatar
    mattpiwik a validé
    		$visitor->setPageCharset('iso-8859-15');
    		$visitor->setUrl('http://example.org/index.htm?q=Final%20t%FCte%20Keyword%20Searched%20for%20now&search_count=10');
    		self::checkResponse($visitor->doTrackPageView(false));
    
    mattpiwik's avatar
    mattpiwik a validé
    
    		// -
    		// Visitor BIS
    		$visitorB = self::getTracker(self::$idSite1, self::$dateTime, $defaultInit = true);
    		$visitorB->setIp('156.66.6.66');
    		$visitorB->setResolution(1600, 1000);
    
    		$visitorB->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(2.26)->getDatetime());
    		$visitorB->setUrl('http://example.org/index.htm#q=' . urlencode('No Result Keyword!') . '&search_count=0');
    		self::checkResponse($visitorB->doTrackPageView('Site Search results - URL Fragment'));
    
    		$visitorB->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(2.27)->getDatetime());
    		$visitorB->setUrl('http://example.org/index.htm?hello=world#q=Search 1&search_count=10');
    		self::checkResponse($visitorB->doTrackPageView('Site Search results - URL Fragment'));
    
    		$visitorB->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(2.3)->getDatetime());
    		$visitorB->setUrl('http://example.org/index.htm?random=param&mykwd=Search 2&test&cats= Search Category &search_count=10');
    		self::checkResponse($visitorB->doTrackPageView('Site Search results'));
    	}
    
    	protected static function recordVisitorSite3()
    	{ // -
    		// Third new visitor on Idsite 3
    		$visitor = self::getTracker(self::$idSite3, self::$dateTime, $defaultInit = true);
    		$visitor->setResolution(1801, 1301);
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.2)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?q=Search 1&IsPageView=1');
    		$visitor->setCustomVariable(1, 'test cvar name', 'test cvar value');
    		self::checkResponse($visitor->doTrackPageView('IsPageView'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.35)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?gkwd=test not a keyword&gcat=Cat not but not keyword, so this is not search');
    		self::checkResponse($visitor->doTrackPageView('This is a pageview, not a Search'));
    
    		// Testing UTF8 Title & URL
    		$crazyTitle = '%2C%20%C3%8Dslenska%2C%20Italiano%2C%20%E6%97%A5%E6%9C%AC%E8%AA%9E%2C%20%E1%83%A5%E1%83%90%E1%83%A0%E1%83%97%E1%83%A3%E1%83%9A%E1%83%98%2C%20%ED%95%9C%EA%B5%AD%EC%96%B4%2C%20Lietuvi%C5%B3%2C%20Latvie%C5%A1u%2C%20Norsk%20(bokm%C3%A5l)%2C%20Nederlands%2C%20Norsk%20(nynorsk)%2C%20Polski%2C%20Portugu%C3%AAs%20brasileiro%2C%20Portugu%C3%AAs%2C%20Rom%C3%A2n%C4%83%2C%20%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%2C%20Slovensky%2C%20Sloven%C5%A1%C4%8Dina%2C%20Shqip%2C%20Srpski%2C%20Svenska%2C%20%E0%B0%A4%E0%B1%86%E0%B0%B2%E0%B1%81%E0%B0%97%E0%B1%81%2C%20%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%2C%20T%C3%BCrk%C3%A7e%2C%20%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%B0%2C%20%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%2C%20%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87.';
    		$visitor->setUrl('http://example.org/index.htm?' . $crazyTitle);
    		self::checkResponse($visitor->doTrackPageView('Pageview: ' . $crazyTitle));
    	}
    
    	protected static function recordVisitorSite2()
    	{
    		$visitor = self::getTracker(self::$idSite2, self::$dateTime, $defaultInit = true);
    		$visitor->setResolution(801, 301);
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.2)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?q=Search 1&IsPageView=1');
    		self::checkResponse($visitor->doTrackPageView('IsPageView'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.35)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?random=PAGEVIEW, NOT SEARCH&gcat=Cat not but not keyword, so this is not search');
    		self::checkResponse($visitor->doTrackPageView('This is a pageview, not a Search'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.4)->getDatetime());
    		$visitor->setUrl('http://example.org/index.htm?gkwd=SHOULD be a Search with no result!&search_count=0');
    		self::checkResponse($visitor->doTrackPageView('This is a Search'));
    
    		// Testing UTF8 keywords
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.45)->getDatetime());
    		$crazySearchTerm = 'You%20can%20use%20Piwik%20in%3A%20%E1%8A%A0%E1%88%9B%E1%88%AD%E1%8A%9B%2C%20%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9%2C%20%D0%91%D0%B5%D0%BB%D0%B0%D1%80%D1%83%D1%81%D0%BA%D0%B0%D1%8F%2C%20%D0%91%D1%8A%D0%BB%D0%B3%D0%B0%D1%80%D1%81%D0%BA%D0%B8%2C%20Catal%C3%A0%2C%20%C4%8Cesky%2C%20Dansk%2C%20Deutsch%2C%20%CE%95%CE%BB%CE%BB%CE%B7%CE%BD%CE%B9%CE%BA%CE%AC%2C%20English%2C%20Espa%C3%B1ol%2C%20Eesti%20keel%2C%20Euskara%2C%20%D9%81%D8%A7%D8%B1%D8%B3%DB%8C%2C%20Suomi%2C%20Fran%C3%A7ais%2C%20Galego%2C%20%D7%A2%D7%91%D7%A8%D7%99%D7%AA%2C%20Magyar%2C%20Bahasa%20Indonesia%2C%20%C3%8Dslenska%2C%20Italiano%2C%20%E6%97%A5%E6%9C%AC%E8%AA%9E%2C%20%E1%83%A5%E1%83%90%E1%83%A0%E1%83%97%E1%83%A3%E1%83%9A%E1%83%98%2C%20%ED%95%9C%EA%B5%AD%EC%96%B4%2C%20Lietuvi%C5%B3%2C%20Latvie%C5%A1u%2C%20Norsk%20(bokm%C3%A5l)%2C%20Nederlands%2C%20Norsk%20(nynorsk)%2C%20Polski%2C%20Portugu%C3%AAs%20brasileiro%2C%20Portugu%C3%AAs%2C%20Rom%C3%A2n%C4%83%2C%20%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%2C%20Slovensky%2C%20Sloven%C5%A1%C4%8Dina%2C%20Shqip%2C%20Srpski%2C%20Svenska%2C%20%E0%B0%A4%E0%B1%86%E0%B0%B2%E0%B1%81%E0%B0%97%E0%B1%81%2C%20%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%2C%20T%C3%BCrk%C3%A7e%2C%20%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%B0%2C%20%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%2C%20%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87.';
    		$visitor->setUrl('http://example.org/index.htm?gkwd=' . $crazySearchTerm . '&gcat=' . $crazySearchTerm . '&search_count=1');
    		self::checkResponse($visitor->doTrackPageView('Site Search with 1 result'));
    
    		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.5)->getDatetime());
    
    mattpiwik's avatar
    mattpiwik a validé
    		self::checkResponse($visitor->doTrackSiteSearch("No Result Keyword!", "Bad No Result Category bis :(", $count = 0));
    
    mattpiwik's avatar
    mattpiwik a validé
    		return array($defaultInit, $visitor);
    	}
    }