diff --git a/format.sh b/format.sh index 3c6cc0e..dd67977 100644 --- a/format.sh +++ b/format.sh @@ -1,3 +1,7 @@ flake8 src/* black src/* isort src/* + +flake8 tests/* +black tests/* +isort tests/* diff --git a/requirements.txt b/requirements.txt index 7dde8fa..9da48b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ interrogate python-jose[cryptography] passlib jwt -PyJWT \ No newline at end of file +PyJWT +pytest-asyncio \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/crud/authentication.py b/src/crud/authentication.py index e70fb85..631be5a 100644 --- a/src/crud/authentication.py +++ b/src/crud/authentication.py @@ -5,9 +5,9 @@ from fastapi import Depends, HTTPException from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from sqlalchemy.orm import Session -from crud.users import get_user_by_username, pwd_context -from models import User -from schemas.users import UserCreate +from src.crud.users import get_user_by_username, pwd_context +from src.models import User +from src.schemas.users import UserCreate DEFAULT_NR_HIGH_SCORES = 10 diff --git a/src/crud/courseprogress.py b/src/crud/courseprogress.py index e3ba2b1..6fb4b38 100644 --- a/src/crud/courseprogress.py +++ b/src/crud/courseprogress.py @@ -1,9 +1,9 @@ from fastapi import HTTPException from sqlalchemy.orm import Session -from enums import CourseEnum, course_enum_list -from models import CourseProgress, User -from schemas.courseprogress import CourseProgressBase +from src.enums import CourseEnum, course_enum_list +from src.models import CourseProgress, User +from src.schemas.courseprogress import CourseProgressBase def get_course_progress(db: Session, user: User, course: CourseEnum): diff --git a/src/crud/highscores.py b/src/crud/highscores.py index 17b2cce..45c397c 100644 --- a/src/crud/highscores.py +++ b/src/crud/highscores.py @@ -2,10 +2,10 @@ from fastapi import HTTPException from sqlalchemy import desc from sqlalchemy.orm import Session -from enums import MinigameEnum -from models import HighScore, User -from schemas.highscores import HighScoreBase -from schemas.users import UserHighScore +from src.enums import MinigameEnum +from src.models import HighScore, User +from src.schemas.highscores import HighScoreBase +from src.schemas.users import UserHighScore def get_high_scores(db: Session, minigame: MinigameEnum, nr_highest: int): diff --git a/src/crud/users.py b/src/crud/users.py index 50cadd7..1fc8daa 100644 --- a/src/crud/users.py +++ b/src/crud/users.py @@ -2,8 +2,8 @@ from fastapi import HTTPException from passlib.context import CryptContext from sqlalchemy.orm import Session -from models import User -from schemas.users import UserCreate +from src.models import User +from src.schemas.users import UserCreate pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/src/main.py b/src/main.py index 63eae43..75f3706 100644 --- a/src/main.py +++ b/src/main.py @@ -1,18 +1,21 @@ +import sys from typing import List, Optional from fastapi import Depends, FastAPI, HTTPException from sqlalchemy.orm import Session -from crud import authentication as crud_authentication -from crud import courseprogress as crud_courseprogress -from crud import highscores as crud_highscores -from crud import users as crud_users -from database import SessionLocal, engine, get_db -from enums import CourseEnum, MinigameEnum -from models import Base -from schemas import courseprogress, highscores, users +sys.path.append("..") + +from src.crud import authentication as crud_authentication +from src.crud import courseprogress as crud_courseprogress +from src.crud import highscores as crud_highscores +from src.crud import users as crud_users +from src.database import Base, SessionLocal, engine, get_db +from src.enums import CourseEnum, MinigameEnum +from src.schemas import courseprogress, highscores, users app = FastAPI() + 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) -@app.patch("/courseprogress") +@app.patch("/courseprogress/{course_name}") async def get_course_progress( course_progress: courseprogress.CourseProgressBase, current_user_name: str = Depends(crud_authentication.get_current_user_name), diff --git a/src/models.py b/src/models.py index d2f1f8d..516d9c6 100644 --- a/src/models.py +++ b/src/models.py @@ -2,8 +2,8 @@ from sqlalchemy import Column, Float, ForeignKey, Integer, String from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.orm import relationship -from database import Base -from enums import CourseEnum, MinigameEnum, StrEnumType +from src.database import Base +from src.enums import CourseEnum, MinigameEnum, StrEnumType class User(Base): diff --git a/src/schemas/courseprogress.py b/src/schemas/courseprogress.py index 1f071de..768890d 100644 --- a/src/schemas/courseprogress.py +++ b/src/schemas/courseprogress.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from enums import CourseEnum +from src.enums import CourseEnum class CourseProgressBase(BaseModel): diff --git a/src/schemas/highscores.py b/src/schemas/highscores.py index 3f1879a..39632ba 100644 --- a/src/schemas/highscores.py +++ b/src/schemas/highscores.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from enums import MinigameEnum +from src.enums import MinigameEnum class HighScoreBase(BaseModel): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/config/database.py b/tests/config/database.py new file mode 100644 index 0000000..6760fea --- /dev/null +++ b/tests/config/database.py @@ -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() diff --git a/tests/config/setup.py b/tests/config/setup.py new file mode 100644 index 0000000..fa49ebe --- /dev/null +++ b/tests/config/setup.py @@ -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() diff --git a/tests/test_users.py b/tests/test_users.py new file mode 100644 index 0000000..90f2fe2 --- /dev/null +++ b/tests/test_users.py @@ -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 diff --git a/tests/usertests.py b/tests/usertests.py new file mode 100644 index 0000000..1f79c86 --- /dev/null +++ b/tests/usertests.py @@ -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