Skip to content

Commit a8b4029

Browse files
authored
Merge pull request #9 from Indicio-tech/fix/did-indy-tests
Fix/did indy tests
2 parents 0886f84 + 5147ed0 commit a8b4029

File tree

9 files changed

+148
-119
lines changed

9 files changed

+148
-119
lines changed

indy_common/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
# NYM
1616
# TODO: Will be defined in plenum
17-
DIDDOC_CONTENT = "diddoc_content"
17+
DIDDOC_CONTENT = "diddocContent"
1818

1919
# SCHEMA
2020
SCHEMA_NAME = "name"

indy_common/test/types/test_get_nym_schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
("type", ConstantField),
99
("dest", IdentifierField),
1010
("timestamp", IntegerField),
11-
("seNo", TxnSeqNoField)
11+
("seqNo", TxnSeqNoField)
1212
])
1313

1414

indy_common/test/types/test_nym.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from plenum.common.constants import TARGET_NYM, TXN_TYPE
2+
import pytest
3+
from indy_common.constants import DIDDOC_CONTENT, NYM
4+
from indy_common.types import ClientNYMOperation
5+
6+
VALID_TARGET_NYM = 'a' * 43
7+
8+
@pytest.fixture
9+
def validator():
10+
yield ClientNYMOperation()
11+
12+
13+
def test_nym(validator):
14+
msg = {
15+
TXN_TYPE: NYM,
16+
TARGET_NYM: VALID_TARGET_NYM,
17+
DIDDOC_CONTENT: '{}',
18+
}
19+
validator.validate(msg)
20+
21+
22+
def test_nym_raw_dictionary(validator):
23+
msg = {
24+
TXN_TYPE: NYM,
25+
TARGET_NYM: VALID_TARGET_NYM,
26+
DIDDOC_CONTENT: {},
27+
}
28+
with pytest.raises(TypeError) as ex_info:
29+
validator.validate(msg)
30+
31+
ex_info.match("validation error")

indy_node/server/request_handlers/domain_req_handlers/nym_handler.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from binascii import hexlify
22
from hashlib import sha256
3+
import json
34
from typing import Optional
45
import base58
56

@@ -8,7 +9,6 @@
89
from indy_common.authorize.auth_actions import AuthActionAdd, AuthActionEdit
910
from indy_common.authorize.auth_request_validator import WriteRequestValidator
1011
from indy_common.base_diddoc_template import BaseDIDDoc
11-
from indy_common.config_util import getConfig
1212

1313
# TODO - Import DIDDOC_CONTENT from plenum?
1414
from indy_common.constants import NYM, DIDDOC_CONTENT
@@ -31,8 +31,6 @@
3131
from plenum.server.request_handlers.nym_handler import NymHandler as PNymHandler
3232
from plenum.server.request_handlers.utils import get_nym_details, nym_to_state_key
3333

34-
config = getConfig()
35-
NAMESPACE = config.NETWORK_NAME
3634
# TODO - Clean up
3735
DID_CONTEXT = "https://www.w3.org/ns/did/v1"
3836

@@ -44,6 +42,7 @@ def __init__(self, config, database_manager: DatabaseManager,
4442
write_req_validator: WriteRequestValidator):
4543
super().__init__(config, database_manager)
4644
self.write_req_validator = write_req_validator
45+
self.namespace = config.NETWORK_NAME
4746

4847
def static_validation(self, request: Request):
4948
self._validate_request_type(request)
@@ -63,6 +62,7 @@ def static_validation(self, request: Request):
6362

6463
diddoc_content = operation.get(DIDDOC_CONTENT, None)
6564
if diddoc_content:
65+
diddoc_content = json.loads(diddoc_content)
6666
try:
6767
self._validate_diddoc_content(diddoc_content)
6868
except InvalidDIDDocException:
@@ -140,7 +140,7 @@ def _validate_new_nym(self, request, operation):
140140
"Non-ledger nym txn must contain verkey for new did",
141141
)
142142

