/vendor/mobiledetect/mobiledetectlib/tests/UserAgentTest.php
https://gitlab.com/vannh/portal_training · PHP · 189 lines · 116 code · 40 blank · 33 comment · 22 complexity · e6415fe22e8f1a4bec3162836b41ad4c MD5 · raw file
- <?php
- /**
- * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt
- * @link http://mobiledetect.net
- */
- class UserAgentTest extends PHPUnit_Framework_TestCase
- {
- protected $detect;
- protected static $ualist = array();
- protected static $json;
- public function setUp()
- {
- $this->detect = new Mobile_Detect;
- }
- public static function generateJson()
- {
- //in case this gets run multiple times
- if (isset(self::$json)) {
- return self::$json;
- }
- //the json and PHP formatted files
- $jsonFile = dirname(__FILE__) . '/ualist.json';
- $phpFile = dirname(__FILE__) . '/UA_List.inc.php';
- //currently stored as a PHP array
- $list = include $phpFile;
- //check recency of the file
- if (file_exists($jsonFile) && is_readable($jsonFile)) {
- //read the json file
- $json = json_decode(file_get_contents($jsonFile), true);
- //check that the hash matches
- $hash = isset($json['hash']) ? $json['hash'] : null;
- if ($hash == sha1(serialize($list))) {
- //file is up to date, just read the json file
- self::$json = $json['user_agents'];
- return self::$json;
- }
- }
- //uses the UA_List.inc.php to generate a json file
- if (file_exists($jsonFile) && !is_writable($jsonFile)) {
- throw new RuntimeException("Need to be able to create/update $jsonFile from UA_List.inc.php.");
- }
- if (!is_writable(dirname($jsonFile))) {
- throw new RuntimeException("Insufficient permissions to create this file: $jsonFile");
- }
- //print_r($list['Acer']); exit;
- $json = array();
- foreach ($list as $vendor => $vendorList) {
- foreach ($vendorList as $userAgent => $props) {
- if (is_int($userAgent)) {
- //this means that the user agent is the props
- $userAgent = $props;
- $props = array();
- }
- $tmp = array(
- 'vendor' => $vendor,
- 'user_agent' => $userAgent
- );
- if (isset($props['isMobile'])) {
- $tmp['mobile'] = $props['isMobile'];
- }
- if (isset($props['isTablet'])) {
- $tmp['tablet'] = $props['isTablet'];
- }
- if (isset($props['version'])) {
- $tmp['version'] = $props['version'];
- }
- if (isset($props['model'])) {
- $tmp['model'] = $props['model'];
- }
- $json[] = $tmp;
- }
- }
- //save the hash
- $hash = sha1(serialize($list));
- $json = array(
- 'hash' => $hash,
- 'user_agents' => $json
- );
- if (defined('JSON_PRETTY_PRINT')) {
- $jsonString = json_encode($json, JSON_PRETTY_PRINT);
- } else {
- $jsonString = json_encode($json);
- }
- file_put_contents($jsonFile, $jsonString);
- self::$json = $json['user_agents'];
- return self::$json;
- }
- public static function setUpBeforeClass()
- {
- //generate json file first
- self::generateJson();
- //get the generated JSON data
- $json = self::$json;
- //make a list that is usable by functions (THE ORDER OF THE KEYS MATTERS!)
- foreach ($json as $userAgent) {
- $tmp = array();
- $tmp[] = isset($userAgent['user_agent']) ? $userAgent['user_agent'] : null;
- $tmp[] = isset($userAgent['mobile']) ? $userAgent['mobile'] : null;
- $tmp[] = isset($userAgent['tablet']) ? $userAgent['tablet'] : null;
- $tmp[] = isset($userAgent['version']) ? $userAgent['version'] : null;
- $tmp[] = isset($userAgent['model']) ? $userAgent['model'] : null;
- $tmp[] = isset($userAgent['vendor']) ? $userAgent['vendor'] : null;
- self::$ualist[] = $tmp;
- }
- }
- public function userAgentData()
- {
- if (!count(self::$ualist)) {
- self::setUpBeforeClass();
- }
- return self::$ualist;
- }
- /**
- * @medium
- * @dataProvider userAgentData
- */
- public function testUserAgents($userAgent, $isMobile, $isTablet, $version, $model, $vendor)
- {
- //make sure we're passed valid data
- if (!is_string($userAgent) || !is_bool($isMobile) || !is_bool($isTablet)) {
- $this->markTestIncomplete("The User-Agent $userAgent does not have sufficient information for testing.");
- return;
- }
- //setup
- $this->detect->setUserAgent($userAgent);
- //is mobile?
- $this->assertEquals($this->detect->isMobile(), $isMobile);
- //is tablet?
- $this->assertEquals($this->detect->isTablet(), $isTablet, 'FAILED: ' . $userAgent . ' isTablet: ' . $isTablet);
- if (isset($version)) {
- foreach ($version as $condition => $assertion) {
- $this->assertEquals($assertion, $this->detect->version($condition), 'FAILED UA (version("'.$condition.'")): '.$userAgent);
- }
- }
- //version property tests
- if (isset($version)) {
- foreach ($version as $property => $stringVersion) {
- $v = $this->detect->version($property);
- $this->assertSame($stringVersion, $v);
- }
- }
- //@todo: model test, not sure how exactly yet
- //@todo: vendor test. The below is theoretical, but fails 50% of the tests...
- /*if (isset($vendor)) {
- $method = "is$vendor";
- $this->assertTrue($this->detect->{$method}(), "Expected Mobile_Detect::{$method}() to be true.");
- }*/
- }
- }