browser 2.5.2 → 5.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +1 -1
  3. data/.github/workflows/tests.yml +57 -0
  4. data/.gitignore +1 -0
  5. data/.prettierignore +1 -0
  6. data/.rubocop.yml +22 -107
  7. data/CHANGELOG.md +192 -11
  8. data/FUNDING.yml +3 -0
  9. data/Gemfile +2 -0
  10. data/README.md +139 -89
  11. data/Rakefile +11 -3
  12. data/bot_exceptions.yml +2 -0
  13. data/bots.yml +302 -247
  14. data/browser.gemspec +12 -7
  15. data/gemfiles/rails6_0.gemfile +6 -0
  16. data/gemfiles/rails6_1.gemfile +6 -0
  17. data/lib/browser/accept_language.rb +12 -9
  18. data/lib/browser/action_controller.rb +1 -3
  19. data/lib/browser/aliases.rb +5 -5
  20. data/lib/browser/alipay.rb +2 -2
  21. data/lib/browser/base.rb +101 -19
  22. data/lib/browser/blackberry.rb +3 -3
  23. data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
  24. data/lib/browser/bot/keyword_matcher.rb +11 -0
  25. data/lib/browser/bot/known_bots_matcher.rb +11 -0
  26. data/lib/browser/bot.rb +39 -27
  27. data/lib/browser/browser.rb +65 -54
  28. data/lib/browser/chrome.rb +18 -5
  29. data/lib/browser/detect_version.rb +5 -5
  30. data/lib/browser/device/android.rb +20 -0
  31. data/lib/browser/device/blackberry_playbook.rb +1 -1
  32. data/lib/browser/device/ipad.rb +1 -1
  33. data/lib/browser/device/iphone.rb +1 -1
  34. data/lib/browser/device/ipod_touch.rb +1 -1
  35. data/lib/browser/device/kindle.rb +1 -1
  36. data/lib/browser/device/kindle_fire.rb +1 -1
  37. data/lib/browser/device/playstation3.rb +1 -1
  38. data/lib/browser/device/playstation4.rb +1 -1
  39. data/lib/browser/device/psp.rb +1 -1
  40. data/lib/browser/device/psvita.rb +1 -1
  41. data/lib/browser/device/samsung.rb +33 -0
  42. data/lib/browser/device/surface.rb +2 -4
  43. data/lib/browser/device/switch.rb +19 -0
  44. data/lib/browser/device/tv.rb +1 -1
  45. data/lib/browser/device/unknown.rb +1 -1
  46. data/lib/browser/device/wii.rb +1 -1
  47. data/lib/browser/device/wiiu.rb +1 -1
  48. data/lib/browser/device/xbox_360.rb +1 -1
  49. data/lib/browser/device/xbox_one.rb +1 -1
  50. data/lib/browser/device.rb +47 -30
  51. data/lib/browser/duck_duck_go.rb +22 -0
  52. data/lib/browser/edge.rb +6 -2
  53. data/lib/browser/electron.rb +2 -2
  54. data/lib/browser/facebook.rb +4 -2
  55. data/lib/browser/firefox.rb +2 -2
  56. data/lib/browser/google_search_app.rb +21 -0
  57. data/lib/browser/huawei_browser.rb +21 -0
  58. data/lib/browser/instagram.rb +21 -0
  59. data/lib/browser/internet_explorer.rb +9 -10
  60. data/lib/browser/maxthon.rb +21 -0
  61. data/lib/browser/meta/base.rb +0 -1
  62. data/lib/browser/meta/generic_browser.rb +1 -3
  63. data/lib/browser/meta.rb +12 -13
  64. data/lib/browser/micro_messenger.rb +2 -2
  65. data/lib/browser/middleware/context/additions.rb +1 -1
  66. data/lib/browser/middleware.rb +4 -3
  67. data/lib/browser/miui_browser.rb +21 -0
  68. data/lib/browser/nokia.rb +2 -2
  69. data/lib/browser/opera.rb +2 -2
  70. data/lib/browser/otter.rb +2 -2
  71. data/lib/browser/phantom_js.rb +2 -2
  72. data/lib/browser/platform/adobe_air.rb +2 -2
  73. data/lib/browser/platform/android.rb +1 -1
  74. data/lib/browser/platform/base.rb +3 -2
  75. data/lib/browser/platform/blackberry.rb +2 -2
  76. data/lib/browser/platform/chrome_os.rb +1 -1
  77. data/lib/browser/platform/firefox_os.rb +1 -1
  78. data/lib/browser/platform/ios.rb +17 -4
  79. data/lib/browser/platform/kai_os.rb +23 -0
  80. data/lib/browser/platform/linux.rb +1 -1
  81. data/lib/browser/platform/mac.rb +5 -3
  82. data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
  83. data/lib/browser/platform/windows.rb +2 -2
  84. data/lib/browser/platform/windows_mobile.rb +1 -1
  85. data/lib/browser/platform/windows_phone.rb +1 -1
  86. data/lib/browser/platform.rb +37 -28
  87. data/lib/browser/qq.rb +5 -5
  88. data/lib/browser/rails.rb +11 -5
  89. data/lib/browser/safari.rb +19 -4
  90. data/lib/browser/samsung_browser.rb +21 -0
  91. data/lib/browser/snapchat.rb +21 -0
  92. data/lib/browser/sougou_browser.rb +24 -0
  93. data/lib/browser/sputnik.rb +21 -0
  94. data/lib/browser/uc_browser.rb +2 -2
  95. data/lib/browser/{generic.rb → unknown.rb} +6 -8
  96. data/lib/browser/version.rb +1 -1
  97. data/lib/browser/weibo.rb +2 -2
  98. data/lib/browser/yandex.rb +21 -0
  99. data/lib/browser.rb +2 -2
  100. data/samsung.yml +138 -0
  101. data/search_engines.yml +2 -2
  102. data/test/browser_test.rb +42 -10
  103. data/test/rails_test.rb +10 -0
  104. data/test/sample_app.rb +14 -0
  105. data/test/test_helper.rb +9 -1
  106. data/test/ua.yml +147 -109
  107. data/test/ua_bots.yml +98 -45
  108. data/test/ua_search_engines.yml +7 -6
  109. data/test/unit/accept_language_test.rb +24 -0
  110. data/test/unit/adobe_air_test.rb +1 -1
  111. data/test/unit/alipay_test.rb +6 -0
  112. data/test/unit/blackberry_test.rb +0 -6
  113. data/test/unit/bots_test.rb +37 -27
  114. data/test/unit/chrome_test.rb +8 -19
  115. data/test/unit/console_test.rb +2 -2
  116. data/test/unit/device_test.rb +60 -3
  117. data/test/unit/duck_duck_go_test.rb +37 -0
  118. data/test/unit/edge_test.rb +49 -5
  119. data/test/unit/facebook_test.rb +20 -0
  120. data/test/unit/firefox_test.rb +0 -3
  121. data/test/unit/google_search_app_test.rb +54 -0
  122. data/test/unit/huawei_browser_test.rb +25 -0
  123. data/test/unit/instagram_test.rb +30 -0
  124. data/test/unit/internet_explorer_test.rb +0 -12
  125. data/test/unit/ios_test.rb +7 -5
  126. data/test/unit/kai_os_test.rb +31 -0
  127. data/test/unit/kindle_test.rb +0 -2
  128. data/test/unit/maxthon_test.rb +25 -0
  129. data/test/unit/meta_test.rb +10 -2
  130. data/test/unit/micro_messenger_test.rb +21 -6
  131. data/test/unit/miui_browser_test.rb +25 -0
  132. data/test/unit/opera_test.rb +1 -2
  133. data/test/unit/platform_test.rb +34 -8
  134. data/test/unit/qq_test.rb +12 -0
  135. data/test/unit/safari_test.rb +12 -7
  136. data/test/unit/samsung_browser_test.rb +23 -0
  137. data/test/unit/snapchat_test.rb +40 -0
  138. data/test/unit/sougou_browser_test.rb +41 -0
  139. data/test/unit/sputnik_test.rb +22 -0
  140. data/test/unit/yandex_test.rb +37 -0
  141. metadata +83 -26
  142. data/.bundle/config +0 -2
  143. data/.travis.yml +0 -16
  144. data/bin/rake +0 -17
  145. data/gemfiles/rails4.gemfile +0 -4
  146. data/lib/browser/meta/modern.rb +0 -11
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class SougouBrowser < Base
5
+ def id
6
+ :sougou_browser
7
+ end
8
+
9
+ def name
10
+ "Sougou Browser"
11
+ end
12
+
13
+ # We can't get the real version on desktop device from the ua string
14
+ def full_version
15
+ ua[%r{(?:SogouMobileBrowser)/([\d.]+)}, 1] || "0.0"
16
+ end
17
+
18
+ # SogouMobileBrowser for mobile device
19
+ # SE for desktop device
20
+ def match?
21
+ ua.match?(/SogouMobileBrowser/i) || ua.match?(/\bSE\b/)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Sputnik < Base
5
+ def id
6
+ :sputnik
7
+ end
8
+
9
+ def name
10
+ "Sputnik"
11
+ end
12
+
13
+ def full_version
14
+ ua[%r{SputnikBrowser/([\d.]+)}, 1] || "0.0"
15
+ end
16
+
17
+ def match?
18
+ ua.include?("SputnikBrowser")
19
+ end
20
+ end
21
+ end
@@ -11,11 +11,11 @@ module Browser
11
11
  end
