discourse/spec/lib/slug_spec.rb

196 lines
6.3 KiB
Ruby
Raw Normal View History

2013-02-05 13:16:51 -06:00
# encoding: utf-8
# frozen_string_literal: true
2013-02-05 13:16:51 -06:00
require 'slug'
describe Slug do
2015-04-13 09:50:41 -05:00
describe '#for' do
let(:default_slug) { 'topic' }
let(:very_long_string) do
'内容似乎不清晰,这是个完整的句子吗?内容似乎不清晰,这是个完整的句子吗?' * 10
end
it 'returns topic by default' do
expect(Slug.for('')).to eq default_slug
end
it 'return topic by default if the string boils down to a number' do
expect(Slug.for('=213=-!(@#+@)(!*_(@#&(!)#')).to eq default_slug
end
it 'accepts fallback' do
expect(Slug.for('', 'king')).to eq 'king'
end
it 'replaces the underscore' do
expect(Slug.for("o_o_o")).to eq("o-o-o")
end
2018-04-17 13:44:43 -05:00
it 'strips emoji string' do
expect(Slug.for(":smile: To Infinity and beyond! 🚀 :woman:t5:")).to eq("to-infinity-and-beyond")
end
2015-04-13 09:50:41 -05:00
context 'ascii generator' do
before { SiteSetting.slug_generation_method = 'ascii' }
it 'generates the slug' do
expect(Slug.for("hello world")).to eq('hello-world')
2015-04-13 09:50:41 -05:00
end
it 'generates default slug when nothing' do
expect(Slug.for('')).to eq(default_slug)
2015-04-13 09:50:41 -05:00
end
it "doesn't generate slugs that are just numbers" do
expect(Slug.for('123')).to eq(default_slug)
end
it "fallbacks to empty string if it's too long" do
expect(Slug.for(very_long_string)).to eq(default_slug)
2015-04-13 09:50:41 -05:00
end
it "transliterates with the default locale" do
SiteSetting.default_locale = :de
I18n.locale = :en
expect(Slug.for('löwe')).to eq('loewe')
end
2015-04-13 09:50:41 -05:00
end
context 'encoded generator' do
before { SiteSetting.slug_generation_method = 'encoded' }
after { SiteSetting.slug_generation_method = 'ascii' }
it 'generates the slug' do
expect(Slug.for("熱帶風暴畫眉")).to eq('%E7%86%B1%E5%B8%B6%E9%A2%A8%E6%9A%B4%E7%95%AB%E7%9C%89')
expect(Slug.for("Jeff hate's !~-_|,=#this")).to eq("jeff-hates-this")
2015-04-13 09:50:41 -05:00
end
it 'generates default slug when nothing' do
expect(Slug.for('')).to eq(default_slug)
2015-04-13 09:50:41 -05:00
end
it "doesn't generate slugs that are just numbers" do
expect(Slug.for('123')).to eq(default_slug)
end
it "handles the special characters" do
expect(Slug.for(
" - English and Chinese title with special characters / 中文标题 !@:?\\:'`#^& $%&*()` -- "
)).to eq("english-and-chinese-title-with-special-characters-%E4%B8%AD%E6%96%87%E6%A0%87%E9%A2%98")
end
it "kills the trailing dash" do
expect(Slug.for("2- -this!~-_|,we-#-=^-")).to eq('2-this-we')
2015-04-13 09:50:41 -05:00
end
it "returns a slug that can be used in a valid URL" do
slug = Slug.for("Γνωμη για αγορα μπουζουκιου μεσω ιντερνετ και εκτίμηση")
expect { URI.parse("http://example.com/#{slug}") }.not_to raise_error
end
2015-04-13 09:50:41 -05:00
end
context 'none generator' do
before { SiteSetting.slug_generation_method = 'none' }
after { SiteSetting.slug_generation_method = 'ascii' }
it 'generates the slug' do
expect(Slug.for("hello world", 'category')).to eq('category')
expect(Slug.for("hello world")).to eq(default_slug)
expect(Slug.for('')).to eq(default_slug)
expect(Slug.for('123')).to eq(default_slug)
2015-04-13 09:50:41 -05:00
end
end
2013-02-05 13:16:51 -06:00
end
2015-04-13 09:50:41 -05:00
describe '#ascii_generator' do
before { SiteSetting.slug_generation_method = 'ascii' }
2013-02-05 13:16:51 -06:00
2015-04-13 09:50:41 -05:00
it 'replaces spaces with hyphens' do
expect(Slug.ascii_generator("hello world")).to eq('hello-world')
end
2013-02-05 13:16:51 -06:00
2015-04-13 09:50:41 -05:00
it 'changes accented characters' do
expect(Slug.ascii_generator('àllo')).to eq('allo')
end
2013-02-05 13:16:51 -06:00
2015-04-13 09:50:41 -05:00
it 'replaces symbols' do
expect(Slug.ascii_generator('evil#trout')).to eq('evil-trout')
end
2013-02-05 13:16:51 -06:00
2015-04-13 09:50:41 -05:00
it 'handles a.b.c properly' do
expect(Slug.ascii_generator("a.b.c")).to eq("a-b-c")
end
2015-04-13 09:50:41 -05:00
it 'handles double dots right' do
expect(Slug.ascii_generator("a....b.....c")).to eq("a-b-c")
end
2013-02-05 13:16:51 -06:00
2015-04-13 09:50:41 -05:00
it 'strips trailing punctuation' do
expect(Slug.ascii_generator("hello...")).to eq("hello")
end
2013-02-11 20:34:38 -06:00
2015-04-13 09:50:41 -05:00
it 'strips leading punctuation' do
expect(Slug.ascii_generator("...hello")).to eq("hello")
end
2013-02-14 16:46:11 -06:00
2015-04-13 09:50:41 -05:00
it 'handles our initial transliteration' do
from = "àáäâčďèéëěêìíïîľĺňòóöôŕřšťůùúüûýžñç"
to = "aaaacdeeeeeiiiillnoooorrstuuuuuyznc"
expect(Slug.ascii_generator(from)).to eq(to)
end
2015-04-13 09:50:41 -05:00
it "doesn't keep single quotes within word" do
expect(Slug.ascii_generator("Jeff hate's this")).to eq("jeff-hates-this")
end
it 'generates null when nothing' do
expect(Slug.ascii_generator('')).to eq('')
end
2015-04-13 09:50:41 -05:00
it "keeps number unchanged" do
expect(Slug.ascii_generator('123')).to eq('123')
end
2013-06-02 18:08:34 -05:00
end
2015-04-13 09:50:41 -05:00
describe '#encoded_generator' do
before { SiteSetting.slug_generation_method = 'encoded' }
after { SiteSetting.slug_generation_method = 'ascii' }
it 'generates percentage encoded string' do
expect(Slug.encoded_generator("뉴스피드")).to eq("%EB%89%B4%EC%8A%A4%ED%94%BC%EB%93%9C")
expect(Slug.encoded_generator("آموزش اضافه کردن لینک اختیاری به هدر")).to eq("%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%84%DB%8C%D9%86%DA%A9-%D8%A7%D8%AE%D8%AA%DB%8C%D8%A7%D8%B1%DB%8C-%D8%A8%D9%87-%D9%87%D8%AF%D8%B1")
expect(Slug.encoded_generator("熱帶風暴畫眉")).to eq("%E7%86%B1%E5%B8%B6%E9%A2%A8%E6%9A%B4%E7%95%AB%E7%9C%89")
2015-04-13 09:50:41 -05:00
end
it 'reject RFC 3986 reserved character and blank' do
expect(Slug.encoded_generator(":/?#[]@!$ &'()*+,;=% -_`~.")).to eq("---") # will be clear by #for
2015-04-13 09:50:41 -05:00
end
it 'generates null when nothing' do
expect(Slug.encoded_generator('')).to eq('')
end
it "keeps number unchanged" do
expect(Slug.encoded_generator('123')).to eq('123')
end
it 'downcase the string' do
expect(Slug.encoded_generator("LoWer")).to eq('lower')
end
end
2015-04-13 09:50:41 -05:00
describe '#none_generator' do
before { SiteSetting.slug_generation_method = 'none' }
after { SiteSetting.slug_generation_method = 'ascii' }
it 'generates nothing' do
expect(Slug.none_generator("Jeff hate's this")).to eq('')
expect(Slug.none_generator(nil)).to eq('')
expect(Slug.none_generator('')).to eq('')
expect(Slug.none_generator('31')).to eq('')
end
end
2013-02-05 13:16:51 -06:00
end