✨ 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 typing import Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, EmailStr
|
||||||
|
|
||||||
|
|
||||||
# Shared properties
|
# Shared properties
|
||||||
class UserBase(BaseModel):
|
class UserBase(BaseModel):
|
||||||
email: Optional[str] = None
|
email: Optional[EmailStr] = None
|
||||||
is_active: Optional[bool] = True
|
is_active: Optional[bool] = True
|
||||||
is_superuser: Optional[bool] = False
|
is_superuser: Optional[bool] = False
|
||||||
full_name: Optional[str] = None
|
full_name: Optional[str] = None
|
||||||
@@ -20,7 +20,7 @@ class UserBaseInDB(UserBase):
|
|||||||
|
|
||||||
# Properties to receive via API on creation
|
# Properties to receive via API on creation
|
||||||
class UserCreate(UserBaseInDB):
|
class UserCreate(UserBaseInDB):
|
||||||
email: str
|
email: EmailStr
|
||||||
password: str
|
password: str
|
||||||
|
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ from app import crud
|
|||||||
from app.core import config
|
from app.core import config
|
||||||
from app.db.session import db_session
|
from app.db.session import db_session
|
||||||
from app.schemas.user import UserCreate
|
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):
|
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):
|
def test_create_user_new_email(superuser_token_headers):
|
||||||
server_api = get_server_api()
|
server_api = get_server_api()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
data = {"email": username, "password": password}
|
data = {"email": username, "password": password}
|
||||||
r = requests.post(
|
r = requests.post(
|
||||||
@@ -49,7 +49,7 @@ def test_create_user_new_email(superuser_token_headers):
|
|||||||
|
|
||||||
def test_get_existing_user(superuser_token_headers):
|
def test_get_existing_user(superuser_token_headers):
|
||||||
server_api = get_server_api()
|
server_api = get_server_api()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=username, password=password)
|
user_in = UserCreate(email=username, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
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):
|
def test_create_user_existing_username(superuser_token_headers):
|
||||||
server_api = get_server_api()
|
server_api = get_server_api()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
# username = email
|
# username = email
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=username, password=password)
|
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):
|
def test_create_user_by_normal_user(normal_user_token_headers):
|
||||||
server_api = get_server_api()
|
server_api = get_server_api()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
data = {"email": username, "password": password}
|
data = {"email": username, "password": password}
|
||||||
r = requests.post(
|
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):
|
def test_retrieve_users(superuser_token_headers):
|
||||||
server_api = get_server_api()
|
server_api = get_server_api()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=username, password=password)
|
user_in = UserCreate(email=username, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
user = crud.user.create(db_session, obj_in=user_in)
|
||||||
|
|
||||||
username2 = random_lower_string()
|
username2 = random_email()
|
||||||
password2 = random_lower_string()
|
password2 = random_lower_string()
|
||||||
user_in2 = UserCreate(email=username2, password=password2)
|
user_in2 = UserCreate(email=username2, password=password2)
|
||||||
crud.user.create(db_session, obj_in=user_in2)
|
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 import crud
|
||||||
from app.db.session import db_session
|
from app.db.session import db_session
|
||||||
from app.schemas.user import UserCreate
|
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():
|
def test_create_user():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=email, password=password)
|
user_in = UserCreate(email=email, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
user = crud.user.create(db_session, obj_in=user_in)
|
||||||
@@ -16,7 +16,7 @@ def test_create_user():
|
|||||||
|
|
||||||
|
|
||||||
def test_authenticate_user():
|
def test_authenticate_user():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=email, password=password)
|
user_in = UserCreate(email=email, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
user = crud.user.create(db_session, obj_in=user_in)
|
||||||
@@ -28,14 +28,14 @@ def test_authenticate_user():
|
|||||||
|
|
||||||
|
|
||||||
def test_not_authenticate_user():
|
def test_not_authenticate_user():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user = crud.user.authenticate(db_session, email=email, password=password)
|
user = crud.user.authenticate(db_session, email=email, password=password)
|
||||||
assert user is None
|
assert user is None
|
||||||
|
|
||||||
|
|
||||||
def test_check_if_user_is_active():
|
def test_check_if_user_is_active():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=email, password=password)
|
user_in = UserCreate(email=email, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
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():
|
def test_check_if_user_is_active_inactive():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=email, password=password, disabled=True)
|
user_in = UserCreate(email=email, password=password, disabled=True)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
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():
|
def test_check_if_user_is_superuser():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=email, password=password, is_superuser=True)
|
user_in = UserCreate(email=email, password=password, is_superuser=True)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
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():
|
def test_check_if_user_is_superuser_normal_user():
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(email=username, password=password)
|
user_in = UserCreate(email=username, password=password)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
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():
|
def test_get_user():
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
username = random_lower_string()
|
username = random_email()
|
||||||
user_in = UserCreate(email=username, password=password, is_superuser=True)
|
user_in = UserCreate(email=username, password=password, is_superuser=True)
|
||||||
user = crud.user.create(db_session, obj_in=user_in)
|
user = crud.user.create(db_session, obj_in=user_in)
|
||||||
user_2 = crud.user.get(db_session, id=user.id)
|
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.core import config
|
||||||
from app.db.session import db_session
|
from app.db.session import db_session
|
||||||
from app.schemas.user import UserCreate, UserUpdate
|
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):
|
def user_authentication_headers(server_api, email, password):
|
||||||
@@ -18,7 +18,7 @@ def user_authentication_headers(server_api, email, password):
|
|||||||
|
|
||||||
|
|
||||||
def create_random_user():
|
def create_random_user():
|
||||||
email = random_lower_string()
|
email = random_email()
|
||||||
password = random_lower_string()
|
password = random_lower_string()
|
||||||
user_in = UserCreate(username=email, email=email, password=password)
|
user_in = UserCreate(username=email, email=email, password=password)
|
||||||
user = crud.user.create(db_session=db_session, obj_in=user_in)
|
user = crud.user.create(db_session=db_session, obj_in=user_in)
|
||||||
|
@@ -2,7 +2,6 @@ import random
|
|||||||
import string
|
import string
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from app.core import config
|
from app.core import config
|
||||||
|
|
||||||
|
|
||||||
@@ -10,6 +9,10 @@ def random_lower_string():
|
|||||||
return "".join(random.choices(string.ascii_lowercase, k=32))
|
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():
|
def get_server_api():
|
||||||
server_name = f"http://{config.SERVER_NAME}"
|
server_name = f"http://{config.SERVER_NAME}"
|
||||||
return server_name
|
return server_name
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
|
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
|
# For development, Jupyter remote kernel, Hydrogen
|
||||||
# Using inside the container:
|
# Using inside the container:
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
FROM python:3.7
|
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
|
# For development, Jupyter remote kernel, Hydrogen
|
||||||
# Using inside the container:
|
# Using inside the container:
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
FROM python:3.7
|
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
|
# For development, Jupyter remote kernel, Hydrogen
|
||||||
# Using inside the container:
|
# Using inside the container:
|
||||||
|
Reference in New Issue
Block a user