Browse Source

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>
pull/13907/head
Teomor Szczurek 5 years ago
committed by GitHub
parent
commit
970a182ec8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      {{cookiecutter.project_slug}}/backend/app/app/schemas/user.py
  2. 14
      {{cookiecutter.project_slug}}/backend/app/app/tests/api/api_v1/test_users.py
  3. 18
      {{cookiecutter.project_slug}}/backend/app/app/tests/crud/test_user.py
  4. 4
      {{cookiecutter.project_slug}}/backend/app/app/tests/utils/user.py
  5. 5
      {{cookiecutter.project_slug}}/backend/app/app/tests/utils/utils.py
  6. 2
      {{cookiecutter.project_slug}}/backend/backend.dockerfile
  7. 2
      {{cookiecutter.project_slug}}/backend/celeryworker.dockerfile
  8. 2
      {{cookiecutter.project_slug}}/backend/tests.dockerfile

6
{{cookiecutter.project_slug}}/backend/app/app/schemas/user.py

@ -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

14
{{cookiecutter.project_slug}}/backend/app/app/tests/api/api_v1/test_users.py

@ -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)

18
{{cookiecutter.project_slug}}/backend/app/app/tests/crud/test_user.py

@ -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
{{cookiecutter.project_slug}}/backend/app/app/tests/utils/user.py

@ -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)

5
{{cookiecutter.project_slug}}/backend/app/app/tests/utils/utils.py

@ -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

2
{{cookiecutter.project_slug}}/backend/backend.dockerfile

@ -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:

2
{{cookiecutter.project_slug}}/backend/celeryworker.dockerfile

@ -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:

2
{{cookiecutter.project_slug}}/backend/tests.dockerfile

@ -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:

Loading…
Cancel
Save