diff --git a/retribute_api/search/sources.py b/retribute_api/search/sources.py index 1ba18943b130495c2f74be6e82ca4efb1f31096a..c7b6724a43e5f896069e1c751b694afc3dd1fa27 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 26d124f976951a9f4d62988a09cca7ed233ae79d..8131f64f16c64609c7bcf1e17b619d9c20f717fc 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