From 6ce6a19acf61c2e1459fad857530a2a94ccab16b Mon Sep 17 00:00:00 2001 From: Lilian Date: Tue, 28 Feb 2023 10:21:08 +0100 Subject: [PATCH] Remove print/console.log statements --- backend/api/database/db.py | 7 +- backend/api/database/exercices/FileField.py | 2 +- backend/api/database/exercices/crud.py | 16 +- backend/api/database/room/crud.py | 14 +- backend/api/dbo/exercices/crud.py | 12 +- backend/api/exo.py | 2 +- backend/api/generateur/generateur_csv.py | 2 +- backend/api/main.py | 10 +- backend/api/routes/exercices/routes.py | 2 +- backend/api/routes/room/consumer.py | 22 +- backend/api/routes/room/manager.py | 10 +- backend/api/routes/room/routes.py | 12 +- backend/api/services/models.py | 7 +- backend/api/services/websocket.py | 6 +- backend/api/testing.py | 1 - backend/api/tests/test_auth.py | 36 +- backend/api/tests/test_exos.py | 85 +- backend/api/tests/test_room.py | 18 +- frontend/src/components/NavBar.svelte | 2 +- frontend/src/components/exos/EditForm.svelte | 2 +- frontend/src/components/exos/Feed.svelte | 2 +- frontend/src/components/exos/Tag.svelte | 2 +- frontend/src/components/exos/TagViewer.svelte | 2 +- .../components/forms/InputWithLabel.svelte | 2 +- frontend/src/components/forms/Item.svelte | 2 +- .../src/components/forms/LabeledInput.svelte | 2 +- .../src/components/forms/TagSelector.svelte | 4 +- .../src/components/rooms/Challenge.svelte | 2 +- .../components/rooms/InputChallenge.svelte | 6 +- .../components/rooms/ParcoursCreate.svelte | 6 +- frontend/src/components/rooms/RoomHead.svelte | 2 +- frontend/src/components/rooms/Waiting.svelte | 2 +- frontend/src/context/Modal.svelte | 8 +- frontend/src/context/Navigation.svelte | 2 +- frontend/src/requests/exo.request.ts | 2 +- frontend/src/routes/dashboard/+page.svelte | 4 +- .../src/routes/room/[...slug]/+page.svelte | 8 +- frontend/src/routes/room/create/+page.svelte | 4 +- frontend/src/routes/signin/+page.svelte | 2 +- frontend/src/routes/signup/+page.svelte | 2 +- frontend/src/test/exo.test.ts | 1675 +++++++++-------- frontend/src/test/room.test.ts | 8 +- frontend/src/utils/forms.ts | 4 +- frontend/src/utils/utils.ts | 2 +- 44 files changed, 1022 insertions(+), 1001 deletions(-) diff --git a/backend/api/database/db.py b/backend/api/database/db.py index c3c2a0d..2a11a59 100644 --- a/backend/api/database/db.py +++ b/backend/api/database/db.py @@ -1,6 +1,7 @@ -import pydantic.json import json -from sqlmodel import SQLModel, create_engine, Session, select + +import pydantic.json +from sqlmodel import SQLModel, create_engine, Session sqlite_file_name = "database7.db" sqlite_url = f"sqlite:///{sqlite_file_name}" @@ -10,7 +11,7 @@ def _custom_json_serializer(*args, **kwargs) -> str: """ Encodes json in the same way that pydantic does. """ - print('JSON SERIALIZATION') + return json.dumps(*args, default=pydantic.json.pydantic_encoder, **kwargs) engine = create_engine(sqlite_url, echo=False, connect_args={"check_same_thread": False}, json_serializer=_custom_json_serializer) diff --git a/backend/api/database/exercices/FileField.py b/backend/api/database/exercices/FileField.py index 8e9b7b9..821f100 100644 --- a/backend/api/database/exercices/FileField.py +++ b/backend/api/database/exercices/FileField.py @@ -20,7 +20,7 @@ class FileField(str, metaclass=FileFieldMeta): @classmethod def validate(cls, value: str | IO, values): - print('VALID FILE', values) + upload_root = get_or_create_dir( add_fast_api_root(cls.upload_root)) if not isinstance(value, str): diff --git a/backend/api/database/exercices/crud.py b/backend/api/database/exercices/crud.py index ff272fa..e446635 100644 --- a/backend/api/database/exercices/crud.py +++ b/backend/api/database/exercices/crud.py @@ -1,19 +1,21 @@ -from fastapi import Query, HTTPException, status import os import shutil from typing import IO, List + +from fastapi import Depends +from fastapi import Query, HTTPException, status from sqlmodel import Session, select, or_, col -from generateur.generateur_main import generate_from_data, generate_from_path + from database.auth.models import User from database.db import get_session -from fastapi import Depends -from database.exercices.models import ExampleEnum, ExerciceCreate, Exercice, ExerciceEdit, ExerciceRead, ExercicesTagLink, Tag, TagCreate, Supports, ExerciceReadFull +from database.exercices.models import ExampleEnum, ExerciceCreate, Exercice, ExerciceEdit, ExercicesTagLink, Tag, \ + TagCreate, Supports, ExerciceReadFull +from generateur.generateur_main import generate_from_data from services.auth import get_current_user, get_current_user_optional from services.database import generate_unique_code from services.io import add_fast_api_root, get_ancestor, get_or_create_dir - def create_exo_db(exercice: ExerciceCreate, user: User,supports: Supports, exo_source: IO, db: Session): example = { "type": ExampleEnum.csv if supports['csv'] == True else ExampleEnum.web if supports['web'] == True else None, @@ -190,9 +192,9 @@ def serialize_exo(*, exo: Exercice, user_id: User = None, db: Session): tags = parse_exo_tags(exo_id=exo.id, user_id=user_id, db=db) if user_id is not None else [] is_author = user_id is not None and check_author(exo=exo, user_id=user_id) - print('USER', exo.dict(), exo) + if exo.original is not None: - print('TEST', db.exec(select(User).where(User.id == exo.original.author_id)).all()) + author = db.exec(select(User).where( User.id == exo.original.author_id)).all()[0] original = {**exo.original.dict(), 'author': author.username} diff --git a/backend/api/database/room/crud.py b/backend/api/database/room/crud.py index 76ec12f..d714f77 100644 --- a/backend/api/database/room/crud.py +++ b/backend/api/database/room/crud.py @@ -286,7 +286,7 @@ def leave_room(member: Member, db: Session): def serialize_member(member: Member, private: bool = False, admin: bool = False, m2: Member | None = None) -> MemberRead | Waiter: member_obj = member.user or member.anonymous - print("OHLA", member_obj, private, member.user_id == None) + if not member.waiting: return MemberRead(username=member_obj.username, online=member.online, clientId=str(member_obj.clientId) if (private == True and member.user_id == None) else "", @@ -379,7 +379,7 @@ def getMemberRank(m: Member, p: Parcours, db: Session): def getMemberAvgRank(m: Member, p: Parcours, db: Session): challenger = db.exec(select(Challenger).where(Challenger.member_id == m.id)).first() - print('CHALLE', challenger) + if challenger is None or challenger.avg is None: return None return getAvgRank(challenger, p, db) @@ -583,8 +583,8 @@ def validate_challenge_input(obj: List[CorrectionData], corr: TmpCorrection): for i in range(len(data)): exo_corr = data[i] exo = obj[i] - print('EXO', exo) - print('EXO', exo.data) + + if len(exo.data) != len(exo_corr['data']): return zipped = zip(exo_corr['data'], exo.data) @@ -628,7 +628,7 @@ def corrige_challenge(obj: List[List[ParsedGeneratorOut]], corr: TmpCorrection) return zipped = zip(exo_corr, exo) for e, f in zipped: - print("HO\n\n") + for k, l in zip(e['inputs'], f.inputs): k["value"] = str(l.value) total += 1 @@ -703,7 +703,7 @@ def checkValidated(challenger: Challenger, db: Session, challenge: Challenge | N def create_challenge(data: List[CorrigedData], challenger: Member, parcours: Parcours, time: int, mistakes: int, isCorriged: bool, db: Session): challenger_obj: Challenger = getChallenger(parcours, challenger, db) - print('VALIDATING', time <= parcours.time * 60 and mistakes <= parcours.max_mistakes, time, parcours.time) + validated = time <= parcours.time * 60 and mistakes <= parcours.max_mistakes challenge = Challenge(data=data, challenger_pid=challenger_obj.parcours_id, challenger_mid=challenger_obj.member_id, @@ -730,7 +730,7 @@ def create_challenge(data: List[CorrigedData], challenger: Member, parcours: Par db.commit() db.refresh(challenge) db.refresh(challenger_obj) - print('RETURN,', challenge, challenger_obj) + return challenge, challenger_obj diff --git a/backend/api/dbo/exercices/crud.py b/backend/api/dbo/exercices/crud.py index 654d6df..454d053 100644 --- a/backend/api/dbo/exercices/crud.py +++ b/backend/api/dbo/exercices/crud.py @@ -1,13 +1,11 @@ import os import shutil -from typing import BinaryIO, List -from schemas.exercices import TagIn, TagIn_schema -from services.database import generate_unique_code -from services.io import add_fast_api_root, get_ancestor, get_filename_from_path, get_parent_dir, remove_fastapi_root, remove_if_exists, get_or_create_dir +from typing import BinaryIO from database.exercices.models import Exercice, Tag from schemas.exercices import Exercice_schema - +from services.database import generate_unique_code +from services.io import add_fast_api_root, get_ancestor, get_parent_dir, remove_if_exists, get_or_create_dir async def create_exo_db(*args, **kwargs) -> Exercice: @@ -57,14 +55,14 @@ async def clone_exo_db(id_code: str, user_id): exo_obj = await Exercice_schema.from_tortoise_orm(exo) exo_obj = exo_obj.dict(exclude_unset=True) - print("eaoiuezaoiueza", exo_obj) + exo_obj.pop('tags') exo_obj = exclude_dict_key(exo_obj, 'tags') exo_obj = exclude_dict_key(exo_obj, 'author') #exo_obj.pop('exercices') path = clone_exo_source(exo.exo_source, new_id_code) - print('\n\npatiuar', path, exo_obj, '\n', + exclude_dict_key(exo_obj, 'tags')) new_exo = Exercice(**{**exo_obj, 'id_code': new_id_code, 'exo_source': path, "isOriginal": False, 'author_id': user_id}, origin_id=exo.id) diff --git a/backend/api/exo.py b/backend/api/exo.py index 696cfd0..2e90a7e 100644 --- a/backend/api/exo.py +++ b/backend/api/exo.py @@ -7,6 +7,6 @@ def exos(nb, username, password): for i in range(nb): r = requests.post('http://localhost:8002/exercices', data={"name": "Test" + str(i), "consigne": "consigne", "private": False}, files={ 'file': ('test.py', open('./tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print('DONE') + exos(100, "lilianTest2", "Pomme937342") \ No newline at end of file diff --git a/backend/api/generateur/generateur_csv.py b/backend/api/generateur/generateur_csv.py index 3950ab6..d7c9717 100644 --- a/backend/api/generateur/generateur_csv.py +++ b/backend/api/generateur/generateur_csv.py @@ -37,7 +37,7 @@ def Csv_generator(path, nb_in_serie, nb_page, police, consigne, writer): if len(text_longueur) > longueur_max: consigne_lines.append(text_longueur) text_longueur = '' - # print(text_longueur) + # else: consigne_lines.append(consigne) serie_page_vertical = int(PAGE_LINES[police] / diff --git a/backend/api/main.py b/backend/api/main.py index 227206a..661cedf 100644 --- a/backend/api/main.py +++ b/backend/api/main.py @@ -62,7 +62,7 @@ class Id_codeField(str): @classmethod def validate(cls, value, values, config, field): - print("validator", cls, value, values, config, field) + return value class Test(SQLModel, table=True): @@ -71,13 +71,13 @@ class Test(SQLModel, table=True): ''' @validator('id_code', always=True) def test(cls,value, values): - print('VAlIDATE') + session= get_session() session = next(session) y = session.exec(select(cls)).all() - print(y) + code = generate_unique_code(cls, s=session) - print(code) + return code ''' @app.on_event("startup") @@ -100,7 +100,7 @@ def test(test_1: str, test_2: str, test_3: str = Depends(t), test_4: str = Depen @app.exception_handler(ValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError|ValidationError): errors = {} - print(exc.errors()) + for e in exc.errors(): locs = [e for e in e['loc'] if type(e) == str] errors[locs[-1] + "_error"] = e['msg'] diff --git a/backend/api/routes/exercices/routes.py b/backend/api/routes/exercices/routes.py index fcc7145..f92fb50 100644 --- a/backend/api/routes/exercices/routes.py +++ b/backend/api/routes/exercices/routes.py @@ -120,7 +120,7 @@ def get_public_exercices(user: User | None = Depends(get_current_user_optional), statement = statement.where(sub) statement = statement.order_by(col(Exercice.id).desc()) page = p(db, statement) - print('¨PAGE', page) + exercices = page.items page.items = [ serialize_exo(exo=e, user_id=user.id, db=db) for e in exercices] diff --git a/backend/api/routes/room/consumer.py b/backend/api/routes/room/consumer.py index 4ffad4a..9067d56 100644 --- a/backend/api/routes/room/consumer.py +++ b/backend/api/routes/room/consumer.py @@ -8,7 +8,7 @@ from database.auth.crud import get_user_from_token from database.room.crud import change_room_name, change_room_status, serialize_member, check_user_in_room, \ create_anonymous, create_member, get_member, get_member_from_token, get_member_from_reconnect_code, connect_member, \ disconnect_member, get_waiter, accept_waiter, leave_room, refuse_waiter -from database.room.models import Room, Member, MemberRead, Waiter, Challenger +from database.room.models import Room, Member, MemberRead, Waiter from services.websocket import Consumer if TYPE_CHECKING: @@ -69,11 +69,11 @@ class RoomConsumer(Consumer): # await self.broadcast(type="connect", payload={"member": serialize_member(self.member)}, exclude=True) async def disconnect_self(self): - print(self.manager.active_connections[self.room.id_code]) + self.manager.remove(self.room.id_code, self) - print(self.manager.active_connections[self.room.id_code]) + if isinstance(self.member, Member): - print('MEMBER', self.member) + try: disconnect_member(self.member, self.db) except StaleDataError: @@ -111,7 +111,7 @@ class RoomConsumer(Consumer): return self.member is not None and self.member.is_admin == True async def isMember(self): - print('S', self.member, self.ws, self.ws.state, self.ws.application_state.__str__()) + if self.member is None: await self.send_error("Vous n'êtes connecté à aucune salle") return self.member is not None and self.member.waiting == False @@ -126,10 +126,10 @@ class RoomConsumer(Consumer): if reconnect_code is None and token is None: await self.direct_send(type="error", payload={"msg": "Veuillez spécifier une méthode de connection"}) return - print("login", token) + if token is not None: member = get_member_from_token(token, self.room.id, self.db) - print('MEMBER', member) + if member == False: await self.send_error("Token expired", code=422) return @@ -233,7 +233,7 @@ class RoomConsumer(Consumer): async def change_name(self, name: str): if len(name) < 20: self.room = change_room_name(self.room, name, self.db) - print('SENDING') + await self.broadcast(type="new_name", payload={"name": name}) return @@ -251,7 +251,7 @@ class RoomConsumer(Consumer): @Consumer.event('leave', conditions=[isMember]) async def leave(self): - print('LEAVED', self.member, isinstance(self.member, Member), isinstance(self.member, Challenger)) + if self.member.is_admin is True: await self.send_error("Vous ne pouvez pas quitter une salle dont vous êtes l'administrateur") return @@ -316,8 +316,8 @@ class RoomConsumer(Consumer): return {} async def disconnect(self): - print('DISCONNECTED', self.member) - print(self.manager.active_connections[self.room.id_code]) + + self.manager.remove(self.room.id_code, self) for p in self.room.parcours: diff --git a/backend/api/routes/room/manager.py b/backend/api/routes/room/manager.py index e511792..f731ab9 100644 --- a/backend/api/routes/room/manager.py +++ b/backend/api/routes/room/manager.py @@ -18,7 +18,7 @@ class RoomManager: self.active_connections[group].append(member) async def _send(self, connection: "RoomConsumer", message, group: str): - print('SENDING', connection.ws.application_state, connection.ws.client_state) + if connection.ws.application_state == WebSocketState.DISCONNECTED or connection.ws.client_state == WebSocketState.DISCONNECTED: self.remove(group, connection) elif connection.ws.application_state == WebSocketState.CONNECTED and connection.ws.client_state == WebSocketState.CONNECTED: @@ -34,7 +34,7 @@ class RoomManager: return True async def broadcast(self, message: Any | Callable, group: str, conditions: list[Callable] = [], exclude: list["RoomConsumer"] = [], ): - print('BROADCaST', self.active_connections) + if group in self.active_connections: @@ -43,17 +43,17 @@ class RoomManager: await self._send(connection, message, group) async def send_to(self, group, id_code, msg): - print('SENDING TO') + if group in self.active_connections: members = [c for c in self.active_connections[group] if c.member.id_code == id_code] - print('MEM', members) + for m in members: await self._send(m, msg, group) async def send_to_admin(self, group, msg): if group in self.active_connections: - print('MEMBERS', self.active_connections[group], [(c.ws.state, c.ws.client_state, c.ws.application_state) for c in self.active_connections[group]]) + members = [c for c in self.active_connections[group] if c.member is not None and c.member.is_admin is True] for m in members: diff --git a/backend/api/routes/room/routes.py b/backend/api/routes/room/routes.py index 12b00ea..890351f 100644 --- a/backend/api/routes/room/routes.py +++ b/backend/api/routes/room/routes.py @@ -90,7 +90,7 @@ async def update_parcours(*, room_id: str, parcours: ParcoursCreate, member: Mem await m.broadcast({"type": "edit_parcours", "data": { "parcours": ParcoursReadUpdate(**parcours_obj.dict(), update_challenges=update_challenges).dict()}}, parcours_old.id_code) - print('BROADCASTING') + await m.broadcast( lambda m: {"type": "update_challenges", "data": {"challenger": {"id_code": m.id_code, "name": getUsername(m), "validated": getMemberValidated(m, parcours_obj, db)}, "challenges": [Challenges( @@ -118,7 +118,7 @@ class Exos(BaseModel): @router.get('/room/{room_id}/challenge/{parcours_id}') def challenge_route(parcours: Parcours = Depends(get_parcours), exercices: List[Exos] = Depends(get_exercices), member: Member = Depends(get_member_dep), db: Session = Depends(get_session)): - print('GENERATE', exercices) + correction = [parseGeneratorOut(generate_from_path(add_fast_api_root( e['exercice'].exo_source), e['quantity'], "web")) for e in exercices] @@ -161,21 +161,21 @@ async def send_challenge(*, challenge: List[CorrectionData], correction: TmpCorr await m.broadcast(lambda m: {"type": "newRanks", "data": {"rank": getMemberRank(m, correction.parcours, db), "avgRank": getMemberAvgRank(m, correction.parcours, db)}}, parcours.id_code) - print('WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo') + await m.send_to(parcours.room.id_code, member.id_code, {"type": "parcours_stats", "data": { "parcours": ParcoursReadShort(name=parcours.name, best_note=challenger.best, validated=challenger.validated, id_code=parcours.id_code, avg=challenger.avg).dict()}}) - print('CHALLENGE', chall) + rank, avgRank = getRank( challenger, parcours, db), getAvgRank(challenger, parcours, db) - print('RANKS', rank, avgRank) + if rank <= 3 or avgRank <= 3: await m.broadcast({"type": "newTops", "data": { "tops": getTops(correction.parcours, db), "avgTops": getAvgTops(correction.parcours, db), }}, parcours.id_code) - print('CHALLENGE', chall) + db.delete(correction) returnValue = {**chall.dict()} db.commit() diff --git a/backend/api/services/models.py b/backend/api/services/models.py index 249c2a9..d2c8b54 100644 --- a/backend/api/services/models.py +++ b/backend/api/services/models.py @@ -1,9 +1,10 @@ from __future__ import annotations + +from math import ceil from typing import TypeVar, Generic, Sequence from fastapi_pagination import Params -from fastapi_pagination.bases import AbstractPage, AbstractParams, BasePage -from math import ceil +from fastapi_pagination.bases import AbstractParams, BasePage from pydantic import conint T = TypeVar("T") @@ -24,7 +25,7 @@ class Page(BasePage[T], Generic[T]): total: int, params: AbstractParams, ) -> Page[T]: - print("PARAMS", params) + totalPage = ceil(total/params.size) return cls( total=total, diff --git a/backend/api/services/websocket.py b/backend/api/services/websocket.py index a2a9565..7fcc552 100644 --- a/backend/api/services/websocket.py +++ b/backend/api/services/websocket.py @@ -74,7 +74,7 @@ class Consumer: ''' if self.ws.state == WebSocketState.DISCONNECTED: return ''' type = payload.get('type', None) - print('TYPE', type, self.member) + if type is not None: event_wrapper = self.sendings.get(type, None) @@ -91,7 +91,7 @@ class Consumer: try: validated_payload = model(self=self, **data) except ValidationError as e: - print("ERROR", e) + await self.ws.send_json({"type": "error", "data": {"msg": "Oops there was an error"}}) return @@ -142,5 +142,5 @@ class Consumer: data = await self.ws.receive_json() await self.receive(data) except WebSocketDisconnect: - print('DISCONNECTION') + await self.disconnect() diff --git a/backend/api/testing.py b/backend/api/testing.py index 3c69918..e7c5c1d 100644 --- a/backend/api/testing.py +++ b/backend/api/testing.py @@ -1,4 +1,3 @@ t = "test = 12" locs ={} exec(t, globals(), locs) -print(locs) \ No newline at end of file diff --git a/backend/api/tests/test_auth.py b/backend/api/tests/test_auth.py index 25084e4..e0241aa 100644 --- a/backend/api/tests/test_auth.py +++ b/backend/api/tests/test_auth.py @@ -6,7 +6,7 @@ VALID_PASSWORD = 'Test12345' def test_register(client: TestClient, username = VALID_USERNAME): r = client.post('/register', data={"username": username, 'password': VALID_PASSWORD, 'password_confirm': VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 200 assert 'access_token' in data assert 'refresh_token' in data @@ -16,7 +16,7 @@ def test_register_username_too_long(client: TestClient): r = client.post('/register', data={"username": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 'password':VALID_PASSWORD, 'password_confirm':VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['username_error'] == 'ensure this value has at most 20 characters' @@ -24,7 +24,7 @@ def test_register_mdp_not_corresponding(client: TestClient): r = client.post('/register', data={"username": VALID_USERNAME, 'password': "Test12345", 'password_confirm': 'Test1234'}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['password_confirm_error'] == 'Les mots de passe ne correspondent pas' @@ -32,7 +32,7 @@ def test_register_mdp_missing_number(client: TestClient): r = client.post('/register', data={"username": "lilian", 'password': "Testttttt", 'password_confirm': 'Testttttt'}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['password_error'] == 'Le mot de passe doit contenir au moins un chiffre' @@ -40,7 +40,7 @@ def test_register_mdp_missing_maj(client: TestClient): r = client.post('/register', data={"username":VALID_USERNAME, 'password': "testttttt1", 'password_confirm': 'testttttt1'}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['password_error'] == 'Le mot de passe doit contenir au moins une majuscule' @@ -48,7 +48,7 @@ def test_register_mdp_too_short(client: TestClient): r = client.post('/register', data={"username": VALID_USERNAME, 'password': "t", 'password_confirm': 't'}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail'][ 'password_error'] == 'Le mot de passe est trop court (8 caractères minimum)' @@ -60,7 +60,7 @@ def test_register_username_indisponible(client: TestClient): rr = client.post('/register', data={"username": VALID_USERNAME, 'password':VALID_PASSWORD, 'password_confirm':VALID_PASSWORD}) data = rr.json() - print(data) + assert rr.status_code == 400 assert data['detail'][ 'username_error'] == "Nom d'utilisateur indisponible" @@ -70,7 +70,7 @@ def test_login(client: TestClient): r = client.post('/login', data={"username": VALID_USERNAME, 'password': VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 200 assert 'access_token' in data assert 'refresh_token' in data @@ -81,7 +81,7 @@ def test_login_invalid_password(client: TestClient): r = client.post('/login', data={"username": VALID_USERNAME, 'password': 'Test1234'}) data = r.json() - print(data) + assert r.status_code == 401 assert data['detail'][ 'password_error'] == "Mot de passe invalide" @@ -89,7 +89,7 @@ def test_login_invalid_password(client: TestClient): def test_login_user_not_found(client: TestClient): r = client.post('/login', data={"username": VALID_USERNAME, 'password': VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 401 assert data['detail'][ 'username_error'] == "Utilisateur introuvable" @@ -101,7 +101,7 @@ def test_check_token(client: TestClient): r = client.post( '/check-access', headers={'Authorization': 'Bearer ' + token}) data = r.json() - print(data) + assert r.status_code == 200 assert data['username'] == 'lilian' @@ -122,7 +122,7 @@ def test_update_user(client: TestClient): r = client.put( '/user', headers={'Authorization': 'Bearer ' + token}, data= {'username': 'lilian2', 'email': 'example@example.com', 'firstname': 'test', 'name': "test"}) data = r.json() - print(data) + assert r.status_code == 200 assert data['username'] == 'lilian2' assert data['email'] == 'example@example.com' @@ -135,7 +135,7 @@ def test_update_user_invalid(client: TestClient): r = client.put( '/user', headers={'Authorization': 'Bearer ' + token}, data={'username': 'lilian222222222222222', 'email': 'example@example.com', 'firstname': 'test', 'name': "test"}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['username_error'] == 'ensure this value has at most 20 characters' @@ -145,7 +145,7 @@ def test_update_username_missing(client: TestClient): r = client.put( '/user', headers={'Authorization': 'Bearer ' + token}, data={ 'email': 'example@example.com', 'firstname': 'test', 'name': "test"}) data = r.json() - print(data) + assert r.status_code == 422 assert data['detail']['username_error'] == 'field required' def test_update_username_missing(client: TestClient): @@ -153,7 +153,7 @@ def test_update_username_missing(client: TestClient): r = client.put( '/user', data={ 'email': 'example@example.com', 'firstname': 'test', 'name': "test"}) data = r.json() - print(data) + assert r.status_code == 401 assert data['detail'] == 'Not authenticated' @@ -168,7 +168,7 @@ def test_delete_user(client: TestClient): '/user', data={'username': VALID_USERNAME, 'password': VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 200 assert data['ok'] == True @@ -179,7 +179,7 @@ def test_delete_invalid_password(client: TestClient): r = client.delete( '/user', data={"username": VALID_USERNAME, 'password': 'Test1234'}) data = r.json() - print(data) + assert r.status_code == 401 assert data['detail'][ 'password_error'] == "Mot de passe invalide" @@ -189,7 +189,7 @@ def test_delete_user_not_found(client: TestClient): r = client.delete( '/user', data={"username": VALID_USERNAME, 'password': VALID_PASSWORD}) data = r.json() - print(data) + assert r.status_code == 401 assert data['detail'][ 'username_error'] == "Utilisateur introuvable" diff --git a/backend/api/tests/test_exos.py b/backend/api/tests/test_exos.py index c9c5a88..57b4e6b 100644 --- a/backend/api/tests/test_exos.py +++ b/backend/api/tests/test_exos.py @@ -1,7 +1,8 @@ from typing import List -from pydantic import BaseModel -import time + from fastapi.testclient import TestClient +from pydantic import BaseModel + from tests.test_auth import test_register @@ -14,7 +15,7 @@ def test_create(client: TestClient, name="test_exo", consigne="consigne", privat username = user['username'] r = client.post('/exercices', data={"name": name, "consigne": consigne, "private": private}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 201 assert 'id_code' in r.json() assert {**r.json(), 'id_code': None} == {'name': name, 'consigne': consigne, 'private': private, 'id_code': None, 'author': {'username': username}, 'original': None, 'tags': [], 'exo_source': 'test.py', 'supports': { @@ -32,7 +33,7 @@ def test_create_bad_import(client: TestClient, name="test_exo", consigne="consig username = user['username'] r = client.post('/exercices', data={"name": name, "consigne": consigne, "private": private}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source_bad_import.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 return r.json() @@ -47,7 +48,7 @@ def test_create_bad_use__(client: TestClient, name="test_exo", consigne="consign username = user['username'] r = client.post('/exercices', data={"name": name, "consigne": consigne, "private": private}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source_use__.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 return r.json() @@ -58,7 +59,7 @@ def test_create_invalid(client: TestClient): r = client.post('/exercices', data={"name": "e"*51, "consigne": "e"*201, "private": False}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print('RESP', r.json()) + assert r.status_code == 422 assert r.json()['detail'] == {'name_error': 'ensure this value has at most 50 characters', 'consigne_error': 'ensure this value has at most 200 characters'} @@ -70,7 +71,7 @@ def test_create_too_long(client: TestClient): r = client.post('/exercices', data={"name": "e", "consigne": "e", "private": False}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source_infinite.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print('RESP', r.json()) + assert r.status_code == 422 assert r.json()['detail'] == {'exo_source_error': 'Script took too long', } @@ -79,7 +80,7 @@ def test_create_name_missing(client: TestClient): token = test_register(client)['access'] r = client.post('/exercices', headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == { 'name_error': 'field required', 'file_error': 'field required'} @@ -90,7 +91,7 @@ def test_create_missing_main(client: TestClient): r = client.post('/exercices', data={"name": "test_exo", "consigne": "consigne", "private": False}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source_missing_main.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == { 'exo_source_error': "Fonction 'main' introuvable"} @@ -101,7 +102,7 @@ def test_create_invalid_source(client: TestClient): r = client.post('/exercices', data={"name": "test_exo", "consigne": "consigne", "private": False}, files={ 'file': ('test.py', open('tests/testing_exo_source/exo_source_invalid.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == { 'exo_source_error': "Exercice non valide (compatible avec aucun support)"} @@ -113,7 +114,7 @@ def test_clone(client: TestClient): token = test_register(client, username="lilian2")['access'] rr = client.post('/clone/' + id_code, headers={'Authorization': 'Bearer ' + token}) - print(rr.json()) + assert rr.status_code == 200 assert 'id_code' in rr.json() assert {**rr.json(), 'id_code': None} == {'name': 'test_exo', 'consigne': 'consigne', 'private': False, 'id_code': None, 'author': {'username': 'lilian2'}, 'original': {"id_code": id_code, "name": create['name'], 'author': 'lilian'}, 'tags': [], 'exo_source': 'test.py', 'supports': { @@ -126,7 +127,7 @@ def test_clone_private(client: TestClient): token = test_register(client, username="lilian2")['access'] rr = client.post('/clone/' + id_code, headers={'Authorization': 'Bearer ' + token}) - print(rr.json()) + assert rr.status_code == 401 assert rr.json() == {'detail': 'Cet exercice est privé'} @@ -137,7 +138,7 @@ def test_update(client: TestClient): consigne="testconsigne")['id_code'] r = client.put('/exercice/' + id_code, data={"name": "name", "private": True}, files={ 'file': ('test2.py', open('tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 200 assert 'id_code' in r.json() assert r.json() == {'name': "name", 'consigne': "testconsigne", 'private': True, 'id_code': id_code, 'author': {'username': 'lilian'}, 'original': None, 'tags': [], 'exo_source': 'test2.py', 'supports': { @@ -149,7 +150,7 @@ def test_update_no_file(client: TestClient): id_code = test_create(client, user={'token': token, 'username': "lilian"}, consigne="testconsigne")['id_code'] r = client.put('/exercice/' + id_code, data={"name": "name", "private": True}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 200 assert 'id_code' in r.json() assert r.json() == {'name': "name", 'consigne': "testconsigne", 'private': True, 'id_code': id_code, 'author': {'username': 'lilian'}, 'original': None, 'tags': [], 'exo_source': 'test.py', 'supports': { @@ -163,7 +164,7 @@ def test_update_missing_name(client: TestClient): 'id_code'] r = client.put('/exercice/' + id_code, data={"consigne": "consigne", "private": False}, files={ 'file': ('test2.py', open('tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == {'name_error': 'field required'} @@ -174,7 +175,7 @@ def test_update_missing_main(client: TestClient): 'id_code'] r = client.put('/exercice/' + id_code, data={"consigne": "consigne", "private": False}, files={ 'file': ('test2.py', open('tests/testing_exo_source/exo_source_missing_main.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == { 'exo_source_error': "Fonction 'main' introuvable"} @@ -186,7 +187,7 @@ def test_update_invalid(client: TestClient): 'id_code'] r = client.put('/exercice/' + id_code, data={"consigne": "consigne", "private": False}, files={ 'file': ('test2.py', open('tests/testing_exo_source/exo_source_invalid.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == { 'exo_source_error': "Exercice non valide (compatible avec aucun support)"} @@ -199,7 +200,7 @@ def test_update_too_long(client: TestClient): 'id_code'] r = client.put('/exercice/' + id_code, data={'name': 'e'*51, "consigne": "e"*201, "private": False}, files={ 'file': ('test2.py', open('tests/testing_exo_source/exo_source.py', 'rb'))}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert r.status_code == 422 assert r.json()['detail'] == {'name_error': 'ensure this value has at most 50 characters', 'consigne_error': 'ensure this value has at most 200 characters'} @@ -211,7 +212,7 @@ def test_delete(client: TestClient): 'id_code'] r = client.delete('/exercice/' + id_code, headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + assert r.status_code == 200 assert r.json()['detail'] == 'Exercice supprimé avec succès' @@ -220,7 +221,7 @@ def test_delete_not_found(client: TestClient): token = test_register(client, username="lilian")['access'] r = client.delete('/exercice/' + "test", headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + assert r.status_code == 404 assert r.json()['detail'] == 'Exercice introuvable' @@ -246,7 +247,7 @@ def test_add_tags(client: TestClient, name='name', tags: List[Tags] = [{'label': id_code = exo['id_code'] r = client.post(f'/exercice/{id_code}/tags', json=tags, headers={'Authorization': 'Bearer ' + token}) - print("DATA", tags, "\n\n",r.json()) + data = r.json() labels = [l['label'] for l in tags] assert r.status_code == 200 @@ -261,7 +262,7 @@ def test_add_tags_invalid_color(client: TestClient): id_code = exo['id_code'] r = client.post(f'/exercice/{id_code}/tags', json=[ {'label': "name", 'color': "color", 'id_code': "id_code"}], headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + data = r.json() assert r.status_code == 422 assert data['detail'] == { @@ -274,7 +275,7 @@ def test_add_tags_too_long(client: TestClient): id_code = exo['id_code'] r = client.post(f'/exercice/{id_code}/tags', json=[ {'label': "n"*21, 'color': "#ff0000", 'id_code': "id_code"}], headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + data = r.json() assert r.status_code == 422 assert data['detail'] == { @@ -288,7 +289,7 @@ def test_remove_tag(client: TestClient): tag_id = exo["tags"][0]["id_code"] r = client.delete(f'/exercice/{id_code}/tags/{tag_id}', headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + assert r.json() == { **exo['exo'], 'tags': exo['tags'][1:]} @@ -300,7 +301,7 @@ def test_remove_tag_not_found(client: TestClient): tag_id = "none" r = client.delete(f'/exercice/{id_code}/tags/{tag_id}', headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + assert r.json()['detail'] == 'Tag introuvable' @@ -311,7 +312,7 @@ def test_remove_tag_exo_not_found(client: TestClient): id_code = "tets" r = client.delete(f'/exercice/{id_code}/tags/{tag_id}', headers={'Authorization': 'Bearer ' + token}) - print(r.json()) + assert r.json()['detail'] == 'Exercice introuvable' @@ -323,7 +324,7 @@ def test_remove_tag_not_owner(client: TestClient): tag_id = exo['tags'][0]['id_code'] r = client.delete(f'/exercice/{id_code}/tags/{tag_id}', headers={'Authorization': 'Bearer ' + token2}) - print(r.json()) + assert r.json()['detail'] == "Vous n'êtes pas le propriétaire du tag" @@ -333,8 +334,8 @@ def test_exo_exo_source(client: TestClient): id_code = exo['id_code'] r = client.get(f"/exercice/{id_code}/exo_source", headers={'Authorization': 'Bearer ' + token}) - print(r.text) - print(r.headers) + + assert r.text == open('tests/testing_exo_source/exo_source.py', 'r').read() assert r.headers['content-disposition'].split('filename=')[-1] == 'test.py' @@ -350,7 +351,7 @@ def test_get_users_exos(client: TestClient): r = client.get('/exercices/user', headers={'Authorization': 'Bearer ' + token1}) - print(r.json()) + assert r.json()['page'] == 1 assert r.json()['size'] == 50 assert r.json()["items"] == [prv] @@ -387,7 +388,7 @@ def test_get_users_exos_page(client: TestClient): r = client.get('/exercices/user', headers={'Authorization': 'Bearer ' + token1}, params={"page": 2, "size": 10}) - print(r.json()) + assert r.json()['page'] == 2 assert r.json()['size'] == 10 assert r.json()["items"] == [prv11, prv12] @@ -424,7 +425,7 @@ def test_get_users_exos_page_up(client: TestClient): r = client.get('/exercices/user', headers={'Authorization': 'Bearer ' + token1}, params={"page": 2, "size": 10}) - print(r.json()) + assert r.json()['page'] == 2 assert r.json()['size'] == 10 assert r.json()["items"] == [] @@ -451,7 +452,7 @@ def test_get_user_with_search(client: TestClient): r = client.get('/exercices/user', params={"search": "test"}, headers={'Authorization': 'Bearer ' + token1}) - print(r.json()) + assert r.json()['items'] == [exo1, exo2] @@ -475,7 +476,7 @@ def test_get_user_with_search(client: TestClient): r = client.get('/exercices/user', params={"search": "test"}, headers={'Authorization': 'Bearer ' + token1}) - print(r.json()) + assert r.json()['items'] == [exo1, exo2] @@ -507,7 +508,7 @@ def test_get_user_with_tags(client: TestClient): tags3 = exo3['tags'] r = client.get('/exercices/user', params={'tags': [*[t['id_code'] for t in tags2], 'notexisting']}, headers={'Authorization': 'Bearer ' + token1}) - print("DATA", r.json()) + assert r.json()['items'] == [exo2['exo'], exo3['exo']] @@ -536,7 +537,7 @@ def test_get_user_with_tags_and_search(client: TestClient): tags3 = exo3['tags'] r = client.get('/exercices/user', params={"search": "yes", 'tags': [t['id_code'] for t in tags2]}, headers={'Authorization': 'Bearer ' + token1}) - print(r.json()) + assert r.json()['items'] == [exo3['exo']] @@ -553,7 +554,7 @@ def test_get_public_auth(client: TestClient): r = client.get('/exercices/public', headers={'Authorization': 'Bearer ' + token2}) - print(r.json()) + assert r.json()['items'] == [{**public2, 'is_author': False}] @@ -573,7 +574,7 @@ def test_get_public_auth_with_search(client: TestClient): r = client.get('/exercices/public', params={'search': "yes"}, headers={'Authorization': 'Bearer ' + token2}) - print(r.json()) + assert r.json()['items'] == [{**public2, 'is_author': False}] @@ -589,7 +590,7 @@ def test_get_public_no_auth(client: TestClient): client, user={'token': token1, 'username': "lilian"}) r = client.get('/exercices/public') - print(r.json()) + assert r.json()['items'] == [{**public1, 'is_author': False}, {**public2, 'is_author': False}] @@ -618,7 +619,7 @@ def test_get_exo_auth(client: TestClient): r = client.get('/exercice/' + exo['exo']['id_code'], headers={'Authorization': 'Bearer ' + token2}) - print(r.json(), exo) + assert r.json() == {**exo['exo'], "tags": [], 'is_author': False} @@ -632,7 +633,7 @@ def test_get_exo_auth_with_tags(client: TestClient): r = client.get('/exercice/' + exo['exo']['id_code'], headers={'Authorization': 'Bearer ' + token}) - print(r.json(), exo) + assert r.json() == {**exo['exo']} @@ -657,7 +658,7 @@ def test_get_tags(client: TestClient): tags2 = exo2['tags'] r = client.get('/tags', headers={'Authorization': 'Bearer ' + token2}) - print(r.json()) + assert r.json() == tags2 diff --git a/backend/api/tests/test_room.py b/backend/api/tests/test_room.py index cce6589..ab5426a 100644 --- a/backend/api/tests/test_room.py +++ b/backend/api/tests/test_room.py @@ -8,7 +8,7 @@ from tests.test_exos import test_create def test_create_room_no_auth(client: TestClient, public=False): r = client.post('/room', json={"name": "test_room", "public": public}, params={'username': "lilian"}) - print(r.json()) + assert "room" in r.json() assert "member" in r.json() assert r.json()['member'] is not None @@ -18,7 +18,7 @@ def test_create_room_no_auth(client: TestClient, public=False): def test_create_room_no_auth_invalid(client: TestClient): r = client.post('/room', json={"name": "test_room" * 21, "public": False}, params={'username': "lilian" * 21}) - print(r.json()) + assert r.json() == {'detail': {'username_error': 'ensure this value has at most 20 characters', 'name_error': 'ensure this value has at most 20 characters'}} @@ -28,7 +28,7 @@ def test_create_room_auth(client: TestClient, token=None, public=False): token = test_register(client=client)['access'] r = client.post('/room', json={"name": "test_room", "public": public}, headers={"Authorization": "Bearer " + token}) - print(r.json()) + assert "room" in r.json() assert "member" in r.json() assert r.json()['member'] == None @@ -81,7 +81,7 @@ def test_login_no_auth_not_in_room(client: TestClient): ws.send_json({"type": "login", "data": { "reconnect_code": "lol"}}) data = ws.receive_json() - print(data) + assert data == {'type': "error", "data": {"code": 401, "msg": "Utilisateur introuvable dans cette salle"}} @@ -93,7 +93,7 @@ def test_login_auth(client: TestClient): with client.websocket_connect(f"/ws/room/" + room['room']) as ws: ws.send_json({"type": "login", "data": {"token": token}}) data = ws.receive_json() - print(data) + assert "id_code" in data["data"]['member'] assert data == {'type': "loggedIn", "data": {"member": {**data["data"]['member'], "username": "lilian", "isAdmin": True, "isUser": True, @@ -107,7 +107,7 @@ def test_login_auth_not_in_room(client: TestClient): with client.websocket_connect(f"/ws/room/" + room['room']) as ws: ws.send_json({"type": "login", "data": {"token": token}}) data = ws.receive_json() - print(data) + assert data == {'type': "error", "data": {"code": 401, "msg": "Utilisateur introuvable dans cette salle"}} @@ -139,7 +139,7 @@ def test_join_auth(client: TestClient): assert mdata == {"type": "accepted", "data": {"member": { "username": "lilian2", "isUser": True, "isAdmin": False, "reconnect_code": "", "id_code": mdata['data']["member"]["id_code"], "clientId": "", "online": True}}} - print("MDATABUS", mdata) + adata = admin.receive_json() assert adata == {'type': "joined", 'data': { @@ -601,7 +601,7 @@ def test_create_parcours_no_auth(client: TestClient): {"exercice_id": exo2['id_code'], "quantity": 5}, {"exercice_id": exo3['id_code'], "quantity": 12}]}) - print('resonse', r.json(), exo3) + assert r.json() == {"id_code": r.json()['id_code'], "memberRank": None, "name": "test_parcours", "pb": None, "rank": None, "ranking": [], "tops": [], "validated": False, "challenges": {}, "name": "test_parcours", "time": 10 * 60, @@ -925,7 +925,7 @@ def test_corrige_auth(client: TestClient): r = client.post(f'/room/{room["room"]}/parcours', headers={"Authorization": "Bearer " + token}, json={"name": "test_parcours", "time": 10 * 60, "max_mistakes": 10, "exercices": [ {"exercice_id": exo1['id_code'], "quantity": 3}]}) - print(r.json()) + parcours_id = r.json()['id_code'] memberws.receive_json() admin.receive_json() # new parcours diff --git a/frontend/src/components/NavBar.svelte b/frontend/src/components/NavBar.svelte index f39cf6b..1ee3164 100644 --- a/frontend/src/components/NavBar.svelte +++ b/frontend/src/components/NavBar.svelte @@ -16,7 +16,7 @@ afterNavigate(() => { open = false; }); - $: console.log("USERNAME", $username); + $: