device_detector 1.0.4 → 1.0.7

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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +8 -7
  4. data/lib/device_detector/browser.rb +364 -0
  5. data/lib/device_detector/client.rb +8 -0
  6. data/lib/device_detector/device.rb +1204 -2
  7. data/lib/device_detector/os.rb +39 -12
  8. data/lib/device_detector/parser.rb +1 -1
  9. data/lib/device_detector/version.rb +1 -1
  10. data/lib/device_detector/version_extractor.rb +28 -0
  11. data/lib/device_detector.rb +57 -13
  12. data/regexes/bots.yml +651 -61
  13. data/regexes/client/browser_engine.yml +7 -1
  14. data/regexes/client/browsers.yml +774 -78
  15. data/regexes/client/feed_readers.yml +4 -10
  16. data/regexes/client/libraries.yml +71 -2
  17. data/regexes/client/mediaplayers.yml +25 -1
  18. data/regexes/client/mobile_apps.yml +923 -73
  19. data/regexes/client/pim.yml +65 -2
  20. data/regexes/device/cameras.yml +5 -5
  21. data/regexes/device/car_browsers.yml +16 -0
  22. data/regexes/device/consoles.yml +13 -1
  23. data/regexes/device/mobiles.yml +17029 -3889
  24. data/regexes/device/notebooks.yml +114 -0
  25. data/regexes/device/portable_media_player.yml +36 -9
  26. data/regexes/device/shell_tv.yml +117 -0
  27. data/regexes/device/televisions.yml +439 -34
  28. data/regexes/oss.yml +620 -284
  29. metadata +9 -131
  30. data/.gitignore +0 -14
  31. data/.rubocop.yml +0 -49
  32. data/.ruby-version +0 -1
  33. data/.travis.yml +0 -14
  34. data/Gemfile +0 -8
  35. data/Rakefile +0 -85
  36. data/device_detector.gemspec +0 -27
  37. data/spec/device_detector/bot_fixtures_spec.rb +0 -30
  38. data/spec/device_detector/client_fixtures_spec.rb +0 -31
  39. data/spec/device_detector/concrete_user_agent_spec.rb +0 -135
  40. data/spec/device_detector/detector_fixtures_spec.rb +0 -100
  41. data/spec/device_detector/device_fixtures_spec.rb +0 -36
  42. data/spec/device_detector/device_spec.rb +0 -131
  43. data/spec/device_detector/memory_cache_spec.rb +0 -148
  44. data/spec/device_detector/model_extractor_spec.rb +0 -63
  45. data/spec/device_detector/os_fixtures_spec.rb +0 -26
  46. data/spec/device_detector/version_extractor_spec.rb +0 -79
  47. data/spec/device_detector_spec.rb +0 -189
  48. data/spec/fixtures/client/browser.yml +0 -2836
  49. data/spec/fixtures/client/feed_reader.yml +0 -199
  50. data/spec/fixtures/client/library.yml +0 -193
  51. data/spec/fixtures/client/mediaplayer.yml +0 -163
  52. data/spec/fixtures/client/mobile_app.yml +0 -217
  53. data/spec/fixtures/client/pim.yml +0 -115
  54. data/spec/fixtures/detector/bots.yml +0 -3726
  55. data/spec/fixtures/detector/camera.yml +0 -141
  56. data/spec/fixtures/detector/car_browser.yml +0 -81
  57. data/spec/fixtures/detector/console.yml +0 -321
  58. data/spec/fixtures/detector/desktop.yml +0 -5461
  59. data/spec/fixtures/detector/feature_phone.yml +0 -891
  60. data/spec/fixtures/detector/feed_reader.yml +0 -551
  61. data/spec/fixtures/detector/mediaplayer.yml +0 -253
  62. data/spec/fixtures/detector/mobile_apps.yml +0 -494
  63. data/spec/fixtures/detector/phablet.yml +0 -4167
  64. data/spec/fixtures/detector/portable_media_player.yml +0 -178
  65. data/spec/fixtures/detector/smart_display.yml +0 -61
  66. data/spec/fixtures/detector/smart_speaker.yml +0 -55
  67. data/spec/fixtures/detector/smartphone-1.yml +0 -9927
  68. data/spec/fixtures/detector/smartphone-10.yml +0 -9977
  69. data/spec/fixtures/detector/smartphone-11.yml +0 -9891
  70. data/spec/fixtures/detector/smartphone-12.yml +0 -9906
  71. data/spec/fixtures/detector/smartphone-13.yml +0 -9920
  72. data/spec/fixtures/detector/smartphone-14.yml +0 -2662
  73. data/spec/fixtures/detector/smartphone-2.yml +0 -9992
  74. data/spec/fixtures/detector/smartphone-3.yml +0 -9945
  75. data/spec/fixtures/detector/smartphone-4.yml +0 -9923
  76. data/spec/fixtures/detector/smartphone-5.yml +0 -9914
  77. data/spec/fixtures/detector/smartphone-6.yml +0 -9962
  78. data/spec/fixtures/detector/smartphone-7.yml +0 -9899
  79. data/spec/fixtures/detector/smartphone-8.yml +0 -9931
  80. data/spec/fixtures/detector/smartphone-9.yml +0 -9899
  81. data/spec/fixtures/detector/smartphone.yml +0 -9984
  82. data/spec/fixtures/detector/tablet-1.yml +0 -9995
  83. data/spec/fixtures/detector/tablet-2.yml +0 -9977
  84. data/spec/fixtures/detector/tablet-3.yml +0 -9959
  85. data/spec/fixtures/detector/tablet-4.yml +0 -4528
  86. data/spec/fixtures/detector/tablet.yml +0 -9971
  87. data/spec/fixtures/detector/tv.yml +0 -4933
  88. data/spec/fixtures/detector/unknown.yml +0 -3236
  89. data/spec/fixtures/detector/wearable.yml +0 -61
  90. data/spec/fixtures/device/camera.yml +0 -19
  91. data/spec/fixtures/device/car_browser.yml +0 -13
  92. data/spec/fixtures/device/console.yml +0 -79
  93. data/spec/fixtures/parser/oss.yml +0 -1082
  94. data/spec/fixtures/parser/vendorfragments.yml +0 -168
  95. data/spec/spec_helper.rb +0 -9
@@ -1,36 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe DeviceDetector::Device do
4
-
5
- fixture_dir = File.expand_path('../../fixtures/devices', __FILE__)
6
- fixture_files = Dir["#{fixture_dir}/*.yml"]
7
- fixture_files.each do |fixture_file|
8
-
9
- describe File.basename(fixture_file) do
10
-
11
- fixtures = YAML.load_file(fixture_file)
12
- fixtures.each do |f|
13
-
14
- user_agent = f["user_agent"]
15
- device = DeviceDetector::Device.new(user_agent)
16
-
17
- describe user_agent do
18
-
19
- it "should be known" do
20
- assert device.known?, "isn't known as a device"
21
- end
22
-
23
- it "should have the expected model" do
24
- assert_equal f["device"]["model"], device.name, "failed model detection"
25
- end
26
-
27
- it "should have the expected type" do
28
- expected_device_type = DeviceDetector::Device::DEVICE_NAMES[f["device"]["type"]]
29
- assert_equal expected_device_type, device.type, "failed device name detection"
30
- end
31
-
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,131 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../spec_helper'
4
-
5
- describe DeviceDetector::Device do
6
- subject { DeviceDetector::Device.new(user_agent) }
7
-
8
- alias_method :device, :subject
9
-
10
- describe '#name' do
11
- describe 'when models are nested' do
12
- let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 [FBDV/iPhone7,2]' }
13
-
14
- it 'finds an Apple iPhone 6' do
15
- value(device.name).must_equal 'iPhone 6'
16
- end
17
- end
18
-
19
- describe 'when models are NOT nested' do
20
- let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
21
-
22
- it 'finds an Airness AIR99' do
23
- value(device.name).must_equal 'AIR99'
24
- end
25
- end
26
-
27
- describe 'when it cannot find a device name' do
28
- let(:user_agent) { 'UNKNOWN MODEL NAME' }
29
-
30
- it 'returns nil' do
31
- value(device.name).must_be_nil
32
- end
33
- end
34
- end
35
-
36
- describe '#type' do
37
- describe 'when models are nested' do
38
- let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 [FBDV/iPhone7,2]' }
39
-
40
- it 'finds device of Apple iPhone 6' do
41
- value(device.type).must_equal 'smartphone'
42
- end
43
- end
44
-
45
- describe 'when models are NOT nested' do
46
- let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
47
-
48
- it 'finds the device of Airness AIR99' do
49
- value(device.type).must_equal 'feature phone'
50
- end
51
- end
52
-
53
- describe 'when it cannot find a device type' do
54
- let(:user_agent) { 'UNKNOWN MODEL TYPE' }
55
-
56
- it 'returns nil' do
57
- value(device.type).must_be_nil
58
- end
59
- end
60
-
61
- describe 'device not specified in nested block' do
62
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
63
-
64
- it 'falls back to top-level device' do
65
- value(device.type).must_equal 'smartphone'
66
- end
67
- end
68
- end
69
-
70
- describe 'concrete device types' do
71
- describe 'mobiles' do
72
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
73
-
74
- it 'identifies the device' do
75
- value(device.name).must_equal 'GALAXY S5'
76
- value(device.type).must_equal 'smartphone'
77
- value(device.brand).must_equal 'Samsung'
78
- end
79
- end
80
-
81
- describe 'cameras' do
82
- let(:user_agent) { 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; EK-GC100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' }
83
-
84
- it 'identifies the device' do
85
- value(device.name).must_equal 'GALAXY Camera'
86
- value(device.type).must_equal 'camera'
87
- value(device.brand).must_equal 'Samsung'
88
- end
89
- end
90
-
91
- describe 'car browsers' do
92
- let(:user_agent) { 'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34' }
93
-
94
- it 'identifies the device' do
95
- value(device.name).must_equal 'Model S'
96
- value(device.type).must_equal 'car browser'
97
- value(device.brand).must_equal 'Tesla'
98
- end
99
- end
100
-
101
- describe '(gaming) consoles' do
102
- let(:user_agent) { 'Opera/9.30 (Nintendo Wii; U; ; 2047-7;en)' }
103
-
104
- it 'identifies the device' do
105
- value(device.name).must_equal 'Wii'
106
- value(device.type).must_equal 'console'
107
- value(device.brand).must_be_nil
108
- end
109
- end
110
-
111
- describe 'portable media players' do
112
- let(:user_agent) { 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B651 Safari/9537.53' }
113
-
114
- it 'identifies the device' do
115
- value(device.name).must_equal 'iPod Touch'
116
- value(device.type).must_equal 'portable media player'
117
- value(device.brand).must_equal 'Apple'
118
- end
119
- end
120
-
121
- describe 'televisions' do
122
- let(:user_agent) { 'Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.10.81 ;1.0M ;)' }
123
-
124
- it 'identifies the device' do
125
- value(device.name).must_equal 'NetCast 4.0'
126
- value(device.type).must_equal 'tv'
127
- value(device.brand).must_equal 'LG'
128
- end
129
- end
130
- end
131
- end
@@ -1,148 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../spec_helper'
4
-
5
- describe DeviceDetector::MemoryCache do
6
- let(:subject) { DeviceDetector::MemoryCache.new(config) }
7
-
8
- let(:config) { {} }
9
-
10
- describe '#set' do
11
- describe 'string key' do
12
- let(:key) { 'string' }
13
-
14
- it 'sets the value under the key' do
15
- subject.set(key, 'value')
16
-
17
- value(subject.data[key]).must_equal 'value'
18
- end
19
-
20
- it 'returns the value' do
21
- value(subject.set(key, 'value')).must_equal 'value'
22
- value(subject.set(key, false)).must_equal false
23
- assert_nil subject.set(key, nil)
24
- end
25
- end
26
-
27
- describe 'array key' do
28
- let(:key) { %w[string1 string2] }
29
-
30
- it 'sets the value under the key' do
31
- subject.set(key, 'value')
32
-
33
- value(subject.data[String(key)]).must_equal 'value'
34
- end
35
- end
36
-
37
- describe 'nil value' do
38
- let(:key) { 'string' }
39
- let(:internal_value) { DeviceDetector::MemoryCache::STORES_NIL_VALUE }
40
-
41
- it 'sets the value under the key' do
42
- subject.set(key, nil)
43
-
44
- value(subject.data[String(key)]).must_equal internal_value
45
- assert_nil subject.get(key)
46
- end
47
-
48
- it 'sets the value under the key' do
49
- subject.get_or_set(key, nil)
50
-
51
- value(subject.data[String(key)]).must_equal internal_value
52
- assert_nil subject.get(key)
53
- end
54
- end
55
-
56
- describe 'false value' do
57
- let(:key) { 'string' }
58
-
59
- it 'sets the value under the key' do
60
- subject.set(key, false)
61
-
62
- value(subject.data[String(key)]).must_equal false
63
- value(subject.get(key)).must_equal false
64
- end
65
-
66
- it 'sets the value under the key' do
67
- subject.get_or_set(key, false)
68
-
69
- value(subject.data[String(key)]).must_equal false
70
- value(subject.get(key)).must_equal false
71
- end
72
- end
73
- end
74
-
75
- describe '#get' do
76
- describe 'string key' do
77
- let(:key) { 'string' }
78
-
79
- it 'gets the value for the key' do
80
- subject.data[key] = 'value'
81
-
82
- value(subject.get(key)).must_equal 'value'
83
- end
84
- end
85
-
86
- describe 'array key' do
87
- let(:key) { %w[string1 string2] }
88
-
89
- it 'gets the value for the key' do
90
- subject.data[String(key)] = 'value'
91
-
92
- value(subject.get(key)).must_equal 'value'
93
- end
94
- end
95
- end
96
-
97
- describe '#get_or_set' do
98
- let(:key) { 'string' }
99
-
100
- describe 'value already present' do
101
- it 'gets the value for the key from cache' do
102
- subject.data[key] = 'value'
103
-
104
- block_called = false
105
- value = subject.get_or_set(key) do
106
- block_called = true
107
- end
108
-
109
- value(value).must_equal 'value'
110
- value(block_called).must_equal false
111
- end
112
-
113
- it 'returns the value' do
114
- subject.data[key] = 'value2'
115
- value(subject.get_or_set(key, 'value')).must_equal 'value2'
116
- end
117
- end
118
-
119
- describe 'value not yet present' do
120
- it 'evaluates the block and sets the result' do
121
- block_called = false
122
- subject.get_or_set(key) do
123
- block_called = true
124
- end
125
-
126
- value(block_called).must_equal true
127
- value(subject.data[key]).must_equal true
128
- end
129
-
130
- it 'returns the value' do
131
- value(subject.get_or_set(key, 'value')).must_equal 'value'
132
- end
133
- end
134
- end
135
-
136
- describe 'cache purging' do
137
- let(:config) { { max_cache_keys: 3 } }
138
-
139
- it 'purges the cache when key size arrives at max' do
140
- subject.set('1', 'foo')
141
- subject.set('2', 'bar')
142
- subject.set('3', 'baz')
143
- subject.set('4', 'boz')
144
-
145
- value(subject.data.keys.size).must_equal 3
146
- end
147
- end
148
- end
@@ -1,63 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe DeviceDetector::ModelExtractor do
4
-
5
- subject { DeviceDetector::ModelExtractor.new(user_agent, regex_meta) }
6
-
7
- alias :extractor :subject
8
-
9
- describe '#call' do
10
-
11
- describe 'when matching against dynamic model' do
12
-
13
- let(:regex_meta) do
14
- {
15
- :regex => '(?:Apple-)?iPhone ?(3GS?|4S?|5[CS]?|6(:? Plus)?)?',
16
- :model => 'iPhone $1',
17
- :device => 'smartphone'
18
- }
19
- end
20
-
21
- describe 'when no dynamic match is found' do
22
- let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4' }
23
- let(:device_name) { 'iPhone' }
24
-
25
- it 'returns the textual portion without trailing whitespace' do
26
- value(extractor.call).must_equal device_name
27
- end
28
-
29
- end
30
-
31
- describe 'when a dynamic match is found' do
32
- let(:user_agent) { 'Mozilla/5.0 (iPhone 5S; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4' }
33
- let(:device_name) { 'iPhone 5S' }
34
-
35
- it 'returns the full device name' do
36
- value(extractor.call).must_equal device_name
37
- end
38
-
39
- end
40
-
41
- end
42
-
43
- describe 'when matching against static model' do
44
-
45
- let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 Weibo (iPhone7,2)' }
46
- let(:device_name) { 'iPhone 6' }
47
- let(:regex_meta) do
48
- {
49
- :regex => '(?:Apple-)?iPhone7[C,]2',
50
- :model => 'iPhone 6',
51
- :device => 'smartphone'
52
- }
53
- end
54
-
55
- it 'returns the model name' do
56
- value(extractor.call).must_equal device_name
57
- end
58
-
59
- end
60
-
61
- end
62
-
63
- end
@@ -1,26 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe DeviceDetector::OS do
4
-
5
- fixture_dir = File.expand_path('../../fixtures/parser', __FILE__)
6
- fixture_files = Dir["#{fixture_dir}/oss.yml"]
7
- fixture_files.each do |fixture_file|
8
-
9
- describe File.basename(fixture_file) do
10
-
11
- fixtures = YAML.load(File.read(fixture_file))
12
- fixtures.each do |f|
13
- user_agent = f["user_agent"]
14
-
15
- describe user_agent do
16
-
17
- it "should have the expected name" do
18
- os = DeviceDetector::OS.new(user_agent)
19
- assert_equal f["os"]["name"], os.name, "failed OS name detection"
20
- end
21
-
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,79 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe DeviceDetector::VersionExtractor do
4
-
5
- subject { DeviceDetector::VersionExtractor.new(user_agent, regex_meta) }
6
-
7
- alias :extractor :subject
8
-
9
- describe '#call' do
10
-
11
- describe 'extractor without version' do
12
-
13
- let(:user_agent) { 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; Avant Browser; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)' }
14
-
15
- let(:regex_meta) do
16
- {
17
- :regex => 'Avant Browser',
18
- :name => 'Avant Browser',
19
- :version => ''
20
- }
21
- end
22
-
23
- it 'returns nil' do
24
- value(extractor.call).must_equal ''
25
- end
26
-
27
- end
28
-
29
- describe 'regex with dynamic matching' do
30
-
31
- let(:user_agent) { 'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1b2) Gecko/20060821 BonEcho/2.0b2 (Debian-1.99+2.0b2+dfsg-1)' }
32
- let(:version) { 'BonEcho (2.0)' }
33
- let(:regex_meta) do
34
- {
35
- :regex => '(BonEcho|GranParadiso|Lorentz|Minefield|Namoroka|Shiretoko)/(\d+[\.\d]+)',
36
- :name => 'Firefox',
37
- :version => '$1 ($2)'
38
- }
39
- end
40
-
41
- it 'returns the correct version' do
42
- value(extractor.call).must_equal version
43
- end
44
-
45
- it 'removes trailing white spaces' do
46
- regex_meta[:version] = regex_meta[:version] + ' '
47
- value(extractor.call).must_equal version
48
- end
49
-
50
- end
51
-
52
- describe 'extractor with fixed version' do
53
-
54
- let(:user_agent) { 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)' }
55
- let(:regex_meta) do
56
- {
57
- :regex => 'MSIE.*Trident/4.0',
58
- :version => '8.0'
59
- }
60
- end
61
-
62
- it 'returns the correct version' do
63
- value(extractor.call).must_equal '8.0'
64
- end
65
-
66
- end
67
-
68
- describe 'unknown user agent' do
69
-
70
- let(:user_agent) { 'garbage' }
71
- let(:regex_meta) { {} }
72
-
73
- it 'returns nil' do
74
- value(extractor.call).must_be_nil
75
- end
76
-
77
- end
78
- end
79
- end
@@ -1,189 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'spec_helper'
4
-
5
- describe DeviceDetector do
6
- subject { DeviceDetector.new(user_agent) }
7
-
8
- alias_method :client, :subject
9
-
10
- describe 'known user agent' do
11
- describe 'desktop chrome browser' do
12
- let(:user_agent) { 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69' }
13
-
14
- describe '#name' do
15
- it 'returns the name' do
16
- value(client.name).must_equal 'Chrome'
17
- end
18
- end
19
-
20
- describe '#full_version' do
21
- it 'returns the full version' do
22
- value(client.full_version).must_equal '30.0.1599.69'
23
- end
24
- end
25
-
26
- describe '#os_family' do
27
- it 'returns the operating system name' do
28
- value(client.os_family).must_equal 'Mac'
29
- end
30
- end
31
-
32
- describe '#os_name' do
33
- it 'returns the operating system name' do
34
- value(client.os_name).must_equal 'Mac'
35
- end
36
- end
37
-
38
- describe '#os_full_version' do
39
- it 'returns the operating system full version' do
40
- value(client.os_full_version).must_equal '10.8.5'
41
- end
42
- end
43
-
44
- describe '#known?' do
45
- it 'returns true' do
46
- value(client.known?).must_equal true
47
- end
48
- end
49
-
50
- describe '#bot?' do
51
- it 'returns false' do
52
- value(client.bot?).must_equal false
53
- end
54
- end
55
-
56
- describe '#bot_name' do
57
- it 'returns nil' do
58
- value(client.bot_name).must_be_nil
59
- end
60
- end
61
- end
62
-
63
- describe 'ubuntu linux' do
64
- let(:user_agent) do
65
- 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
66
- end
67
-
68
- describe '#os_family' do
69
- it 'returns the operating system name' do
70
- value(client.os_family).must_equal 'GNU/Linux'
71
- end
72
- end
73
-
74
- describe '#os_name' do
75
- it 'returns the operating system name' do
76
- value(client.os_name).must_equal 'Ubuntu'
77
- end
78
- end
79
- end
80
-
81
- describe 'firefox mobile phone' do
82
- let(:user_agent) { 'Mozilla/5.0 (Android 7.0; Mobile; rv:53.0) Gecko/53.0 Firefox/53.0' }
83
-
84
- it 'detects smartphone' do
85
- value(client.device_type).must_equal 'smartphone'
86
- end
87
- end
88
-
89
- describe 'firefox mobile tablet' do
90
- let(:user_agent) { 'Mozilla/5.0 (Android 6.0.1; Tablet; rv:47.0) Gecko/47.0 Firefox/47.0' }
91
-
92
- it 'detects tablet' do
93
- value(client.device_type).must_equal 'tablet'
94
- end
95
- end
96
- end
97
-
98
- describe 'unknown user agent' do
99
- let(:user_agent) { 'garbage123' }
100
-
101
- describe '#name' do
102
- it 'returns nil' do
103
- value(client.name).must_be_nil
104
- end
105
- end
106
-
107
- describe '#full_version' do
108
- it 'returns nil' do
109
- value(client.full_version).must_be_nil
110
- end
111
- end
112
-
113
- describe '#os_name' do
114
- it 'returns nil' do
115
- value(client.os_name).must_be_nil
116
- end
117
- end
118
-
119
- describe '#os_full_version' do
120
- it 'returns nil' do
121
- value(client.os_full_version).must_be_nil
122
- end
123
- end
124
-
125
- describe '#known?' do
126
- it 'returns false' do
127
- value(client.known?).must_equal false
128
- end
129
- end
130
-
131
- describe '#bot?' do
132
- it 'returns false' do
133
- value(client.bot?).must_equal false
134
- end
135
- end
136
-
137
- describe '#bot_name' do
138
- it 'returns nil' do
139
- value(client.bot_name).must_be_nil
140
- end
141
- end
142
- end
143
-
144
- describe 'bot' do
145
- let(:user_agent) { 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' }
146
-
147
- describe '#name' do
148
- it 'returns nil' do
149
- value(client.name).must_be_nil
150
- end
151
- end
152
-
153
- describe '#full_version' do
154
- it 'returns nil' do
155
- value(client.full_version).must_be_nil
156
- end
157
- end
158
-
159
- describe '#os_name' do
160
- it 'returns nil' do
161
- value(client.os_name).must_be_nil
162
- end
163
- end
164
-
165
- describe '#os_full_version' do
166
- it 'returns nil' do
167
- value(client.os_full_version).must_be_nil
168
- end
169
- end
170
-
171
- describe '#known?' do
172
- it 'returns false' do
173
- value(client.known?).must_equal false
174
- end
175
- end
176
-
177
- describe '#bot?' do
178
- it 'returns true' do
179
- value(client.bot?).must_equal true
180
- end
181
- end
182
-
183
- describe '#bot_name' do
184
- it 'returns the name of the bot' do
185
- value(client.bot_name).must_equal 'Googlebot'
186
- end
187
- end
188
- end
189
- end