12
12
 
13
13
  def full_version
14
- ua[%r[UCBrowser/([\d.]+)], 1] || "0.0"
14
+ ua[%r{UCBrowser/([\d.]+)}, 1] || "0.0"
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /UCBrowser/
18
+ ua.include?("UCBrowser")
19
19
  end
20
20
  end
21
21
  end
@@ -1,23 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- class Generic < Base
4
+ class Unknown < Base
5
5
  NAMES = {
6
6
  "QuickTime" => "QuickTime",
7
7
  "CoreMedia" => "Apple CoreMedia"
8
8
  }.freeze
9
9
 
10
10
  def id
11
- :generic
11
+ :unknown_browser
12
12
  end
13
13
 
14
14
  def name
15
- infer_name || "Generic Browser"
15
+ infer_name || "Unknown Browser"
16
16
  end
17
17
 
18
18
  def full_version
19
- ua[%r[(?:QuickTime)/([\d.]+)], 1] ||
20
- ua[%r[CoreMedia v([\d.]+)], 1] ||
19
+ ua[%r{(?:QuickTime)/([\d.]+)}, 1] ||
20
+ ua[/CoreMedia v([\d.]+)/, 1] ||
21
21
  "0.0"
22
22
  end
23
23
 
@@ -25,9 +25,7 @@ module Browser
25
25
  true
