<?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$
 */

/**
 * Tests that visits track & reports display correctly when non-unicode text is
 * used in URL query params of visits.
 */
class Test_Piwik_Integration_NonUnicodeTest extends IntegrationTestCase
{
	protected static $idSite1 = 1;
	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		NonUnicodeTest
	 */
	public function testApi($api, $params)
	{
		$this->runApiTests($api, $params);
	}
	
	public function getApiForTesting()
	{
		$apiToCall = array(
			'Actions.getSiteSearchKeywords',
			'Actions.getPageTitles',
			'Actions.getPageUrls',
			'Referers.getWebsites',
		);
		
		return array(
			array($apiToCall, array('idSite'	=> self::$idSite1,
									'date'		=> self::$dateTime,
									'periods'	=> 'day'))
		);
	}

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

	/**
	 * 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::$idSite1 = self::createWebsite(Piwik_Date::factory(self::$dateTime)->getDatetime(), 0, "Site 1 - Site search", $siteurl=false, $search=1, $searchKwd='q,mykwd,p', $searchCat='cats' );
	}

	protected static function trackVisits()
	{
		self::assertTrue(function_exists('mb_check_encoding'), ' check mb_check_encoding ');
		self::assertTrue(function_exists('mb_convert_encoding'), ' check mb_convert_encoding ');

		// Visitor site1
		$visitor = self::getTracker(self::$idSite1, self::$dateTime, $defaultInit = true);
		
		// Test w/ iso-8859-15
		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.3)->getDatetime());
		$visitor->setUrlReferrer('http://anothersite.com/whatever.html?whatever=Ato%FC');
		// Also testing that the value is encoded when passed as an array
		$visitor->setUrl('http://example.org/index.htm?random=param&mykwd[]=Search 2%FC&test&cats= Search Category &search_count=INCORRECT!');
		$visitor->setPageCharset('iso-8859-15');
		self::checkResponse($visitor->doTrackPageView('Site Search results'));
		$visitor->setPageCharset('');
		
		// Test w/ windows-1251
		$visitor = self::getTracker(self::$idSite1, self::$dateTime, $defaultInit = true);
		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.3)->getDatetime());
		$visitor->setUrlReferrer('http://anothersite.com/whatever.html?txt=%EC%E5%F8%EA%EE%E2%FB%E5');
		$visitor->setUrl('http://example.org/page/index.htm?whatever=%EC%E5%F8%EA%EE%E2%FB%E5');
		$visitor->setPageCharset('windows-1251');
		self::checkResponse($visitor->doTrackPageView('Page title is always UTF-8'));

		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.4)->getDatetime());
		$visitor->setUrl('http://example.org/page/index.htm?q=%EC%E5%F8%EA%EE%E2%FB%E5');
		$visitor->setPageCharset('windows-1251');
		self::checkResponse($visitor->doTrackPageView('Site Search'));

		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(0.5)->getDatetime());
		$visitor->setUrl('http://example.org/page/index.htm?q=non unicode keyword %EC%E5%F8%EA%EE%E2%FB%E5 was there');
		$visitor->setPageCharset('utf-8');
		self::checkResponse($visitor->doTrackPageView('Site Search'));
		$visitor->setPageCharset('');
		
		// Test invalid char set
		$visitor = self::getTracker(self::$idSite1, self::$dateTime, $defaultInit = true);
		$visitor->setForceVisitDateTime(Piwik_Date::factory(self::$dateTime)->addHour(1)->getDatetime());
		$visitor->setUrlReferrer('http://anothersite.com/whatever.html');
		$visitor->setUrl('http://example.org/index.htm?random=param&mykwd=a+keyword&test&cats= Search Category &search_count=INCORRECT!');
		$visitor->setPageCharset('GTF-42'); // galactic transformation format
		self::checkResponse($visitor->doTrackPageView('Site Search results'));
		$visitor->setPageCharset('');
	}
}