From 2cfc0bd3154126cff00caf4fd3aae9ce82ff2296 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sun, 9 Jun 2019 18:26:04 +0200
Subject: [PATCH] Remove duplicates

---
 retribute_api/search/sources.py | 14 +++++++++++++-
 tests/search/test_sources.py    | 34 +++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/retribute_api/search/sources.py b/retribute_api/search/sources.py
index 1ba1894..c7b6724 100644
--- a/retribute_api/search/sources.py
+++ b/retribute_api/search/sources.py
@@ -115,8 +115,20 @@ def result_to_retribute_profile(lookup_type, lookup, data):
     valid_means = list(filter(lambda v: v[1] is not None, valid_means))
     if not valid_means:
         raise exceptions.MeansNotFound()
+
+    # remove possible duplicates
+    deduplicated_means = []
+    handled = []
+    for mean in valid_means:
+        id = (mean[1]["provider"], mean[1]["id"])
+        if id in handled:
+            # avoid duplicates
+            continue
+        deduplicated_means.append(mean)
+        handled.append(id)
+
     final_means = []
-    for i, mean in enumerate(reversed(valid_means)):
+    for i, mean in enumerate(reversed(deduplicated_means)):
         link_data = mean[0]
         mean_data = mean[1]
         mean_data.setdefault("weight", i)
diff --git a/tests/search/test_sources.py b/tests/search/test_sources.py
index 26d124f..8131f64 100644
--- a/tests/search/test_sources.py
+++ b/tests/search/test_sources.py
@@ -172,3 +172,37 @@ def test_source_result_to_retribute_profile(settings, now):
 
     result = sources.result_to_retribute_profile(lookup_type, lookup, data)
     assert result == expected
+
+
+def test_source_result_to_retribute_profile_removes_duplicates(settings, now):
+    settings.BASE_URL = "https://retribute.me.test"
+
+    lookup_type = "webfinger"
+    lookup = "test@domain.test"
+
+    data = {
+        "links": [
+            {"summary": "Patreon", "url": "https://patreon.com/username"},
+            {"summary": "Duplicate Patreon", "url": "https://patreon.com/username"},
+        ]
+    }
+
+    expected = {
+        "version": "0.1",
+        "id": "https://retribute.me.test/compat/{}:{}".format(lookup_type, lookup),
+        "title": "Compat profile for {}:{}".format(lookup_type, lookup),
+        "updated": now.isoformat(),
+        "identities": [],
+        "means": [
+            {
+                "provider": "patreon",
+                "id": "username",
+                "summary": "Patreon",
+                "weight": 0,
+                "url": "https://patreon.com/username",
+            }
+        ],
+    }
+
+    result = sources.result_to_retribute_profile(lookup_type, lookup, data)
+    assert result == expected
-- 
GitLab