26
26
  end
27
27
 
28
- private
29
-
30
- def infer_name
28
+ private def infer_name
31
29
  (NAMES.find {|key, _| ua.include?(key) } || []).last
32
30
  end
33
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- VERSION = "2.5.2".freeze
4
+ VERSION = "5.3.1"
5
5
  end
data/lib/browser/weibo.rb CHANGED
@@ -11,11 +11,11 @@ module Browser
11
11
  end
12
12
 
13
13
  def full_version
14
- ua[%r[(?:__weibo__)([\d.]+)]i, 1] || "0.0"
14
+ ua[/(?:__weibo__)([\d.]+)/i, 1] || "0.0"
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /__weibo__/i
18
+ ua.match?(/__weibo__/i)
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Yandex < Base
5
+ def id
6
+ :yandex
7
+ end
8
+
9
+ def name
10
+ "Yandex"
11
+ end
12
+
13
+ def full_version
14
+ ua[%r{YaBrowser/([\d.]+)}, 1] || "0.0"
15
+ end
16
+
17
+ def match?
18
+ ua.include?("YaBrowser")
19
+ end
20
+ end
21
+ end
data/lib/browser.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "browser/browser"
4
- require "browser/rails" if defined?(::Rails)
3
+ require_relative "browser/browser"
4
+ require_relative "browser/rails" if defined?(::Rails)
data/samsung.yml ADDED
@@ -0,0 +1,138 @@
1
+ # Source: https://en.wikipedia.org/wiki/Samsung_Galaxy
2
+ SM-G900H: Galaxy S5 Exynos
3
+ SM-A320FL: Galaxy A3
4
+ SM-G780F: Galaxy S20 Fan Edition
5
+ SM-G781B: Galaxy S20 Fan Edition
6
+ SM-F196B: Galaxy Z Fold2 5G
7
+ SM-G928A: Galaxy S6 Edge+
8
+ SM-G928AZ: Galaxy S6 Edge+
9
+ SM-G928D: Galaxy S6 Edge+
10
+ SM-G928F: Galaxy S6 Edge+
11
+ SM-G928FD: Galaxy S6 Edge+
12
+ SM-G928I: Galaxy S6 Edge+
13
+ SM-G928K: Galaxy S6 Edge+
14
+ SM-G928L: Galaxy S6 Edge+
15
+ SM-G928P: Galaxy S6 Edge+
16
+ SM-G928PZ: Galaxy S6 Edge+
17
+ SM-G928R4: Galaxy S6 Edge+
18
+ SM-G928R7: Galaxy S6 Edge+
19
+ SM-G928S: Galaxy S6 Edge+
20
+ SM-G928T: Galaxy S6 Edge+
21
+ SM-G928T1: Galaxy S6 Edge+
22
+ SM-G928TR: Galaxy S6 Edge+
23
+ SM-G928V: Galaxy S6 Edge+
24
+ SM-G9280: Galaxy S6 Edge+
25
+ SM-G9288: Galaxy S6 Edge+
26
+ SM-G9289: Galaxy S6 Edge+
27
+ SM-A8000: Galaxy A8
28
+ SM-A800F: Galaxy A8
29
+ SM-A800I: Galaxy A8
30
+ SM-A800S: Galaxy A8
31
+ SM-A800Y: Galaxy A8
32
+ SM-N9200: Galaxy Note 5
33
+ SM-N920C: Galaxy Note 5
34
+ SM-N920T: Galaxy Note 5
35
+ SM-N920A: Galaxy Note 5
36
+ SM-N920I: Galaxy Note 5
37
+ SM-N9208: Galaxy Note 5
38
+ SM-G903FP: Galaxy S5 Neo
39
+ SM-G903WP: Galaxy S5 Neo
40
+ SM-G925A: Galaxy S6 Edge
41
+ SM-G925AZ: Galaxy S6 Edge
42
+ SM-G925F: Galaxy S6 Edge
43
+ SM-G925I: Galaxy S6 Edge
44
+ SM-G925K: Galaxy S6 Edge
45
+ SM-G925L: Galaxy S6 Edge
46
+ SM-G925P: Galaxy S6 Edge
47
+ SM-G925PZ: Galaxy S6 Edge
48
+ SM-G925R4: Galaxy S6 Edge
49
+ SM-G925R7: Galaxy S6 Edge
50
+ SM-G925S: Galaxy S6 Edge
51
+ SM-G925T: Galaxy S6 Edge
52
+ SM-G925T1: Galaxy S6 Edge
53
+ SM-G925TR: Galaxy S6 Edge
54
+ SM-G925V: Galaxy S6 Edge
55
+ SM-G9250: Galaxy S6 Edge
56
+ SM-G9258: Galaxy S6 Edge
57
+ SM-G9259: Galaxy S6 Edge
58
+ SM-G920A: Galaxy S6
59
+ SM-G920AZ: Galaxy S6
60
+ SM-G920D: Galaxy S6
61
+ SM-G920F: Galaxy S6
62
+ SM-G920FD: Galaxy S6
63
+ SM-G920I: Galaxy S6
64
+ SM-G920K: Galaxy S6
65
+ SM-G920L: Galaxy S6
66
+ SM-G920P: Galaxy S6
67
+ SM-G920PZ: Galaxy S6
68
+ SM-G920R4: Galaxy S6
69
+ SM-G920R7: Galaxy S6
70
+ SM-G920S: Galaxy S6
71
+ SM-G920T: Galaxy S6
72
+ SM-G920T1: Galaxy S6
73
+ SM-G920TR: Galaxy S6
74
+ SM-G920V: Galaxy S6
75
+ SM-G9200: Galaxy S6
76
+ SM-G9208: Galaxy S6
77
+ SM-G9209: Galaxy S6
78
+ SM-A700F: Galaxy A7
79
+ SM-A700FD: Galaxy A7
80
+ SM-A700FQ: Galaxy A7
81
+ SM-A700H: Galaxy A7
82
+ SM-A700K: Galaxy A7
83
+ SM-A700L: Galaxy A7
84
+ SM-A700M: Galaxy A7
85
+ SM-A700S: Galaxy A7
86
+ SM-A700X: Galaxy A7
87
+ SM-A700YD: Galaxy A7
88
+ SM-A700YZ: Galaxy A7
89
+ SM-A7000: Galaxy A7
90
+ SM-A7009: Galaxy A7
91
+ SM-A7009W: Galaxy A7
92
+ SM-G530BT: Galaxy Grand Prime
93
+ SM-G530F: Galaxy Grand Prime
94
+ SM-G530FQ: Galaxy Grand Prime
95
+ SM-G530FZ: Galaxy Grand Prime
96
+ SM-G530H: Galaxy Grand Prime
97
+ SM-G530M: Galaxy Grand Prime
98
+ SM-G530MU: Galaxy Grand Prime
99
+ SM-G530P: Galaxy Grand Prime
100
+ SM-G530R4: Galaxy Grand Prime
101
+ SM-G530R7: Galaxy Grand Prime
102
+ SM-G530T: Galaxy Grand Prime
103
+ SM-G530W: Galaxy Grand Prime
104
+ SM-G530Y: Galaxy Grand Prime
105
+ SM-G5306W: Galaxy Grand Prime
106
+ SM-G5308W: Galaxy Grand Prime
107
+ SM-G5309W: Galaxy Grand Prime
108
+ SM-J7109: Galaxy J7
109
+ SM-J710F: Galaxy J7
110
+ SM-J710FN: Galaxy J7
111
+ SM-J710H: Galaxy J7
112
+ SM-J710MN: Galaxy J7
113
+ SM-J710FQ: Galaxy J7
114
+ SM-J710K: Galaxy J7
115
+ SM-J710K: Galaxy J7
116
+ SM-J710GN: Galaxy J7
117
+ SM-J5109: Galaxy J5
118
+ SM-J510F: Galaxy J5
119
+ SM-J510FN: Galaxy J5
120
+ SM-J510H: Galaxy J5
121
+ SM-J510G: Galaxy J5
122
+ SM-J510MN: Galaxy J5
123
+ SM-J510Y: Galaxy J5
124
+ SM-J5108: Galaxy J5
125
+ SM-J510K: Galaxy J5
126
+ SM-J510L: Galaxy J5
127
+ SM-J510S: Galaxy J5
128
+ SM-J510UN: Galaxy J5
129
+ SM-G570F: Galaxy J2 Prime
130
+ SM-G570M: Galaxy J2 Prime
131
+ SM-G532F: Galaxy J2 Prime
132
+ SM-G532M: Galaxy J2 Prime
133
+ SM-G532G: Galaxy J2 Prime
134
+ SM-G610F: Galaxy J7 Prime
135
+ SM-G610M: Galaxy J7 Prime
136
+ SM-G975F: Galaxy S10+
137
+ SM-G960F: Galaxy S9
138
+ SM-F700F: Galaxy Z Flip
data/search_engines.yml CHANGED
@@ -1,6 +1,6 @@
1
+ ask jeeves: "Ask Jeeves"
1
2
  baidu: "Chinese search engine"
