diff --git a/.vscode/settings.json b/.vscode/settings.json index 8c125bf..7d9bb57 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,10 @@ "cSpell.language": "en,de-DE", "cSpell.words": [ "Chiara" - ] + ], + "python.testing.pytestArgs": [ + "backend" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true } \ No newline at end of file diff --git a/backend/dev.db b/backend/dev.db deleted file mode 100644 index 5cfe680..0000000 Binary files a/backend/dev.db and /dev/null differ diff --git a/backend/src/backend/__pycache__/main.cpython-314.pyc b/backend/src/backend/__pycache__/main.cpython-314.pyc index 221f8aa..1f02bd3 100644 Binary files a/backend/src/backend/__pycache__/main.cpython-314.pyc and b/backend/src/backend/__pycache__/main.cpython-314.pyc differ diff --git a/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc index 16a96f9..e8e4a82 100644 Binary files a/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc and b/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc differ diff --git a/backend/src/backend/internal/__pycache__/database.cpython-314.pyc b/backend/src/backend/internal/__pycache__/database.cpython-314.pyc index ab0bf1b..b6681d4 100644 Binary files a/backend/src/backend/internal/__pycache__/database.cpython-314.pyc and b/backend/src/backend/internal/__pycache__/database.cpython-314.pyc differ diff --git a/backend/src/backend/internal/database.py b/backend/src/backend/internal/database.py index 16820d8..de12497 100644 --- a/backend/src/backend/internal/database.py +++ b/backend/src/backend/internal/database.py @@ -2,6 +2,7 @@ from collections.abc import Generator from sqlmodel import Session from sqlmodel import SQLModel from sqlmodel import create_engine + sqlite_file = "dev.db" sqlite_url = f"sqlite:///{sqlite_file}" @@ -13,4 +14,4 @@ def create_db_and_tables(): def get_session() -> Generator[Session, None, None]: with Session(engine) as session: - yield session + yield session \ No newline at end of file diff --git a/backend/src/backend/main.py b/backend/src/backend/main.py index 8095601..e9892ce 100644 --- a/backend/src/backend/main.py +++ b/backend/src/backend/main.py @@ -1,4 +1,5 @@ -from .routers import users +from sqlmodel import SQLModel +from .routers import users, comments from backend.internal.database import create_db_and_tables from fastapi import APIRouter from fastapi import FastAPI @@ -16,3 +17,6 @@ def on_startup(): router = APIRouter() app.include_router(users.router) +app.include_router(comments.router) + +print(SQLModel.metadata.tables.keys()) diff --git a/backend/src/backend/models/__init__.py b/backend/src/backend/models/__init__.py index e69de29..c27d1df 100644 --- a/backend/src/backend/models/__init__.py +++ b/backend/src/backend/models/__init__.py @@ -0,0 +1,2 @@ +from .user import User +from .comment import Comment \ No newline at end of file diff --git a/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc index eaefbcb..63e9ebf 100644 Binary files a/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc and b/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc differ diff --git a/backend/src/backend/models/__pycache__/comment.cpython-314.pyc b/backend/src/backend/models/__pycache__/comment.cpython-314.pyc index 3611c7f..e3d9eaa 100644 Binary files a/backend/src/backend/models/__pycache__/comment.cpython-314.pyc and b/backend/src/backend/models/__pycache__/comment.cpython-314.pyc differ diff --git a/backend/src/backend/models/__pycache__/user.cpython-314.pyc b/backend/src/backend/models/__pycache__/user.cpython-314.pyc index ce1b3d8..69ea8e6 100644 Binary files a/backend/src/backend/models/__pycache__/user.cpython-314.pyc and b/backend/src/backend/models/__pycache__/user.cpython-314.pyc differ diff --git a/backend/src/backend/models/comment.py b/backend/src/backend/models/comment.py index 9d15f97..e1fb5dc 100644 --- a/backend/src/backend/models/comment.py +++ b/backend/src/backend/models/comment.py @@ -1,12 +1,12 @@ +from datetime import datetime import uuid -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from sqlmodel import Relationship -from sqlmodel import DateTime from sqlmodel import Field from sqlmodel import SQLModel if TYPE_CHECKING: - from ..models.user import User + from backend.models.user import User class CommentBase(SQLModel): pass @@ -15,6 +15,6 @@ class Comment(CommentBase, table=True): id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True) slug: str = Field(index=True) content: str = Field() - date_time: DateTime = Field(default=DateTime()) + date_time: datetime = Field(default=datetime.now()) user_id: uuid.UUID = Field(foreign_key="user.id") - user: Optional["User"] = Relationship(back_populates="comments") \ No newline at end of file + user: "User" = Relationship(back_populates="comments") \ No newline at end of file diff --git a/backend/src/backend/models/user.py b/backend/src/backend/models/user.py index 3937665..90923aa 100644 --- a/backend/src/backend/models/user.py +++ b/backend/src/backend/models/user.py @@ -5,20 +5,20 @@ from sqlmodel import Relationship from sqlmodel import SQLModel if TYPE_CHECKING: - from ..models.comment import Comment + from backend.models.comment import Comment class UserBase(SQLModel): pass -class User(UserBase): - id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True) +class User(UserBase, table=True): + id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True) email: str = Field(unique=True) name: str = Field(unique=True) - user_code: str = Field(unique=True) # TODO: create generation function + user_code: str = Field(default="1234",unique=True) # TODO: create Generator subscription: bool = Field() comments: list["Comment"] = Relationship(back_populates="user") -class RegisterUser(UserBase): +class NewUser(UserBase): email: str name: str subscription: bool diff --git a/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc b/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc new file mode 100644 index 0000000..6619cab Binary files /dev/null and b/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc differ diff --git a/backend/src/backend/routers/__pycache__/test_users.cpython-314-pytest-9.1.1.pyc b/backend/src/backend/routers/__pycache__/test_users.cpython-314-pytest-9.1.1.pyc index ee1f03b..a17eab1 100644 Binary files a/backend/src/backend/routers/__pycache__/test_users.cpython-314-pytest-9.1.1.pyc and b/backend/src/backend/routers/__pycache__/test_users.cpython-314-pytest-9.1.1.pyc differ diff --git a/backend/src/backend/routers/__pycache__/users.cpython-314.pyc b/backend/src/backend/routers/__pycache__/users.cpython-314.pyc index 2c4f339..d95f89b 100644 Binary files a/backend/src/backend/routers/__pycache__/users.cpython-314.pyc and b/backend/src/backend/routers/__pycache__/users.cpython-314.pyc differ diff --git a/backend/src/backend/routers/comments.py b/backend/src/backend/routers/comments.py index 83ab410..6393035 100644 --- a/backend/src/backend/routers/comments.py +++ b/backend/src/backend/routers/comments.py @@ -1,4 +1,24 @@ # add comment # delete comment -# get comments \ No newline at end of file +# get comments + +from backend.internal.database import get_session +from fastapi import Depends +from sqlmodel import Session +from fastapi import APIRouter +from ..models.comment import Comment + +router = APIRouter( + prefix="/comments", + tags=["comments"], + dependencies=[], + responses={404: {"description": "Not found"}}, +) + +@router.post("/") +def register_user(session: Session = Depends(get_session)): + comment = {"test":"test"} + comment1 = Comment.model_validate(comment) + session.add(comment) + session.commit() diff --git a/backend/src/backend/routers/test_users.py b/backend/src/backend/routers/test_users.py index cdf58db..ff62a1c 100644 --- a/backend/src/backend/routers/test_users.py +++ b/backend/src/backend/routers/test_users.py @@ -1,15 +1,57 @@ -from httpx2 import post -from backend.models.user import RegisterUser +from backend.models.user import User +from backend.internal.database import get_session +from sqlmodel import Session +from sqlmodel import StaticPool +from sqlmodel import create_engine +import pytest +from backend.internal.database import engine +from sqlmodel import SQLModel from backend.main import app from fastapi.testclient import TestClient -client = TestClient(app) +@pytest.fixture(name="session") +def session_fixture(): + engine = create_engine( + "sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool + ) + SQLModel.metadata.create_all(engine) + with Session(engine) as session: + yield session -def test_register_user_works(): + +@pytest.fixture(name="client") +def client_fixture(session: Session): + def get_session_override(): + return session + + app.dependency_overrides[get_session] = get_session_override + + client = TestClient(app) + yield client + app.dependency_overrides.clear() + + + + +def test_register_user_works(client: TestClient): + print(SQLModel.metadata.tables.keys()) new_user = { - "email": "Test", + "email": "Test@Test.test", "name": "Test1", "subscription": True } response = client.post(url="/users/", json=new_user) - assert response.status_code == 200 \ No newline at end of file + assert response.status_code == 200 + +def test_email_not_unique(session: Session, client: TestClient): + new_user = { + "email": "Test@Test.test", + "name": "Test1", + "subscription": True + } + user = User.model_validate(new_user) + session.add(user) + session.commit() + response = client.post(url="/users/", json=new_user) + + assert response.status_code == 400 \ No newline at end of file diff --git a/backend/src/backend/routers/users.py b/backend/src/backend/routers/users.py index 3bb20fa..8b8cef1 100644 --- a/backend/src/backend/routers/users.py +++ b/backend/src/backend/routers/users.py @@ -8,6 +8,11 @@ # delete all deactivated users after 48h +from starlette.status import HTTP_400_BAD_REQUEST +from fastapi import HTTPException +from sqlalchemy.exc import IntegrityError +from backend.models.user import User +from backend.models.user import NewUser from backend.internal.database import get_session from fastapi import Depends from sqlmodel import Session @@ -21,5 +26,12 @@ router = APIRouter( ) @router.post("/") -def register_user(session: Session = Depends(get_session)): - pass +def register_user(new_user: NewUser, session: Session = Depends(get_session)): + user = User.model_validate(new_user) + + try: + session.add(user) + session.commit() + except IntegrityError as e: + session.rollback() + raise HTTPException(HTTP_400_BAD_REQUEST)