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