2
3
  bingbot: "Microsoft bing bot"
4
+ duckduckbot: "Duck Duck Go"
3
5
  googlebot: "Google spider"
4
6
  slurp: "Yahoo spider"
5
- duckduckbot: "Duck Duck Go"
6
- ask jeeves: "Ask Jeeves"
data/test/browser_test.rb CHANGED
@@ -39,7 +39,6 @@ class BrowserTest < Minitest::Test
39
39
  assert browser.platform.android?
40
40
  assert browser.safari?
41
41
  assert browser.webkit?
42
- assert browser.modern?
43
42
  assert_equal "3.1.2", browser.full_version
44
43
  assert_equal "3", browser.version
45
44
  end
@@ -51,7 +50,6 @@ class BrowserTest < Minitest::Test
51
50
  assert browser.platform.android?
52
51
  assert browser.safari?
53
52
  assert browser.webkit?
54
- assert browser.modern?
55
53
  assert_equal "4.0", browser.full_version
56
54
  assert_equal "4", browser.version
57
55
  end
@@ -62,7 +60,6 @@ class BrowserTest < Minitest::Test
62
60
  assert_equal "Internet Explorer", browser.name
63
61
  assert browser.device.surface?
64
62
  assert browser.ie?
65
- assert browser.modern?
66
63
  assert_equal "10.0", browser.full_version
