Add email validation (#40)

* modify tests

*  Add email-validator to Dockerfiles

* ♻️ Update random email generation

* ♻️ Re-apply email validation after rebase

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
Teomor Szczurek
2020-04-06 11:36:29 +02:00
committed by GitHub
parent 1d8678235d
commit 970a182ec8
8 changed files with 28 additions and 25 deletions

View File

@@ -1,11 +1,11 @@
from typing import Optional
from pydantic import BaseModel
from pydantic import BaseModel, EmailStr
# Shared properties
class UserBase(BaseModel):
email: Optional[str] = None
email: Optional[EmailStr] = None
is_active: Optional[bool] = True
is_superuser: Optional[bool] = False
full_name: Optional[str] = None
@@ -20,7 +20,7 @@ class UserBaseInDB(UserBase):
# Properties to receive via API on creation
class UserCreate(UserBaseInDB):
email: str
email: EmailStr
password: str

View File

@@ -4,7 +4,7 @@ from app import crud
from app.core import config
from app.db.session import db_session
from app.schemas.user import UserCreate
from app.tests.utils.utils import get_server_api, random_lower_string
from app.tests.utils.utils import get_server_api, random_lower_string, random_email
def test_get_users_superuser_me(superuser_token_headers):
@@ -33,7 +33,7 @@ def test_get_users_normal_user_me(normal_user_token_headers):
def test_create_user_new_email(superuser_token_headers):
server_api = get_server_api()
username = random_lower_string()
username = random_email()
password = random_lower_string()
data = {"email": username, "password": password}
r = requests.post(
@@ -49,7 +49,7 @@ def test_create_user_new_email(superuser_token_headers):
def test_get_existing_user(superuser_token_headers):
server_api = get_server_api()
username = random_lower_string()
username = random_email()
password = random_lower_string()
user_in = UserCreate(email=username, password=password)
user = crud.user.create(db_session, obj_in=user_in)
@@ -66,7 +66,7 @@ def test_get_existing_user(superuser_token_headers):
def test_create_user_existing_username(superuser_token_headers):
server_api = get_server_api()
username = random_lower_string()
username = random_email()
# username = email
password = random_lower_string()
user_in = UserCreate(email=username, password=password)
@@ -84,7 +84,7 @@ def test_create_user_existing_username(superuser_token_headers):
def test_create_user_by_normal_user(normal_user_token_headers):
server_api = get_server_api()
username = random_lower_string()
username = random_email()
password = random_lower_string()
data = {"email": username, "password": password}
r = requests.post(
@@ -97,12 +97,12 @@ def test_create_user_by_normal_user(normal_user_token_headers):
def test_retrieve_users(superuser_token_headers):
server_api = get_server_api()
username = random_lower_string()
username = random_email()
password = random_lower_string()
user_in = UserCreate(email=username, password=password)
user = crud.user.create(db_session, obj_in=user_in)
username2 = random_lower_string()
username2 = random_email()
password2 = random_lower_string()
user_in2 = UserCreate(email=username2, password=password2)
crud.user.create(db_session, obj_in=user_in2)

View File

@@ -3,11 +3,11 @@ from fastapi.encoders import jsonable_encoder
from app import crud
from app.db.session import db_session
from app.schemas.user import UserCreate
from app.tests.utils.utils import random_lower_string
from app.tests.utils.utils import random_lower_string, random_email
def test_create_user():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password)
user = crud.user.create(db_session, obj_in=user_in)
@@ -16,7 +16,7 @@ def test_create_user():
def test_authenticate_user():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password)
user = crud.user.create(db_session, obj_in=user_in)
@@ -28,14 +28,14 @@ def test_authenticate_user():
def test_not_authenticate_user():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user = crud.user.authenticate(db_session, email=email, password=password)
assert user is None
def test_check_if_user_is_active():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password)
user = crud.user.create(db_session, obj_in=user_in)
@@ -44,7 +44,7 @@ def test_check_if_user_is_active():
def test_check_if_user_is_active_inactive():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password, disabled=True)
user = crud.user.create(db_session, obj_in=user_in)
@@ -53,7 +53,7 @@ def test_check_if_user_is_active_inactive():
def test_check_if_user_is_superuser():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password, is_superuser=True)
user = crud.user.create(db_session, obj_in=user_in)
@@ -62,7 +62,7 @@ def test_check_if_user_is_superuser():
def test_check_if_user_is_superuser_normal_user():
username = random_lower_string()
username = random_email()
password = random_lower_string()
user_in = UserCreate(email=username, password=password)
user = crud.user.create(db_session, obj_in=user_in)
@@ -72,7 +72,7 @@ def test_check_if_user_is_superuser_normal_user():
def test_get_user():
password = random_lower_string()
username = random_lower_string()
username = random_email()
user_in = UserCreate(email=username, password=password, is_superuser=True)
user = crud.user.create(db_session, obj_in=user_in)
user_2 = crud.user.get(db_session, id=user.id)

View File

@@ -4,7 +4,7 @@ from app import crud
from app.core import config
from app.db.session import db_session
from app.schemas.user import UserCreate, UserUpdate
from app.tests.utils.utils import get_server_api, random_lower_string
from app.tests.utils.utils import get_server_api, random_lower_string, random_email
def user_authentication_headers(server_api, email, password):
@@ -18,7 +18,7 @@ def user_authentication_headers(server_api, email, password):
def create_random_user():
email = random_lower_string()
email = random_email()
password = random_lower_string()
user_in = UserCreate(username=email, email=email, password=password)
user = crud.user.create(db_session=db_session, obj_in=user_in)

View File

@@ -2,7 +2,6 @@ import random
import string
import requests
from app.core import config
@@ -10,6 +9,10 @@ def random_lower_string():
return "".join(random.choices(string.ascii_lowercase, k=32))
def random_email():
return f"{random_lower_string()}@{random_lower_string()}.com"
def get_server_api():
server_name = f"http://{config.SERVER_NAME}"
return server_name

View File

@@ -1,6 +1,6 @@
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
RUN pip install celery~=4.3 passlib[bcrypt] tenacity requests emails "fastapi>=0.47.0" "uvicorn>=0.11.1" gunicorn pyjwt python-multipart email_validator jinja2 psycopg2-binary alembic SQLAlchemy
RUN pip install celery~=4.3 passlib[bcrypt] tenacity requests emails "fastapi>=0.47.0" "uvicorn>=0.11.1" gunicorn pyjwt python-multipart email_validator jinja2 psycopg2-binary alembic SQLAlchemy email_validator
# For development, Jupyter remote kernel, Hydrogen
# Using inside the container:

View File

@@ -1,6 +1,6 @@
FROM python:3.7
RUN pip install raven celery~=4.3 passlib[bcrypt] tenacity requests "fastapi>=0.16.0" emails pyjwt email_validator jinja2 psycopg2-binary alembic SQLAlchemy
RUN pip install raven celery~=4.3 passlib[bcrypt] tenacity requests "fastapi>=0.16.0" emails pyjwt email_validator jinja2 psycopg2-binary alembic SQLAlchemy email_validator
# For development, Jupyter remote kernel, Hydrogen
# Using inside the container:

View File

@@ -1,6 +1,6 @@
FROM python:3.7
RUN pip install requests pytest tenacity passlib[bcrypt] "fastapi>=0.16.0" psycopg2-binary SQLAlchemy
RUN pip install requests pytest tenacity passlib[bcrypt] "fastapi>=0.16.0" psycopg2-binary SQLAlchemy email_validator
# For development, Jupyter remote kernel, Hydrogen
# Using inside the container: