device_detector 1.0.3 → 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 (94) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +8 -7
  4. data/lib/device_detector/bot.rb +2 -2
  5. data/lib/device_detector/browser.rb +364 -0
  6. data/lib/device_detector/client.rb +11 -2
  7. data/lib/device_detector/device.rb +1247 -22
  8. data/lib/device_detector/memory_cache.rb +5 -5
  9. data/lib/device_detector/metadata_extractor.rb +7 -8
  10. data/lib/device_detector/model_extractor.rb +3 -3
  11. data/lib/device_detector/name_extractor.rb +2 -2
  12. data/lib/device_detector/os.rb +150 -116
  13. data/lib/device_detector/parser.rb +23 -10
  14. data/lib/device_detector/version.rb +1 -1
  15. data/lib/device_detector/version_extractor.rb +29 -2
  16. data/lib/device_detector.rb +73 -40
  17. data/regexes/bots.yml +868 -62
  18. data/regexes/client/browser_engine.yml +11 -2
  19. data/regexes/client/browsers.yml +1132 -112
  20. data/regexes/client/feed_readers.yml +5 -11
  21. data/regexes/client/libraries.yml +86 -2
  22. data/regexes/client/mediaplayers.yml +39 -3
  23. data/regexes/client/mobile_apps.yml +940 -66
  24. data/regexes/client/pim.yml +66 -3
  25. data/regexes/device/cameras.yml +6 -6
  26. data/regexes/device/car_browsers.yml +23 -3
  27. data/regexes/device/consoles.yml +15 -3
  28. data/regexes/device/mobiles.yml +18351 -3566
  29. data/regexes/device/notebooks.yml +114 -0
  30. data/regexes/device/portable_media_player.yml +36 -9
  31. data/regexes/device/shell_tv.yml +117 -0
  32. data/regexes/device/televisions.yml +440 -35
  33. data/regexes/oss.yml +635 -284
  34. data/regexes/vendorfragments.yml +5 -1
  35. metadata +21 -118
  36. data/.gitignore +0 -14
  37. data/.travis.yml +0 -14
  38. data/Gemfile +0 -8
  39. data/Rakefile +0 -96
  40. data/device_detector.gemspec +0 -26
  41. data/spec/device_detector/bot_fixtures_spec.rb +0 -30
  42. data/spec/device_detector/client_fixtures_spec.rb +0 -31
  43. data/spec/device_detector/concrete_user_agent_spec.rb +0 -135
  44. data/spec/device_detector/detector_fixtures_spec.rb +0 -100
  45. data/spec/device_detector/device_fixtures_spec.rb +0 -36
  46. data/spec/device_detector/device_spec.rb +0 -151
  47. data/spec/device_detector/memory_cache_spec.rb +0 -148
  48. data/spec/device_detector/model_extractor_spec.rb +0 -63
  49. data/spec/device_detector/os_fixtures_spec.rb +0 -26
  50. data/spec/device_detector/version_extractor_spec.rb +0 -79
  51. data/spec/device_detector_spec.rb +0 -189
  52. data/spec/fixtures/client/browser.yml +0 -2206
  53. data/spec/fixtures/client/feed_reader.yml +0 -199
  54. data/spec/fixtures/client/library.yml +0 -175
  55. data/spec/fixtures/client/mediaplayer.yml +0 -163
  56. data/spec/fixtures/client/mobile_app.yml +0 -193
  57. data/spec/fixtures/client/pim.yml +0 -115
  58. data/spec/fixtures/detector/bots.yml +0 -3260
  59. data/spec/fixtures/detector/camera.yml +0 -121
  60. data/spec/fixtures/detector/car_browser.yml +0 -21
  61. data/spec/fixtures/detector/console.yml +0 -281
  62. data/spec/fixtures/detector/desktop.yml +0 -5361
  63. data/spec/fixtures/detector/feature_phone.yml +0 -891
  64. data/spec/fixtures/detector/feed_reader.yml +0 -551
  65. data/spec/fixtures/detector/mediaplayer.yml +0 -210
  66. data/spec/fixtures/detector/mobile_apps.yml +0 -456
  67. data/spec/fixtures/detector/phablet.yml +0 -3785
  68. data/spec/fixtures/detector/portable_media_player.yml +0 -178
  69. data/spec/fixtures/detector/smart_display.yml +0 -61
  70. data/spec/fixtures/detector/smartphone-1.yml +0 -9953
  71. data/spec/fixtures/detector/smartphone-10.yml +0 -9924
  72. data/spec/fixtures/detector/smartphone-11.yml +0 -9889
  73. data/spec/fixtures/detector/smartphone-12.yml +0 -8655
  74. data/spec/fixtures/detector/smartphone-2.yml +0 -9967
  75. data/spec/fixtures/detector/smartphone-3.yml +0 -9887
  76. data/spec/fixtures/detector/smartphone-4.yml +0 -9911
  77. data/spec/fixtures/detector/smartphone-5.yml +0 -9933
  78. data/spec/fixtures/detector/smartphone-6.yml +0 -9923
  79. data/spec/fixtures/detector/smartphone-7.yml +0 -9892
  80. data/spec/fixtures/detector/smartphone-8.yml +0 -9896
  81. data/spec/fixtures/detector/smartphone-9.yml +0 -9928
  82. data/spec/fixtures/detector/smartphone.yml +0 -9984
  83. data/spec/fixtures/detector/tablet-1.yml +0 -10023
  84. data/spec/fixtures/detector/tablet-2.yml +0 -9968
  85. data/spec/fixtures/detector/tablet-3.yml +0 -7787
  86. data/spec/fixtures/detector/tablet.yml +0 -9951
  87. data/spec/fixtures/detector/tv.yml +0 -3333
  88. data/spec/fixtures/detector/unknown.yml +0 -3283
  89. data/spec/fixtures/device/camera.yml +0 -19
  90. data/spec/fixtures/device/car_browser.yml +0 -7
  91. data/spec/fixtures/device/console.yml +0 -79
  92. data/spec/fixtures/parser/oss.yml +0 -1047
  93. data/spec/fixtures/parser/vendorfragments.yml +0 -162
  94. 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,151 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe DeviceDetector::Device do
