From c5777f360e7e96d7c54938c891d0cf1c17d2f3ba Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 21 Feb 2022 18:57:40 -0600 Subject: [PATCH] artist urls: normalize trailing slashes and missing http://. * Remove unnecessary trailing slashes when artist URLs are saved. * Automatically add `http://` to new artist URLs if it's missing (before this was an error; now it's automatically fixed). --- app/models/artist_url.rb | 9 ++------- test/unit/artist_test.rb | 3 ++- test/unit/artist_url_test.rb | 25 ++++++++++++++----------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/app/models/artist_url.rb b/app/models/artist_url.rb index a9aa11881..7ca9d44fa 100644 --- a/app/models/artist_url.rb +++ b/app/models/artist_url.rb @@ -72,8 +72,7 @@ class ArtistURL < ApplicationRecord end def domain - uri = Addressable::URI.parse(normalized_url) - uri.domain + Danbooru::URL.parse(normalized_url)&.domain end def site_name @@ -119,11 +118,7 @@ class ArtistURL < ApplicationRecord end def self.normalize_url(url) - uri = Addressable::URI.parse(url) - uri.site = uri.normalized_site - uri.to_s - rescue Addressable::URI::InvalidURIError - url + Danbooru::URL.parse(url)&.to_s.presence || url end def url=(url) diff --git a/test/unit/artist_test.rb b/test/unit/artist_test.rb index bc55d6dbb..97dc2328d 100644 --- a/test/unit/artist_test.rb +++ b/test/unit/artist_test.rb @@ -580,7 +580,8 @@ class ArtistTest < ActiveSupport::TestCase should "not save invalid urls" do assert_no_difference("ArtistVersion.count") do - @artist.update(:url_string => "http://foo.com www.example.com") + @artist.update(url_string: "http://foo.com :42") + assert_equal(%w[http://foo.com], @artist.versions.last.urls) end end diff --git a/test/unit/artist_url_test.rb b/test/unit/artist_url_test.rb index 561c3f888..632cfcd27 100644 --- a/test/unit/artist_url_test.rb +++ b/test/unit/artist_url_test.rb @@ -25,26 +25,29 @@ class ArtistURLTest < ActiveSupport::TestCase should "disallow invalid urls" do urls = [ - FactoryBot.build(:artist_url, url: "www.example.com"), - FactoryBot.build(:artist_url, url: ":www.example.com"), - FactoryBot.build(:artist_url, url: "http://http://www.example.com"), + build(:artist_url, url: ":www.example.com"), + build(:artist_url, url: "http://http://www.example.com"), ] assert_equal(false, urls[0].valid?) - assert_match(/must begin with http/, urls[0].errors.full_messages.join) + assert_match(/is malformed/, urls[0].errors.full_messages.join) assert_equal(false, urls[1].valid?) - assert_match(/is malformed/, urls[1].errors.full_messages.join) - assert_equal(false, urls[2].valid?) - assert_match(/that does not contain a dot/, urls[2].errors.full_messages.join) + assert_match(/that does not contain a dot/, urls[1].errors.full_messages.join) end - should "always add a trailing slash when normalized" do - url = FactoryBot.create(:artist_url, :url => "http://monet.com") + should "automatically add http:// if missing" do + url = create(:artist_url, url: "example.com") + assert_equal("http://example.com", url.url) + assert_equal("http://example.com/", url.normalized_url) + end + + should "normalize trailing slashes" do + url = create(:artist_url, url: "http://monet.com") assert_equal("http://monet.com", url.url) assert_equal("http://monet.com/", url.normalized_url) - url = FactoryBot.create(:artist_url, :url => "http://monet.com/") - assert_equal("http://monet.com/", url.url) + url = create(:artist_url, url: "http://monet.com/") + assert_equal("http://monet.com", url.url) assert_equal("http://monet.com/", url.normalized_url) end