143-
if not self._is_self_certifying(
143+
if self.config.ENABLE_DID_INDY and not self._is_self_certifying(
144144
request.operation.get(TARGET_NYM), request.operation.get(VERKEY)
145145
):
146146
raise InvalidClientRequest(
@@ -197,16 +197,6 @@ def _validate_diddoc_content(self, diddoc):
197197
if diddoc.get("id", None):
198198
raise InvalidDIDDocException
199199

200-
context = diddoc.get("@context", None)
201-
if context:
202-
# Must be string or array and contain DID_CONTEXT
203-
if not isinstance(context, (list, str)):
204-
raise InvalidDIDDocException
205-
if isinstance(context, str) and not context == DID_CONTEXT:
206-
raise InvalidDIDDocException
207-
elif isinstance(context, list) and DID_CONTEXT not in context:
208-
raise InvalidDIDDocException
209-
210200
# No element in diddoc is allowed to have same id as verkey in base diddoc
211201
# Alernative would be to merge with base did doc and perform generic did doc validation,
212202
# e.g. using pyDID
@@ -228,6 +218,6 @@ def _make_base_diddoc(self, request: Request):
228218
dest = request.operation.get(TARGET_NYM)
229219
verkey = request.operation.get(VERKEY)
230220

231-
diddoc = BaseDIDDoc(NAMESPACE, dest, verkey)
221+
diddoc = BaseDIDDoc(self.config.NETWORK_NAME, dest, verkey)
232222

233223
return diddoc

indy_node/test/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,8 @@ def fake_node(db_manager, fake_pool_cfg, fake_upgrader, fake_restarter, fake_poo
419419
config=FakeSomething(
420420
stewardThreshold=20,
421421
poolTransactionsFile="//pool_genesis_that_cannot_exist",
422-
domainTransactionsFile="//domain_genesis_that_cannot_exist"
422+
domainTransactionsFile="//domain_genesis_that_cannot_exist",
423+
NETWORK_NAME="sandbox",
423424
),
424425
poolCfg=fake_pool_cfg,
425426
upgrader=fake_upgrader,

indy_node/test/mock.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import json
22
from random import randint
3+
from typing import Any, Dict, Union
34

45
from indy_common.constants import GET_NYM, NYM
56

67

7-
def build_nym_request(identifier, dest, verkey, diddoc_content, role):
8-
8+
def build_nym_request(
9+
identifier: str,
10+
dest: str,
11+
verkey: str = None,
12+
diddoc_content: Union[dict, str] = None,
13+
role: str = None
14+
):
915
request = {
1016
"identifier": identifier,
1117
"reqId": randint(100, 1000000),
@@ -20,7 +26,11 @@ def build_nym_request(identifier, dest, verkey, diddoc_content, role):
2026
if verkey:
2127
operation["verkey"] = verkey
2228
if diddoc_content:
23-
operation["diddoc_content"] = diddoc_content
29+
operation["diddocContent"] = (
30+
json.dumps(diddoc_content)
31+
if isinstance(diddoc_content, dict)
32+
else diddoc_content
33+
)
2434
if role:
2535
operation["role"] = role
2636

@@ -29,15 +39,15 @@ def build_nym_request(identifier, dest, verkey, diddoc_content, role):
2939

3040

3141
def build_get_nym_request(
32-
identifier, dest, timestamp, seq_no
42+
identifier: str, dest: str, timestamp: int = None, seq_no: int = None
3343
):
3444
request = {
3545
"identifier": identifier,
3646
"reqId": randint(100, 1000000),
3747
"protocolVersion": 2
3848
}
3949

40-
operation = {
50+
operation: Dict[str, Any] = {
4151
"dest": dest,
4252
"type": GET_NYM
4353
}

indy_node/test/nym_txn/test_nym_additional.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ def test_send_same_nyms_only_first_gets_written(looper, sdk_pool_handle, sdk_wal
8585

8686
def get_nym(looper, sdk_pool_handle, sdk_wallet_steward, t_did):
8787
_, s_did = sdk_wallet_steward
88-
print(json.dumps(build_get_nym_request(s_did, t_did)))
8988
get_nym_req = looper.loop.run_until_complete(build_get_nym_request(s_did, t_did))
9089
req = sdk_sign_and_send_prepared_request(
9190
looper, sdk_wallet_steward, sdk_pool_handle, get_nym_req

indy_node/test/nym_txn/test_nym_did_indy.py

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
}
2828
],
2929
}
30+
diddoc_content_json = json.dumps(diddoc_content)
3031

3132

3233
# Prepare nym with role endorser and no diddoc content
33-
@pytest.fixture("module")
34+
@pytest.fixture(scope="module")
3435
def prepare_endorser(looper, sdk_pool_handle, sdk_wallet_steward, sdk_wallet_endorser):
3536
_, did_steward = sdk_wallet_steward
3637
wh, _ = sdk_wallet_endorser
@@ -46,7 +47,7 @@ def prepare_endorser(looper, sdk_pool_handle, sdk_wallet_steward, sdk_wallet_end
4647

4748

4849
# Add diddoc content to nym
49-
@pytest.fixture("module")
50+
@pytest.fixture(scope="module")
5051
def add_diddoc_content(looper, sdk_pool_handle, sdk_wallet_endorser, prepare_endorser):
5152
_, did = sdk_wallet_endorser
5253
nym_request = build_nym_request(did, did, None, diddoc_content, None)
@@ -64,27 +65,29 @@ def test_get_nym_data_with_diddoc_content(
6465
looper, sdk_pool_handle, sdk_wallet_endorser, add_diddoc_content
6566
):
6667
_, did = sdk_wallet_endorser
67-
get_nym_request = build_get_nym_request(did, did, None, None)
68+
get_nym_request = build_get_nym_request(did, did)
6869
request_couple = sdk_sign_and_send_prepared_request(
6970
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
7071
)
7172
replies = sdk_get_and_check_replies(looper, [request_couple])
7273

7374
assert (
74-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == diddoc_content
75+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == diddoc_content_json
7576
)
7677

7778

7879
def test_get_previous_nym_data_by_timestamp(
7980
looper, sdk_pool_handle, sdk_wallet_endorser, add_diddoc_content
8081
):
8182
_, did = sdk_wallet_endorser
83+
8284
# Get current nym data
83-
get_nym_request = build_get_nym_request(did, did, None, None)
85+
get_nym_request = build_get_nym_request(did, did)
8486
request_couple = sdk_sign_and_send_prepared_request(
8587
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
8688
)
8789
replies = sdk_get_and_check_replies(looper, [request_couple])
90+
8891
# Get timestamp from data
8992
timestamp = replies[0][1]["result"]["txnTime"]
9093

@@ -93,61 +96,66 @@ def test_get_previous_nym_data_by_timestamp(
9396
new_diddoc_content["serviceEndpoint"][0][
9497
"serviceEndpoint"
9598
] = "https://new.example.com"
99+
new_diddoc_content = json.dumps(new_diddoc_content)
96100

97101
time.sleep(3)
98102

99-
nym_request = build_nym_request(did, did, None, new_diddoc_content, None)
103+
nym_request = build_nym_request(
104+
identifier=did, dest=did, diddoc_content=new_diddoc_content
105+
)
100106
request_couple = sdk_sign_and_send_prepared_request(
101107
looper, sdk_wallet_endorser, sdk_pool_handle, nym_request
102108
)
103109
sdk_get_and_check_replies(looper, [request_couple])
104110

105-
get_nym_request = build_get_nym_request(did, did, None, None)
111+
get_nym_request = build_get_nym_request(did, did)
106112
request_couple = sdk_sign_and_send_prepared_request(
107113
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
108114
)
109115
replies = sdk_get_and_check_replies(looper, [request_couple])
110116

111117
assert (
112-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == new_diddoc_content
118+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == new_diddoc_content
113119
)
114120

115121
update_ts = replies[0][1]["result"]["txnTime"]
116122

117123
# Get previous nym data by exact timestamp
118-
get_nym_request = build_get_nym_request(did, did, timestamp, None)
124+
get_nym_request = build_get_nym_request(did, did, timestamp)
119125
request_couple = sdk_sign_and_send_prepared_request(
120126
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
121127
)
122128
replies = sdk_get_and_check_replies(looper, [request_couple])
123129

124130
assert (
125-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == diddoc_content
131+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == diddoc_content_json
126132
)
127133

128134
# Get previous nym data by timestamp but not exact
129135
ts = randint(timestamp + 1, update_ts - 1)
130-
get_nym_request = build_get_nym_request(did, did, ts, None)
136+
get_nym_request = build_get_nym_request(did, did, ts)
131137
request_couple = sdk_sign_and_send_prepared_request(
132138
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
133139
)
134140
replies = sdk_get_and_check_replies(looper, [request_couple])
135141

136142
assert (
137-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == diddoc_content
143+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == diddoc_content_json
138144
)
139145

140146

141147
def test_get_previous_nym_data_by_seq_no(
142148
looper, sdk_pool_handle, sdk_wallet_endorser, add_diddoc_content
143149
):
144150
_, did = sdk_wallet_endorser
151+
145152
# Get current nym data
146-
get_nym_request = build_get_nym_request(did, did, None, None)
153+
get_nym_request = build_get_nym_request(did, did)
147154
request_couple = sdk_sign_and_send_prepared_request(
148155
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
149156
)
150157
replies = sdk_get_and_check_replies(looper, [request_couple])
158+
151159
# Get seq_no from data
152160
seq_no = replies[0][1]["result"]["seqNo"]
153161

@@ -156,6 +164,7 @@ def test_get_previous_nym_data_by_seq_no(
156164
new_diddoc_content["serviceEndpoint"][0][
157165
"serviceEndpoint"
158166
] = "https://new.example.com"
167+
new_diddoc_content = json.dumps(new_diddoc_content)
159168

160169
time.sleep(3)
161170

@@ -165,25 +174,25 @@ def test_get_previous_nym_data_by_seq_no(
165174
)
166175
sdk_get_and_check_replies(looper, [request_couple])
167176

168-
get_nym_request = build_get_nym_request(did, did, None, None)
177+
get_nym_request = build_get_nym_request(did, did)
169178
request_couple = sdk_sign_and_send_prepared_request(
170179
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
171180
)
172181
replies = sdk_get_and_check_replies(looper, [request_couple])
173182

174183
assert (
175-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == new_diddoc_content
184+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == new_diddoc_content
176185
)
177186

178187
# Get previous nym data by seq_no
179-
get_nym_request = build_get_nym_request(did, did, None, seq_no)
188+
get_nym_request = build_get_nym_request(did, did, seq_no=seq_no)
180189
request_couple = sdk_sign_and_send_prepared_request(
181190
looper, sdk_wallet_endorser, sdk_pool_handle, get_nym_request
182191
)
183192
replies = sdk_get_and_check_replies(looper, [request_couple])
184193

185194
assert (
186-
json.loads(replies[0][1]["result"]["data"])["diddoc_content"] == diddoc_content
195+
json.loads(replies[0][1]["result"]["data"])["diddocContent"] == diddoc_content_json
187196
)
188197

189198

@@ -210,26 +219,6 @@ def test_add_arbitrary_property(
210219
assert replies[0][1]["result"]["txn"]["data"]["someProp"] == "someValue"
211220

212221

213-
def test_add_diddoc_content_did_context_missing_fails(
214-
looper, sdk_pool_handle, sdk_wallet_endorser, prepare_endorser
215-
):
216-
_, did = sdk_wallet_endorser
217-
diddoc_content_without_did_context = copy.deepcopy(diddoc_content)
218-
diddoc_content_without_did_context["@context"] = [
219-
"https://identity.foundation/didcomm-messaging/service-endpoint/v1"
220-
]
221-
nym_request = build_nym_request(
222-
did, did, None, diddoc_content_without_did_context, None
223-
)
224-
request_couple = sdk_sign_and_send_prepared_request(
225-
looper, sdk_wallet_endorser, sdk_pool_handle, nym_request
226-
)
227-
with pytest.raises(RequestNackedException) as e:
228-
sdk_get_and_check_replies(looper, [request_couple])
229-
e.match("InvalidClientRequest")
230-
e.match("Invalid DIDDOC_Content")
231-
232-
233222
def test_add_didoc_with_id_fails(
234223
looper, sdk_pool_handle, sdk_wallet_endorser, prepare_endorser
235224
):

0 commit comments

Comments
 (0)