Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,4 @@ dmypy.json

# Pyre type checker
.pyre/
.idea/
11 changes: 11 additions & 0 deletions app/internal/event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import re

from fastapi import HTTPException

ZOOM_REGEX = re.compile(r'https://.*?\.zoom.us/[a-z]/.[^.,\b\t\n]+')


def validate_zoom_link(location):
if not ZOOM_REGEX.findall(location):
raise HTTPException(status_code=400,
detail="VC type with no valid zoom link")
33 changes: 33 additions & 0 deletions app/routers/event.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
from datetime import datetime as dt
from operator import attrgetter
from typing import List

from fastapi import APIRouter, Request
from fastapi import Depends
from fastapi.responses import RedirectResponse
from starlette.status import HTTP_303_SEE_OTHER

from app.database.database import get_db
from app.database.models import Event
from app.database.models import User
from app.database.models import UserEvent
from app.dependencies import templates
from app.internal.event import validate_zoom_link
from app.internal.utils import create_model
from app.routers.user import create_user

router = APIRouter(
prefix="/event",
Expand All @@ -21,6 +29,31 @@ async def eventedit(request: Request):
{"request": request})


@router.post("/edit")
async def create_new_event(request: Request, session=Depends(get_db)):
data = await request.form()
title = data['title']
content = data['description']
start = dt.strptime(data['start_date'] + ' ' + data['start_time'],
'%Y-%m-%d %H:%M')
end = dt.strptime(data['end_date'] + ' ' + data['end_time'],
'%Y-%m-%d %H:%M')
user = session.query(User).filter_by(id=1).first()
user = user if user else create_user("u", "p", "e@mail.com", session)
owner_id = user.id
location_type = data['location_type']
is_zoom = location_type == 'vc_url'
location = data['location']

if is_zoom:
validate_zoom_link(location)

event = create_event(session, title, start, end, owner_id, content,
location)
return RedirectResponse(f'/event/view/{event.id}',
status_code=HTTP_303_SEE_OTHER)


@router.get("/view/{id}")
async def eventview(request: Request, id: int):
return templates.TemplateResponse("event/eventview.html",
Expand Down
14 changes: 13 additions & 1 deletion tests/client_fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from app.database.models import User
from app.main import app
from app.database.database import Base
from app.routers import profile, agenda, invitation
from app.routers import profile, agenda, invitation, event
from tests.conftest import test_engine, get_test_db


Expand All @@ -13,6 +13,18 @@ def client():
return TestClient(app)


@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)


@pytest.fixture(scope="session")
def agenda_test_client():
Base.metadata.create_all(bind=test_engine)
Expand Down
42 changes: 40 additions & 2 deletions tests/test_event.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
from starlette.status import HTTP_404_NOT_FOUND
from starlette.status import HTTP_303_SEE_OTHER, HTTP_404_NOT_FOUND

CORRECT_EVENT_FORM_DATA = {
'title': 'test title',
'start_date': '2021-01-28',
'start_time': '15:59',
'end_date': '2021-01-27',
'end_time': '15:01',
'location_type': 'vc_url',
'location': 'https://us02web.zoom.us/j/875384596',
'description': 'content',
'color': 'red',
'availability': 'busy',
'privacy': 'public'
}

WRONG_EVENT_FORM_DATA = {
'title': 'test title',
'start_date': '2021-01-28',
'start_time': '15:59',
'end_date': '2021-01-27',
'end_time': '15:01',
'location_type': 'vc_url',
'location': 'not a zoom link',
'description': 'content',
'color': 'red',
'availability': 'busy',
'privacy': 'public'
}

class TestEvent:

class TestEvent:
def test_eventedit(self, client):
response = client.get("/event/edit")
assert response.ok
Expand All @@ -17,5 +44,16 @@ def test_eventview_without_id(self, client):
response = client.get("/event/view")
assert response.status_code == HTTP_404_NOT_FOUND

def test_eventedit_post_correct(self, event_test_client, user):
response = event_test_client.post("/event/edit",
data=CORRECT_EVENT_FORM_DATA)
assert response.status_code == HTTP_303_SEE_OTHER
assert '/event/view/' in response.headers['location']

def test_eventedit_post_wrong(self, event_test_client, user):
response = event_test_client.post("/event/edit",
data=WRONG_EVENT_FORM_DATA)
assert response.json()['detail'] == 'VC type with no valid zoom link'

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