67
64
  assert_equal "10", browser.version
68
65
  end
@@ -93,7 +90,6 @@ class BrowserTest < Minitest::Test
93
90
  assert_equal "PhantomJS", browser.name
94
91
  assert_equal :phantom_js, browser.id
95
92
  assert browser.phantom_js?
96
- assert browser.modern?
97
93
  assert_equal "1.9.0", browser.full_version
98
94
  assert_equal "1", browser.version
99
95
  assert browser.phantom_js?(%w[>=1 <2])
@@ -105,14 +101,18 @@ class BrowserTest < Minitest::Test
105
101
  assert_equal "0", browser.version
106
102
  end
107
103
 
108
- test "detects unknown id" do
109
- browser = Browser.new("Unknown")
110
- assert_equal :generic, browser.id
104
+ test "ignores malformed strings when comparing versions" do
105
+ browser = Browser.new("Chrome/65.0.3325.99.FreeBrowser.3.0.5")
106
+ refute browser.chrome?(">=65")
111
107
  end
112
108
 
113
- test "detects unknown name" do
109
+ test "detects unknown browser" do
114
110
  browser = Browser.new("Unknown")
115
- assert_equal "Generic Browser", browser.name
111
+
112
+ assert browser.unknown?
113
+ refute browser.known?
114
+ assert_equal :unknown_browser, browser.id
115
+ assert_equal "Unknown Browser", browser.name
116
116
  end
