diff --git a/app/models/links.rb b/app/models/links.rb index 3d92b093e6a..af22203245b 100644 --- a/app/models/links.rb +++ b/app/models/links.rb @@ -35,8 +35,18 @@ def links delegate :keys, to: :links def unique_links - links.uniq do |_short, long| - send(long) + seen_urls = {} + links.select do |short, long| + url = send(long) + # always include 'code' (source_code_uri) even if URL is duplicate + if short == "code" + true + elsif seen_urls[url] + false + else + seen_urls[url] = true + true + end end end diff --git a/test/models/links_test.rb b/test/models/links_test.rb index 050f95a381e..f85dc0b571c 100644 --- a/test/models/links_test.rb +++ b/test/models/links_test.rb @@ -69,6 +69,19 @@ class LinksTest < ActiveSupport::TestCase assert_equal([["home", "https://example.code"], ["download", "/downloads/.gem"]], enumerated) end + should "always include source code even when duplicate" do + metadata = { "homepage_uri" => "https://example.com", "source_code_uri" => "https://example.com" } + version = build(:version, indexed: true, metadata: metadata) + rubygem = build(:rubygem, linkset: build(:linkset), versions: [version]) + links = rubygem.links(version) + + enumerated = links.map do |short, value| + [short, value] + end + + assert_equal([["home", "https://example.code"], ["code", "https://example.code"], ["download", "/downloads/.gem"]], enumerated) + end + context "metadata includes unknown uri key" do setup do metadata = {