Skip to content

Commit

Permalink
Integrate device name and public-key to registration, test create
Browse files Browse the repository at this point in the history
  • Loading branch information
EnTeQuAk committed Mar 20, 2016
1 parent c0bd43d commit 62d7470
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 2 deletions.
23 changes: 22 additions & 1 deletion src/keybar/api/serializers/registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,42 @@
from rest_framework import serializers

from keybar.models.user import User
from keybar.models.device import Device
from keybar.utils.crypto import load_public_key


class RegisterSerializer(serializers.ModelSerializer):
device_name = serializers.CharField(max_length=256, required=False)
public_key = serializers.CharField(required=True)

class Meta:
model = User
fields = ('email', 'password')
fields = ('email', 'password', 'device_name', 'public_key')

def validate_password(self, password):
password_validation.validate_password(password)
return password

def validate_public_key(self, public_key):
try:
loaded = load_public_key(public_key)
except ValueError:
raise serializers.ValidationError('Invalid public key')

return public_key

def create(self, validated_data):
password = validated_data.pop('password')
public_key = validated_data.pop('public_key')
device_name = validated_data.pop('device_name', '')

user = User(**validated_data)
user.set_password(password)
user.save()

Device.objects.create(
public_key=public_key,
name=device_name,
user=user,
authorized=True)
return user
31 changes: 30 additions & 1 deletion src/keybar/tests/api/serializers/test_registration.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import pytest

from keybar.api.serializers.registration import RegisterSerializer
from keybar.tests.factories.device import PUBLIC_KEY
from keybar.utils.crypto import serialize_public_key


@pytest.mark.django_db
class TestRegisterSerializer:

def test_requires_email(self):
serializer = RegisterSerializer(data={
'password': 'supersafepassword',
'public_key': serialize_public_key(PUBLIC_KEY)
})

assert not serializer.is_valid()
Expand All @@ -16,15 +20,26 @@ def test_requires_email(self):
def test_requires_password(self):
serializer = RegisterSerializer(data={
'email': 'foo@bar.com',
'public_key': serialize_public_key(PUBLIC_KEY)
})

assert not serializer.is_valid()
assert serializer.errors == {'password': ['This field is required.']}

def test_requires_public_key(self):
serializer = RegisterSerializer(data={
'email': 'foo@bar.com',
'password': 'supersafepassword',
})

assert not serializer.is_valid()
assert serializer.errors == {'public_key': ['This field is required.']}

def test_validates_password(self):
serializer = RegisterSerializer(data={
'password': 'short',
'email': 'foo@bar.com'
'email': 'foo@bar.com',
'public_key': serialize_public_key(PUBLIC_KEY)
})

assert not serializer.is_valid()
Expand All @@ -36,3 +51,17 @@ def test_validates_password(self):
'least 10 characters.'
]
}

def test_create(self):
serializer = RegisterSerializer(data={
'password': 'supersafepassword',
'email': 'foo@bar.com',
'public_key': serialize_public_key(PUBLIC_KEY),
})

assert serializer.is_valid()

user = serializer.save()
assert user.email == 'foo@bar.com'
assert user.devices.count() == 1
assert user.devices.first().fingerprint == 'e777 c552 5bab 7d95 58dc bb8d 6cd5 daf0'

0 comments on commit 62d7470

Please sign in to comment.