diff --git a/server/app/database/controller/__init__.py b/server/app/database/controller/__init__.py index 2865b52300df3a80dce6554e9ad018faf5f06edc..a46a65f1e6c2fe4e0664c462288a5f00c1cdd46c 100644 --- a/server/app/database/controller/__init__.py +++ b/server/app/database/controller/__init__.py @@ -1,3 +1,3 @@ # import add, get from app.core import db -from app.database.controller import add, delete, edit, get, search, utils +from app.database.controller import add, copy, delete, edit, get, search, utils diff --git a/server/app/database/controller/copy.py b/server/app/database/controller/copy.py index ef6f0ecff5304fcfd037e7e39045fd9dde4724a8..de4f8c1edcb7b8ddc9a40c7a8aad07e58ac01922 100644 --- a/server/app/database/controller/copy.py +++ b/server/app/database/controller/copy.py @@ -4,7 +4,6 @@ This file contains functionality to copy and duplicate data to the database. from app.database.controller import add, utils from app.database.models import Question, Slide -from flask_sqlalchemy import utils def _question(item_question_old, slide_id): @@ -53,9 +52,9 @@ def slide(item_slide_old): """ order = Slide.query.filter( - Slide.competition_id == item_slide_old.item_competition.id + Slide.competition_id == item_slide_old.competition_id ).count() # first element has index 0 - item_slide_new = add.db_add(Slide(order, item_slide_old.item_competition.id)) + item_slide_new = add.db_add(Slide(order, item_slide_old.competition_id)) # Copy all fields item_slide_new.title = item_slide_old.title @@ -66,7 +65,7 @@ def slide(item_slide_old): # TODO: Add background image for item_component in item_slide_old.components: - _component(item_slide_new, item_component) + _component(item_component, item_slide_new) for item_question in item_slide_old.questions: _question(item_question, item_slide_new.id) diff --git a/server/tests/test_db.py b/server/tests/test_db.py index 3bb998aec9674b9ab0cc865ec2e9c22a9640e73a..3d68bc3e807462574fba47db01ec812e8708334a 100644 --- a/server/tests/test_db.py +++ b/server/tests/test_db.py @@ -1,5 +1,5 @@ import app.database.controller as dbc -from app.database.models import City, Competition, Media, MediaType, Question, QuestionType, Role, Slide, Team, User +from app.database.models import City, Media, MediaType, Role, User from tests import app, client, db from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail @@ -40,6 +40,73 @@ def test_media(client): assert item_media.upload_by.email == "test@test.se" +def test_copy(client): + add_default_values() + + # Fetches an empty competition + list_item_competitions, _ = dbc.search.competition(name="Tävling 1") + item_competition = list_item_competitions[0] + + # Fetches the first slide in that competition + num_slides = 3 + item_slides, total = dbc.search.slide(competition_id=item_competition.id) + assert total == 3 + item_slide_original = item_slides[0] + + # Copies the slide and double checks the results + item_slide_copy = dbc.copy.slide(item_slide_original) + num_slides += 1 + assert item_slide_copy.order == num_slides - 1 # 0 indexing + assert item_slide_copy.title == item_slide_original.title + assert item_slide_copy.body == item_slide_original.body + assert item_slide_copy.timer == item_slide_original.timer + assert item_slide_copy.settings == item_slide_original.settings + assert item_slide_copy.competition_id == item_slide_original.competition_id + + # Checks that all components were correctly copied + assert len(item_slide_copy.components) == len(item_slide_original.components) + for i, c1 in enumerate(item_slide_original.components): + c2 = item_slide_copy.components[i] + assert c1 != c2 + assert c1.x == c2.x + assert c1.y == c2.y + assert c1.w == c2.w + assert c1.h == c2.h + assert c1.data == c2.data + assert c1.slide_id == item_slide_original.id + assert c2.slide_id == item_slide_copy.id + assert c1.type_id == c2.type_id + + # Checks that all questions were correctly copied + assert len(item_slide_copy.questions) == len(item_slide_original.questions) + for i, q1 in enumerate(item_slide_original.questions): + q2 = item_slide_copy.questions[i] + assert q1 != q2 + assert q1.name == q2.name + assert q1.total_score == q2.total_score + assert q1.type_id == q2.type_id + assert q1.slide_id == item_slide_original.id + assert q2.slide_id == item_slide_copy.id + # TODO: Assert alternatives + + # Checks that the copy put the slide in the database + item_slides, total = dbc.search.slide(competition_id=item_competition.id) + assert total == num_slides + assert item_slide_copy == item_slides[num_slides - 1] + + # Inserts several copies of the same slide + num_copies = 10 + for i in range(num_copies): + # The order must be correct + item_slide_original = dbc.copy.slide(item_slide_original) + assert item_slide_original.order == i + num_slides + + # Checks that the last slide is correct + item_slides, total = dbc.search.slide(competition_id=item_competition.id) + assert total == num_copies + num_slides + assert item_slide_original == item_slides[num_copies + num_slides - 1] + + """ def test_question(client): add_default_values() diff --git a/server/tests/test_helpers.py b/server/tests/test_helpers.py index fbd77d9ef146676c0cb6af94581c984b730ac3db..7a68655b5a0212012736b40627050dab81f86595 100644 --- a/server/tests/test_helpers.py +++ b/server/tests/test_helpers.py @@ -47,17 +47,19 @@ def add_default_values(): dbc.add.slide(item_comp) # Add slides - i = 1 - for item_slide in item_comp.slides: + for i, item_slide in enumerate(item_comp.slides): # Populate slide with data - item_slide.title = f"Title {i}" - item_slide.body = f"Body {i}" - item_slide.timer = 100 + i + item_slide.title = f"Title {i+1}" + item_slide.body = f"Body {i+1}" + item_slide.timer = 100 + i + 1 # item_slide.settings = "{}" dbc.utils.commit_and_refresh(item_slide) + # Add question to competition - dbc.add.question(name=f"Q{i}", total_score=i, type_id=1, item_slide=item_slide) - i += 1 + dbc.add.question(name=f"Q{i+1}", total_score=i + 1, type_id=1, item_slide=item_slide) + + # Add text component + dbc.add.component(1, item_slide, {"text": "Text"}, i, 2 * i, 3 * i, 4 * i) def get_body(response):