Skip to content

Commit cde1bfe

Browse files
committed
🏋️‍♂️ Load tests and some minor issues
1 parent df7446b commit cde1bfe

5 files changed

Lines changed: 124 additions & 11 deletions

File tree

app/routers/petitions.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ def _generate_petition_object(petition, ci_uid=None):
106106
placeholders={"petition": petition.petition_id},
107107
)
108108
petition = zencode(
109-
CONTRACTS.APPROVE_PETITION, keys=json.dumps(issuer_verify), data=petition_req
109+
CONTRACTS.APPROVE_PETITION,
110+
keys=json.dumps(issuer_verify),
111+
data=petition_req,
112+
placeholders={"issuer_identifier": ci_uid},
110113
)
111114
return petition, ci_uid
112115

@@ -192,7 +195,7 @@ class PetitionSignature(BaseModel):
192195
tags=["Petitions"],
193196
summary="Adds a petition signature to the petition object (signs a petition)",
194197
)
195-
async def sign(petition_id: str, signature: PetitionSignature, expand: bool = False):
198+
def sign(petition_id: str, signature: PetitionSignature, expand: bool = False):
196199
p = Petition.by_pid(petition_id)
197200
if not p:
198201
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="Petition not Found")
@@ -201,6 +204,7 @@ async def sign(petition_id: str, signature: PetitionSignature, expand: bool = Fa
201204
petition = zencode(
202205
CONTRACTS.ADD_SIGNATURE, keys=p.petition, data=signature.json()
203206
)
207+
json.loads(petition)
204208
p.petition = petition
205209
DBSession.commit()
206210
except Error as e:
@@ -224,7 +228,7 @@ class TallyBody(BaseModel):
224228
tags=["Petitions"],
225229
summary="Tally a petition, just by tally admins",
226230
)
227-
async def tally(
231+
def tally(
228232
petition_id: str,
229233
authorizable_attribute: TallyBody = Body(...),
230234
expand: bool = False,
@@ -254,7 +258,7 @@ async def tally(
254258
tags=["Petitions"],
255259
summary="Count the signs of a tallied petition",
256260
)
257-
async def count(petition_id: str):
261+
def count(petition_id: str):
258262
p = Petition.by_pid(petition_id)
259263
if not p:
260264
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="Petition not Found")

app/utils/helpers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,5 @@ def zencode(name, keys=None, data=None, placeholders={}):
108108
debug("+" * 50)
109109

110110
result, _ = zenroom.execute(script=script, keys=k, data=a)
111+
111112
return result.decode()

tests/conftest.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
from app.main import api
55
from app.model import Base, engine
6+
from app.utils.helpers import debug
7+
8+
AAID = "aa_test_2"
69

710

811
def pytest_addoption(parser):
@@ -18,6 +21,7 @@ def pytest_addoption(parser):
1821
def client(request):
1922
def fn():
2023
Base.metadata.drop_all(bind=engine)
24+
debug("FINISH")
2125

2226
request.addfinalizer(fn)
2327
return TestClient(api)

tests/test_load_and_stress.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import json
2+
3+
import requests
4+
from bunch import Bunch
5+
from environs import Env
6+
from starlette.testclient import TestClient
7+
8+
from app.main import api
9+
from app.routers.petitions import _retrieve_verification_key
10+
from app.utils.helpers import zencode, CONTRACTS
11+
from tests.conftest import AAID
12+
13+
env = Env()
14+
env.read_env()
15+
16+
17+
def auth():
18+
client = TestClient(api)
19+
r = client.post(
20+
"/token", data=dict(username="demo", password="demo", grant_type="password")
21+
)
22+
return r.json()["access_token"]
23+
24+
25+
def petition_auth():
26+
client = TestClient(api)
27+
r = client.post(
28+
"/token",
29+
data=dict(username="demotally", password="demotally", grant_type="password"),
30+
)
31+
return r.json()["access_token"]
32+
33+
34+
def _get_token(url):
35+
r = requests.post(
36+
f"{url}/token",
37+
data={
38+
"username": env("CREDENTIAL_ISSUER_USERNAME"),
39+
"password": env("CREDENTIAL_ISSUER_PASSWORD"),
40+
},
41+
)
42+
return r.json()["access_token"]
43+
44+
45+
def stress_sign_petition():
46+
client = TestClient(api)
47+
petition = Bunch(
48+
petition_id="petition",
49+
credential_issuer_url="http://localhost:5000",
50+
authorizable_attribute_id=AAID,
51+
credential_issuer_petition_value=[
52+
{"name": "zip_code", "value": "08001"},
53+
{"name": "email", "value": "puria@example.com"},
54+
],
55+
)
56+
57+
r = client.post(
58+
"/petitions/",
59+
json=petition,
60+
headers={"Authorization": f"Bearer {petition_auth()}"},
61+
)
62+
63+
assert r.status_code == 200
64+
assert petition.petition_id in r.json()
65+
66+
vk = _retrieve_verification_key(petition)
67+
url = petition.credential_issuer_url
68+
value = petition.credential_issuer_petition_value
69+
70+
for _ in range(500):
71+
print(f"SIGNING #{_}")
72+
keys = zencode(CONTRACTS.CITIZEN_KEYGEN)
73+
blind_sign_request = zencode(CONTRACTS.CITIZEN_REQ_BLIND_SIG, keys=keys)
74+
data = dict(
75+
authorizable_attribute_id=AAID,
76+
blind_sign_request=json.loads(blind_sign_request),
77+
optional_values=[],
78+
values=value,
79+
)
80+
print(data)
81+
r = requests.post(
82+
f"{url}/credential/",
83+
json=data,
84+
headers={"Authorization": f"Bearer {_get_token(url)}"},
85+
)
86+
credential_request = json.dumps(r.json())
87+
credential = zencode(
88+
CONTRACTS.AGGREGATE_CREDENTIAL, keys=keys, data=credential_request
89+
)
90+
petition_signature = zencode(
91+
CONTRACTS.SIGN_PETITION,
92+
keys=credential,
93+
data=json.dumps(vk),
94+
placeholders={"petition": petition.petition_id},
95+
)
96+
97+
r = client.post(
98+
f"/petitions/{petition.petition_id}/sign",
99+
headers={"Authorization": "Bearer %s" % auth()},
100+
json=json.loads(petition_signature),
101+
)
102+
103+
assert r.status_code == 200

tests/test_petition.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from app.model.petition import Petition
77
from app.routers.petitions import _retrieve_verification_key, _retrieve_credential
88
from app.utils.helpers import zencode, CONTRACTS
9+
from tests.conftest import AAID
910

1011

1112
def auth():
@@ -31,7 +32,7 @@ def test_create_petition(client):
3132
json=dict(
3233
petition_id="petition",
3334
credential_issuer_url="https://credentials.decodeproject.eu",
34-
authorizable_attribute_id="aa_test",
35+
authorizable_attribute_id=AAID,
3536
credential_issuer_petition_value=[
3637
{"name": "zip_code", "value": "08001"},
3738
{"name": "email", "value": "puria@example.com"},
@@ -71,7 +72,7 @@ def test_not_found_ci_server(client):
7172
json=dict(
7273
petition_id="petition",
7374
credential_issuer_url="https://supernonexistent.zzz",
74-
authorizable_attribute_id="aa_test",
75+
authorizable_attribute_id=AAID,
7576
credential_issuer_petition_value=[],
7677
),
7778
headers={"Authorization": "Bearer %s" % petition_auth()},
@@ -86,7 +87,7 @@ def test_duplicate_create_petition(client):
8687
json=dict(
8788
petition_id="petition",
8889
credential_issuer_url="https://credentials.decodeproject.eu",
89-
authorizable_attribute_id="aa_test",
90+
authorizable_attribute_id=AAID,
9091
credential_issuer_petition_value=[
9192
{"name": "zip_code", "value": "08001"},
9293
{"name": "email", "value": "puria@example.com"},
@@ -102,7 +103,7 @@ def test_sign(client):
102103
petition = Bunch(
103104
petition_id="petition",
104105
credential_issuer_url="https://credentials.decodeproject.eu",
105-
authorizable_attribute_id="aa_test",
106+
authorizable_attribute_id=AAID,
106107
credential_issuer_petition_value=[
107108
{"name": "zip_code", "value": "08001"},
108109
{"name": "email", "value": "puria@example.com"},
@@ -140,7 +141,7 @@ def test_duplicate_sign(client):
140141
petition = Bunch(
141142
petition_id="petition",
142143
credential_issuer_url="https://credentials.decodeproject.eu",
143-
authorizable_attribute_id="aa_test",
144+
authorizable_attribute_id=AAID,
144145
credential_issuer_petition_value=[
145146
{"name": "zip_code", "value": "08001"},
146147
{"name": "email", "value": "puria@example.com"},
@@ -170,7 +171,7 @@ def test_duplicate_sign(client):
170171
def test_tally(client):
171172
r = client.post(
172173
"/petitions/petition/tally",
173-
json=dict(authorizable_attribute_id="aa_test"),
174+
json=dict(authorizable_attribute_id=AAID),
174175
headers={"Authorization": f"Bearer {petition_auth()}"},
175176
)
176177
assert r.status_code == 200
@@ -180,7 +181,7 @@ def test_tally(client):
180181
def test_auth_tally(client, mocker):
181182
r = client.post(
182183
"/petitions/petition/tally",
183-
json=dict(authorizable_attribute_id="aa_test"),
184+
json=dict(authorizable_attribute_id=AAID),
184185
headers={"Authorization": f"Bearer {auth()}"},
185186
)
186187
assert r.status_code == 401

0 commit comments

Comments
 (0)