259 lines
7 KiB
Elixir
259 lines
7 KiB
Elixir
defmodule Linkify.ParserTest do
|
|
use ExUnit.Case, async: true
|
|
doctest Linkify.Parser
|
|
|
|
import Linkify.Parser
|
|
|
|
describe "url?/2" do
|
|
test "valid scheme true" do
|
|
valid_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
assert url?(url, scheme: true, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "invalid scheme true" do
|
|
invalid_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
refute url?(url, scheme: true, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "valid scheme false" do
|
|
valid_non_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
assert url?(url, scheme: false, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "invalid scheme false" do
|
|
invalid_non_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
refute url?(url, scheme: false, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "checks the tld for url with a scheme when validate_tld: true" do
|
|
custom_tld_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
refute url?(url, scheme: true, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "does not check the tld for url with a scheme when validate_tld: false" do
|
|
custom_tld_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
assert url?(url, scheme: true, validate_tld: false)
|
|
end)
|
|
end
|
|
|
|
test "does not check the tld for url with a scheme when validate_tld: :no_scheme" do
|
|
custom_tld_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
assert url?(url, scheme: true, validate_tld: :no_scheme)
|
|
end)
|
|
end
|
|
|
|
test "checks the tld for url without a scheme when validate_tld: true" do
|
|
custom_tld_non_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
refute url?(url, scheme: false, validate_tld: true)
|
|
end)
|
|
end
|
|
|
|
test "checks the tld for url without a scheme when validate_tld: :no_scheme" do
|
|
custom_tld_non_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
refute url?(url, scheme: false, validate_tld: :no_scheme)
|
|
end)
|
|
end
|
|
|
|
test "does not check the tld for url without a scheme when validate_tld: false" do
|
|
custom_tld_non_scheme_urls()
|
|
|> Enum.each(fn url ->
|
|
assert url?(url, scheme: false, validate_tld: false)
|
|
end)
|
|
end
|
|
end
|
|
|
|
describe "email?" do
|
|
test "identifies valid emails" do
|
|
valid_emails()
|
|
|> Enum.each(fn email ->
|
|
assert email?(email, [])
|
|
end)
|
|
end
|
|
|
|
test "identifies invalid emails" do
|
|
invalid_emails()
|
|
|> Enum.each(fn email ->
|
|
refute email?(email, [])
|
|
end)
|
|
end
|
|
|
|
test "does not validate tlds when validate_tld: false" do
|
|
valid_custom_tld_emails()
|
|
|> Enum.each(fn email ->
|
|
assert email?(email, validate_tld: false)
|
|
end)
|
|
end
|
|
|
|
test "validates tlds when validate_tld: true" do
|
|
valid_custom_tld_emails()
|
|
|> Enum.each(fn email ->
|
|
refute email?(email, validate_tld: true)
|
|
end)
|
|
end
|
|
end
|
|
|
|
describe "parse" do
|
|
test "handle line breakes" do
|
|
text = "google.com\r\nssss"
|
|
expected = "<a href=\"http://google.com\">google.com</a>\r\nssss"
|
|
|
|
assert parse(text) == expected
|
|
end
|
|
|
|
test "does not link attributes" do
|
|
text = "Check out <a href='google.com'>google</a>"
|
|
assert parse(text) == text
|
|
text = "Check out <img src='google.com' alt='google.com'/>"
|
|
assert parse(text) == text
|
|
text = "Check out <span><img src='google.com' alt='google.com'/></span>"
|
|
assert parse(text) == text
|
|
end
|
|
|
|
test "does not link inside `<pre>` and `<code>`" do
|
|
text = "<pre>google.com</pre>"
|
|
assert parse(text) == text
|
|
|
|
text = "<code>google.com</code>"
|
|
assert parse(text) == text
|
|
|
|
text = "<pre><code>google.com</code></pre>"
|
|
assert parse(text) == text
|
|
end
|
|
|
|
test "links url inside html" do
|
|
text = "<div>google.com</div>"
|
|
|
|
expected = "<div><a href=\"http://google.com\">google.com</a></div>"
|
|
|
|
assert parse(text, class: false, rel: false) == expected
|
|
|
|
text = "Check out <div class='section'>google.com</div>"
|
|
|
|
expected =
|
|
"Check out <div class='section'><a href=\"http://google.com\">google.com</a></div>"
|
|
|
|
assert parse(text, class: false, rel: false) == expected
|
|
end
|
|
|
|
test "links url inside nested html" do
|
|
text = "<p><strong>google.com</strong></p>"
|
|
expected = "<p><strong><a href=\"http://google.com\">google.com</a></strong></p>"
|
|
assert parse(text, class: false, rel: false) == expected
|
|
end
|
|
|
|
test "do not link parens" do
|
|
text = " foo (https://example.com/path/folder/), bar"
|
|
|
|
expected =
|
|
" foo (<a href=\"https://example.com/path/folder/\">example.com/path/folder/</a>), bar"
|
|
|
|
assert parse(text, class: false, rel: false, scheme: true) == expected
|
|
|
|
text = " foo (example.com/path/folder/), bar"
|
|
|
|
expected =
|
|
" foo (<a href=\"http://example.com/path/folder/\">example.com/path/folder/</a>), bar"
|
|
|
|
assert parse(text, class: false, rel: false) == expected
|
|
end
|
|
|
|
test "do not link urls" do
|
|
text = "google.com"
|
|
assert parse(text, url: false) == text
|
|
end
|
|
|
|
test "do not link `:test.test`" do
|
|
text = ":test.test"
|
|
|
|
assert parse(text, %{
|
|
scheme: true,
|
|
extra: true,
|
|
class: false,
|
|
strip_prefix: false,
|
|
new_window: false,
|
|
rel: false
|
|
}) == text
|
|
end
|
|
end
|
|
|
|
def valid_number?([list], number) do
|
|
assert List.last(list) == number
|
|
end
|
|
|
|
def valid_number?(_, _), do: false
|
|
|
|
def valid_scheme_urls,
|
|
do: [
|
|
"https://www.example.com",
|
|
"http://www2.example.com",
|
|
"http://home.example-site.com",
|
|
"http://blog.example.com",
|
|
"http://www.example.com/product",
|
|
"http://www.example.com/products?id=1&page=2",
|
|
"http://www.example.com#up",
|
|
"http://255.255.255.255",
|
|
"http://www.site.com:8008"
|
|
]
|
|
|
|
def invalid_scheme_urls,
|
|
do: [
|
|
"http://invalid.com/perl.cgi?key= | http://web-site.com/cgi-bin/perl.cgi?key1=value1&key2"
|
|
]
|
|
|
|
def valid_non_scheme_urls,
|
|
do: [
|
|
"www.example.com",
|
|
"www2.example.com",
|
|
"www.example.com:2000",
|
|
"www.example.com?abc=1",
|
|
"example.example-site.com",
|
|
"example.com",
|
|
"example.ca",
|
|
"example.tv",
|
|
"example.com:999?one=one",
|
|
"255.255.255.255",
|
|
"255.255.255.255:3000?one=1&two=2"
|
|
]
|
|
|
|
def invalid_non_scheme_urls,
|
|
do: [
|
|
"invalid.com/perl.cgi?key= | web-site.com/cgi-bin/perl.cgi?key1=value1&key2",
|
|
"invalid.",
|
|
"hi..there",
|
|
"555.555.5555"
|
|
]
|
|
|
|
def custom_tld_scheme_urls,
|
|
do: [
|
|
"http://whatever.null/",
|
|
"https://example.o/index.html",
|
|
"http://pleroma.i2p/test",
|
|
"http://misskey.loki"
|
|
]
|
|
|
|
def custom_tld_non_scheme_urls,
|
|
do: [
|
|
"whatever.null/",
|
|
"example.o/index.html",
|
|
"pleroma.i2p/test",
|
|
"misskey.loki"
|
|
]
|
|
|
|
def valid_emails, do: ["rms@ai.mit.edu", "vc@cock.li"]
|
|
def invalid_emails, do: ["rms[at]ai.mit.edu", "vc@cock", "xmpp:lain@trashserver.net"]
|
|
def valid_custom_tld_emails, do: ["guardian@33y6fjyhs3phzfjj.onion", "hi@company.null"]
|
|
end
|