async def test_balance(client, create_account, make_transfer, currency): acc1 = await create_account(test_key) # check initial account balance response = await client.get('/balance', headers={ 'X-Token': create_token(test_key).decode() }) assert response.status_code == 200 assert response.json()['balance'] == 0 # fill acc1 await Account.create( address='deposit', pub_key=test_deposit_key.publickey().export_key().decode(), type=AccountType.passive ) response = await make_transfer(test_deposit_key, acc1, '1.00', currency) assert response.status_code == 200 # check balance changed after filled response = await client.get('/balance', headers={ 'X-Token': create_token(test_key).decode() }) assert response.status_code == 200 assert response.json()['balance'] == 1
async def test_race_condition(make_transfer, create_account, currency, client): # create account # fill account # create N tasks and start them in parallel # TODO: check if last view line covered acc1 = await create_account(test_key) acc2 = await create_account(test_key2) await Account.create( address='deposit', pub_key=test_deposit_key.publickey().export_key().decode(), type=AccountType.passive ) await make_transfer(test_deposit_key, acc1, '1.00', currency) await asyncio.gather(*[ make_transfer(test_key, acc2, '1.00', currency, ignore_failed=True) for _ in range(10) ]) response = await client.get('/balance', headers={ 'X-Token': create_token(test_key).decode() }) assert response.status_code == 200, "Wrong status %s" % response.content assert response.json()['balance'] == 0 response = await client.get('/balance', headers={ 'X-Token': create_token(test_key2).decode() }) assert response.status_code == 200, "Wrong status %s" % response.content assert response.json()['balance'] == 1
async def test_unregistered_pub_key(client, currency, create_account): acc2 = await create_account(test_key2) response = await client.post("/transfer/", json={ 'receiver': acc2, 'currency': currency.symbol, 'amount': '1.00' }, headers={ 'X-Token': create_token(test_key).decode() }) assert response.status_code == 403
async def _make_transfer(sender_key, to_account, amount, currency, ignore_failed=False): response = await client.post("/transfer/", json={ 'receiver': to_account, 'currency': currency.symbol, 'amount': amount }, headers={ 'X-Token': create_token(sender_key).decode() }) if not ignore_failed: assert response.status_code == 200, "Invalid status code %s" % response.content return response
async def test_transfer_invalid_currency(client, create_account): await create_account(test_key) to_account = await create_account(test_key2) response = await client.post("/transfer/", json={ 'receiver': to_account, 'currency': 'INVALID', 'amount': '1.00' }, headers={ 'X-Token': create_token(test_key).decode() }) assert response.status_code == 400, "Should fail with invalid currency: %s" % response.content return response
async def test_invalid_token_sign(client, create_account, currency): acc1 = await create_account(test_key) await create_account(test_key2) response = await client.post("/transfer/", json={ 'receiver': acc1, 'currency': currency.symbol, 'amount': '1.00' }, headers={ 'X-Token': create_token(test_key2, signature='123').decode() }) assert response.status_code == 403