123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- package parser
- import (
- "testing"
- "github.com/stretchr/testify/assert"
- )
- func TestSimpleUserAgentParser_Parse(t *testing.T) {
- parser := NewSimpleUserAgentParser()
- testCases := []struct {
- name string
- userAgent string
- expectedInfo UserAgentInfo
- }{
- {
- name: "Chrome on Windows",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
- expectedInfo: UserAgentInfo{
- Browser: "Chrome",
- BrowserVer: "91.0",
- OS: "Windows",
- OSVersion: "10",
- DeviceType: "Desktop",
- },
- },
- {
- name: "Firefox on Ubuntu",
- userAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0",
- expectedInfo: UserAgentInfo{
- Browser: "Firefox",
- BrowserVer: "89.0",
- OS: "Ubuntu",
- OSVersion: "",
- DeviceType: "Desktop",
- },
- },
- {
- name: "Safari on iPhone",
- userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1",
- expectedInfo: UserAgentInfo{
- Browser: "Safari",
- BrowserVer: "14.1",
- OS: "iOS",
- OSVersion: "14.6",
- DeviceType: "iPhone",
- },
- },
- {
- name: "Safari on iPad",
- userAgent: "Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1",
- expectedInfo: UserAgentInfo{
- Browser: "Safari",
- BrowserVer: "14.1",
- OS: "iOS",
- OSVersion: "14.6",
- DeviceType: "iPad",
- },
- },
- {
- name: "WeChat Browser",
- userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.7(0x18000733) NetType/WIFI Language/zh_CN",
- expectedInfo: UserAgentInfo{
- Browser: "WeChat",
- BrowserVer: "8.0",
- OS: "iOS",
- OSVersion: "14.6",
- DeviceType: "iPhone",
- },
- },
- {
- name: "Chrome on Android Phone",
- userAgent: "Mozilla/5.0 (Linux; Android 11; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36",
- expectedInfo: UserAgentInfo{
- Browser: "Chrome",
- BrowserVer: "91.0",
- OS: "Android",
- OSVersion: "11",
- DeviceType: "Mobile",
- },
- },
- {
- name: "Chrome on Android Tablet",
- userAgent: "Mozilla/5.0 (Linux; Android 11; SM-T870) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Safari/537.36",
- expectedInfo: UserAgentInfo{
- Browser: "Chrome",
- BrowserVer: "91.0",
- OS: "Android",
- OSVersion: "11",
- DeviceType: "Tablet",
- },
- },
- {
- name: "Edge Browser",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",
- expectedInfo: UserAgentInfo{
- Browser: "Edge",
- BrowserVer: "91.0",
- OS: "Windows",
- OSVersion: "10",
- DeviceType: "Desktop",
- },
- },
- {
- name: "UC Browser",
- userAgent: "Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; EML-AL00 Build/HUAWEIEML-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/11.9.4.974 Mobile Safari/537.36",
- expectedInfo: UserAgentInfo{
- Browser: "UC Browser",
- BrowserVer: "11.9",
- OS: "Android",
- OSVersion: "8.1",
- DeviceType: "Mobile",
- },
- },
- {
- name: "QQ Browser",
- userAgent: "Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043632 Safari/537.36 MicroMessenger/6.6.1.1220(0x26060135) NetType/WIFI Language/zh_CN",
- expectedInfo: UserAgentInfo{
- Browser: "WeChat",
- BrowserVer: "6.6",
- OS: "Android",
- OSVersion: "5",
- DeviceType: "Mobile",
- },
- },
- {
- name: "Googlebot",
- userAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
- expectedInfo: UserAgentInfo{
- Browser: "Bot",
- BrowserVer: "",
- OS: "Unknown",
- OSVersion: "",
- DeviceType: "Bot",
- },
- },
- {
- name: "Samsung Browser",
- userAgent: "Mozilla/5.0 (Linux; Android 9; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.2 Chrome/67.0.3396.87 Mobile Safari/537.36",
- expectedInfo: UserAgentInfo{
- Browser: "Samsung Browser",
- BrowserVer: "9.2",
- OS: "Android",
- OSVersion: "9",
- DeviceType: "Mobile",
- },
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- result := parser.Parse(tc.userAgent)
-
- assert.Equal(t, tc.expectedInfo.Browser, result.Browser, "Browser mismatch")
- assert.Equal(t, tc.expectedInfo.BrowserVer, result.BrowserVer, "Browser version mismatch")
- assert.Equal(t, tc.expectedInfo.OS, result.OS, "OS mismatch")
- assert.Equal(t, tc.expectedInfo.OSVersion, result.OSVersion, "OS version mismatch")
- assert.Equal(t, tc.expectedInfo.DeviceType, result.DeviceType, "Device type mismatch")
- })
- }
- }
- func TestSimpleUserAgentParser_IsBot(t *testing.T) {
- parser := NewSimpleUserAgentParser()
- testCases := []struct {
- name string
- userAgent string
- expected bool
- }{
- {
- name: "Googlebot",
- userAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
- expected: true,
- },
- {
- name: "Bingbot",
- userAgent: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
- expected: true,
- },
- {
- name: "Regular Chrome",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
- expected: false,
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- result := parser.IsBot(tc.userAgent)
- assert.Equal(t, tc.expected, result)
- })
- }
- }
- func TestSimpleUserAgentParser_IsMobile(t *testing.T) {
- parser := NewSimpleUserAgentParser()
- testCases := []struct {
- name string
- userAgent string
- expected bool
- }{
- {
- name: "iPhone",
- userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: true,
- },
- {
- name: "Android Phone",
- userAgent: "Mozilla/5.0 (Linux; Android 11; SM-G991B) AppleWebKit/537.36 Chrome/91.0.4472.120 Mobile Safari/537.36",
- expected: true,
- },
- {
- name: "Desktop Chrome",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/91.0.4472.124 Safari/537.36",
- expected: false,
- },
- {
- name: "iPad",
- userAgent: "Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: false, // iPad should be tablet, not mobile
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- result := parser.IsMobile(tc.userAgent)
- assert.Equal(t, tc.expected, result)
- })
- }
- }
- func TestSimpleUserAgentParser_IsTablet(t *testing.T) {
- parser := NewSimpleUserAgentParser()
- testCases := []struct {
- name string
- userAgent string
- expected bool
- }{
- {
- name: "iPad",
- userAgent: "Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: true,
- },
- {
- name: "Android Tablet",
- userAgent: "Mozilla/5.0 (Linux; Android 11; SM-T870) AppleWebKit/537.36 Chrome/91.0.4472.120 Safari/537.36",
- expected: true,
- },
- {
- name: "iPhone",
- userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: false,
- },
- {
- name: "Desktop",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
- expected: false,
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- result := parser.IsTablet(tc.userAgent)
- assert.Equal(t, tc.expected, result)
- })
- }
- }
- func TestCachedUserAgentParser_Enhanced(t *testing.T) {
- baseParser := NewSimpleUserAgentParser()
- cachedParser := NewCachedUserAgentParser(baseParser, 10)
- userAgent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/91.0.4472.124 Safari/537.36"
- // First call should parse and cache
- result1 := cachedParser.Parse(userAgent)
- assert.Equal(t, "Chrome", result1.Browser)
- // Second call should return cached result
- result2 := cachedParser.Parse(userAgent)
- assert.Equal(t, result1, result2)
- // Check cache stats
- size, maxSize := cachedParser.GetCacheStats()
- assert.Equal(t, 1, size)
- assert.Equal(t, 10, maxSize)
- // Clear cache
- cachedParser.ClearCache()
- size, _ = cachedParser.GetCacheStats()
- assert.Equal(t, 0, size)
- }
- func TestSimpleUserAgentParser_GetSimpleDeviceType(t *testing.T) {
- parser := NewSimpleUserAgentParser()
- testCases := []struct {
- name string
- userAgent string
- expected string
- }{
- {
- name: "iPhone",
- userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: "Mobile",
- },
- {
- name: "iPad",
- userAgent: "Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15",
- expected: "Tablet",
- },
- {
- name: "Bot",
- userAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
- expected: "Bot",
- },
- {
- name: "Desktop",
- userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
- expected: "Desktop",
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- result := parser.GetSimpleDeviceType(tc.userAgent)
- assert.Equal(t, tc.expected, result)
- })
- }
- }
|