@@ -23,21 +23,6 @@ import org.junit.Assert.assertTrue
2323import org.junit.Before
2424import org.junit.Test
2525
26- private const val CHROME_MOBILE_UA =
27- " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36"
28-
29- // Some values will be dynamic based on OS/Architecture/Software versions, so use Regex to match around dynamic values
30- private val DESKTOP_UA_REGEX = Regex (
31- " Mozilla/5.0 \\ (X11; Linux .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Chrome/[.0-9]+ Safari/[.0-9]+ DuckDuckGo/5"
32- )
33- private val MOBILE_UA_REGEX = Regex (
34- " Mozilla/5.0 \\ (Linux; Android .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Chrome/[.0-9]+ Mobile Safari/[.0-9]+ DuckDuckGo/5"
35- )
36-
37- private val MOBILE_UA_REGEX_MISSING_APPLE_WEBKIT_DETAILS = Regex (
38- " Mozilla/5.0 \\ (Linux; Android .*?\\ ) DuckDuckGo/5"
39- )
40-
4126class UserAgentProviderTest {
4227
4328 private lateinit var testee: UserAgentProvider
@@ -50,24 +35,127 @@ class UserAgentProviderTest {
5035 }
5136
5237 @Test
53- fun whenMobileUaRetrievedThenDeviceStrippedAndDuckDuckGoSuffixAddedToUA () {
54- testee = UserAgentProvider (CHROME_MOBILE_UA , deviceInfo)
55- val actual = testee.getUserAgent(desktopSiteRequested = false )
56- assertTrue(MOBILE_UA_REGEX .matches(actual))
38+ fun whenUaRetrievedWithNoParamsThenDeviceStrippedAndApplicationComponentAddedBeforeSafari () {
39+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
40+ val actual = testee.userAgent()
41+ assertTrue(" $actual does not match expected regex" , ValidationRegex .converted.matches(actual))
42+ }
43+
44+ @Test
45+ fun whenMobileUaRetrievedThenDeviceStrippedAndApplicationComponentAddedBeforeSafari () {
46+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
47+ val actual = testee.userAgent(isDesktop = false )
48+ assertTrue(" $actual does not match expected regex" , ValidationRegex .converted.matches(actual))
49+ }
50+
51+ @Test
52+ fun whenDesktopUaRetrievedThenDeviceStrippedAndApplicationComponentAddedBeforeSafari () {
53+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
54+ val actual = testee.userAgent(isDesktop = true )
55+ assertTrue(" $actual does not match expected regex" , ValidationRegex .desktop.matches(actual))
56+ }
57+
58+ @Test
59+ fun whenMissingAppleWebKitComponentThenUaContainsMozillaAndApplicationAndSafariComponents () {
60+ testee = UserAgentProvider (Agent .NO_WEBKIT , deviceInfo)
61+ val actual = testee.userAgent(isDesktop = false )
62+ assertTrue(" $actual does not match expected regex" , ValidationRegex .missingWebKit.matches(actual))
63+ }
64+
65+ @Test
66+ fun whenMissingSafariComponentThenUaContainsMozillaAndVersionAndApplicationComponents () {
67+ testee = UserAgentProvider (Agent .NO_SAFARI , deviceInfo)
68+ val actual = testee.userAgent(isDesktop = false )
69+ assertTrue(" $actual does not match expected result" , ValidationRegex .missingSafari.matches(actual))
70+ }
71+
72+ @Test
73+ fun whenMissingVersionComponentThenUaContainsMozillaAndApplicationAndSafariComponents () {
74+ testee = UserAgentProvider (Agent .NO_VERSION , deviceInfo)
75+ val actual = testee.userAgent(isDesktop = false )
76+ assertTrue(" $actual does not match expected result" , ValidationRegex .noVersion.matches(actual))
5777 }
5878
5979 @Test
60- fun whenDesktopUaRetrievedThenDeviceStrippedAndDuckDuckGoSuffixAddedToUA () {
61- testee = UserAgentProvider (CHROME_MOBILE_UA , deviceInfo)
62- val actual = testee.getUserAgent(desktopSiteRequested = true )
63- assertTrue(DESKTOP_UA_REGEX .matches(actual))
80+ fun whenDomainDoesNotSupportApplicationThenUaOmitsApplicationComponent () {
81+ testee = UserAgentProvider (Agent . DEFAULT , deviceInfo)
82+ val actual = testee.userAgent( NO_APPLICATION_DOMAIN )
83+ assertTrue(" $actual does not match expected regex " , ValidationRegex .noApplication .matches(actual))
6484 }
6585
6686 @Test
67- fun whenMissingAppleWebKitStringThenUAContainsOnlyMozillaAndDuckDuckGoProducts () {
68- val missingAppleWebKitPart = " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) Chrome/64.0.3282.137 Mobile Safari/537.36"
69- testee = UserAgentProvider (missingAppleWebKitPart, deviceInfo)
70- val actual = testee.getUserAgent(desktopSiteRequested = false )
71- assertTrue(MOBILE_UA_REGEX_MISSING_APPLE_WEBKIT_DETAILS .matches(actual))
87+ fun whenSubdomsinDoesNotSupportApplicationThenUaOmitsApplicationComponent () {
88+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
89+ val actual = testee.userAgent(NO_APPLICATION_SUBDOMAIN )
90+ assertTrue(" $actual does not match expected regex" , ValidationRegex .noApplication.matches(actual))
91+ }
92+
93+ @Test
94+ fun whenDomainSupportsApplicationThenUaAddsApplicationComponentBeforeSafari () {
95+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
96+ val actual = testee.userAgent(DOMAIN )
97+ assertTrue(" $actual does not match expected regex" , ValidationRegex .converted.matches(actual))
98+ }
99+
100+ @Test
101+ fun whenDomainDoesNotSupportVersionThenUaOmitsVersionComponent () {
102+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
103+ val actual = testee.userAgent(NO_VERSION_DOMAIN )
104+ assertTrue(" $actual does not match expected regex" , ValidationRegex .noVersion.matches(actual))
105+ }
106+
107+ @Test
108+ fun whenSubdomainDoesNotSupportVersionThenUaOmitsVersionComponent () {
109+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
110+ val actual = testee.userAgent(NO_VERSION_SUBDOMAIN )
111+ assertTrue(" $actual does not match expected regex" , ValidationRegex .noVersion.matches(actual))
112+ }
113+
114+ @Test
115+ fun whenDomainSupportsVersionThenUaIncludesVersionComponentInUsualLocation () {
116+ testee = UserAgentProvider (Agent .DEFAULT , deviceInfo)
117+ val actual = testee.userAgent(DOMAIN )
118+ assertTrue(" $actual does not match expected regex" , ValidationRegex .converted.matches(actual))
119+ }
120+
121+ companion object {
122+ const val DOMAIN = " example.com"
123+ const val NO_APPLICATION_DOMAIN = " cvs.com"
124+ const val NO_APPLICATION_SUBDOMAIN = " subdomain.cvs.com"
125+ const val NO_VERSION_DOMAIN = " ing.nl"
126+ const val NO_VERSION_SUBDOMAIN = " subdomain.ing.nl"
127+ }
128+
129+ private object Agent {
130+ const val DEFAULT =
131+ " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36"
132+ const val NO_WEBKIT =
133+ " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36"
134+ const val NO_SAFARI =
135+ " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile"
136+ const val NO_VERSION =
137+ " Mozilla/5.0 (Linux; Android 8.1.0; Nexus 6P Build/OPM3.171019.014) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36"
138+ }
139+
140+ // Some values will be dynamic based on OS/Architecture/Software versions, so we use Regex to validate values
141+ private object ValidationRegex {
142+ val converted = Regex (
143+ " Mozilla/5.0 \\ (Linux; Android .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Version/[.0-9]+ Chrome/[.0-9]+ Mobile DuckDuckGo/5 Safari/[.0-9]+"
144+ )
145+ val desktop = Regex (
146+ " Mozilla/5.0 \\ (X11; Linux .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Version/[.0-9]+ Chrome/[.0-9]+ DuckDuckGo/5 Safari/[.0-9]+"
147+ )
148+ val noApplication = Regex (
149+ " Mozilla/5.0 \\ (Linux; Android .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Version/[.0-9]+ Chrome/[.0-9]+ Mobile Safari/[.0-9]+"
150+ )
151+ val noVersion = Regex (
152+ " Mozilla/5.0 \\ (Linux; Android .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Chrome/[.0-9]+ Mobile DuckDuckGo/5 Safari/[.0-9]+"
153+ )
154+ val missingWebKit = Regex (
155+ " Mozilla/5.0 \\ (Linux; Android .*?\\ ) DuckDuckGo/5 Safari/[.0-9]+"
156+ )
157+ val missingSafari = Regex (
158+ " Mozilla/5.0 \\ (Linux; Android .*?\\ ) AppleWebKit/[.0-9]+ \\ (KHTML, like Gecko\\ ) Version/[.0-9]+ Chrome/[.0-9]+ Mobile DuckDuckGo/5"
159+ )
72160 }
73161}
0 commit comments