✨ 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:
@@ -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
|
||||
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user