From c981c767b9cc3f7a3c901e4fda5e432e6d747166 Mon Sep 17 00:00:00 2001
From: Victor Shyba <victor.shyba@gmail.com>
Date: Fri, 4 Sep 2020 00:35:38 -0300
Subject: [PATCH] raise instead of implicit deduplication of arguments

---
 lbry/service/parser.py            |  2 +-
 tests/unit/service/test_parser.py | 40 ++++++++++++++++---------------
 2 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/lbry/service/parser.py b/lbry/service/parser.py
index 5b8247e03..f7f9561b3 100644
--- a/lbry/service/parser.py
+++ b/lbry/service/parser.py
@@ -159,7 +159,7 @@ def parse_method(method, expanders: dict) -> dict:
                     raise Exception(f"Expander '{expander_name}' not found, used by {d['name']}.")
                 for expanded in expanders[expander_name]:
                     if expanded['name'] in known_names:
-                        continue
+                        raise Exception(f"Expander '{expander_name}' argument repeated: {expanded['name']}.")
                     d['arguments'].append(expanded)
                     d['kwargs'].append(expanded)
                     known_names.add(expanded['name'])
diff --git a/tests/unit/service/test_parser.py b/tests/unit/service/test_parser.py
index 3806dbc6a..5507e3b60 100644
--- a/tests/unit/service/test_parser.py
+++ b/tests/unit/service/test_parser.py
@@ -14,10 +14,10 @@ def test_kwargs(somevalue=1):
 
 @expander
 def another_test_kwargs(
-        somevalue=1,
-        repeated=2,
-        bad_description=3,  # using linebreaks makes docopt very very --angry
-        angry=4
+    somevalue=1,
+    repeated=2,
+    bad_description=3,  # using linebreaks makes docopt very very --angry
+    angry=4
 ):
     pass
 
@@ -48,18 +48,6 @@ class FakeAPI:
     def thing_update(self, value1: str) -> Wallet:  # updated wallet
         """update command doc"""
 
-    def thing_search(
-            self,
-            query='a',
-            **test_and_another_test_kwargs) -> Wallet:
-        """
-        search command doc
-
-        Usage:
-            thing search [--query=<query>]
-                         {kwargs}
-        """
-
     def thing_delete(self, value1: str, **tx_and_pagination_kwargs) -> Wallet:  # deleted thing
         """
         delete command doc
@@ -84,13 +72,27 @@ class FakeAPI:
         """
 
 
+class BadAPI(FakeAPI):
+    def thing_search(
+        self,
+        query='a',
+        **test_and_another_test_kwargs) -> Wallet:
+        """
+        search command doc
+
+        Usage:
+            thing search [--query=<query>]
+                         {kwargs}
+        """
+
+
 class TestParser(TestCase):
     maxDiff = None
 
     def test_parse_does_not_duplicate_arguments(self):
-        parsed = parse_method(FakeAPI.thing_search, get_expanders())
-        names = [arg['name'] for arg in parsed['arguments']]
-        self.assertEqual(len(names), len(set(names)))
+        with self.assertRaises(Exception) as exc:
+            parse_method(BadAPI.thing_search, get_expanders())
+        self.assertEqual(exc.exception.args[0], "Expander 'another_test' argument repeated: thing_search.")
 
     def test_parse_method(self):
         expanders = get_expanders()