1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
# frozen_string_literal: true
require "test_helper"
class AcceptLanguageTest < Minitest::Test
def assert_language(item, expect = {})
assert_equal expect[:code], item.code, "failed code comparison"
if expect[:region]
assert_equal expect[:region], item.region, "failed region comparison"
else
assert_nil item.region,
"region should be nil; got #{item.region.inspect} instead"
end
assert_equal expect[:quality], item.quality, "failed quality comparison"
end
test "returns full language" do
language = Browser::AcceptLanguage.new("en-GB")
assert_equal "en-GB", language.full
end
test "returns language name" do
language = Browser::AcceptLanguage.new("en-GB")
assert_equal "English/United Kingdom", language.name
language = Browser::AcceptLanguage.new("en")
assert_equal "English", language.name
end
test "returns nil for unknown languages" do
language = Browser::AcceptLanguage.new("unknown")
assert_nil language.name
end
test "returns code" do
language = Browser::AcceptLanguage.new("en-GB")
assert_equal "en", language.code
end
test "returns formatted code" do
%w[EN-GB En-GB eN-GB].each do |locale|
language = Browser::AcceptLanguage.new(locale)
assert_equal "en", language.code
end
end
test "returns region" do
language = Browser::AcceptLanguage.new("en-GB")
assert_equal "GB", language.region
end
test "returns formatted region" do
%w[en-gb en-Gb en-gB].each do |locale|
language = Browser::AcceptLanguage.new(locale)
assert_equal "GB", language.region
end
end
test "returns nil for language without region" do
language = Browser::AcceptLanguage.new("en")
assert_nil language.region
end
test "parses language with quality" do
language = Browser::AcceptLanguage.new("en-GB;q=0.8")
assert_language language, code: "en", region: "GB", quality: 0.8
end
test "parses language without quality" do
language = Browser::AcceptLanguage.new("en-GB")
assert_language language, code: "en", region: "GB", quality: 1.0
end
test "parses language without region" do
language = Browser::AcceptLanguage.new("en")
assert_language language, code: "en", region: nil, quality: 1.0
end
test "ignores multi-part region" do
language = Browser::AcceptLanguage.new("az-AZ-Cyrl")
assert_language language, code: "az", region: "AZ", quality: 1.0
end
test "parses multi-language set" do
result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.8")
assert_equal 2, result.count
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "fr", region: nil, quality: 0.8
end
test "parses wildcard" do
result = Browser::AcceptLanguage.parse("fr-CA,*;q=0.8")
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "*", region: nil, quality: 0.8
end
test "parses complex set" do
accept_language = "fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1"
result = Browser::AcceptLanguage.parse(accept_language)
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "fr", region: nil, quality: 0.8
assert_language result[2], code: "en", region: "US", quality: 0.6
assert_language result[3], code: "en", region: nil, quality: 0.4
assert_language result[4], code: "*", region: nil, quality: 0.1
end
test "handles random white spaces" do
accept_language = "fr-CA, fr;q=0.8, en-US;q=0.6,en;q=0.4, *;q=0.1"
result = Browser::AcceptLanguage.parse(accept_language)
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "fr", region: nil, quality: 0.8
assert_language result[2], code: "en", region: "US", quality: 0.6
assert_language result[3], code: "en", region: nil, quality: 0.4
assert_language result[4], code: "*", region: nil, quality: 0.1
end
test "sorts based on quality" do
accept_language = "fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5"
result = Browser::AcceptLanguage.parse(accept_language)
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "en", region: "US", quality: 0.6
assert_language result[2], code: "*", region: nil, quality: 0.5
assert_language result[3], code: "en", region: nil, quality: 0.4
assert_language result[4], code: "fr", region: nil, quality: 0.2
end
test "sorts the same quality in a descending priority" do
accept_language = "fr-CA,fr;q=0.2,en-US;q=0.2,en"
result = Browser::AcceptLanguage.parse(accept_language)
assert_language result[0], code: "fr", region: "CA", quality: 1.0
assert_language result[1], code: "en", region: nil, quality: 1.0
assert_language result[2], code: "fr", region: nil, quality: 0.2
assert_language result[3], code: "en", region: "US", quality: 0.2
end
test "rejects quality values equals to zero (#241)" do
result = Browser::AcceptLanguage.parse("de-DE,ru;q=0.9,de;q=0.8,en;q=0.")
assert_equal 3, result.size
assert_language result[0], code: "de", region: "DE", quality: 1.0
assert_language result[1], code: "ru", region: nil, quality: 0.9
assert_language result[2], code: "de", region: nil, quality: 0.8
end
test "handles invalid quality values that look like a number" do
accept_language = "fr-CH, fr;q=0.9, en;q=0.8, de;q=0..7, *;q=0.5"
result = Browser::AcceptLanguage.parse(accept_language)
assert_equal 5, result.size
assert_language result[3], code: "de", region: nil, quality: 0.7
end
test "sets default quality value for invalid strings" do
result = Browser::AcceptLanguage.parse(";q=0.0.0.0")
assert_equal 0.1, result[0].quality # rubocop:disable Minitest/AssertInDelta
end
end
|