Skip to content

Feature/delete event #139

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jan 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 47 additions & 3 deletions app/routers/event.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
from datetime import datetime
from operator import attrgetter
from typing import Dict, List, Optional, Any
from typing import Any, Dict, List, Optional

from app.database.models import Event, UserEvent
from app.database.database import get_db
from app.database.models import Event, User, UserEvent
from app.dependencies import templates
from app.internal.utils import create_model
from fastapi import APIRouter, Request
from fastapi import APIRouter, Depends, Request
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from starlette import status
from starlette.responses import RedirectResponse

router = APIRouter(
prefix="/event",
Expand Down Expand Up @@ -104,3 +107,44 @@ def sort_by_date(events: List[Event]) -> List[Event]:

temp = events.copy()
return sorted(temp, key=attrgetter('start'))


def get_participants_emails_by_event(db: Session, event_id: int) -> List[str]:
"""Returns a list of all the email address of the event invited users,
by event id."""

return [email[0] for email in db.query(User.email).
select_from(Event).
join(UserEvent, UserEvent.event_id == Event.id).
join(User, User.id == UserEvent.user_id).
filter(Event.id == event_id).
all()]


@router.delete("/{event_id}")
def delete_event(request: Request,
event_id: int,
db: Session = Depends(get_db)):

# TODO: Check if the user is the owner of the event.
event = by_id(db, event_id)
participants = get_participants_emails_by_event(db, event_id)
try:
# Delete event
db.delete(event)

# Delete user_event
db.query(UserEvent).filter(UserEvent.event_id == event_id).delete()

db.commit()

except (SQLAlchemyError, TypeError):
return templates.TemplateResponse(
"event/eventview.html", {"request": request, "event_id": event_id},
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
if participants and event.start > datetime.now():
pass
# TODO: Send them a cancellation notice
# if the deletion is successful
return RedirectResponse(
url="/calendar", status_code=status.HTTP_200_OK)
22 changes: 17 additions & 5 deletions tests/client_fixture.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from fastapi.testclient import TestClient
import pytest

from app import main
from app.database.database import Base
from app.database.models import User
from app.main import app
from app.database.database import Base
from app.routers import agenda, invitation, profile
from tests.conftest import test_engine, get_test_db
from app.routers import agenda, event, invitation, profile
from fastapi.testclient import TestClient

from tests.conftest import get_test_db, test_engine


@pytest.fixture(scope="session")
Expand Down Expand Up @@ -62,3 +62,15 @@ def get_test_placeholder_user():
full_name='FakeName',
telegram_id='666666'
)


@pytest.fixture(scope="session")
def event_test_client():
Base.metadata.create_all(bind=test_engine)
app.dependency_overrides[event.get_db] = get_test_db

with TestClient(app) as client:
yield client

app.dependency_overrides = {}
Base.metadata.drop_all(bind=test_engine)
15 changes: 12 additions & 3 deletions tests/test_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import pytest
from app.database.models import Event
from app.routers.event import update_event
from starlette.status import HTTP_404_NOT_FOUND
from app.routers.event import by_id, update_event
from starlette import status

INVALID_UPDATE_OPTIONS = [
{}, {"test": "test"}, {"start": "20.01.2020"},
Expand All @@ -26,7 +26,7 @@ def test_eventview_with_id(self, client):

def test_eventview_without_id(self, client):
response = client.get("/event/view")
assert response.status_code == HTTP_404_NOT_FOUND
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED

@staticmethod
@pytest.mark.parametrize("data", INVALID_UPDATE_OPTIONS)
Expand Down Expand Up @@ -61,3 +61,12 @@ def test_update_event_does_not_exist(event, session):

def test_repr(self, event):
assert event.__repr__() == f'<Event {event.id}>'

def test_successful_deletion(self, event_test_client, session, event):
respons = event_test_client.delete("/event/1")
assert respons.ok
assert by_id(db=session, event_id=1) is None

def test_delete_failed(self, event_test_client, event):
respons = event_test_client.delete("/event/2")
assert respons.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR