1import json 2import os 3import unittest 4 5from ua_parser import user_agent_parser 6from . import compat 7from .parsers import parse 8 9 10iphone_ua_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3' 11ipad_ua_string = 'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10' 12galaxy_tab_ua_string = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' 13galaxy_s3_ua_string = 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' 14kindle_fire_ua_string = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' 15playbook_ua_string = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.0.1; en-US) AppleWebKit/535.8+ (KHTML, like Gecko) Version/7.2.0.1 Safari/535.8+' 16nexus_7_ua_string = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' 17windows_phone_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' 18blackberry_torch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; zh-TW) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8+' 19blackberry_bold_ua_string = 'BlackBerry9700/5.0.0.862 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/331 UNTRUSTED/1.0 3gpp-gba' 20blackberry_bold_touch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9930; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.241 Mobile Safari/534.11+' 21windows_rt_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' 22j2me_opera_ua_string = 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54' 23ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' 24ie_touch_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)' 25mac_safari_ua_string = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2' 26windows_ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' 27ubuntu_firefox_ua_string = 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1' 28google_bot_ua_string = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' 29nokia_n97_ua_string = 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/12.0.024; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.12344' 30android_firefox_aurora_ua_string = 'Mozilla/5.0 (Android; Mobile; rv:27.0) Gecko/27.0 Firefox/27.0' 31 32iphone_ua = parse(iphone_ua_string) 33ipad_ua = parse(ipad_ua_string) 34galaxy_tab = parse(galaxy_tab_ua_string) 35galaxy_s3_ua = parse(galaxy_s3_ua_string) 36kindle_fire_ua = parse(kindle_fire_ua_string) 37playbook_ua = parse(playbook_ua_string) 38nexus_7_ua = parse(nexus_7_ua_string) 39windows_phone_ua = parse(windows_phone_ua_string) 40windows_rt_ua = parse(windows_rt_ua_string) 41blackberry_torch_ua = parse(blackberry_torch_ua_string) 42blackberry_bold_ua = parse(blackberry_bold_ua_string) 43blackberry_bold_touch_ua = parse(blackberry_bold_touch_ua_string) 44j2me_opera_ua = parse(j2me_opera_ua_string) 45ie_ua = parse(ie_ua_string) 46ie_touch_ua = parse(ie_touch_ua_string) 47mac_safari_ua = parse(mac_safari_ua_string) 48windows_ie_ua = parse(windows_ie_ua_string) 49ubuntu_firefox_ua = parse(ubuntu_firefox_ua_string) 50google_bot_ua = parse(google_bot_ua_string) 51nokia_n97_ua = parse(nokia_n97_ua_string) 52android_firefox_aurora_ua = parse(android_firefox_aurora_ua_string) 53 54 55class UserAgentsTest(unittest.TestCase): 56 57 def test_user_agent_object_assignments(self): 58 ua_dict = user_agent_parser.Parse(devices['iphone']['ua_string']) 59 iphone_ua = devices['iphone']['user_agent'] 60 61 # Ensure browser attributes are assigned correctly 62 self.assertEqual(iphone_ua.browser.family, 63 ua_dict['user_agent']['family']) 64 self.assertEqual( 65 iphone_ua.browser.version, 66 (int(ua_dict['user_agent']['major']), 67 int(ua_dict['user_agent']['minor'])) 68 ) 69 70 # Ensure os attributes are assigned correctly 71 self.assertEqual(iphone_ua.os.family, ua_dict['os']['family']) 72 self.assertEqual( 73 iphone_ua.os.version, 74 (int(ua_dict['os']['major']), int(ua_dict['os']['minor'])) 75 ) 76 77 # Ensure device attributes are assigned correctly 78 self.assertEqual(iphone_ua.device.family, 79 ua_dict['device']['family']) 80 81 def test_is_tablet_property(self): 82 self.assertFalse(iphone_ua.is_tablet) 83 self.assertFalse(galaxy_s3_ua.is_tablet) 84 self.assertFalse(blackberry_torch_ua.is_tablet) 85 self.assertFalse(blackberry_bold_ua.is_tablet) 86 self.assertFalse(windows_phone_ua.is_tablet) 87 self.assertFalse(ie_ua.is_tablet) 88 self.assertFalse(ie_touch_ua.is_tablet) 89 self.assertFalse(mac_safari_ua.is_tablet) 90 self.assertFalse(windows_ie_ua.is_tablet) 91 self.assertFalse(ubuntu_firefox_ua.is_tablet) 92 self.assertFalse(j2me_opera_ua.is_tablet) 93 self.assertFalse(google_bot_ua.is_tablet) 94 self.assertFalse(nokia_n97_ua.is_tablet) 95 self.assertTrue(windows_rt_ua.is_tablet) 96 self.assertTrue(ipad_ua.is_tablet) 97 self.assertTrue(playbook_ua.is_tablet) 98 self.assertTrue(kindle_fire_ua.is_tablet) 99 self.assertTrue(nexus_7_ua.is_tablet) 100 self.assertFalse(android_firefox_aurora_ua.is_tablet) 101 102 def test_is_mobile_property(self): 103 self.assertTrue(iphone_ua.is_mobile) 104 self.assertTrue(galaxy_s3_ua.is_mobile) 105 self.assertTrue(blackberry_torch_ua.is_mobile) 106 self.assertTrue(blackberry_bold_ua.is_mobile) 107 self.assertTrue(windows_phone_ua.is_mobile) 108 self.assertTrue(j2me_opera_ua.is_mobile) 109 self.assertTrue(nokia_n97_ua.is_mobile) 110 self.assertFalse(windows_rt_ua.is_mobile) 111 self.assertFalse(ipad_ua.is_mobile) 112 self.assertFalse(playbook_ua.is_mobile) 113 self.assertFalse(kindle_fire_ua.is_mobile) 114 self.assertFalse(nexus_7_ua.is_mobile) 115 self.assertFalse(ie_ua.is_mobile) 116 self.assertFalse(ie_touch_ua.is_mobile) 117 self.assertFalse(mac_safari_ua.is_mobile) 118 self.assertFalse(windows_ie_ua.is_mobile) 119 self.assertFalse(ubuntu_firefox_ua.is_mobile) 120 self.assertFalse(google_bot_ua.is_mobile) 121 self.assertTrue(android_firefox_aurora_ua.is_mobile) 122 123 def test_is_touch_property(self): 124 self.assertTrue(iphone_ua.is_touch_capable) 125 self.assertTrue(galaxy_s3_ua.is_touch_capable) 126 self.assertTrue(ipad_ua.is_touch_capable) 127 self.assertTrue(playbook_ua.is_touch_capable) 128 self.assertTrue(kindle_fire_ua.is_touch_capable) 129 self.assertTrue(nexus_7_ua.is_touch_capable) 130 self.assertTrue(windows_phone_ua.is_touch_capable) 131 self.assertTrue(ie_touch_ua.is_touch_capable) 132 self.assertTrue(blackberry_bold_touch_ua.is_mobile) 133 self.assertTrue(blackberry_torch_ua.is_mobile) 134 self.assertFalse(j2me_opera_ua.is_touch_capable) 135 self.assertFalse(ie_ua.is_touch_capable) 136 self.assertFalse(blackberry_bold_ua.is_touch_capable) 137 self.assertFalse(mac_safari_ua.is_touch_capable) 138 self.assertFalse(windows_ie_ua.is_touch_capable) 139 self.assertFalse(ubuntu_firefox_ua.is_touch_capable) 140 self.assertFalse(google_bot_ua.is_touch_capable) 141 self.assertFalse(nokia_n97_ua.is_touch_capable) 142 self.assertTrue(android_firefox_aurora_ua.is_touch_capable) 143 144 def test_is_pc(self): 145 self.assertFalse(iphone_ua.is_pc) 146 self.assertFalse(galaxy_s3_ua.is_pc) 147 self.assertFalse(ipad_ua.is_pc) 148 self.assertFalse(playbook_ua.is_pc) 149 self.assertFalse(kindle_fire_ua.is_pc) 150 self.assertFalse(nexus_7_ua.is_pc) 151 self.assertFalse(windows_phone_ua.is_pc) 152 self.assertFalse(blackberry_bold_touch_ua.is_pc) 153 self.assertFalse(blackberry_torch_ua.is_pc) 154 self.assertFalse(blackberry_bold_ua.is_pc) 155 self.assertFalse(j2me_opera_ua.is_pc) 156 self.assertFalse(google_bot_ua.is_pc) 157 self.assertFalse(nokia_n97_ua.is_pc) 158 self.assertTrue(mac_safari_ua.is_pc) 159 self.assertTrue(windows_ie_ua.is_pc) 160 self.assertTrue(ubuntu_firefox_ua.is_pc) 161 self.assertTrue(ie_touch_ua.is_pc) 162 self.assertTrue(ie_ua.is_pc) 163 self.assertFalse(android_firefox_aurora_ua.is_pc) 164 165 def test_is_bot(self): 166 self.assertTrue(google_bot_ua.is_bot) 167 self.assertFalse(iphone_ua.is_bot) 168 self.assertFalse(galaxy_s3_ua.is_bot) 169 self.assertFalse(ipad_ua.is_bot) 170 self.assertFalse(playbook_ua.is_bot) 171 self.assertFalse(kindle_fire_ua.is_bot) 172 self.assertFalse(nexus_7_ua.is_bot) 173 self.assertFalse(windows_phone_ua.is_bot) 174 self.assertFalse(blackberry_bold_touch_ua.is_bot) 175 self.assertFalse(blackberry_torch_ua.is_bot) 176 self.assertFalse(blackberry_bold_ua.is_bot) 177 self.assertFalse(j2me_opera_ua.is_bot) 178 self.assertFalse(mac_safari_ua.is_bot) 179 self.assertFalse(windows_ie_ua.is_bot) 180 self.assertFalse(ubuntu_firefox_ua.is_bot) 181 self.assertFalse(ie_touch_ua.is_bot) 182 self.assertFalse(ie_ua.is_bot) 183 self.assertFalse(nokia_n97_ua.is_bot) 184 self.assertFalse(android_firefox_aurora_ua.is_bot) 185 186 def test_strings(self): 187 self.assertEqual(str(iphone_ua), "iPhone / iOS 5.1 / Mobile Safari 5.1") 188 self.assertEqual(str(ipad_ua), "iPad / iOS 3.2 / Mobile Safari 4.0.4") 189 self.assertEqual(str(galaxy_tab), "Samsung SCH-I800 / Android 2.2 / Android 2.2") 190 self.assertEqual(str(galaxy_s3_ua), "Samsung GT-I9300 / Android 4.0.4 / Android 4.0.4") 191 self.assertEqual(str(kindle_fire_ua), "Kindle / Android / Amazon Silk 1.1.0-80") 192 self.assertEqual(str(playbook_ua), "BlackBerry Playbook / BlackBerry Tablet OS 2.0.1 / BlackBerry WebKit 2.0.1") 193 self.assertEqual(str(nexus_7_ua), "Asus Nexus 7 / Android 4.1.1 / Chrome 18.0.1025") 194 self.assertEqual(str(windows_phone_ua), "Samsung SGH-i917 / Windows Phone 7.5 / IE Mobile 9") 195 self.assertEqual(str(windows_rt_ua), "PC / Windows RT / IE 10") 196 self.assertEqual(str(blackberry_torch_ua), "BlackBerry 9800 / BlackBerry OS 6 / BlackBerry WebKit 6") 197 self.assertEqual(str(blackberry_bold_ua), "BlackBerry 9700 / BlackBerry OS 5 / BlackBerry 9700") 198 self.assertEqual(str(blackberry_bold_touch_ua), "BlackBerry 9930 / BlackBerry OS 7 / BlackBerry WebKit 7") 199 self.assertEqual(str(j2me_opera_ua), "Generic Feature Phone / Other / Opera Mini 9.80") 200 self.assertEqual(str(ie_ua), "PC / Windows 8 / IE 10") 201 self.assertEqual(str(ie_touch_ua), "PC / Windows 8 / IE 10") 202 self.assertEqual(str(mac_safari_ua), "PC / Mac OS X 10.6.8 / WebKit Nightly 537.13") 203 self.assertEqual(str(windows_ie_ua), "PC / Windows 7 / IE 9") 204 self.assertEqual(str(ubuntu_firefox_ua), "PC / Ubuntu / Firefox 15.0.1") 205 self.assertEqual(str(google_bot_ua), "Spider / Other / Googlebot 2.1") 206 self.assertEqual(str(nokia_n97_ua), "Nokia N97 / Symbian OS 9.4 / Nokia Browser 7.1.12344") 207 self.assertEqual(str(android_firefox_aurora_ua), "Generic Smartphone / Android / Firefox Mobile 27") 208 209 def test_unicode_strings(self): 210 try: 211 # Python 2 212 unicode_ua_str = unicode(devices['iphone']['user_agent']) 213 self.assertEqual(unicode_ua_str, 214 u"iPhone / iOS 5.1 / Mobile Safari 5.1") 215 self.assertTrue(isinstance(unicode_ua_str, unicode)) 216 except NameError: 217 # Python 3 218 unicode_ua_str = str(devices['iphone']['user_agent']) 219 self.assertEqual(unicode_ua_str, 220 "iPhone / iOS 5.1 / Mobile Safari 5.1") 221 222 223with open(os.path.join(os.path.dirname(__file__), 'devices.json')) as f: 224 devices = json.load(f) 225 226 227def test_wrapper(items): 228 def test_func(self): 229 attrs = ('is_bot', 'is_mobile', 230 'is_pc', 'is_tablet', 'is_touch_capable') 231 for attr in attrs: 232 self.assertEqual( 233 getattr(items['user_agent'], attr), items[attr], msg=attr) 234 # Temporarily commenting this out since UserAgent.device 235 # may return different string depending ua-parser version 236 # self.assertEqual(str(items['user_agent']), items['str']) 237 return test_func 238 239for device, items in compat.iteritems(devices): 240 items['user_agent'] = parse(items['ua_string']) 241 setattr(UserAgentsTest, 'test_' + device, test_wrapper(items)) 242