add some tests to the forms, utils and validators

This commit is contained in:
Gonçalo Valério 2019-11-25 19:10:04 +00:00
parent c5d68aa1f8
commit 0faf45d9d5
3 changed files with 131 additions and 0 deletions

69
tests/test_forms.py Normal file
View File

@ -0,0 +1,69 @@
from unittest.mock import MagicMock, patch
from django.contrib.auth import get_user_model
import pytest
from model_mommy import mommy
from django_cryptolock.forms import SimpleLoginForm, SimpleSignUpForm
VALID_ADDRESS = "46fYuhPAdsxMbEeMg97LhSbFPamdiCw7C6b19VEcZSmV6xboWFZuZQ9MTbj1wLszhUExHi63CMtsWjDTrRDqegZiPVebgYq"
User = get_user_model()
def test_simpleloginform_generates_new_challenge():
request = MagicMock()
initial = {}
request.session.__setitem__.side_effect = initial.__setitem__
request.session.__getitem__.side_effect = initial.__getitem__
form = SimpleLoginForm(request=request)
assert form.initial.get("challenge")
assert initial["current_challenge"] == form.initial.get("challenge")
def test_simpleloginform_generates_no_new_challenge():
request = MagicMock()
initial = {}
request.session.__setitem__.side_effect = initial.__setitem__
request.session.__getitem__.side_effect = initial.__getitem__
form = SimpleLoginForm(request=request, data={"address": ""})
assert not form.initial.get("challenge")
assert not initial.get("current_challenge")
@pytest.mark.django_db
def test_simpleloginform_valid_data(settings):
settings.DJCL_MONERO_NETWORK = "mainnet"
request = MagicMock()
form = SimpleLoginForm(
request=request,
data={
"address": VALID_ADDRESS,
"challenge": "12345678",
"signature": "some valid signature",
},
)
with patch("django_cryptolock.forms.authenticate") as auth_mock:
auth_mock.return_value = mommy.make(User)
request.session.get.return_value = "12345678"
assert form.is_valid()
def test_simplesignupform_generaes_new_challenge():
request = MagicMock()
initial = {}
request.session.__setitem__.side_effect = initial.__setitem__
request.session.__getitem__.side_effect = initial.__getitem__
form = SimpleSignUpForm(request=request)
assert form.initial.get("challenge")
assert initial["current_challenge"] == form.initial.get("challenge")
def test_simplesignupform_generaes_no_new_challenge():
request = MagicMock()
initial = {}
request.session.__setitem__.side_effect = initial.__setitem__
request.session.__getitem__.side_effect = initial.__getitem__
form = SimpleSignUpForm(request=request, data={"address": ""})
assert not form.initial.get("challenge")
assert not initial.get("current_challenge")

9
tests/test_utils.py Normal file
View File

@ -0,0 +1,9 @@
import pytest
from model_mommy import mommy
from django_cryptolock.utils import generate_challenge
def test_challenge_has_8_bytes():
challenge = generate_challenge()
assert len(bytes.fromhex(challenge)) == 8

53
tests/test_validators.py Normal file
View File

@ -0,0 +1,53 @@
from django.core.exceptions import ValidationError
import pytest
from django_cryptolock.validators import validate_monero_address
@pytest.mark.parametrize(
"network,address",
[
(
"mainnet",
"46fYuhPAdsxMbEeMg97LhSbFPamdiCw7C6b19VEcZSmV6xboWFZuZQ9MTbj1wLszhUExHi63CMtsWjDTrRDqegZiPVebgYq",
),
(
"stagenet",
"5A2uBqpNg7E4cYzA7bhXeuP9C2qSeUAtDhUScFgTBJWMUNJd9yZJxwDHg8sPVPBBx7JJFYqxDSbb7HFz2w8dttVJKW5Yipp",
),
(
"testnet",
"9waU7xxRYbC2HkKV2k4dzPjEYwkYDiHmfELLUkS8vegVLEYkk2dk3X5JJZtURNthsaDh8zL5SYAp8VXMzqvRYptgGTYNpEn",
),
],
)
def test_valid_address(network, address, settings):
settings.DJCL_MONERO_NETWORK = network
assert validate_monero_address(address) is None
@pytest.mark.parametrize(
"network,address",
[
(
"mainnet",
"9waU7xxRYbC2HkKV2k4dzPjEYwkYDiHmfELLUkS8vegVLEYkk2dk3X5JJZtURNthsaDh8zL5SYAp8VXMzqvRYptgGTYNpEn",
),
(
"stagenet",
"46fYuhPAdsxMbEeMg97LhSbFPamdiCw7C6b19VEcZSmV6xboWFZuZQ9MTbj1wLszhUExHi63CMtsWjDTrRDqegZiPVebgYq",
),
(
"testnet",
"5A2uBqpNg7E4cYzA7bhXeuP9C2qSeUAtDhUScFgTBJWMUNJd9yZJxwDHg8sPVPBBx7JJFYqxDSbb7HFz2w8dttVJKW5Yipp",
),
],
)
def test_invalid_address(network, address, settings):
settings.DJCL_MONERO_NETWORK = network
with pytest.raises(ValidationError) as error:
validate_monero_address(address)
assert f"Invalid address for {network}" in str(error.value)