<?php
/**
 * Piwik - Open source web analytics
 *
 * @link    http://piwik.org
 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 * @version $Id$
 */

/**
 * testing period=range use case. Recording data before and after, checking that the requested range is processed correctly
 */
class Test_Piwik_Integration_OneVisitorOneWebsite_SeveralDaysDateRange extends IntegrationTestCase
{
    protected static $dateTimes = array(
        '2010-12-14 01:00:00',
        '2010-12-15 01:00:00',
        '2010-12-25 01:00:00',
        '2011-01-15 01:00:00',
        '2011-01-16 01:00:00',
    );
    protected static $idSite = 1;
    
    // one per visit
    protected static $referrerUrls = array(
    	'http://facebook.com/whatever',
    	'http://www.facebook.com/another/path',
    	'http://fb.me/?q=sdlfjs&n=slfjsd',
    	'http://twitter.com/whatever2',
    	'http://www.twitter.com/index?a=2334',
    	'http://t.co/id/?y=dsfs',
    	'http://www.flickr.com',
    	'http://xanga.com',
    	'http://skyrock.com',
    	'http://mixi.jp',
    );

    public static function setUpBeforeClass()
    {
        parent::setUpBeforeClass();
        try {
            self::setUpWebsitesAndGoals();
            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        OneVisitorOneWebsite_SeveralDaysDateRange
     */
    public function testApi($api, $params)
    {
        $this->runApiTests($api, $params);
    }

    public function getApiForTesting()
    {
        return array(
            // range test
            array('MultiSites.getAll', array('idSite'  => self::$idSite,
                                             'date'    => '2010-12-15,2011-01-15',
                                             'periods' => array('range'))),

            // test several dates (tests use of IndexedByDate w/ 'date1,date2,etc.')
            array('MultiSites.getAll', array('idSite'       => self::$idSite,
                                             'date'         => '2010-12-10',
                                             'periods'      => array('day'),
                                             'setDateLastN' => true,
                                             'testSuffix'   => '_IndexedByDate')),
			
			// test socials
			array('Referers.getSocials', array('idSite'  => 'all',
											   'date'    => '2010-12-13,2011-01-18',
											   'periods' => array('range'))),
			
			array('Referers.getSocials', array('idSite'		  => 'all',
											   'date'		  => '2010-12-10',
											   'periods'	  => array('day'),
											   'setDateLastN' => true,
											   'testSuffix'   => '_IndexedByDate')),
			
			array('Referers.getUrlsForSocial', array('idSite'		=> 'all', // test w/o idSubtable
													 'date'			=> '2010-12-13,2011-01-18',
													 'periods'		=> 'range',
													 'testSuffix'	=> '_noIdSubtable')),
			
			array('Referers.getUrlsForSocial', array('idSite'   	 => self::$idSite, // test w/ idSubtable
													 'date'			 => '2010-12-13,2011-01-18',
													 'periods'		 => 'range',
													 'supertableApi' => 'Referers.getSocials')),
        );
    }

    public function getOutputPrefix()
    {
        return 'oneVisitor_oneWebsite_severalDays_DateRange';
    }

    protected static function setUpWebsitesAndGoals()
    {
        self::createWebsite(self::$dateTimes[0]);
    }

    protected static function trackVisits()
    {
        $dateTimes = self::$dateTimes;
        $idSite    = self::$idSite;

        $i = 0;
        $ridx = 0;
        foreach ($dateTimes as $dateTime) {
            $i++;
            $visitor = self::getTracker($idSite, $dateTime, $defaultInit = true);
            // Fake the visit count cookie
            $visitor->setDebugStringAppend("&_idvc=$i");

            $visitor->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(0.1)->getDatetime());
            $visitor->setUrl('http://example.org/homepage');
            $visitor->setUrlReferrer(self::$referrerUrls[$ridx++]);
            self::checkResponse($visitor->doTrackPageView('ou pas'));

            // Test change the IP, the visit should not be split but recorded to the same idvisitor
            $visitor->setIp('200.1.15.22');

            $visitor->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(0.2)->getDatetime());
            $visitor->setUrl('http://example.org/news');
            self::checkResponse($visitor->doTrackPageView('ou pas'));

            $visitor->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(1)->getDatetime());
            $visitor->setUrl('http://example.org/news');
            $visitor->setUrlReferrer(self::$referrerUrls[$ridx++]);
            self::checkResponse($visitor->doTrackPageView('ou pas'));
        }
    }
}