Fix test setup for backend

This commit is contained in:
lvrossem 2023-04-06 14:10:31 -06:00
parent 5528ae8519
commit 78138e83c7
16 changed files with 121 additions and 26 deletions

View File

@ -1,3 +1,7 @@
flake8 src/* flake8 src/*
black src/* black src/*
isort src/* isort src/*
flake8 tests/*
black tests/*
isort tests/*

View File

@ -12,3 +12,4 @@ python-jose[cryptography]
passlib passlib
jwt jwt
PyJWT PyJWT
pytest-asyncio

0
src/__init__.py Normal file
View File

View File

@ -5,9 +5,9 @@ from fastapi import Depends, HTTPException
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from crud.users import get_user_by_username, pwd_context from src.crud.users import get_user_by_username, pwd_context
from models import User from src.models import User
from schemas.users import UserCreate from src.schemas.users import UserCreate
DEFAULT_NR_HIGH_SCORES = 10 DEFAULT_NR_HIGH_SCORES = 10

View File

@ -1,9 +1,9 @@
from fastapi import HTTPException from fastapi import HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from enums import CourseEnum, course_enum_list from src.enums import CourseEnum, course_enum_list
from models import CourseProgress, User from src.models import CourseProgress, User
from schemas.courseprogress import CourseProgressBase from src.schemas.courseprogress import CourseProgressBase
def get_course_progress(db: Session, user: User, course: CourseEnum): def get_course_progress(db: Session, user: User, course: CourseEnum):

View File

@ -2,10 +2,10 @@ from fastapi import HTTPException
from sqlalchemy import desc from sqlalchemy import desc
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from enums import MinigameEnum from src.enums import MinigameEnum
from models import HighScore, User from src.models import HighScore, User
from schemas.highscores import HighScoreBase from src.schemas.highscores import HighScoreBase
from schemas.users import UserHighScore from src.schemas.users import UserHighScore
def get_high_scores(db: Session, minigame: MinigameEnum, nr_highest: int): def get_high_scores(db: Session, minigame: MinigameEnum, nr_highest: int):

View File

@ -2,8 +2,8 @@ from fastapi import HTTPException
from passlib.context import CryptContext from passlib.context import CryptContext
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from models import User from src.models import User
from schemas.users import UserCreate from src.schemas.users import UserCreate
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

View File

@ -1,18 +1,21 @@
import sys
from typing import List, Optional from typing import List, Optional
from fastapi import Depends, FastAPI, HTTPException from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from crud import authentication as crud_authentication sys.path.append("..")
from crud import courseprogress as crud_courseprogress
from crud import highscores as crud_highscores from src.crud import authentication as crud_authentication
from crud import users as crud_users from src.crud import courseprogress as crud_courseprogress
from database import SessionLocal, engine, get_db from src.crud import highscores as crud_highscores
from enums import CourseEnum, MinigameEnum from src.crud import users as crud_users
from models import Base from src.database import Base, SessionLocal, engine, get_db
from schemas import courseprogress, highscores, users from src.enums import CourseEnum, MinigameEnum
from src.schemas import courseprogress, highscores, users
app = FastAPI() app = FastAPI()
Base.metadata.create_all(bind=engine) Base.metadata.create_all(bind=engine)
@ -79,7 +82,7 @@ async def get_course_progress(
return crud_courseprogress.get_course_progress(db, current_user, course) return crud_courseprogress.get_course_progress(db, current_user, course)
@app.patch("/courseprogress") @app.patch("/courseprogress/{course_name}")
async def get_course_progress( async def get_course_progress(
course_progress: courseprogress.CourseProgressBase, course_progress: courseprogress.CourseProgressBase,
current_user_name: str = Depends(crud_authentication.get_current_user_name), current_user_name: str = Depends(crud_authentication.get_current_user_name),

View File

@ -2,8 +2,8 @@ from sqlalchemy import Column, Float, ForeignKey, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from database import Base from src.database import Base
from enums import CourseEnum, MinigameEnum, StrEnumType from src.enums import CourseEnum, MinigameEnum, StrEnumType
class User(Base): class User(Base):

View File

@ -1,6 +1,6 @@
from pydantic import BaseModel from pydantic import BaseModel
from enums import CourseEnum from src.enums import CourseEnum
class CourseProgressBase(BaseModel): class CourseProgressBase(BaseModel):

View File

@ -1,6 +1,6 @@
from pydantic import BaseModel from pydantic import BaseModel
from enums import MinigameEnum from src.enums import MinigameEnum
class HighScoreBase(BaseModel): class HighScoreBase(BaseModel):

0
tests/__init__.py Normal file
View File

20
tests/config/database.py Normal file
View File

@ -0,0 +1,20 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from src.database import Base
SQLALCHEMY_DATABASE_URL = "postgresql://admin:WeSign123!@localhost/wesigntest"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
TestSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base.metadata.create_all(bind=engine)
def override_get_db():
try:
db = TestSessionLocal()
yield db
finally:
db.close()

27
tests/config/setup.py Normal file
View File

@ -0,0 +1,27 @@
import sys
sys.path.append("..")
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from src.database import Base as ProductionBase
from tests.config.database import (SQLALCHEMY_DATABASE_URL, TestBase,
TestSessionLocal)
@pytest.fixture(scope="function")
def db_session():
engine = create_engine(SQLALCHEMY_DATABASE_URL)
print(SQLALCHEMY_DATABASE_URL)
ProductionBase.metadata.create_all(bind=engine)
TestBase.metadata.create_all(bind=engine)
session = TestSessionLocal(bind=engine)
try:
yield session
finally:
session.rollback()
TestBase.metadata.drop_all(bind=engine)
ProductionBase.metadata.drop_all(bind=engine)
session.close()

25
tests/test_users.py Normal file
View File

@ -0,0 +1,25 @@
import sys
import pytest
from fastapi.testclient import TestClient
sys.path.append("..")
from src.main import app, get_db
from tests.config.database import override_get_db
app.dependency_overrides[get_db] = override_get_db
client = TestClient(app)
@pytest.mark.asyncio
async def test_add_user():
response = client.post(
"/register",
headers={"Content-Type": "application/json"},
json={"username": "user27", "password": "mettn", "avatar": "lion"},
)
print(response)
assert response.status_code == 200

15
tests/usertests.py Normal file
View File

@ -0,0 +1,15 @@
import pytest
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_add_user():
response = client.post(
"/users",
headers={"Content-Type": "application/json"},
json={"username": "Lukas", "password": "mettn"},
)
assert response.status_code == 200