4
-
5
- subject { DeviceDetector::Device.new(user_agent) }
6
-
7
- alias :device :subject
8
-
9
- describe '#name' do
10
-
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
-
35
- end
36
-
37
- describe '#type' do
38
-
39
- describe 'when models are nested' do
40
- 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]' }
41
-
42
- it 'finds device of Apple iPhone 6' do
43
- value(device.type).must_equal 'smartphone'
44
- end
45
- end
46
-
47
- describe 'when models are NOT nested' do
48
- let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
49
-
50
- it 'finds the device of Airness AIR99' do
51
- value(device.type).must_equal 'feature phone'
52
- end
53
- end
54
-
55
- describe 'when it cannot find a device type' do
56
- let(:user_agent) { 'UNKNOWN MODEL TYPE' }
57
-
58
- it 'returns nil' do
59
- value(device.type).must_be_nil
60
- end
61
-
62
- end
63
-
64
- describe 'device not specified in nested block' do
65
-
66
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
67
-
68
- it 'falls back to top-level device' do
69
- value(device.type).must_equal 'smartphone'
70
- end
71
-
72
- end
73
-
74
- end
75
-
76
- describe 'concrete device types' do
77
-
78
- describe 'mobiles' do
79
-
80
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
81
-
82
- it 'identifies the device' do
83
- value(device.name).must_equal 'GALAXY S5'
84
- value(device.type).must_equal 'smartphone'
85
- value(device.brand).must_equal 'Samsung'
86
- end
87
-
88
- end
89
-
90
- describe 'cameras' do
91
-
92
- 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' }
93
-
94
- it 'identifies the device' do
95
- value(device.name).must_equal 'GALAXY Camera'
96
- value(device.type).must_equal 'camera'
97
- value(device.brand).must_equal 'Samsung'
98
- end
99
-
100
- end
101
-
102
- describe 'car browsers' do
103
-
104
- let(:user_agent) { 'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34' }
105
-
106
- it 'identifies the device' do
107
- value(device.name).must_equal 'Model S'
108
- value(device.type).must_equal 'car browser'
109
- value(device.brand).must_be_nil
110
- end
111
-
112
- end
113
-
114
- describe '(gaming) consoles' do
115
-
116
- let(:user_agent) { 'Opera/9.30 (Nintendo Wii; U; ; 2047-7;en)' }
117
-
118
- it 'identifies the device' do
119
- value(device.name).must_equal 'Wii'
120
- value(device.type).must_equal 'console'
121
- value(device.brand).must_be_nil
122
- end
123
-
124
- end
125
-
126
- describe 'portable media players' do
127
-
128
- 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' }
129
-
130
- it 'identifies the device' do
131
- value(device.name).must_equal 'iPod Touch'
132
- value(device.type).must_equal 'portable media player'
133
- value(device.brand).must_equal 'Apple'
134
- end
135
-
136
- end
137
-
138
- describe 'televisions' do
139
-
140
- 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 ;)' }
141
-
142
- it 'identifies the device' do
143
- value(device.name).must_equal 'NetCast 4.0'
144
- value(device.type).must_equal 'tv'
145
- value(device.brand).must_equal 'LG'
146
- end
147
-
148
- end
149
- end
150
-
151
- 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