ronin-web-user_agents 0.1.0.beta1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +1 -0
- data/.yardopts +1 -1
- data/ChangeLog.md +3 -0
- data/README.md +3 -2
- data/gemspec.yml +3 -3
- data/lib/ronin/web/user_agents/chrome.rb +1 -1
- data/lib/ronin/web/user_agents/data_dir.rb +1 -1
- data/lib/ronin/web/user_agents/firefox.rb +1 -1
- data/lib/ronin/web/user_agents/google_bot.rb +1 -1
- data/lib/ronin/web/user_agents/os/android.rb +1 -1
- data/lib/ronin/web/user_agents/os/linux.rb +1 -1
- data/lib/ronin/web/user_agents/os/mac_os.rb +1 -1
- data/lib/ronin/web/user_agents/os/windows.rb +1 -1
- data/lib/ronin/web/user_agents/version.rb +2 -2
- data/lib/ronin/web/user_agents.rb +1 -1
- data/ronin-web-user_agents.gemspec +2 -1
- metadata +6 -23
- data/spec/chrome_spec.rb +0 -511
- data/spec/firefox_spec.rb +0 -414
- data/spec/google_bot_spec.rb +0 -231
- data/spec/os/android_spec.rb +0 -55
- data/spec/os/linux_spec.rb +0 -48
- data/spec/os/mac_os_spec.rb +0 -73
- data/spec/os/windows_spec.rb +0 -52
- data/spec/spec_helper.rb +0 -4
- data/spec/user_agents_spec.rb +0 -49
data/spec/firefox_spec.rb
DELETED
@@ -1,414 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/user_agents/firefox'
|
3
|
-
|
4
|
-
describe Ronin::Web::UserAgents::Firefox do
|
5
|
-
describe ".build" do
|
6
|
-
let(:firefox_version) { '91.3.0' }
|
7
|
-
let(:gecko_version) { described_class::DESKTOP_GECKO_VERSION }
|
8
|
-
|
9
|
-
context "when given `os: :windows`" do
|
10
|
-
let(:os) { :windows }
|
11
|
-
|
12
|
-
context "but os_version: is not given" do
|
13
|
-
it do
|
14
|
-
expect {
|
15
|
-
subject.build(firefox_version: firefox_version, os: os)
|
16
|
-
}.to raise_error(ArgumentError,"os: #{os.inspect} also requires an os_version: value")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Ronin::Web::UserAgents::OS::Windows::VERSIONS.each do |version_id,version_string|
|
21
|
-
context "when given `os_version: #{version_id.inspect}`" do
|
22
|
-
let(:os_version) { version_id }
|
23
|
-
let(:windows_version) { version_string }
|
24
|
-
|
25
|
-
it "must include 'Windows NT #{version_string}' in the extensions" do
|
26
|
-
expect(
|
27
|
-
subject.build(
|
28
|
-
firefox_version: firefox_version,
|
29
|
-
os: os,
|
30
|
-
os_version: os_version
|
31
|
-
)
|
32
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
33
|
-
end
|
34
|
-
|
35
|
-
Ronin::Web::UserAgents::OS::Windows::ARCHES.each do |arch_id,arch_string|
|
36
|
-
|
37
|
-
context "and when `arch: #{arch_id.inspect}` is given" do
|
38
|
-
let(:arch) { arch_id }
|
39
|
-
let(:windows_arch) { arch_string }
|
40
|
-
|
41
|
-
if arch_id
|
42
|
-
it "must appned '#{arch_string}' after the Windows version" do
|
43
|
-
expect(
|
44
|
-
subject.build(
|
45
|
-
firefox_version: firefox_version,
|
46
|
-
os: os,
|
47
|
-
os_version: os_version,
|
48
|
-
arch: arch
|
49
|
-
)
|
50
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; #{windows_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
51
|
-
end
|
52
|
-
|
53
|
-
context "and when given the `firefox_version:` keyword argument" do
|
54
|
-
let(:firefox_version) { '1.2.3' }
|
55
|
-
|
56
|
-
it "must use the specified `firefox_version:` value" do
|
57
|
-
expect(
|
58
|
-
subject.build(
|
59
|
-
firefox_version: firefox_version,
|
60
|
-
os: os,
|
61
|
-
os_version: os_version,
|
62
|
-
arch: arch
|
63
|
-
)
|
64
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; #{windows_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
65
|
-
end
|
66
|
-
end
|
67
|
-
else # `arch: nil` edge-case
|
68
|
-
it "must not appned any additional fields" do
|
69
|
-
expect(
|
70
|
-
subject.build(
|
71
|
-
firefox_version: firefox_version,
|
72
|
-
os: os,
|
73
|
-
os_version: os_version,
|
74
|
-
arch: arch
|
75
|
-
)
|
76
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
77
|
-
end
|
78
|
-
|
79
|
-
context "and when given the `firefox_version:` keyword argument" do
|
80
|
-
let(:firefox_version) { '1.2.3' }
|
81
|
-
|
82
|
-
it "must use the specified `firefox_version:` value" do
|
83
|
-
expect(
|
84
|
-
subject.build(
|
85
|
-
firefox_version: firefox_version,
|
86
|
-
os: os,
|
87
|
-
os_version: os_version,
|
88
|
-
arch: arch
|
89
|
-
)
|
90
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
context "and when given the `firefox_version:` keyword argument" do
|
98
|
-
let(:firefox_version) { '1.2.3' }
|
99
|
-
|
100
|
-
it "must use the specified `firefox_version:` value" do
|
101
|
-
expect(
|
102
|
-
subject.build(
|
103
|
-
firefox_version: firefox_version,
|
104
|
-
os: os,
|
105
|
-
os_version: os_version
|
106
|
-
)
|
107
|
-
).to eq("Mozilla/5.0 (Windows NT #{windows_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context "when given `os: :macos`" do
|
115
|
-
let(:os) { :macos }
|
116
|
-
|
117
|
-
context "and when given the `os_version:` keyword argument" do
|
118
|
-
let(:os_version) { '12.0.0' }
|
119
|
-
|
120
|
-
it "must include 'Macintosh; Intel Mac OS X.X.Y.Z' in the extensions" do
|
121
|
-
expect(
|
122
|
-
subject.build(
|
123
|
-
firefox_version: firefox_version,
|
124
|
-
os: os,
|
125
|
-
os_version: os_version
|
126
|
-
)
|
127
|
-
).to eq("Mozilla/5.0 (Macintosh; Intel Mac OS X #{os_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
128
|
-
end
|
129
|
-
|
130
|
-
context "and when given the `firefox_version:` keyword argument" do
|
131
|
-
let(:firefox_version) { '1.2.3' }
|
132
|
-
|
133
|
-
it "must use the specified `firefox_version:` value" do
|
134
|
-
expect(
|
135
|
-
subject.build(
|
136
|
-
firefox_version: firefox_version,
|
137
|
-
os: os,
|
138
|
-
os_version: os_version
|
139
|
-
)
|
140
|
-
).to eq("Mozilla/5.0 (Macintosh; Intel Mac OS X #{os_version}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
context "but `os_version:` is not given" do
|
146
|
-
it do
|
147
|
-
expect {
|
148
|
-
subject.build(firefox_version: firefox_version, os: os)
|
149
|
-
}.to raise_error(ArgumentError,"os: #{os.inspect} also requires an os_version: value")
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
context "when given `os: :linux`" do
|
155
|
-
let(:os) { :linux }
|
156
|
-
|
157
|
-
it "must add 'X11; Linux; rv:...' to the extensions" do
|
158
|
-
expect(
|
159
|
-
subject.build(
|
160
|
-
firefox_version: firefox_version,
|
161
|
-
os: os
|
162
|
-
)
|
163
|
-
).to eq("Mozilla/5.0 (X11; Linux; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
164
|
-
end
|
165
|
-
|
166
|
-
Ronin::Web::UserAgents::OS::Linux::ARCHES.each do |arch_id,arch_string|
|
167
|
-
context "when given `arch: #{arch_id.inspect}`" do
|
168
|
-
let(:arch) { arch_id }
|
169
|
-
let(:linux_arch) { arch_string }
|
170
|
-
|
171
|
-
it "must add 'Linux #{arch_string}' to the extensions" do
|
172
|
-
expect(
|
173
|
-
subject.build(
|
174
|
-
firefox_version: firefox_version,
|
175
|
-
os: os,
|
176
|
-
arch: arch
|
177
|
-
)
|
178
|
-
).to eq("Mozilla/5.0 (X11; Linux #{linux_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
179
|
-
end
|
180
|
-
|
181
|
-
Ronin::Web::UserAgents::OS::Linux::DISTROS.each do |distro_id,distro_string|
|
182
|
-
context "and when given `linux_distro: #{distro_id.inspect}" do
|
183
|
-
if distro_id
|
184
|
-
let(:linux_distro) { distro_string }
|
185
|
-
|
186
|
-
it "must add the '; #{distro_string}' to the extensions" do
|
187
|
-
expect(
|
188
|
-
subject.build(
|
189
|
-
firefox_version: firefox_version,
|
190
|
-
os: os,
|
191
|
-
linux_distro: linux_distro,
|
192
|
-
arch: arch
|
193
|
-
)
|
194
|
-
).to eq("Mozilla/5.0 (X11; #{linux_distro}; Linux #{linux_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
195
|
-
end
|
196
|
-
else # `linux_distro: nil` edge-case
|
197
|
-
it "must omit the Linux Distro from the extensions" do
|
198
|
-
expect(
|
199
|
-
subject.build(
|
200
|
-
firefox_version: firefox_version,
|
201
|
-
os: os,
|
202
|
-
arch: arch
|
203
|
-
)
|
204
|
-
).to eq("Mozilla/5.0 (X11; Linux #{linux_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
context "and when given the `firefox_version:` keyword argument" do
|
211
|
-
let(:firefox_version) { '1.2.3' }
|
212
|
-
|
213
|
-
it "must use the specified `firefox_version:` value" do
|
214
|
-
expect(
|
215
|
-
subject.build(
|
216
|
-
firefox_version: firefox_version,
|
217
|
-
os: os,
|
218
|
-
arch: arch
|
219
|
-
)
|
220
|
-
).to eq("Mozilla/5.0 (X11; Linux #{linux_arch}; rv:#{firefox_version}) Gecko/#{gecko_version} Firefox/#{firefox_version}")
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
context "when given `os: :android`" do
|
228
|
-
let(:os) { :android }
|
229
|
-
|
230
|
-
it "must add 'Android; Mobile; rv:...' to the extensions" do
|
231
|
-
expect(
|
232
|
-
subject.build(
|
233
|
-
firefox_version: firefox_version,
|
234
|
-
os: os
|
235
|
-
)
|
236
|
-
).to eq("Mozilla/5.0 (Android; Mobile; rv:#{firefox_version}) Gecko/#{firefox_version} Firefox/#{firefox_version}")
|
237
|
-
end
|
238
|
-
|
239
|
-
context "when `device_type: :mobile` is given" do
|
240
|
-
let(:device_type) { :mobile }
|
241
|
-
|
242
|
-
it "must add 'Android; Mobile; rv:...' to the extensions" do
|
243
|
-
expect(
|
244
|
-
subject.build(
|
245
|
-
firefox_version: firefox_version,
|
246
|
-
os: os,
|
247
|
-
device_type: device_type
|
248
|
-
)
|
249
|
-
).to eq("Mozilla/5.0 (Android; Mobile; rv:#{firefox_version}) Gecko/#{firefox_version} Firefox/#{firefox_version}")
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
context "when `device_type: :tablet` is given" do
|
254
|
-
let(:device_type) { :tablet }
|
255
|
-
|
256
|
-
it "must add 'Android; Tablet; rv:...' to the extensions" do
|
257
|
-
expect(
|
258
|
-
subject.build(
|
259
|
-
firefox_version: firefox_version,
|
260
|
-
os: os,
|
261
|
-
device_type: device_type
|
262
|
-
)
|
263
|
-
).to eq("Mozilla/5.0 (Android; Tablet; rv:#{firefox_version}) Gecko/#{firefox_version} Firefox/#{firefox_version}")
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
context "when `device_type: nil` is given" do
|
268
|
-
let(:device_type) { nil }
|
269
|
-
|
270
|
-
it "must add 'Android; Mobile; rv:...' to the extensions" do
|
271
|
-
expect(
|
272
|
-
subject.build(
|
273
|
-
firefox_version: firefox_version,
|
274
|
-
os: os,
|
275
|
-
device_type: device_type
|
276
|
-
)
|
277
|
-
).to eq("Mozilla/5.0 (Android; Mobile; rv:#{firefox_version}) Gecko/#{firefox_version} Firefox/#{firefox_version}")
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
context "when given `os: :other`" do
|
283
|
-
let(:os) { :other }
|
284
|
-
|
285
|
-
it do
|
286
|
-
expect {
|
287
|
-
subject.build(firefox_version: firefox_version, os: os)
|
288
|
-
}.to raise_error(ArgumentError,"unsupported os: value (#{os.inspect})")
|
289
|
-
end
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
describe ".random" do
|
294
|
-
it "must return a random Chrome User-Agent string" do
|
295
|
-
expect(subject.random).to match(
|
296
|
-
%r{^Mozilla/5\.0 \([^\)]+\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
297
|
-
)
|
298
|
-
end
|
299
|
-
|
300
|
-
it "must generate a new random Chrome User-Agent string each time" do
|
301
|
-
expect(subject.random).to_not eq(subject.random)
|
302
|
-
end
|
303
|
-
|
304
|
-
context "when `os: :windows`" do
|
305
|
-
let(:os) { :windows }
|
306
|
-
|
307
|
-
it "must return a random Windows Chrome User-Agent string" do
|
308
|
-
expect(subject.random(os: os)).to match(
|
309
|
-
%r{^Mozilla/5\.0 \(Windows NT \d+(?:\.\d+)*(?:; (?:WOW64|Win64; x64))?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
310
|
-
)
|
311
|
-
end
|
312
|
-
|
313
|
-
context "and when given `os_version:`" do
|
314
|
-
let(:os_version) { 10 }
|
315
|
-
|
316
|
-
it "must return a random Windows Chrome User-Agent string for that version of Windows" do
|
317
|
-
expect(subject.random(os: os, os_version: os_version)).to match(
|
318
|
-
%r{^Mozilla/5\.0 \(Windows NT 10\.0(?:; (?:WOW64|Win64; x64))?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
319
|
-
)
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
|
-
context "and when given `arch: :wow64`" do
|
324
|
-
let(:arch) { :wow64 }
|
325
|
-
|
326
|
-
it "must return a random Windows Chrome User-Agent string for the WOW64 architecture" do
|
327
|
-
expect(subject.random(os: os, arch: arch)).to match(
|
328
|
-
%r{^Mozilla/5\.0 \(Windows NT \d+(?:\.\d+)*; WOW64; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
329
|
-
)
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
context "and when given `arch: :win64`" do
|
334
|
-
let(:arch) { :win64 }
|
335
|
-
|
336
|
-
it "must return a random Windows Chrome User-Agent string for the WOW64 architecture" do
|
337
|
-
expect(subject.random(os: os, arch: arch)).to match(
|
338
|
-
%r{^Mozilla/5\.0 \(Windows NT \d+(?:\.\d+)*; Win64; x64; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
339
|
-
)
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
context "when `os: :macos` is given" do
|
345
|
-
let(:os) { :macos }
|
346
|
-
|
347
|
-
it "must return a macOS Chrome User-Agent string" do
|
348
|
-
expect(subject.random(os: os)).to match(
|
349
|
-
%r{^Mozilla/5\.0 \(Macintosh; Intel Mac OS X \d+(\.\d+){1,2}; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
350
|
-
)
|
351
|
-
end
|
352
|
-
|
353
|
-
context "and when `os_version:` is given" do
|
354
|
-
let(:os_version) { '10.11.12' }
|
355
|
-
|
356
|
-
it "must return a macOS Chrome User-Agent string for that macOS version" do
|
357
|
-
expect(subject.random(os: os, os_version: os_version)).to match(
|
358
|
-
%r{^Mozilla/5\.0 \(Macintosh; Intel Mac OS X 10\.11\.12; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
359
|
-
)
|
360
|
-
end
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
|
-
context "when `os: :linux` is given" do
|
365
|
-
let(:os) { :linux }
|
366
|
-
|
367
|
-
it "must return a Linux Chrome User-Agent string" do
|
368
|
-
expect(subject.random(os: os)).to match(
|
369
|
-
%r{^Mozilla/5\.0 \(X11(?:; (?:Ubuntu|Fedora|Arch))?; Linux (?:x86_64|aarch64|i686)(?:; [a-z]+(?:-[A-Z]+)?)?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
370
|
-
)
|
371
|
-
end
|
372
|
-
|
373
|
-
context "and when `linux_distro:` is given" do
|
374
|
-
let(:linux_distro) { :ubuntu }
|
375
|
-
|
376
|
-
it "must return a Linux Chrome User-Agent string for that Linux Distro" do
|
377
|
-
expect(subject.random(os: os, linux_distro: linux_distro)).to match(
|
378
|
-
%r{^Mozilla/5\.0 \(X11; Ubuntu; Linux (?:x86_64|aarch64|i686)(?:; [a-z]+(?:-[A-Z]+)?)?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
379
|
-
)
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
context "and when `arch:` is given" do
|
384
|
-
let(:arch) { :arm64 }
|
385
|
-
|
386
|
-
it "must return a Linux Chrome User-Agent string for that architecture" do
|
387
|
-
expect(subject.random(os: os, arch: arch)).to match(
|
388
|
-
%r{^Mozilla/5\.0 \(X11(?:; (?:Ubuntu|Fedora|Arch))?; Linux aarch64(?:; [a-zA-Z-]+)?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
389
|
-
)
|
390
|
-
end
|
391
|
-
end
|
392
|
-
end
|
393
|
-
|
394
|
-
context "when `os: :android` is given" do
|
395
|
-
let(:os) { :android }
|
396
|
-
|
397
|
-
it "must return a Android Chrome User-Agent string" do
|
398
|
-
expect(subject.random(os: os)).to match(
|
399
|
-
%r{^Mozilla/5\.0 \(Android(?:; (?:Mobile|Tablet))?; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
400
|
-
)
|
401
|
-
end
|
402
|
-
|
403
|
-
context "and when `device_type:` is given" do
|
404
|
-
let(:device_type) { :tablet }
|
405
|
-
|
406
|
-
it "must return a Linux Firefox User-Agent string with that device type" do
|
407
|
-
expect(subject.random(os: os, device_type: device_type)).to match(
|
408
|
-
%r{^Mozilla/5\.0 \(Android; Tablet; rv:\d+(?:\.\d+)*\) Gecko/(?:20100101|\d+(?:\.\d+)*) Firefox/\d+(\.\d+)*$}
|
409
|
-
)
|
410
|
-
end
|
411
|
-
end
|
412
|
-
end
|
413
|
-
end
|
414
|
-
end
|
data/spec/google_bot_spec.rb
DELETED
@@ -1,231 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/web/user_agents/google_bot'
|
3
|
-
|
4
|
-
describe Ronin::Web::UserAgents::GoogleBot do
|
5
|
-
describe ".build" do
|
6
|
-
context "whne given no keyword arguments" do
|
7
|
-
it "must return 'GoogleBot/#{described_class::VERSION} (+#{described_class::URL})'" do
|
8
|
-
expect(subject.build).to eq(
|
9
|
-
"GoogleBot/#{described_class::VERSION} (+#{described_class::URL})"
|
10
|
-
)
|
11
|
-
end
|
12
|
-
|
13
|
-
context "when given `crawler: :image`" do
|
14
|
-
it "must return 'Googlebot-Image/1.0'" do
|
15
|
-
expect(subject.build(crawler: :image)).to eq(
|
16
|
-
"Googlebot-Image/1.0"
|
17
|
-
)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when given `crawler: :video`" do
|
22
|
-
it "must return 'Googlebot-Video/1.0'" do
|
23
|
-
expect(subject.build(crawler: :video)).to eq(
|
24
|
-
"Googlebot-Video/1.0"
|
25
|
-
)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when given `crawler: :search`" do
|
30
|
-
it "must return 'GoogleBot/#{described_class::VERSION} (+http://www.google.com/bot.html)'" do
|
31
|
-
expect(subject.build(crawler: :search)).to eq(
|
32
|
-
"GoogleBot/#{described_class::VERSION} (+#{described_class::URL})"
|
33
|
-
)
|
34
|
-
end
|
35
|
-
|
36
|
-
context "and when also given `compatible: :desktop`" do
|
37
|
-
it "must return 'Mozilla/5.0 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})'" do
|
38
|
-
expect(
|
39
|
-
subject.build(
|
40
|
-
crawler: :search,
|
41
|
-
compatible: :desktop
|
42
|
-
)
|
43
|
-
).to eq(
|
44
|
-
"Mozilla/5.0 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})"
|
45
|
-
)
|
46
|
-
end
|
47
|
-
|
48
|
-
context "and when also given the `chrome_version:` keyword argument" do
|
49
|
-
let(:chrome_version) { '1.2.3' }
|
50
|
-
|
51
|
-
it "must return 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL}) Chrome/... Safari/537.36'" do
|
52
|
-
expect(
|
53
|
-
subject.build(
|
54
|
-
crawler: :search,
|
55
|
-
compatible: :desktop,
|
56
|
-
chrome_version: chrome_version
|
57
|
-
)
|
58
|
-
).to eq(
|
59
|
-
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL}) Chrome/#{chrome_version} Safari/537.36"
|
60
|
-
)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "and when also given `compatible: :mobile`" do
|
66
|
-
context "and the `chrome_version:` keyword argument is also given" do
|
67
|
-
let(:chrome_version) { '1.2.3' }
|
68
|
-
|
69
|
-
it "must return 'Mozilla/5.0 (Linux; Android #{described_class::ANDROID_VERSION}; #{described_class::ANDROID_DEVICE}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/... Mobile Safari/537.36 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})'" do
|
70
|
-
expect(
|
71
|
-
subject.build(
|
72
|
-
crawler: :search,
|
73
|
-
compatible: :mobile,
|
74
|
-
chrome_version: chrome_version
|
75
|
-
)
|
76
|
-
).to eq(
|
77
|
-
"Mozilla/5.0 (Linux; Android #{described_class::ANDROID_VERSION}; #{described_class::ANDROID_DEVICE}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Mobile Safari/537.36 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})"
|
78
|
-
)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context "but the `chrome_version:` keyword argument is not given" do
|
83
|
-
it do
|
84
|
-
expect {
|
85
|
-
subject.build(crawler: :search, compatible: :mobile)
|
86
|
-
}.to raise_error(ArgumentError,"compatible: :mobile also requires the chrome_version: keyword argument")
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context "and when also given `compatible: :desktop`" do
|
94
|
-
it "must return 'Mozilla/5.0 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})'" do
|
95
|
-
expect(subject.build(compatible: :desktop)).to eq(
|
96
|
-
"Mozilla/5.0 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})"
|
97
|
-
)
|
98
|
-
end
|
99
|
-
|
100
|
-
context "and when also given the `chrome_version:` keyword argument" do
|
101
|
-
let(:chrome_version) { '1.2.3' }
|
102
|
-
|
103
|
-
it "must return 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL}) Chrome/... Safari/537.36'" do
|
104
|
-
expect(
|
105
|
-
subject.build(
|
106
|
-
compatible: :desktop,
|
107
|
-
chrome_version: chrome_version
|
108
|
-
)
|
109
|
-
).to eq(
|
110
|
-
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL}) Chrome/#{chrome_version} Safari/537.36"
|
111
|
-
)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "and when also given `compatible: :mobile`" do
|
117
|
-
context "and the `chrome_version:` keyword argument is also given" do
|
118
|
-
let(:chrome_version) { '1.2.3' }
|
119
|
-
|
120
|
-
it "must return 'Mozilla/5.0 (Linux; Android #{described_class::ANDROID_VERSION}; #{described_class::ANDROID_DEVICE}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/... Mobile Safari/537.36 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})'" do
|
121
|
-
expect(
|
122
|
-
subject.build(
|
123
|
-
compatible: :mobile,
|
124
|
-
chrome_version: chrome_version
|
125
|
-
)
|
126
|
-
).to eq(
|
127
|
-
"Mozilla/5.0 (Linux; Android #{described_class::ANDROID_VERSION}; #{described_class::ANDROID_DEVICE}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Mobile Safari/537.36 (compatible; GoogleBot/#{described_class::VERSION}; +#{described_class::URL})"
|
128
|
-
)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
context "but the `chrome_version:` keyword argument is not given" do
|
133
|
-
it do
|
134
|
-
expect {
|
135
|
-
subject.build(compatible: :mobile)
|
136
|
-
}.to raise_error(ArgumentError,"compatible: :mobile also requires the chrome_version: keyword argument")
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe ".random" do
|
143
|
-
let(:version_pattern) { Regexp.escape(described_class::VERSION) }
|
144
|
-
let(:url_pattern) { Regexp.escape(described_class::URL) }
|
145
|
-
|
146
|
-
let(:android_version_pattern) do
|
147
|
-
Regexp.escape(described_class::ANDROID_VERSION)
|
148
|
-
end
|
149
|
-
|
150
|
-
let(:android_device_pattern) do
|
151
|
-
Regexp.escape(described_class::ANDROID_DEVICE)
|
152
|
-
end
|
153
|
-
|
154
|
-
it "must return a random GoogleBot User-Agent string" do
|
155
|
-
expect(subject.random).to match(
|
156
|
-
%r{
|
157
|
-
^(?:
|
158
|
-
Googlebot-Image/1\.0|
|
159
|
-
Googlebot-Video/1\.0|
|
160
|
-
Mozilla/5\.0\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko;\ compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)\ Chrome/\d+(?:\.\d+)*\ Safari/537\.36|
|
161
|
-
Mozilla/5\.0\ \(compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)|
|
162
|
-
Mozilla/5\.0\ \(Linux;\ Android\ #{android_version_pattern};\ #{android_device_pattern}\)\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko\)\ Chrome/\d+(?:\.\d+)*\ Mobile\ Safari/537\.36\ \(compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)|
|
163
|
-
GoogleBot/#{version_pattern}\ \(\+#{url_pattern}\)
|
164
|
-
)$
|
165
|
-
}x
|
166
|
-
)
|
167
|
-
end
|
168
|
-
|
169
|
-
context "when `crawler: :image` is given" do
|
170
|
-
it "must return 'Googlebot-Image/1.0'" do
|
171
|
-
expect(subject.build(crawler: :image)).to eq(
|
172
|
-
"Googlebot-Image/1.0"
|
173
|
-
)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
context "when `crawler: :video` is given" do
|
178
|
-
it "must return 'Googlebot-Video/1.0'" do
|
179
|
-
expect(subject.build(crawler: :video)).to eq(
|
180
|
-
"Googlebot-Video/1.0"
|
181
|
-
)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context "when `crawler: :search ` is given" do
|
186
|
-
it "must return a random GoogleBot User-Agent string" do
|
187
|
-
expect(subject.random(crawler: :search)).to match(
|
188
|
-
%r{
|
189
|
-
^(?:
|
190
|
-
Mozilla/5\.0\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko;\ compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)\ Chrome/\d+(?:\.\d+)*\ Safari/537\.36|
|
191
|
-
Mozilla/5\.0\ \(compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)|
|
192
|
-
Mozilla/5\.0\ \(Linux;\ Android\ #{android_version_pattern};\ #{android_device_pattern}\)\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko\)\ Chrome/\d+(?:\.\d+)*\ Mobile\ Safari/537\.36\ \(compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)|
|
193
|
-
GoogleBot/#{version_pattern}\ \(\+#{url_pattern}\)
|
194
|
-
)$
|
195
|
-
}x
|
196
|
-
)
|
197
|
-
end
|
198
|
-
|
199
|
-
context "and when `compatible: :desktop` is given" do
|
200
|
-
it "must return a random GoogleBot desktop compatible User-Agent string" do
|
201
|
-
expect(
|
202
|
-
subject.random(
|
203
|
-
crawler: :search,
|
204
|
-
compatible: :desktop
|
205
|
-
)
|
206
|
-
).to match(
|
207
|
-
%r{
|
208
|
-
^(?:
|
209
|
-
Mozilla/5\.0\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko;\ compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)\ Chrome/\d+(?:\.\d+)*\ Safari/537\.36|
|
210
|
-
Mozilla/5\.0\ \(compatible;\ GoogleBot/#{version_pattern};\ \+#{url_pattern}\)
|
211
|
-
)$
|
212
|
-
}x
|
213
|
-
)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
context "and when `compatible: :mobile` is given" do
|
218
|
-
it "must return a random GoogleBot mobile compatible User-Agent string" do
|
219
|
-
expect(
|
220
|
-
subject.random(
|
221
|
-
crawler: :search,
|
222
|
-
compatible: :mobile
|
223
|
-
)
|
224
|
-
).to match(
|
225
|
-
%r{^Mozilla/5\.0 \(Linux;\ Android #{android_version_pattern}; #{android_device_pattern}\) AppleWebKit/537\.36 \(KHTML, like\ Gecko\) Chrome/\d+(?:\.\d+)*\ Mobile\ Safari/537\.36 \(compatible; GoogleBot/#{version_pattern}; \+#{url_pattern}\)$}
|
226
|
-
)
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|