117
117
 
118
118
  test "returns empty language set for missing accept language" do
@@ -132,7 +132,7 @@ class BrowserTest < Minitest::Test
132
132
  browser = Browser.new("", accept_language: accept_language)
133
133
  languages = browser.accept_language.map(&:full)
134
134
 
135
- assert_equal ["en-US", "en", "pt-BR", "pt"], languages
135
+ assert_equal %w[en-US en pt-BR pt], languages
136
136
  end
137
137
 
138
138
  test "removes duplicate items" do
@@ -154,4 +154,36 @@ class BrowserTest < Minitest::Test
154
154
  browser = Browser.new("Fancy new browser")
155
155
  refute browser.known?
156
156
  end
157
+
158
+ test "rejects user agent larger than 2048 bytes" do
159
+ message = "user_agent cannot be larger than 2048 bytes; actual size is " \
160
+ "2049 bytes"
161
+
162
+ error =
163
+ begin
164
+ Browser.new("a" * 2049)
165
+ nil
166
+ rescue Browser::Error => error
167
+ error
168
+ end
169
+
170
+ refute_nil error
171
+ assert_equal message, error.message
172
+ end
173
+
174
+ test "rejects accept language larger than 2048 bytes" do
175
+ message = "accept_language cannot be larger than 2048 bytes; actual size " \
176
+ "is 2049 bytes"
177
+
178
+ error =
179
+ begin
180
+ Browser.new("Chrome", accept_language: "a" * 2049).accept_language
181
+ nil
182
+ rescue Browser::Error => error
183
+ error
184
+ end
185
+
186
+ refute_nil error
187
+ assert_equal message, error.message
188
+ end
157
189
  end
