Skip to content

Commit

Permalink
✨ Add email validation (#40)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
Teomor Szczurek and tiangolo authored Apr 6, 2020
1 parent 1d86782 commit 970a182
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 25 deletions.
6 changes: 3 additions & 3 deletions {{cookiecutter.project_slug}}/backend/app/app/schemas/user.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -20,7 +20,7 @@ class Config:

# Properties to receive via API on creation
class UserCreate(UserBaseInDB):
email: str
email: EmailStr
password: str


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
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):
Expand Down Expand Up @@ -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(
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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(
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
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):
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@
import string

import requests

from app.core import config


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
Expand Down
2 changes: 1 addition & 1 deletion {{cookiecutter.project_slug}}/backend/backend.dockerfile
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion {{cookiecutter.project_slug}}/backend/tests.dockerfile
Original file line number Diff line number Diff line change
@@ -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:
Expand Down

1 comment on commit 970a182

@airibarne
Copy link
Contributor

@airibarne airibarne commented on 970a182 Apr 6, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

email_validator was already on both backend and celeryworker dockerfiles pip install's, and now it appears twice!

Please sign in to comment.