Skip to content

Commit e37b143

Browse files
justinnoutJustin Herrera
and
Justin Herrera
authored
Support mult-chain wallets in get_metadata calls (#46)
* Update requirements for new testing format * Add logic for new methods * Version bump Co-authored-by: Justin Herrera <justin@magic.link>
1 parent 9b7d51f commit e37b143

File tree

7 files changed

+192
-57
lines changed

7 files changed

+192
-57
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212

1313
- <PR-#ISSUE> ...
1414

15+
## `0.1.0` - 11/30/2022
16+
17+
#### Added
18+
19+
- PR-#46: Support mult-chain wallets in get_metadata calls
20+
1521
## `0.0.5` - 06/23/2021
1622

1723
#### Fixed

magic_admin/resources/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from magic_admin.resources.token import Token
22
from magic_admin.resources.user import User
3+
from magic_admin.resources.wallet import WalletType

magic_admin/resources/user.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from magic_admin.resources.base import ResourceComponent
2+
from magic_admin.resources.wallet import WalletType
23
from magic_admin.utils.did_token import construct_issuer_with_public_address
34

45

@@ -7,8 +8,22 @@ class User(ResourceComponent):
78
v1_user_info = '/v1/admin/auth/user/get'
89
v2_user_logout = '/v2/admin/auth/user/logout'
910

11+
def get_metadata_by_issuer_and_wallet(self, issuer, wallet_type):
12+
return self.request(
13+
'get', self.v1_user_info, params={'issuer': issuer, 'wallet_type': wallet_type},
14+
)
15+
16+
def get_metadata_by_public_address_and_wallet(self, public_address, wallet_type):
17+
return self.get_metadata_by_issuer_and_wallet(
18+
construct_issuer_with_public_address(public_address),
19+
wallet_type,
20+
)
21+
22+
def get_metadata_by_token_and_wallet(self, did_token, wallet_type):
23+
return self.get_metadata_by_issuer_and_wallet(self.Token.get_issuer(did_token), wallet_type)
24+
1025
def get_metadata_by_issuer(self, issuer):
11-
return self.request('get', self.v1_user_info, params={'issuer': issuer})
26+
return self.get_metadata_by_issuer_and_wallet(issuer, WalletType.NONE)
1227

1328
def get_metadata_by_public_address(self, public_address):
1429
return self.get_metadata_by_issuer(

magic_admin/resources/wallet.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from enum import Enum
2+
3+
4+
class WalletType(Enum):
5+
ETH = 'ETH'
6+
HARMONY = 'HARMONY'
7+
ICON = 'ICON'
8+
FLOW = 'FLOW'
9+
TEZOS = 'TEZOS'
10+
ZILLIQA = 'ZILLIQA'
11+
POLKADOT = 'POLKADOT'
12+
SOLANA = 'SOLANA'
13+
AVAX = 'AVAX'
14+
ALGOD = 'ALGOD'
15+
COSMOS = 'COSMOS'
16+
CELO = 'CELO'
17+
BITCOIN = 'BITCOIN'
18+
NEAR = 'NEAR'
19+
HELIUM = 'HELIUM'
20+
CONFLUX = 'CONFLUX'
21+
TERRA = 'TERRA'
22+
TAQUITO = 'TAQUITO'
23+
ED = 'ED'
24+
HEDERA = 'HEDERA'
25+
NONE = 'NONE'
26+
ANY = 'ANY'

magic_admin/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = '0.0.5'
1+
VERSION = '0.1.0'

requirements-dev.txt

+2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ pexpect==4.8.0
2020
pickleshare==0.7.5
2121
pluggy==0.13.1
2222
pre-commit==1.21.0
23+
pretend==1.0.8
2324
prompt-toolkit==3.0.5
2425
ptyprocess==0.6.0
2526
py==1.8.1
2627
Pygments==2.6.1
2728
pyparsing==2.4.7
2829
pytest==5.4.1
2930
pytest-cov==2.8.1
31+
pytest-mock==3.6.1
3032
PyYAML==5.3.1
3133
six==1.14.0
3234
toml==0.10.0

tests/unit/resources/user_test.py

+140-55
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,205 @@
11
from unittest import mock
2+
from unittest.mock import sentinel
23

34
import pytest
5+
from pretend import stub
46

57
from magic_admin.resources.user import User
8+
from magic_admin.resources.wallet import WalletType
69
from testing.data.did_token import future_did_token
7-
from testing.data.did_token import issuer
810
from testing.data.did_token import public_address
911

1012

1113
class TestUser:
1214

15+
metadata_with_wallets = stub(
16+
data=stub(
17+
email=sentinel.email,
18+
issuer=sentinel.issuer,
19+
public_address=sentinel.public_address,
20+
wallets=[
21+
stub(
22+
network=sentinel.network,
23+
wallet_type=WalletType.ETH.value,
24+
public_address=sentinel.public_address_1,
25+
),
26+
stub(
27+
network=sentinel.network,
28+
wallet_type=WalletType.ETH.value,
29+
public_address=sentinel.public_address_2,
30+
),
31+
stub(
32+
network=sentinel.network,
33+
wallet_type=WalletType.ETH.value,
34+
public_address=sentinel.public_address_3,
35+
),
36+
],
37+
),
38+
error_code=sentinel.error_code,
39+
message=sentinel.message,
40+
status=sentinel.status,
41+
)
42+
43+
metadata_no_wallets = stub(
44+
data=stub(
45+
email=sentinel.email,
46+
issuer=sentinel.issuer,
47+
public_address=sentinel.public_address,
48+
),
49+
error_code=sentinel.error_code,
50+
message=sentinel.message,
51+
status=sentinel.ok,
52+
)
53+
1354
@pytest.fixture(autouse=True)
1455
def setup(self):
1556
self.user = User()
57+
self.user.Token = mock.Mock()
1658

1759
@pytest.fixture
18-
def mock_get_metadata_by_issuer(self):
19-
with mock.patch.object(
20-
self.user,
21-
'get_metadata_by_issuer',
22-
) as mock_get_metadata_by_issuer:
23-
yield mock_get_metadata_by_issuer
24-
25-
@pytest.fixture
26-
def mock_logout_by_issuer(self):
27-
with mock.patch.object(
28-
self.user,
29-
'logout_by_issuer',
30-
) as mock_logout_by_issuer:
31-
yield mock_logout_by_issuer
32-
33-
@pytest.fixture
34-
def mock_construct_issuer_with_public_address(self):
35-
with mock.patch(
60+
def mock_construct_issuer_with_public_address(self, mocker):
61+
return mocker.patch(
3662
'magic_admin.resources.user.construct_issuer_with_public_address',
37-
) as mock_construct_issuer_with_public_address:
38-
yield mock_construct_issuer_with_public_address
63+
return_value=sentinel.public_address,
64+
)
3965

4066
def test_get_metadata_by_issuer(self):
41-
with mock.patch.object(
42-
self.user,
43-
'request',
44-
) as mock_request:
45-
assert self.user.get_metadata_by_issuer(issuer) == mock_request.return_value
67+
self.user.get_metadata_by_issuer_and_wallet = mock.Mock(
68+
return_value=self.metadata_no_wallets,
69+
)
70+
71+
assert self.user.get_metadata_by_issuer(
72+
sentinel.issuer,
73+
) == self.metadata_no_wallets
74+
75+
self.user.get_metadata_by_issuer_and_wallet.assert_called_once_with(
76+
sentinel.issuer,
77+
WalletType.NONE,
78+
)
79+
80+
def test_get_metadata_by_issuer_and_any_wallet(self):
81+
self.user.request = mock.Mock(return_value=self.metadata_with_wallets)
4682

47-
mock_request.assert_called_once_with(
83+
assert self.user.get_metadata_by_issuer_and_wallet(
84+
sentinel.issuer,
85+
WalletType.ANY,
86+
) == self.metadata_with_wallets
87+
88+
self.user.request.assert_called_once_with(
4889
'get',
4990
self.user.v1_user_info,
50-
params={'issuer': issuer},
91+
params={
92+
'issuer': sentinel.issuer,
93+
'wallet_type': WalletType.ANY,
94+
},
95+
)
96+
97+
def test_get_metadata_by_token(self):
98+
self.user.get_metadata_by_issuer = mock.Mock(return_value=self.metadata_no_wallets)
99+
100+
assert self.user.get_metadata_by_token(
101+
future_did_token,
102+
) == self.user.get_metadata_by_issuer.return_value
103+
104+
self.user.Token.get_issuer.assert_called_once_with(future_did_token)
105+
self.user.get_metadata_by_issuer.assert_called_once_with(
106+
self.user.Token.get_issuer.return_value,
107+
)
108+
109+
def test_get_metadata_by_token_and_any_wallet(self):
110+
self.user.get_metadata_by_issuer_and_wallet = mock.Mock(
111+
return_value=self.metadata_with_wallets,
112+
)
113+
114+
assert self.user.get_metadata_by_token_and_wallet(
115+
future_did_token,
116+
WalletType.ANY,
117+
) == self.user.get_metadata_by_issuer_and_wallet.return_value
118+
119+
self.user.Token.get_issuer.assert_called_once_with(future_did_token)
120+
self.user.get_metadata_by_issuer_and_wallet.assert_called_once_with(
121+
self.user.Token.get_issuer.return_value,
122+
WalletType.ANY,
51123
)
52124

53125
def test_get_metadata_by_public_address(
54126
self,
55-
mock_get_metadata_by_issuer,
56127
mock_construct_issuer_with_public_address,
57128
):
129+
self.user.get_metadata_by_issuer = mock.Mock(return_value=self.metadata_no_wallets)
130+
58131
assert self.user.get_metadata_by_public_address(
59-
public_address,
60-
) == mock_get_metadata_by_issuer.return_value
132+
sentinel.public_address,
133+
) == self.user.get_metadata_by_issuer.return_value
61134

62135
mock_construct_issuer_with_public_address.assert_called_once_with(
63-
public_address,
136+
sentinel.public_address,
64137
)
65-
mock_get_metadata_by_issuer.assert_called_once_with(
138+
self.user.get_metadata_by_issuer.assert_called_once_with(
66139
mock_construct_issuer_with_public_address.return_value,
67140
)
68141

69-
def test_get_metadata_by_token(self, mock_get_metadata_by_issuer):
70-
self.user.Token = mock.Mock()
142+
def test_get_metadata_by_public_address_and_any_wallet(
143+
self,
144+
mock_construct_issuer_with_public_address,
145+
):
146+
self.user.get_metadata_by_issuer_and_wallet = mock.Mock(
147+
return_value=self.metadata_with_wallets,
148+
)
71149

72-
assert self.user.get_metadata_by_token(
73-
future_did_token,
74-
) == mock_get_metadata_by_issuer.return_value
150+
assert self.user.get_metadata_by_public_address_and_wallet(
151+
sentinel.public_address,
152+
WalletType.ANY,
153+
) == self.user.get_metadata_by_issuer_and_wallet.return_value
75154

76-
self.user.Token.get_issuer.assert_called_once_with(future_did_token)
77-
mock_get_metadata_by_issuer.assert_called_once_with(
78-
self.user.Token.get_issuer.return_value,
155+
mock_construct_issuer_with_public_address.assert_called_once_with(
156+
sentinel.public_address,
157+
)
158+
self.user.get_metadata_by_issuer_and_wallet.assert_called_once_with(
159+
mock_construct_issuer_with_public_address.return_value,
160+
WalletType.ANY,
79161
)
80162

81163
def test_logout_by_issuer(self):
82-
with mock.patch.object(
83-
self.user,
84-
'request',
85-
) as mock_request:
86-
assert self.user.logout_by_issuer(issuer) == mock_request.return_value
164+
self.user.request = mock.Mock()
165+
166+
assert self.user.logout_by_issuer(
167+
sentinel.issuer,
168+
)
87169

88-
mock_request.assert_called_once_with(
170+
self.user.request.assert_called_once_with(
89171
'post',
90172
self.user.v2_user_logout,
91-
data={'issuer': issuer},
173+
data={
174+
'issuer': sentinel.issuer,
175+
},
92176
)
93177

94178
def test_logout_by_public_address(
95179
self,
96-
mock_logout_by_issuer,
97180
mock_construct_issuer_with_public_address,
98181
):
182+
self.user.logout_by_issuer = mock.Mock()
183+
99184
assert self.user.logout_by_public_address(
100185
public_address,
101-
) == mock_logout_by_issuer.return_value
186+
) == self.user.logout_by_issuer.return_value
102187

103188
mock_construct_issuer_with_public_address.assert_called_once_with(
104189
public_address,
105190
)
106-
mock_logout_by_issuer.assert_called_once_with(
191+
self.user.logout_by_issuer.assert_called_once_with(
107192
mock_construct_issuer_with_public_address.return_value,
108193
)
109194

110-
def test_logout_by_token(self, mock_logout_by_issuer):
111-
self.user.Token = mock.Mock()
195+
def test_logout_by_token(self):
196+
self.user.logout_by_issuer = mock.Mock()
112197

113198
assert self.user.logout_by_token(
114199
future_did_token,
115-
) == mock_logout_by_issuer.return_value
200+
) == self.user.logout_by_issuer.return_value
116201

117202
self.user.Token.get_issuer.assert_called_once_with(future_did_token)
118-
mock_logout_by_issuer.assert_called_once_with(
203+
self.user.logout_by_issuer.assert_called_once_with(
119204
self.user.Token.get_issuer.return_value,
120205
)

0 commit comments

Comments
 (0)