1 # frozen_string_literal: true
5 class Tag2linkTest < ActiveSupport::TestCase
6 def test_link_returns_nil_for_full_url
7 assert_nil Tag2link.link("website", "https://example.com/page")
10 def test_link_returns_nil_for_unknown_key
11 assert_nil Tag2link.link("nonexistent_key", "SomeValue")
14 def test_link_returns_proper_url_for_known_key
15 url = Tag2link.link("wikidata", "Q936")
16 assert_equal "https://www.wikidata.org/entity/Q936", url
19 def test_build_dict_rejects_deprecated_and_third_party
21 { "key" => "Key:example", "url" => "http://example.com/$1", "rank" => "deprecated", "source" => "osmwiki:P8" },
22 { "key" => "Key:example2", "url" => "http://example2.com/$1", "rank" => "preferred", "source" => "wikidata:P3303" },
23 { "key" => "Key:example3", "url" => "http://example3.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" }
25 dict = Tag2link.build_dict(data)
26 assert_not_includes dict, "example"
27 assert_not_includes dict, "example2"
28 assert_includes dict, "example3"
31 def test_build_dict_chooses_single_preferred_item
33 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "normal", "source" => "osmwiki:P8" },
34 { "key" => "Key:example", "url" => "http://example.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" }
36 dict = Tag2link.build_dict(data)
37 assert_equal "http://example.com/$1", dict["example"]
40 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" },
41 { "key" => "Key:example", "url" => "http://example.com/$1", "rank" => "preferred", "source" => "wikidata:P1630" },
42 { "key" => "Key:example", "url" => "http://example3.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" }
44 dict = Tag2link.build_dict(data)
45 assert_equal "http://example.com/$1", dict["example"]
48 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" }
50 dict = Tag2link.build_dict(data)
51 assert_equal "http://example2.com/$1", dict["example"]
54 def test_build_dict_deduplicates_urls
56 { "key" => "Key:example", "url" => "http://example.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" },
57 { "key" => "Key:example", "url" => "http://example.com/$1", "rank" => "normal", "source" => "wikidata:P1630" }
59 dict = Tag2link.build_dict(data)
60 assert_equal "http://example.com/$1", dict["example"]
63 def test_build_dict_rejects_multiple_equally_preferred_items
65 { "key" => "Key:example", "url" => "http://example1.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" },
66 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" }
68 dict = Tag2link.build_dict(data)
69 assert_not_includes dict, "example"
72 { "key" => "Key:example", "url" => "http://example1.com/$1", "rank" => "normal", "source" => "osmwiki:P8" },
73 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "normal", "source" => "osmwiki:P8" }
75 dict = Tag2link.build_dict(data)
76 assert_not_includes dict, "example"
79 def test_build_dict_chooses_osmwiki_when_both_have_single_preferred
81 { "key" => "Key:example", "url" => "http://example1.com/$1", "rank" => "preferred", "source" => "osmwiki:P8" },
82 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "preferred", "source" => "wikidata:P1630" }
84 dict = Tag2link.build_dict(data)
85 assert_equal "http://example1.com/$1", dict["example"]
88 { "key" => "Key:example", "url" => "http://example1.com/$1", "rank" => "normal", "source" => "osmwiki:P8" },
89 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "normal", "source" => "wikidata:P1630" }
91 dict = Tag2link.build_dict(data)
92 assert_equal "http://example1.com/$1", dict["example"]
95 def test_build_dict_multiple_sources_more_than_two
97 { "key" => "Key:example", "url" => "http://example1.com/$1", "rank" => "normal", "source" => "osmwiki:P8" },
98 { "key" => "Key:example", "url" => "http://example2.com/$1", "rank" => "normal", "source" => "wikidata:P1630" },
99 { "key" => "Key:example", "url" => "http://example3.com/$1", "rank" => "normal", "source" => "other:source" }
101 dict = Tag2link.build_dict(data)
102 # Should not happen with current tag2link schema, but ensure we handle it gracefully
103 assert_not_includes dict, "example"