Skip to content
Snippets Groups Projects
test_db.py 11.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • Josef Olsson's avatar
    Josef Olsson committed
    """
    This file tests the database controller functions.
    """
    
    
    import app.database.controller as dbc
    
    from app.database.models import City, Code, Competition, Media, MediaType, Role, User
    
    
    from tests import app, client, db
    
    from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, assert_slide_order, delete
    
    
    
    def test_user(client):
        add_default_values()
        item_user = User.query.filter_by(email="test@test.se").first()
    
        # Assert user
    
        assert item_user is not None
    
        assert item_user.city.name == "Linköping"
        assert item_user.role.name == "Admin"
    
        item_role = Role.query.filter_by(name="Admin").first()
        item_city = City.query.filter_by(name="Linköping").first()
    
        # Assert user with role and city
        assert len(item_role.users) == 1 and item_role.users[0].id == item_user.id
        assert len(item_city.users) == 1 and item_city.users[0].id == item_user.id
    
    
    
    def test_media(client):
    
        add_default_values()
        item_user = User.query.filter_by(email="test@test.se").first()
    
        # Get image type
        image_type = MediaType.query.filter_by(name="Image").first()
    
        # Add image
        db.session.add(Media("bild.png", image_type.id, item_user.id))
        db.session.commit()
    
        # Assert image
        item_media = Media.query.filter_by(filename="bild.png").first()
    
        assert item_media is not None
    
        assert len(item_user.media) == 1
        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_original = list_item_competitions[0]
    
        # Fetches the first slide in that competition
        num_slides = 3
        item_slides, total = dbc.search.slide(competition_id=item_competition_original.id)
        assert total == num_slides
        item_slide_original = item_slides[0]
    
        # Inserts several copies of the same slide
    
        for _ in range(num_copies):
            item_slide_copy = dbc.copy.slide(item_slide_original)
            num_slides += 1
            check_slides_copy(item_slide_original, item_slide_copy, num_slides, num_slides - 1)
            assert item_slide_copy.competition_id == item_slide_original.competition_id
    
        # Copies competition
        num_copies = 3
        for _ in range(num_copies):
            item_competition_copy = dbc.copy.competition(item_competition_original)
            for order, item_slide in enumerate(item_competition_copy.slides):
                item_slide_original = item_competition_original.slides[order]
                check_slides_copy(item_slide_original, item_slide, num_slides, order)
                assert item_slide.competition_id != item_slide_original.competition_id
    
                # TODO: Check that all codes are corectly created
    
        # Deleting competition deletes all corresponding codes
        item_competitions = dbc.get.all(Competition)
        for item_competition in item_competitions:
            dbc.delete.competition(item_competition)
        assert len(dbc.get.all(Code)) == 0
    
        # Deleting team deletes the right code
        item_competition = dbc.add.competition("tom", 1971, 1)
        item_team_1 = dbc.add.team("Lag 1", item_competition.id)
        item_team_2 = dbc.add.team("Lag 2", item_competition.id)
        assert len(dbc.get.all(Code)) == 5
        dbc.delete.team(item_team_1)
        assert len(dbc.get.all(Code)) == 4
        dbc.delete.team(item_team_2)
        assert len(dbc.get.all(Code)) == 3
    
    
    
    def check_slides_copy(item_slide_original, item_slide_copy, num_slides, order):
        """ Checks that two slides are correct copies of each other. Looks big but is quite fast. """
        assert item_slide_copy.order == order  # 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
    
        # Checks that all components were correctly copied
    
        components = item_slide_original.components
        components_copy = item_slide_copy.components
        assert len(components) == len(components_copy)
    
        for c1, c2 in zip(components, components_copy):
    
            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.slide_id == item_slide_original.id
            assert c2.slide_id == item_slide_copy.id
            assert c1.type_id == c2.type_id
    
            if c1.type_id == 1:
                assert c1.text == c2.text
            elif c1.type_id == 2:
                assert c1.image_id == c2.image_id
    
        # Checks that all questions were correctly copied
    
        questions = item_slide_original.questions
        questions_copy = item_slide_copy.questions
        assert len(questions) == len(questions_copy)
    
        for q1, q2 in zip(questions, questions_copy):
    
            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
    
    
            # Assert alternatives
            alternatives = q1.alternatives
            alternatives_copy = q2.alternatives
            assert len(alternatives) == len(alternatives_copy)
    
            for a1, a2 in zip(alternatives, alternatives_copy):
                assert a1.text == a2.text
                assert a1.value == a2.value
                assert a1.quesiton_id == q1.id
                assert a2.quesiton_id == q2.id
    
    
        # Checks that the copy put the slide in the database
        item_slides, total = dbc.search.slide(
            competition_id=item_slide_copy.competition_id,
            # page_size=num_slides + 1, # Use this total > 15
        )
        assert total == num_slides
        assert item_slide_copy == item_slides[order]
    
    
    
    def test_move_slides(client):
        add_default_values()
    
        item_comp = dbc.get.one(Competition, 1)
    
        for _ in range(9):
            dbc.add.slide(item_comp.id)
    
        # Move from beginning to end
        item_comp = dbc.utils.move_slides(item_comp, 0, 9)
        assert_slide_order(item_comp, [9, 0, 1, 2, 3, 4, 5, 6, 7, 8])
    
        # Move from end to beginning
        item_comp = dbc.utils.move_slides(item_comp, 9, 0)
        assert_slide_order(item_comp, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
        # Move some things in the middle
        item_comp = dbc.utils.move_slides(item_comp, 3, 7)
        assert_slide_order(item_comp, [0, 1, 2, 7, 3, 4, 5, 6, 8, 9])
    
        item_comp = dbc.utils.move_slides(item_comp, 1, 5)
        assert_slide_order(item_comp, [0, 5, 1, 7, 2, 3, 4, 6, 8, 9])
    
        item_comp = dbc.utils.move_slides(item_comp, 8, 2)
        assert_slide_order(item_comp, [0, 6, 1, 8, 3, 4, 5, 7, 2, 9])
    
    
    
    def test_question(client):
        add_default_values()
        item_user = User.query.filter_by(email="test@test.se").first()
    
        # Get image type
        image_type = MediaType.query.filter_by(name="Image").first()
    
        # Add image
        db.session.add(Media("bild.png", image_type.id, item_user.id))
        db.session.commit()
        item_media = Media.query.filter_by(filename="bild.png").first()
    
        # Add competition
        item_city = City.query.filter_by(name="Linköping").first()
    
        dbc.add.competition("teknik8", 2020, item_city.id)
        dbc.add.competition("teknik9", 2020, item_city.id)
    
        item_competition = Competition.query.filter_by(name="teknik8").first()
        item_competition_2 = Competition.query.filter_by(name="teknik9").first()
    
    
        assert item_competition is not None
    
        assert item_competition.id == 4
    
        assert item_competition.city.name == "Linköping"
    
        # Add teams
    
        dbc.add.team("Lag1", item_competition)
        dbc.add.team("Lag2", item_competition)
    
    
        assert_insert_fail(Team, "Lag1", item_competition.id)
    
    
        dbc.add.team("Lag1", item_competition_2)
    
    
        assert Team.query.filter((Team.competition_id == item_competition.id) & (Team.name == "Lag1")).count() == 1
        assert Team.query.filter((Team.competition_id == item_competition.id) & (Team.name == "Lag2")).count() == 1
        assert Team.query.filter((Team.competition_id == item_competition_2.id) & (Team.name == "Lag1")).count() == 1
        assert Team.query.filter(Team.name == "Lag1").count() == 2
        assert Team.query.filter(Team.competition_id == item_competition.id).count() == 2
        assert Team.query.count() == 3
    
        # Add slides
    
        dbc.add.slide(item_competition)
        dbc.add.slide(item_competition)
        dbc.add.slide(item_competition)
    
    
        # Try add slide with same order
        assert_insert_fail(Slide, 1, item_competition.id)
    
        assert_exists(Slide, 3, order=1)
    
        item_slide1 = Slide.query.filter_by(order=0).first()
        item_slide2 = Slide.query.filter_by(order=1).first()
        item_slide3 = Slide.query.filter_by(order=2).first()
    
        assert item_slide1 is not None
        assert item_slide2 is not None
        assert item_slide3 is not None
    
    
        # Add questions
        question_type_bool = QuestionType.query.filter_by(name="Boolean").first()
        question_type_multiple = QuestionType.query.filter_by(name="Multiple").first()
    
    
        dbc.add.question("Fråga1", 10, question_type_bool.id, item_slide2)
        dbc.add.question("Fråga2", 10, question_type_multiple.id, item_slide3)
    
        assert question_type_bool is not None
        assert question_type_multiple is not None
    
    
        item_q1 = Question.query.filter_by(name="Fråga1").first()
        item_q2 = Question.query.filter_by(name="Fråga2").first()
        assert item_q1.type.name == "Boolean"
        assert item_q2.type.name == "Multiple"
    
    
        # Get question
        CID = 3
        QID = 4
        item_q1 = dbc.get.question(CID, QID)
        assert item_q1.id == QID
        item_slide = dbc.get.slide(CID, item_q1.slide_id)
        assert item_q1.slide_id == item_slide.id
    
        # Edit question
        print(item_q1.type_id)
        print(item_q1.slide_id)
        name = "Nytt namn"
        total_score = 44
        type_id = 2
        slide_id = 4
        dbc.edit.question(item_q1, name=name, total_score=total_score, type_id=type_id, slide_id=slide_id)
        item_q1 = Question.query.filter_by(name=name).first()
        assert item_q1.name == name
        assert item_q1.total_score == total_score
        assert item_q1.type_id == type_id
        assert item_q1.slide_id == slide_id
    
        # Search for question
        item_q2, _ = dbc.get.search_questions(
            name=name, total_score=total_score, type_id=type_id, slide_id=slide_id, competition_id=CID
        )
        assert item_q1 == item_q2[0]
    
    
    def test_slide(client):
        add_default_values()
    
        # Get all slides
        slides = Slide.query.all()
        item_slides = dbc.get.search_slide()
        assert slides == item_slides[0]
    
        # Search using all parameters
        item_comp = Competition.query.filter(Competition.name == "Tävling 1").first()
        aux = dbc.get.search_slide(slide_order=1, title="Title 1", body="Body 1", competition_id=item_comp.id)
        item_slide = aux[0][0]
        assert item_comp.slides[1] == item_slide
    
        # Edit all parameters of a slide
        title = "Ändrad titel"
        timer = 42
        slide_id = item_slide.id
        dbc.edit.slide(item_slide, title=title, timer=timer)
        aux = dbc.get.search_slide(slide_order=1, title=title, body="Body 1", competition_id=item_comp.id)
        item_slide = aux[0][0]
        assert item_slide.id == slide_id
        assert item_slide.title == title
        assert item_slide.timer == timer
    
        # Delete slide
        aux = dbc.get.search_slide(slide_order=1, competition_id=item_comp.id)
        item_slide = aux[0][0]
        dbc.delete.slide(item_slide)