✅ Added tests and fixed some small bugs
This commit is contained in:
@@ -95,7 +95,6 @@ async def upload_image(edit_id: str, pow_data: str, file: UploadFile = File()):
|
|||||||
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
||||||
if session_data is None:
|
if session_data is None:
|
||||||
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
||||||
|
|
||||||
if uploaded_images == 0 and not check_hashcash(pow_data, pow_data_server, "8"):
|
if uploaded_images == 0 and not check_hashcash(pow_data, pow_data_server, "8"):
|
||||||
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
raise HTTPException(status_code=401, detail="Edit ID not found!")
|
||||||
if uploaded_images != 0 and not check_hashcash(pow_data, pow_data_server, "8"):
|
if uploaded_images != 0 and not check_hashcash(pow_data, pow_data_server, "8"):
|
||||||
@@ -103,7 +102,10 @@ async def upload_image(edit_id: str, pow_data: str, file: UploadFile = File()):
|
|||||||
file_bytes = await file.read()
|
file_bytes = await file.read()
|
||||||
if len(file_bytes) > 2000000:
|
if len(file_bytes) > 2000000:
|
||||||
raise HTTPException(status_code=400, detail="File too large")
|
raise HTTPException(status_code=400, detail="File too large")
|
||||||
pm_data = puremagic.magic_string(file_bytes)[0]
|
try:
|
||||||
|
pm_data = puremagic.magic_string(file_bytes)[0]
|
||||||
|
except puremagic.PureError:
|
||||||
|
raise HTTPException(status_code=400, detail="Image couldn't be identified!")
|
||||||
if pm_data.extension not in allowed_image_extensions:
|
if pm_data.extension not in allowed_image_extensions:
|
||||||
raise HTTPException(status_code=400, detail="Image-type now allowed!")
|
raise HTTPException(status_code=400, detail="Image-type now allowed!")
|
||||||
session_data = EditSessionData.parse_raw(session_data)
|
session_data = EditSessionData.parse_raw(session_data)
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ import json
|
|||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
import ormar.exceptions
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
from fastapi import APIRouter, Depends, Response, File, UploadFile
|
from fastapi import APIRouter, Depends, Response, File, UploadFile, HTTPException
|
||||||
|
|
||||||
from classquiz.auth import get_current_user
|
from classquiz.auth import get_current_user
|
||||||
from classquiz.config import storage, settings
|
from classquiz.config import storage, settings
|
||||||
@@ -22,7 +23,10 @@ image_index_delimiter = b"\xc5\xc5\x00"
|
|||||||
|
|
||||||
@router.get("/{quiz_id}")
|
@router.get("/{quiz_id}")
|
||||||
async def export_quiz(quiz_id: uuid.UUID, user: User = Depends(get_current_user)):
|
async def export_quiz(quiz_id: uuid.UUID, user: User = Depends(get_current_user)):
|
||||||
quiz: Quiz = await Quiz.objects.filter(Quiz.id == quiz_id).first()
|
try:
|
||||||
|
quiz: Quiz = await Quiz.objects.filter(Quiz.id == quiz_id).first()
|
||||||
|
except ormar.exceptions.NoMatch:
|
||||||
|
raise HTTPException(status_code=404, detail="Quiz not found")
|
||||||
image_urls = {}
|
image_urls = {}
|
||||||
for i, question in enumerate(quiz.questions):
|
for i, question in enumerate(quiz.questions):
|
||||||
if question["image"] is None:
|
if question["image"] is None:
|
||||||
|
|||||||
@@ -185,7 +185,6 @@ async def update_quiz(quiz_id: str, quiz_input: QuizInput, user: User = Depends(
|
|||||||
raise HTTPException(status_code=400, detail="badly formed quiz id")
|
raise HTTPException(status_code=400, detail="badly formed quiz id")
|
||||||
# Check Cover-Image
|
# Check Cover-Image
|
||||||
|
|
||||||
print(quiz_input.cover_image)
|
|
||||||
if quiz_input.cover_image == "":
|
if quiz_input.cover_image == "":
|
||||||
quiz_input.cover_image = None
|
quiz_input.cover_image = None
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ class ValueStorage:
|
|||||||
imported_quizzes = []
|
imported_quizzes = []
|
||||||
game_pin = None
|
game_pin = None
|
||||||
game_id = None
|
game_id = None
|
||||||
|
exported_quiz_data = None
|
||||||
|
edit_id = None
|
||||||
|
image_id = None
|
||||||
|
|
||||||
|
|
||||||
example_quiz = {
|
example_quiz = {
|
||||||
|
|||||||
@@ -5,10 +5,12 @@
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from httpx import AsyncClient
|
||||||
from redis import Redis
|
from redis import Redis
|
||||||
from classquiz.config import settings
|
from classquiz.config import settings
|
||||||
from classquiz.tests import test_user_email, test_user_password
|
from classquiz.tests import test_user_email, test_user_password
|
||||||
from classquiz.tests import test_client, example_quiz, ValueStorage # noqa : F401
|
from classquiz.tests import test_client, example_quiz, ValueStorage # noqa : F401
|
||||||
|
from classquiz.helpers.hashcash import mint
|
||||||
|
|
||||||
|
|
||||||
# @pytest.fixture
|
# @pytest.fixture
|
||||||
@@ -414,14 +416,17 @@ class TestPlayQuiz:
|
|||||||
)
|
)
|
||||||
token = resp.cookies["access_token"]
|
token = resp.cookies["access_token"]
|
||||||
resp = test_client.post(
|
resp = test_client.post(
|
||||||
"/api/v1/quiz/start/fb5adc91-629e-416e-8b98-ae400e36417c", cookies={"access_token": token}
|
"/api/v1/quiz/start/fb5adc91-629e-416e-8b98-ae400e36417c?game_mode=kahoot", cookies={"access_token": token}
|
||||||
)
|
)
|
||||||
assert resp.status_code == 404
|
assert resp.status_code == 404
|
||||||
resp = test_client.post(
|
resp = test_client.post(
|
||||||
"/api/v1/quiz/start/fb5adc91-629e-416e-8b98-ae400sdadsasadsadasddsae36417c", cookies={"access_token": token}
|
"/api/v1/quiz/start/fb5adc91-629e-416e-8b98-ae400sdadsasadsadasddsae36417c?game_mode=kahoot",
|
||||||
|
cookies={"access_token": token},
|
||||||
)
|
)
|
||||||
assert resp.status_code == 400
|
assert resp.status_code == 400
|
||||||
resp = test_client.post(f"/api/v1/quiz/start/{ValueStorage.quiz_id}", cookies={"access_token": token})
|
resp = test_client.post(
|
||||||
|
f"/api/v1/quiz/start/{ValueStorage.quiz_id}?game_mode=kahoot", cookies={"access_token": token}
|
||||||
|
)
|
||||||
ValueStorage.game_pin = resp.json()["game_pin"]
|
ValueStorage.game_pin = resp.json()["game_pin"]
|
||||||
ValueStorage.game_id = resp.json()["game_id"]
|
ValueStorage.game_id = resp.json()["game_id"]
|
||||||
|
|
||||||
@@ -462,6 +467,66 @@ class TestCache:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestEditor:
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_start(self, test_client): # noqa : F811
|
||||||
|
resp = test_client.post(
|
||||||
|
"/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password}
|
||||||
|
)
|
||||||
|
token = resp.cookies["access_token"]
|
||||||
|
|
||||||
|
resp = test_client.post("/api/v1/editor/start?edit=false", cookies={"access_token": token})
|
||||||
|
assert resp.status_code == 200
|
||||||
|
edit_id = resp.json()["token"]
|
||||||
|
resp = test_client.get(f"/api/v1/editor/pow?edit_id={edit_id}")
|
||||||
|
assert resp.status_code == 200
|
||||||
|
pow_data = resp.json()["data"]
|
||||||
|
resp = test_client.get("/api/v1/editor/pow?edit_id=loladdfs")
|
||||||
|
assert resp.status_code == 401
|
||||||
|
pow_res = mint(pow_data, 8, None, "", 8, False)
|
||||||
|
print("POW-Res", pow_res)
|
||||||
|
|
||||||
|
async with AsyncClient() as ac:
|
||||||
|
resp = await ac.get("https://i.imgur.com/OE22DNZ.png")
|
||||||
|
image_bytes = resp.read()
|
||||||
|
|
||||||
|
resp = test_client.post(
|
||||||
|
f"/api/v1/editor/image?edit_id={edit_id}&pow_data={pow_res}", files={"file": image_bytes}
|
||||||
|
)
|
||||||
|
assert resp.status_code == 200
|
||||||
|
ValueStorage.edit_id = edit_id
|
||||||
|
ValueStorage.image_id = resp.json()["id"]
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_finish(self, test_client): # noqa : F811
|
||||||
|
local_example_quiz = example_quiz
|
||||||
|
local_example_quiz["questions"][1][
|
||||||
|
"image"
|
||||||
|
] = f"http://localhost:8080/api/v1/storage/download/{ValueStorage.image_id}"
|
||||||
|
resp = test_client.post(f"/api/v1/editor/finish?edit_id={ValueStorage.edit_id}", json=example_quiz)
|
||||||
|
assert resp.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
|
class TestExImport:
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_export_quiz(self, test_client): # noqa : F811
|
||||||
|
|
||||||
|
resp = test_client.get("/api/v1/eximport/jgfgufgfgfzftzi")
|
||||||
|
assert resp.status_code == 422
|
||||||
|
resp = test_client.get("/api/v1/eximport/8bd77201-65ed-46fe-9160-cfe71dad501f")
|
||||||
|
assert resp.status_code == 404
|
||||||
|
resp = test_client.get(f"/api/v1/eximport/{ValueStorage.quiz_id}")
|
||||||
|
assert resp.status_code == 200
|
||||||
|
exported_data = resp.content
|
||||||
|
assert len(exported_data) > 3000
|
||||||
|
ValueStorage.exported_quiz_data = exported_data
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_import_quiz(self, test_client): # noqa : F811
|
||||||
|
resp = test_client.post("/api/v1/eximport/", files={"file": ValueStorage.exported_quiz_data})
|
||||||
|
assert resp.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
class TestDeleteStuff:
|
class TestDeleteStuff:
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_delete_quiz(self, test_client): # noqa : F811
|
async def test_delete_quiz(self, test_client): # noqa : F811
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const gen_salt = (l: number): string => {
|
|||||||
|
|
||||||
export const mint = async (
|
export const mint = async (
|
||||||
resource: string,
|
resource: string,
|
||||||
bits = 16,
|
bits = 8,
|
||||||
// now = null,
|
// now = null,
|
||||||
ext = '',
|
ext = '',
|
||||||
saltchars = 8,
|
saltchars = 8,
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ a)
|
|||||||
run_tests
|
run_tests
|
||||||
stop
|
stop
|
||||||
;;
|
;;
|
||||||
|
prepare)
|
||||||
|
stop
|
||||||
|
docker volume rm classquiz_db_data
|
||||||
|
init
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Invalid option: -$OPTARG" >&2
|
echo "Invalid option: -$OPTARG" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
Reference in New Issue
Block a user