data/test/rails_test.rb CHANGED
@@ -19,4 +19,14 @@ class RailsTest < Minitest::Test
19
19
  assert_equal 200, last_response.status
20
20
  assert_equal "Chrome:en-US", last_response.body
21
21
  end
22
+
23
+ test "renders json" do
24
+ get "/api/pages", {}, "HTTP_USER_AGENT" => Browser["COMMONCRAWL"],
25
+ "HTTP_ACCEPT" => "application/json",
26
+ "HTTP_ACCEPT_LANGUAGE" => "en-US;q=0.8"
27
+
28
+ assert_equal 200, last_response.status
29
+ assert_equal true, JSON.parse(last_response.body)["isBot"]
30
+ assert_equal "en-US", JSON.parse(last_response.body)["acceptLanguages"][0]
31
+ end
22
32
  end
data/test/sample_app.rb CHANGED
@@ -9,12 +9,24 @@ class PagesController < ActionController::Base
9
9
  end
10
10
  end
11
11
 
12
+ class PotsController < ActionController::API
13
+ def index
14
+ render json: {
15
+ isBot: browser.bot?,
16
+ acceptLanguages: browser.accept_language.map(&:full)
17
+ }
18
+ end
19
+ end
20
+
12
21
  class SampleApp < Rails::Application
13
22
  config.secret_token = "99f19f08db7a37bdcb9d6701f54dca"
14
23
  config.secret_key_base = "99f19f08db7a37bdcb9d6701f54dca"
15
24
  config.eager_load = true
16
25
  config.active_support.deprecation = :log
17
26
 
27
+ # Introduced by Rails 6.
28
+ config.hosts << "example.org" if config.respond_to?(:hosts)
29
+
18
30
  routes.append do
19
31
  default_headers = {"Content-Type" => "text/html"}
20
32
 
@@ -29,6 +41,8 @@ class SampleApp < Rails::Application
29
41
  }
30
42
 
31
43
  get "/home", to: "pages#home"
44
+
45
+ get "/api/pages", to: "pots#index"
32
46
  end
33
47
 
34
48
  config.middleware.use Browser::Middleware do
data/test/test_helper.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require "simplecov"
4
4
  SimpleCov.start
5
5
 
6
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
6
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
7
7
  require "bundler/setup"
8
8
  require "minitest/autorun"
9
9
  require "minitest/utils"
@@ -24,3 +24,11 @@ module Minitest
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ # Override Browser::Base#warn, so we don't output deprecation messages.
29
+ module Browser
30
+ class Base
31
+ def warn(*)
32
+ end
33
+ end
34
+ end