diff --git a/apps/cic-eth/cic_eth/api/api_task.py b/apps/cic-eth/cic_eth/api/api_task.py index 6c596a7b..a2535807 100644 --- a/apps/cic-eth/cic_eth/api/api_task.py +++ b/apps/cic-eth/cic_eth/api/api_task.py @@ -22,7 +22,27 @@ logg = logging.getLogger() class Api(ApiBase): - + + @staticmethod + def to_v_list(v, n): + if isinstance(v, str): + vv = v + v = [] + for i in range(n): + v.append([vv]) + elif not isinstance(v, list): + raise ValueError('argument must be single string, or list or strings or lists') + else: + if len(v) != n: + raise ValueError('v argument count must match integer n') + for i in range(n): + if isinstance(v[i], str): + v[i] = [v[i]] + elif not isinstance(v, list): + raise ValueError('proof argument must be single string, or list or strings or lists') + + return v + def default_token(self): s_token = celery.signature( @@ -37,12 +57,21 @@ class Api(ApiBase): def token(self, token_symbol, proof=None): + if not isinstance(token_symbol, str): + raise ValueError('token symbol must be string') + return self.tokens([token_symbol], proof=proof) def tokens(self, token_symbols, proof=None): - if isinstance(proof, str): - proof = [proof] + if not isinstance(token_symbols, list): + raise ValueError('token symbols argument must be list') + + if proof == None: + logg.debug('looking up tokens without external proof check: {}'.format(','.join(token_symbols))) + proof = '' + proof = Api.to_v_list(proof, len(token_symbols)) + chain_spec_dict = self.chain_spec.asdict() s_token_resolve = celery.signature( diff --git a/apps/cic-eth/tests/task/api/test_app_noncritical.py b/apps/cic-eth/tests/task/api/test_app_noncritical.py index 429ef08e..241fc1f6 100644 --- a/apps/cic-eth/tests/task/api/test_app_noncritical.py +++ b/apps/cic-eth/tests/task/api/test_app_noncritical.py @@ -40,6 +40,61 @@ def test_default_token( assert r['address'] == foo_token +def test_to_v_list(): + assert Api.to_v_list('foo', 1) == [['foo']] + assert Api.to_v_list(['foo'], 1) == [['foo']] + assert Api.to_v_list(['foo', 'bar'], 2) == [['foo'], ['bar']] + assert Api.to_v_list('foo', 3) == [['foo'], ['foo'], ['foo']] + assert Api.to_v_list([['foo'], ['bar']], 2) == [['foo'], ['bar']] + with pytest.raises(ValueError): + Api.to_v_list([['foo'], ['bar']], 3) + with pytest.raises(ValueError): + Api.to_v_list(['foo', 'bar'], 3) + with pytest.raises(ValueError): + Api.to_v_list([['foo'], ['bar'], ['baz']], 2) + + assert Api.to_v_list([ + ['foo'], + 'bar', + ['inky', 'pinky', 'blinky', 'clyde'], + ], 3) == [ + ['foo'], + ['bar'], + ['inky', 'pinky', 'blinky', 'clyde'], + ] + + +def test_token_single( + default_chain_spec, + foo_token, + bar_token, + token_registry, + register_tokens, + register_lookups, + cic_registry, + init_database, + init_celery_tasks, + custodial_roles, + foo_token_declaration, + bar_token_declaration, + celery_session_worker, + ): + + api = Api(str(default_chain_spec), queue=None, callback_param='foo') + + t = api.token('FOO', proof=None) + r = t.get() + logg.debug('rr {}'.format(r)) + assert len(r) == 1 + assert r[0]['address'] == strip_0x(foo_token) + + + t = api.token('FOO', proof=foo_token_declaration) + r = t.get() + assert len(r) == 1 + assert r[0]['address'] == strip_0x(foo_token) + + def test_tokens( default_chain_spec, foo_token, @@ -118,3 +173,4 @@ def test_tokens( f.close() assert v == b'\x00' break +