Esempio n. 1
0
def test_level_system():

    with Session() as session:

        session = setup_scenarios.create_levels_junior_and_senior_detectives(
            session)

        junior_detective1 = user_handler.get_user_by_id("1", session)

        assert junior_detective1.level_id == 1
        assert junior_detective1.experience_points == 0

        user_handler.give_experience_point(junior_detective1.id, session)
        junior_detective1 = user_handler.get_user_by_id(
            junior_detective1.id, session)

        assert junior_detective1.level_id == 1
        assert junior_detective1.experience_points == 1

        for _ in range(5):
            user_handler.give_experience_point(junior_detective1.id, session)

        junior_detective1 = user_handler.get_user_by_id(
            junior_detective1.id, session)

        assert junior_detective1.level_id == 2
        assert junior_detective1.experience_points == 6
def test_level_system(monkeypatch):
    monkeypatch.setenv("DBNAME", "Test")

    session = get_db_session(True, None)

    session = setup_scenarios.create_levels_junior_and_senior_detectives(
        session)

    junior_detective1 = user_handler.get_user_by_id("1", True, session)

    assert junior_detective1.level_id == 1
    assert junior_detective1.experience_points == 0

    user_handler.give_experience_point(junior_detective1.id, True, session)
    junior_detective1 = user_handler.get_user_by_id(junior_detective1.id, True,
                                                    session)

    assert junior_detective1.level_id == 1
    assert junior_detective1.experience_points == 1

    for _ in range(5):
        user_handler.give_experience_point(junior_detective1.id, True, session)

    junior_detective1 = user_handler.get_user_by_id(junior_detective1.id, True,
                                                    session)

    assert junior_detective1.level_id == 2
    assert junior_detective1.experience_points == 6
Esempio n. 3
0
def test_get_user(monkeypatch):
    monkeypatch.setenv("DBNAME", "Test")

    session = get_db_session(True, None)

    session = setup_scenarios.create_levels_junior_and_senior_detectives(
        session)
    junior_detective1 = user_handler.get_user_by_id("1", True, session)

    event = event_creator.get_create_review_event(junior_detective1.id, "abc")
    resp = get_user(event, None, True, session)
    body = json.loads(resp["body"])

    assert body["id"] == junior_detective1.id
    assert body["level"] == 1
    assert body["level_description"] == "Junior"
    assert body["progress"] == 0
    assert body["total_rank"] == session.query(User).count()
    assert body["level_rank"] == session.query(User).filter(
        User.level_id == junior_detective1.level_id).count()
    assert body["solved_cases_total"] == 0
    assert body["solved_cases_today"] == 0
    assert body["exp_needed"] == 5
    sign_up_date = datetime.strptime(body["sign_up_timestamp"],
                                     '%Y-%m-%d %H:%M:%S').date()
    assert sign_up_date != datetime.today()
Esempio n. 4
0
def get_open_items(event, context, is_test=False, session=None):

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Get open items for user", event, logger)

    if session == None:
        session = connection_handler.get_db_session(False, None)

    try:
        # get cognito user id
        id = helper.cognito_id_from_event(event)

        # get number of items from url path
        if ('queryStringParameters' in event
                and 'num_items' in event['queryStringParameters']):
            num_items = int(event['queryStringParameters']['num_items'])
        else:
            num_items = 5

        user = user_handler.get_user_by_id(id, is_test, session)
        response = item_handler.get_open_items_for_user(
            user, num_items, is_test, session)
        items = response['items']

        if len(items) < 1:
            response = {
                "statusCode": 404,
                "body": "There are currently no open items for this user."
            }
        else:
            # Transform each item into dict
            items_dict = []
            for item in items:
                items_dict.append(item.to_dict())
            body = {
                "items": items_dict,
                "is_open_review": response['is_open_review']
            }
            response = {
                "statusCode": 200,
                'headers': {
                    "content-type": "application/json; charset=utf-8"
                },
                "body": json.dumps(body)
            }

    except Exception:
        response = {
            "statusCode":
            400,
            "body":
            "Could not get user and/or num_items. Check URL path parameters. Stacktrace: {}"
            .format(traceback.format_exc())
        }

    response_cors = helper.set_cors(response, event, is_test)
    return response_cors
Esempio n. 5
0
def get_review(event, context):
    """Gets a review.

    Parameters
    ----------
    - user_id is retrieved from the event
    - review_id is retrieved from query parameters

    Returns
    ------
    - Status code 200 OK
    - The requested review
    """

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Get Review", event, logger)

    try:
        # get cognito id
        user_id = helper.cognito_id_from_event(event)
    except:
        return helper.get_text_response(
            400, "Malformed request. Please provide a valid request.", event)

    with Session() as session:

        try:
            # get user from database
            user = user_handler.get_user_by_id(user_id, session)
        except:
            return helper.get_text_response(404, "No user found.", event)

        try:
            # Try to receive review
            review = review_handler.get_open_review(user_id, session)
        except:
            return helper.get_text_response(404, "No review found", event)
        if review is None:
            return responses.NoContent(
                event, 'No review in progress found for current user.'
            ).to_json_string()
        try:
            if review.user_id == user.id:
                return responses.Success(
                    event,
                    json.dumps(
                        review.to_dict(with_questions_and_answers=True,
                                       with_tags=True))).to_json_string()
            else:
                return responses.Forbidden(
                    event,
                    'User is not allowed to access review').to_json_string()
        except Exception as e:
            return responses.InternalError(event, "Internal error",
                                           e).to_json_string()
def get_user(event, context, is_test=False, session=None):

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    helper.log_method_initiated("Get user", event, logger)

    if session == None:
        session = get_db_session(False, None)

    try:
        # get cognito id
        id = helper.cognito_id_from_event(event)

        try:
            user = user_handler.get_user_by_id(id, is_test, session)
            user_dict = user.to_dict()
            progress = user_handler.get_user_progress(
                user, is_test, session)
            total_rank = user_handler.get_user_rank(
                user, False, is_test, session)
            level_rank = user_handler.get_user_rank(
                user, True, is_test, session)
            solved_cases_total = user_handler.get_solved_cases(
                user, False, is_test, session)
            solved_cases_today = user_handler.get_solved_cases(
                user, True, is_test, session)
            exp_needed = user_handler.get_needed_exp(user, is_test, session)
            user_dict['progress'] = progress
            user_dict['total_rank'] = total_rank
            user_dict['level_rank'] = level_rank
            user_dict['solved_cases_total'] = solved_cases_total
            user_dict['solved_cases_today'] = solved_cases_today
            user_dict['exp_needed'] = exp_needed
            response = {
                "statusCode": 200,
                'headers': {"content-type": "application/json; charset=utf-8"},
                "body": json.dumps(user_dict)
            }
        except Exception:
            response = {
                "statusCode": 404,
                "body": "No user found with the specified id.{}".format(traceback.format_exc())
            }

    except Exception:
        response = {
            "statusCode": 400,
            "body": "Could not get user. Check Cognito authentication. Stacktrace: {}".format(traceback.format_exc())
        }

    response_cors = helper.set_cors(response, event, is_test)
    return response_cors
    def test_tags_and_urls(self):
        with Session() as session:

            session = setup_scenarios.create_levels_junior_and_senior_detectives(
                session)
            session = setup_scenarios.create_questions(session)

            junior_detective1 = user_handler.get_user_by_id("1", session)

            item1 = Item()
            item1.content = "Item 1"
            item1.status = "open"
            item1.item_type_id = "Type1"
            item1 = item_handler.create_item(item1, session)

            url = URL()
            url.id = str(uuid4())
            url.url = 'www.test.com'

            item_url = ItemURL()
            item_url.id = str(uuid4())
            item_url.item_id = item1.id
            item_url.url_id = url.id

            tag = Tag()
            tag.id = str(uuid4())
            tag.tag = "Test Tag"

            item_tag = ItemTag()
            item_tag.id = str(uuid4())
            item_tag.item_id = item1.id
            item_tag.tag_id = tag.id

            session.add_all([url, item_url, tag, item_tag])

            event = event_creator.get_create_review_event(
                junior_detective1.id, item1.id)

            response = get_open_items(event, None)
            assert response['statusCode'] == 200

            body = json.loads(response['body'])
            items = body['items']
            assert len(items) == 1
            urls = items[0]['urls']
            assert len(urls) == 1
            assert urls[0]['url'] == 'www.test.com'

            tags = items[0]['tags']
            assert len(tags) == 1
            assert tags[0] == "Test Tag"
def test_get_user_ranking():

    with Session() as session:
        session = setup_scenarios.create_users_for_ranking(session)

        my_detective = user_handler.get_user_by_id("999", session)

        event = event_creator.get_create_review_event(my_detective.id, None)

        resp = get_user_ranking(event, None)
        user_rankings = json.loads(resp["body"])

        assert len(user_rankings) == 3
        assert ("top_users" in user_rankings) == True
        assert ("top_users_by_level" in user_rankings) == True
        assert ("top_users_by_period" in user_rankings) == True

        top_users = user_rankings['top_users']

        # ten top users in list
        assert len(top_users) == 10
        assert top_users[0]['experience_points'] == 60
        # each EXP should be higher than the next (for the sorted column "experience_points")
        assert int(top_users[0]['experience_points']) > int(
            top_users[1]['experience_points'])

        top_users_by_level = user_rankings['top_users_by_level']

        assert len(top_users_by_level) == 10
        assert int(top_users_by_level[0]['experience_points']) > int(
            top_users_by_level[1]['experience_points'])
        # the first/ top user's experience points
        assert top_users_by_level[0]['experience_points'] == 40
        # My User's experience points:
        assert top_users_by_level[5]['experience_points'] == 35
        # the last user's experience points
        assert top_users_by_level[9]['experience_points'] == 32
        # the first/ top users's level (= my level)
        assert top_users_by_level[0]['level'] == 2
        # the last users's level (= my level)
        assert top_users_by_level[9]['level'] == 2

        top_users_by_period = user_rankings['top_users_by_period']

        # For period = 1 week only 7 users found
        assert len(top_users_by_period) == 7
        assert int(top_users_by_period[0]['experience_points']) > int(
            top_users_by_period[1]['experience_points'])
        assert top_users_by_period[1]['experience_points'] == 6
        assert top_users_by_period[6]['experience_points'] == 1
def test_get_user():

    with Session() as session:

        session = setup_scenarios.create_levels_junior_and_senior_detectives(
            session)
        junior_detective1 = user_handler.get_user_by_id("1", session)

        event = event_creator.get_create_review_event(junior_detective1.id,
                                                      "abc")
        resp = get_user(event, None)
        body = json.loads(resp["body"])

        assert body["id"] == junior_detective1.id
        assert body["level"] == 1
        assert body["level_description"] == "Junior"
        assert body["progress"] == 0
        assert body["total_rank"] == session.query(User).count()
        assert body["level_rank"] == session.query(User).filter(
            User.level_id == junior_detective1.level_id).count()
        assert body["solved_cases_total"] == 0
        assert body["solved_cases_today"] == 0
        assert body["exp_needed"] == 5
        sign_up_date = datetime.strptime(body["sign_up_timestamp"],
                                         '%Y-%m-%d %H:%M:%S').date()
        assert sign_up_date != datetime.today()

        item1 = Item(id='item1', status='closed')
        review1 = Review(id='review1',
                         user_id=junior_detective1.id,
                         item_id=item1.id)
        item2 = Item(id='item2', status='open')
        review2 = Review(id='review2',
                         user_id=junior_detective1.id,
                         item_id=item2.id)
        session.add_all([item1, item2, review1, review2])
        session.commit()
        resp = get_user(event, None)
        body = json.loads(resp["body"])
        assert len(body['closed_items']) == 1
        assert body['closed_items'][0]['id'] == 'item1'
Esempio n. 10
0
def update_review(event, context):
    """Updates an existing review

    Args:
        event: AWS API Gateway event
        context ([type]): [description].

    Returns
    ------
    - Status code 200, 400, 404 or 500 (Created)
    - The updated review
    """
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Update Review", event, logger)

    try:
        user_id = helper.cognito_id_from_event(event)
        body = json.loads(event['body']) if isinstance(event['body'],
                                                       str) else event['body']
    except:
        return responses.BadRequest(
            event, "Malformed request. Please provide a valid request."
        ).to_json_string()

    if 'id' not in body:
        return responses.BadRequest(
            event,
            "Malformed request. Please provide a review id.").to_json_string()

    with Session() as session:

        try:
            review = review_handler.get_review_by_id(body['id'], session)
        except:
            return responses.NotFound(event,
                                      "No review found.").to_json_string()

        try:
            user = user_handler.get_user_by_id(user_id, session)
        except:
            return responses.NotFound(event, "No user found.").to_json_string()

        if review.user_id != user.id:
            return responses.Forbidden(event).to_json_string()
        # If review is set closed
        if 'status' in body and body['status'] == 'closed':
            try:
                review = review_handler.close_review(review, session)

                if review.item.status == 'closed':
                    EventPublisher().publish_event('codetekt.review_service',
                                                   'item_closed',
                                                   {'item_id': review.item.id})
                return responses.Success(
                    event,
                    json.dumps(
                        review.to_dict(with_questions_and_answers=True,
                                       with_tags=True))).to_json_string()
            except:
                return helper.get_text_response(
                    500, "Internal server error. Stacktrace: {}".format(
                        traceback.format_exc()), event)

        # If answers are appended
        if 'questions' in body:
            if not isinstance(body['questions'], list):
                return responses.BadRequest(
                    event, "Malformed request. Please provide a valid request."
                ).to_json_string()
            for question in body['questions']:
                if 'answer_value' in question:
                    answer_value = question['answer_value']
                else:
                    return responses.BadRequest(
                        event,
                        "Malformed request. Please provide a valid request."
                    ).to_json_string()

                if answer_value is not None:
                    # Check if conditionality is met
                    if question['parent_question_id'] is not None:
                        for q in body['questions']:
                            if q['question_id'] == question[
                                    'parent_question_id']:
                                parent_question = q
                        if parent_question['answer_value'] > question[
                                'upper_bound'] or parent_question[
                                    'answer_value'] < question['lower_bound']:
                            return responses.BadRequest(
                                event,
                                "Bad request. Please adhere to conditionality of questions."
                            ).to_json_string()
                    # Update answer in db
                    try:
                        review_answer_handler.set_answer_value(
                            question['answer_id'], question['answer_value'],
                            session)
                    except Exception as e:
                        return responses.InternalError(
                            event, exception=e).to_json_string()

        # Save qualitative_comment
        if 'comment' in body:
            if body['comment']:
                if review.comment is None:
                    try:
                        comment_handler.create_comment(session,
                                                       comment=body['comment'],
                                                       user_id=user_id,
                                                       parent_type='review',
                                                       parent_id=review.id,
                                                       is_review_comment=True)
                    except Exception as e:
                        return responses.InternalError(
                            event, "Could not create comment for item",
                            e).to_json_string()
                elif review.comment.comment != body['comment']:
                    review.comment.comment = body['comment']
                    session.merge(review)

        if 'tags' in body:
            if body['tags'] is None:
                body['tags'] = []
            if isinstance(body['tags'], list):
                try:
                    db_tags = [
                        item_tag.tag.tag
                        for item_tag in tag_handler.get_item_tags_by_review_id(
                            review.id, session)
                    ]
                    body_tags_upper = [tag.upper() for tag in body['tags']]
                    db_tags_upper = [tag.upper() for tag in db_tags]
                    tags_to_add = [
                        tag for tag in body['tags']
                        if tag.upper() not in db_tags_upper
                    ]
                    tags_to_delete = [
                        tag for tag in db_tags
                        if tag.upper() not in body_tags_upper
                    ]
                    for tag in tags_to_add:
                        tag_handler.store_tag_for_item(review.item_id, tag,
                                                       session, review.id)

                    for tag in tags_to_delete:
                        tag_handler.delete_itemtag_by_tag_and_review_id(
                            tag, review.id, session)
                except Exception as e:
                    return responses.InternalError(
                        event, "Could not create tags for item",
                        e).to_json_string()
        return responses.Success(
            event,
            json.dumps(
                review.to_dict(with_questions_and_answers=True,
                               with_tags=True))).to_json_string()
Esempio n. 11
0
def test_create_review():

    with Session() as session:
        session = setup_scenarios.create_levels_junior_and_senior_detectives(
            session)

        junior_detective1 = user_handler.get_user_by_id("1", session)
        junior_detective2 = user_handler.get_user_by_id("2", session)

        senior_detective1 = user_handler.get_user_by_id("11", session)

        users = user_handler.get_all_users(session)
        assert len(users) == 10

        # Creating an item
        item = Item()
        item.content = "This item needs to be checked"
        item = item_handler.create_item(item, session)

        items = item_handler.get_all_items(session)
        assert len(items) == 1

        reviews = session.query(Review).all()
        review_pairs = session.query(ReviewPair).all()
        assert len(reviews) == 0
        assert len(review_pairs) == 0

        # Junior detectives accepting item
        event = event_creator.get_create_review_event(
            junior_detective1.id, item.id)
        response = create_review(event, None)
        assert response['statusCode'] == 201
        item = item_handler.get_item_by_id(item.id, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 1
        reviews = session.query(Review).all()
        review_pairs = session.query(ReviewPair).all()
        assert len(reviews) == 1
        assert len(review_pairs) == 1

        event = event_creator.get_create_review_event(
            junior_detective2.id, item.id)
        create_review(event, None)
        item = item_handler.get_item_by_id(item.id, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 2
        reviews = session.query(Review).all()
        review_pairs = session.query(ReviewPair).all()
        assert len(reviews) == 2
        assert len(review_pairs) == 2

        # Senior detective accepting item
        event = event_creator.get_create_review_event(
            senior_detective1.id, item.id)
        create_review(event, None)
        item = item_handler.get_item_by_id(item.id, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_2 == 1
        reviews = session.query(Review).all()
        review_pairs = session.query(ReviewPair).all()
        assert len(reviews) == 3
        assert len(review_pairs) == 2
Esempio n. 12
0
def test_verification_process_best_case(monkeypatch):
    monkeypatch.setenv("STAGE", "dev")
    monkeypatch.setenv("MOTO", "1")
    monkeypatch.setenv("CORS_ALLOW_ORIGIN", "http://*****:*****@test.de'
        submission.status = 'confirmed'
        session.add(submission)
        session.commit()

        items = item_handler.get_all_items(session)
        assert len(items) == 1

        # Junior detectives accepting item
        jr1 = review_handler.create_review(junior_detective1, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 1

        jr2 = review_handler.create_review(junior_detective2, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 2

        jr3 = review_handler.create_review(junior_detective3, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 3

        jr4 = review_handler.create_review(junior_detective4, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 4

        with pytest.raises(Exception):
            review_handler.create_review(junior_detective5, item, session)

        # Senior detectives accepting item
        sr1 = review_handler.create_review(senior_detective1, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 1

        sr2 = review_handler.create_review(senior_detective2, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 2

        sr3 = review_handler.create_review(senior_detective3, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 3

        sr4 = review_handler.create_review(senior_detective4, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 4

        with pytest.raises(Exception):
            review_handler.create_review(senior_detective5, item, session)

        pairs = review_pair_handler.get_review_pairs_by_item(item.id, session)
        assert len(pairs) == 4

        # Detectives reviewing item
        reviews = [jr1, jr2, jr3, jr4, sr1, sr2, sr3, sr4]

        for review in reviews:
            event = event_creator.get_review_event(
                review, item.id, "in progress", review.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(
                review, item.id, "closed", review.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200

        # reload object instead of refreshing the session
        item = item_handler.get_item_by_id(item.id, session)
        item = item_handler.update_item_warning_tags(item, session)
        assert item.status == 'closed'
        assert item.in_progress_reviews_level_1 == 0
        assert item.in_progress_reviews_level_2 == 0
        assert item.open_reviews_level_1 == 0
        assert item.open_reviews_level_2 == 0
        assert item.open_reviews == 0
        assert item.close_timestamp is not None
        assert item.warning_tags_calculated == True
        assert item.result_score == 1

        item_dict = item.to_dict(with_warnings=True)
        assert 'warning_tags' in item_dict
        assert len(item_dict['warning_tags']) > 0
        assert 'text' in item_dict['warning_tags'][0]
        assert 'icon' in item_dict['warning_tags'][0]
        assert item_dict['result_score'] == 0
        session.expire_all()
Esempio n. 13
0
def test_verification_process_worst_case(monkeypatch):
    monkeypatch.setenv("CORS_ALLOW_ORIGIN", "http://localhost:4200")

    with Session() as session:
        session = setup_scenarios.create_levels_junior_and_senior_detectives(
            session)
        session = setup_scenarios.create_questions(session)

        junior_detective1 = user_handler.get_user_by_id("1", session)
        junior_detective2 = user_handler.get_user_by_id("2", session)
        junior_detective3 = user_handler.get_user_by_id("3", session)
        junior_detective4 = user_handler.get_user_by_id("4", session)
        junior_detective5 = user_handler.get_user_by_id("5", session)

        senior_detective1 = user_handler.get_user_by_id("11", session)
        senior_detective2 = user_handler.get_user_by_id("12", session)
        senior_detective3 = user_handler.get_user_by_id("13", session)
        senior_detective4 = user_handler.get_user_by_id("14", session)
        senior_detective5 = user_handler.get_user_by_id("15", session)

        users = user_handler.get_all_users(session)
        assert len(users) == 10

        # Creating an item
        item = Item()
        item.content = "This item needs to be checked"
        item.status = 'open'
        item.item_type_id = "Type1"
        item = item_handler.create_item(item, session)

        items = item_handler.get_all_items(session)
        assert len(items) == 1

        # Junior detectives accepting item
        jr1 = review_handler.create_review(junior_detective1, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 1

        jr2 = review_handler.create_review(junior_detective2, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 2

        jr3 = review_handler.create_review(junior_detective3, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 3

        jr4 = review_handler.create_review(junior_detective4, item, session)
        assert item.open_reviews_level_1 == 4
        assert item.in_progress_reviews_level_1 == 4

        with pytest.raises(Exception):
            review_handler.create_review(junior_detective5, item, session)

        # Senior detectives accepting item
        sr1 = review_handler.create_review(senior_detective1, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 1

        sr2 = review_handler.create_review(senior_detective2, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 2

        sr3 = review_handler.create_review(senior_detective3, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 3

        sr4 = review_handler.create_review(senior_detective4, item, session)
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_2 == 4

        with pytest.raises(Exception):
            review_handler.create_review(senior_detective5, item, session)

        pairs = review_pair_handler.get_review_pairs_by_item(item.id, session)
        assert len(pairs) == 4

        # Detective without review in progress trying to get question
        junior_reviews = [jr1, jr2, jr3, jr4]
        senior_reviews = [sr1, sr2, sr3, sr4]
        for review in junior_reviews:
            event = event_creator.get_review_event(
                review, item.id, "in progress", review.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(
                review, item.id, "closed", review.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200

        for review in senior_reviews:
            event = event_creator.get_review_event(
                review, item.id, "in progress", review.user_id, 4)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(
                review, item.id, "closed", review.user_id, 4)
            response = update_review(event, None)
            assert response['statusCode'] == 200

        # reload object instead of refreshing the session
        item = item_handler.get_item_by_id(item.id, session)
        assert item.status == 'open'
        assert item.in_progress_reviews_level_1 == 0
        assert item.in_progress_reviews_level_2 == 0
        assert item.open_reviews_level_1 == 4
        assert item.open_reviews_level_2 == 4
        assert item.open_reviews == 4

        session.expire_all()
    def test_open_items_sorting(self):

        with Session() as session:

            session = setup_scenarios.create_levels_junior_and_senior_detectives(
                session)
            session = setup_scenarios.create_questions(session)

            junior_detective1 = user_handler.get_user_by_id("1", session)

            senior_detective1 = user_handler.get_user_by_id("11", session)

            # Creating 5 items

            item1 = Item()
            item1.content = "Item 1"
            item1.status = "open"
            item1.item_type_id = "Type1"
            item1.open_timestamp = datetime.now() + timedelta(seconds=1)
            item1 = item_handler.create_item(item1, session)

            item2 = Item()
            item2.content = "Item 2"
            item2.status = "open"
            item2.item_type_id = "Type1"
            item2.open_timestamp = datetime.now() + timedelta(seconds=2)
            item2 = item_handler.create_item(item2, session)

            item3 = Item()
            item3.content = "Item 3"
            item3.status = "open"
            item3.item_type_id = "Type1"
            item3.open_timestamp = datetime.now() + timedelta(seconds=3)
            item3 = item_handler.create_item(item3, session)

            item4 = Item()
            item4.content = "Item 4"
            item4.status = "open"
            item4.item_type_id = "Type1"
            item4.open_timestamp = datetime.now() + timedelta(seconds=4)
            item4 = item_handler.create_item(item4, session)

            item5 = Item()
            item5.content = "Item 5"
            item5.status = "open"
            item5.item_type_id = "Type1"
            item5.open_timestamp = datetime.now() + timedelta(seconds=5)
            item5 = item_handler.create_item(item5, session)

            item6 = Item()
            item6.content = "Item 6"
            item6.status = "open"
            item6.item_type_id = "Type1"
            item6.open_timestamp = datetime.now() + timedelta(seconds=6)
            item6 = item_handler.create_item(item6, session)

            items = item_handler.get_all_items(session)
            assert len(items) == 6

            open_items_for_senior = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_for_senior) == 5
            assert all(x in open_items_for_senior
                       for x in [item1, item2, item4, item5, item6])

            open_items_for_junior = item_handler.get_open_items_for_user(
                junior_detective1, 5, session)['items']
            assert all(x in open_items_for_junior
                       for x in [item1, item2, item4, item5, item6])

            # When item3 needs less reviewed it should be prioritized over item4
            item3.open_reviews_level_1 = 3
            item3.open_reviews_level_2 = 3
            session.merge(item3)
            session.commit

            open_items_for_senior = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_for_senior) == 5
            assert all(x in open_items_for_senior
                       for x in [item1, item2, item3, item5, item6])

            open_items_for_junior = item_handler.get_open_items_for_user(
                junior_detective1, 5, session)['items']
            assert all(x in open_items_for_junior
                       for x in [item1, item2, item3, item5, item6])
def get_review(event, context, is_test=False, session=None):
    """Gets a review.

    Parameters
    ----------
    - user_id is retrieved from the event
    - review_id is retrieved from query parameters

    Returns
    ------
    - Status code 200 OK
    - The requested review
    """

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Get Review", event, logger)

    if session == None:
        session = connection_handler.get_db_session(False, None)

    try:
        # get review id from url query params
        review_id = event['pathParameters']['review_id']
        # get cognito id
        user_id = helper.cognito_id_from_event(event)
    except:
        return helper.get_text_response(
            400, "Malformed request. Please provide a valid request.", event,
            is_test)

    try:
        # get user from database
        user = user_handler.get_user_by_id(user_id, is_test, session)
    except:
        return helper.get_text_response(404, "No user found.", event, is_test)
        # Try to receive item
    try:
        review = review_handler.get_review_by_id(review_id, is_test, session)
    except:
        return helper.get_text_response(404, "No review found", event, is_test)

    try:
        if review.user_id == user.id:
            response = {
                "statusCode": 200,
                'headers': {
                    "content-type": "application/json; charset=utf-8"
                },
                "body": json.dumps(review.to_dict_with_questions_and_answers())
            }
        else:
            return helper.get_text_response(403, "Forbidden", event, is_test)

    except:
        return helper.get_text_response(
            500, "Internal server error. Stacktrace: {}".format(
                traceback.format_exc()), event, is_test)

    response_cors = helper.set_cors(response, event, is_test)
    return response_cors
Esempio n. 16
0
def test_verification_process_best_case(monkeypatch):
    monkeypatch.setenv("STAGE", "dev")
    monkeypatch.setenv("DBNAME", "Test")
    conn = boto3.client("ses", region_name="eu-central-1")
    conn.verify_email_identity(EmailAddress="*****@*****.**")

    session = get_db_session(True, None)
    session = setup_scenarios.create_levels_junior_and_senior_detectives(
        session)
    session = setup_scenarios.create_questions(session)

    junior_detective1 = user_handler.get_user_by_id("1", True, session)
    junior_detective2 = user_handler.get_user_by_id("2", True, session)
    junior_detective3 = user_handler.get_user_by_id("3", True, session)
    junior_detective4 = user_handler.get_user_by_id("4", True, session)
    junior_detective5 = user_handler.get_user_by_id("5", True, session)

    senior_detective1 = user_handler.get_user_by_id("11", True, session)
    senior_detective2 = user_handler.get_user_by_id("12", True, session)
    senior_detective3 = user_handler.get_user_by_id("13", True, session)
    senior_detective4 = user_handler.get_user_by_id("14", True, session)
    senior_detective5 = user_handler.get_user_by_id("15", True, session)

    users = user_handler.get_all_users(True, session)
    assert len(users) == 10

    # Creating an item

    item = Item()
    item.content = "This item needs to be checked"
    item.item_type_id = "Type1"
    item = item_handler.create_item(item, True, session)
    assert item.in_progress_reviews_level_1 == 0
    assert item.open_reviews_level_1 == 4
    assert item.status == 'unconfirmed'

    item.status = 'open'
    session.merge(item)

    submission = Submission()
    submission.id = 'Submission 1'
    submission.item_id = item.id
    submission.mail = '*****@*****.**'
    submission.status = 'confirmed'
    session.add(submission)
    session.commit()

    items = item_handler.get_all_items(True, session)
    assert len(items) == 1

    # Junior detectives accepting item
    jr1 = review_handler.create_review(junior_detective1, item, True, session)
    assert item.open_reviews_level_1 == 4
    assert item.in_progress_reviews_level_1 == 1

    jr2 = review_handler.create_review(junior_detective2, item, True, session)
    assert item.open_reviews_level_1 == 4
    assert item.in_progress_reviews_level_1 == 2

    jr3 = review_handler.create_review(junior_detective3, item, True, session)
    assert item.open_reviews_level_1 == 4
    assert item.in_progress_reviews_level_1 == 3

    jr4 = review_handler.create_review(junior_detective4, item, True, session)
    assert item.open_reviews_level_1 == 4
    assert item.in_progress_reviews_level_1 == 4

    with pytest.raises(Exception):
        review_handler.create_review(junior_detective5, item, True, session)

    # Senior detectives accepting item
    sr1 = review_handler.create_review(senior_detective1, item, True, session)
    assert item.open_reviews_level_2 == 4
    assert item.in_progress_reviews_level_2 == 1

    sr2 = review_handler.create_review(senior_detective2, item, True, session)
    assert item.open_reviews_level_2 == 4
    assert item.in_progress_reviews_level_2 == 2

    sr3 = review_handler.create_review(senior_detective3, item, True, session)
    assert item.open_reviews_level_2 == 4
    assert item.in_progress_reviews_level_2 == 3

    sr4 = review_handler.create_review(senior_detective4, item, True, session)
    assert item.open_reviews_level_2 == 4
    assert item.in_progress_reviews_level_2 == 4

    with pytest.raises(Exception):
        review_handler.create_review(senior_detective5, item, True, session)

    pairs = review_pair_handler.get_review_pairs_by_item(
        item.id, True, session)
    assert len(pairs) == 4

    # Detectives reviewing item
    reviews = [jr1, jr2, jr3, jr4, sr1, sr2, sr3, sr4]
    for review in reviews:
        event = event_creator.get_review_event(review, item.id, "in progress",
                                               review.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200
        session.refresh(review)
        event = event_creator.get_review_event(review, item.id, "closed",
                                               review.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200

    assert item.status == 'closed'
    assert item.in_progress_reviews_level_1 == 0
    assert item.in_progress_reviews_level_2 == 0
    assert item.open_reviews_level_1 == 0
    assert item.open_reviews_level_2 == 0
    assert item.open_reviews == 0
    assert item.close_timestamp is not None

    send_quota = conn.get_send_quota()
    sent_count = int(send_quota["SentLast24Hours"])
    assert sent_count == 1
    session.refresh(submission)
    assert not submission.mail
Esempio n. 17
0
def create_review(event, context, is_test=False, session=None):
    """Creates a new review.

    Parameters
    ----------
    - user_id is retrieved from the event
    - item_id is retrieved from query parameters

    Returns
    ------
    - Status code 201 (Created)
    - The newly created review
    """

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Create Review", event, logger)

    if session == None:
        session = connection_handler.get_db_session(False, None)

    try:
        # get item id from body
        item_id = json.loads(event['body'])['item_id'] if isinstance(
            event['body'], str) else event['body']['item_id']

        # get cognito id
        user_id = helper.cognito_id_from_event(event)

    except Exception:
        return helper.get_text_response(
            400, "Malformed request. Please provide a valid request.", event,
            is_test)

    try:
        # get user and item from the db
        user = user_handler.get_user_by_id(user_id, is_test, session)
    except Exception:
        return helper.get_text_response(404, "No user found.", event, is_test)

    item = item_handler.get_item_by_id(item_id, is_test, session)
    if item is None:
        return helper.get_text_response(404, "No item found.", event, is_test)

    # Try to accept item
    try:
        review = review_handler.create_review(user, item, is_test, session)

        response = {
            "statusCode": 201,
            'headers': {
                "content-type": "application/json; charset=utf-8"
            },
            "body": json.dumps(review.to_dict_with_questions_and_answers())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    except:
        return helper.get_text_response(
            500, "Internal server error. Stacktrace: {}".format(
                traceback.format_exc()), event, is_test)
Esempio n. 18
0
def update_review(event, context, is_test=False, session=None):
    """Updates an existing review

    Args:
        event: AWS API Gateway event
        context ([type]): [description]
        is_test (bool, optional): Whether the function is executed in test mode. Defaults to False.
        session (optional): An sql alchemy session. Defaults to None.

    Returns
    ------
    - Status code 200, 400, 404 or 500 (Created)
    - The updated review
    """
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    helper.log_method_initiated("Create Review", event, logger)

    if session == None:
        session = connection_handler.get_db_session(False, None)

    try:
        user_id = helper.cognito_id_from_event(event)
        body = json.loads(event['body']) if isinstance(event['body'],
                                                       str) else event['body']

    except:
        return helper.get_text_response(
            400, "Malformed request. Please provide a valid request.", event,
            is_test)

    if 'id' not in body:
        return helper.get_text_response(
            400, "Malformed request. Please provide a review id.", event,
            is_test)

    try:
        review = review_handler.get_review_by_id(body['id'], is_test, session)
    except:
        return helper.get_text_response(404, "No review found", event, is_test)

    try:
        user = user_handler.get_user_by_id(user_id, is_test, session)
    except:
        return helper.get_text_response(404, "No user found.", event, is_test)

    if review.user_id != user.id:
        return helper.get_text_response(403, "Forbidden.", event, is_test)

        # If review is set closed
    if 'status' in body and body['status'] == 'closed':
        try:
            review = review_handler.close_review(review, is_test, session)
            if review.item.status == 'closed':
                notifications.notify_users(is_test, session, review.item)
            response = {
                "statusCode": 200,
                "body": json.dumps(review.to_dict_with_questions_and_answers())
            }
            response_cors = helper.set_cors(response, event, is_test)
            return response_cors
        except:
            return helper.get_text_response(
                500, "Internal server error. Stacktrace: {}".format(
                    traceback.format_exc()), event, is_test)

    # If answers are appended
    elif 'questions' in body:
        if not isinstance(body['questions'], list):
            return helper.get_text_response(
                400, "Malformed request. Please provide a valid request.",
                event, is_test)
        for question in body['questions']:
            if 'answer_value' in question:
                answer_value = question['answer_value']
            else:
                return helper.get_text_response(
                    400, "Malformed request. Please provide a valid request.",
                    event, is_test)

            if answer_value is not None:
                # Check if conditionality is met
                if question['parent_question_id'] is not None:
                    for q in body['questions']:
                        if q['question_id'] == question['parent_question_id']:
                            parent_question = q
                    parent_answer = review_answer_handler.get_parent_answer(
                        question['answer_id'], is_test, session)
                    if parent_question['answer_value'] > question[
                            'upper_bound'] or parent_question[
                                'answer_value'] < question['lower_bound']:
                        return helper.get_text_response(
                            400,
                            "Bad request. Please adhere to conditionality of questions.",
                            event, is_test)
                # Update answer in db
                try:
                    review_answer_handler.set_answer_value(
                        question['answer_id'], question['answer_value'],
                        is_test, session)
                except:
                    return helper.get_text_response(
                        500, "Internal server error. Stacktrace: {}".format(
                            traceback.format_exc()), event, is_test)

        response = {
            "statusCode": 200,
            "body": json.dumps(review.to_dict_with_questions_and_answers())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    else:
        return helper.get_text_response(
            400, "Bad request. Please adhere to conditionality of questions.",
            event, is_test)
Esempio n. 19
0
    def test_get_open_items_for_user(self, monkeypatch):
        monkeypatch.setenv("DBNAME", "Test")

        session = get_db_session(True, None)

        session = setup_scenarios.create_levels_junior_and_senior_detectives(
            session)
        session = setup_scenarios.create_questions(session)

        junior_detective1 = user_handler.get_user_by_id("1", True, session)
        junior_detective2 = user_handler.get_user_by_id("2", True, session)
        junior_detective3 = user_handler.get_user_by_id("3", True, session)
        junior_detective4 = user_handler.get_user_by_id("4", True, session)
        junior_detective5 = user_handler.get_user_by_id("5", True, session)

        senior_detective1 = user_handler.get_user_by_id("11", True, session)

        # Creating 5 items

        item1 = Item()
        item1.content = "Item 1"
        item1.status = "open"
        item1.item_type_id = "Type1"
        item1 = item_handler.create_item(item1, True, session)

        item2 = Item()
        item2.content = "Item 2"
        item2.status = "open"
        item2.item_type_id = "Type1"
        item2 = item_handler.create_item(item2, True, session)

        item3 = Item()
        item3.content = "Item 3"
        item3.status = "open"
        item3.item_type_id = "Type1"
        item3 = item_handler.create_item(item3, True, session)

        item4 = Item()
        item4.content = "Item 4"
        item4.status = "open"
        item4.item_type_id = "Type1"
        item4 = item_handler.create_item(item4, True, session)

        item5 = Item()
        item5.content = "Item 5"
        item5.status = "open"
        item5.item_type_id = "Type1"
        item5 = item_handler.create_item(item5, True, session)

        items = item_handler.get_all_items(True, session)
        assert len(items) == 5

        open_items_for_senior = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_items_for_senior) == 5

        open_items_for_junior = item_handler.get_open_items_for_user(
            junior_detective1, 5, True, session)['items']
        assert len(open_items_for_junior) == 5

        # JuniorDetective 1 accepting item 1
        jr1 = review_handler.create_review(junior_detective1, item1, True,
                                           session)
        open_item_after_accept = item_handler.get_open_items_for_user(
            junior_detective1, 5, True, session)['items']
        assert len(open_item_after_accept) == 1

        item1 = item_handler.get_item_by_id(item1.id, True, session)
        assert item1.in_progress_reviews_level_1 == 1

        # Accepting event again should not create a new review
        review_handler.create_review(junior_detective1, item1, True, session)
        # app.create_review(accept_event, None, True, session)
        item1 = item_handler.get_item_by_id(item1.id, True, session)
        assert item1.in_progress_reviews_level_1 == 1

        # JuniorDetective 1 finishing review
        event = event_creator.get_review_event(jr1, item1.id, "in progress",
                                               jr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200
        event = event_creator.get_review_event(jr1, item1.id, "closed",
                                               jr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200

        # For JuniorDetective1 only 4 cases should be available
        open_items_after_submission = item_handler.get_open_items_for_user(
            junior_detective1, 5, True, session)['items']
        assert len(open_items_after_submission) == 4

        open_items_limit_3 = item_handler.get_open_items_for_user(
            junior_detective1, 3, True, session)['items']
        assert len(open_items_limit_3) == 3

        open_items_after_other_review = item_handler.get_open_items_for_user(
            junior_detective4, 5, True, session)['items']
        assert len(open_items_after_other_review) == 5

        # 4 Junior Detectives reviewing Item 2
        jr1 = review_handler.create_review(junior_detective1, item2, True,
                                           session)
        jr2 = review_handler.create_review(junior_detective2, item2, True,
                                           session)
        jr3 = review_handler.create_review(junior_detective3, item2, True,
                                           session)
        jr4 = review_handler.create_review(junior_detective4, item2, True,
                                           session)

        reviews = [jr1, jr2, jr3, jr4]
        for review in reviews:
            event = event_creator.get_review_event(review, item2.id,
                                                   "in progress",
                                                   review.user_id, 1, session)
            response = update_review(event, None, True, session)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(review, item2.id, "closed",
                                                   review.user_id, 1, session)
            response = update_review(event, None, True, session)
            assert response['statusCode'] == 200

        # 4 Cases should be available for Detective 5

        open_items_after_other_review = item_handler.get_open_items_for_user(
            junior_detective5, 5, True, session)['items']
        assert len(open_items_after_other_review) == 4

        # 5 cases should be available for senior
        open_items_for_senior = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_items_for_senior) == 5

        # Senior detective accepting item 1
        sr1 = review_handler.create_review(senior_detective1, item1, True,
                                           session)

        open_item_after_accept = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_item_after_accept) == 1

        # Senior detective finishing review
        event = event_creator.get_review_event(sr1, item1.id, "in progress",
                                               sr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200
        event = event_creator.get_review_event(sr1, item1.id, "closed",
                                               sr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200

        # For SeniorDetective1 only 4 cases should be available
        open_items_after_submission = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_items_after_submission) == 4

        # SeniorDetective 1 accepting item 3
        sr1 = review_handler.create_review(senior_detective1, item3, True,
                                           session)
        open_item_after_accept = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_item_after_accept) == 1

        item3 = item_handler.get_item_by_id(item3.id, True, session)
        assert item3.in_progress_reviews_level_2 == 1

        # Accepting event again should not create a new review
        review_handler.create_review(senior_detective1, item3, True, session)
        item3 = item_handler.get_item_by_id(item3.id, True, session)
        assert item3.in_progress_reviews_level_2 == 1

        # SeniorDetective 1 finishing review
        event = event_creator.get_review_event(sr1, item3.id, "in progress",
                                               sr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200
        event = event_creator.get_review_event(sr1, item3.id, "closed",
                                               sr1.user_id, 1, session)
        response = update_review(event, None, True, session)
        assert response['statusCode'] == 200

        open_items_for_senior = item_handler.get_open_items_for_user(
            senior_detective1, 5, True, session)['items']
        assert len(open_items_for_senior) == 3

        event = {
            "requestContext": {
                "identity": {
                    "cognitoAuthenticationProvider":
                    "...CognitoSignIn:{}".format(senior_detective1.id)
                }
            }
        }
        response = get_open_items(event, None, True, session)
        assert 'is_open_review' in response['headers']
        assert response['headers']['is_open_review'] == "False"
        body = json.loads(response['body'])
        assert len(body) == 3
def get_user_ranking(event, context, is_test=False, session=None):
    """
    returns a dictionary with
    list top_users:           10 top users
    list top_users_by_level:  10 top users on the user's level 
    list top_users_by_period: 10 top users in a period p (1 week)
    """
    n = 10
    p = 1
    
    descending = True
    attr = 'experience_points'
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    helper.log_method_initiated("Get User Ranking", event, logger)

    if session == None:
        session = get_db_session(False, None)

    user_ranking_dict = {}

    top_users_list = []
    top_users_by_level_list = []
    top_users_by_period_list = []

    try:        
        my_user_id = helper.cognito_id_from_event(event)
    except Exception:
        response = {
            "statusCode": 400,
            "body": "Could not get User. Check Cognito Authentication. Stacktrace: {}".format(traceback.format_exc())
        }
        
    try:
        helper.log_method_initiated("Get Top n Users", event, logger) 
        top_users = user_handler.get_top_users(n, attr, descending, is_test, session)
        for user in top_users:            
            top_users_list.append(user.to_dict())
        user_ranking_dict['top_users'] = top_users_list    

        helper.log_method_initiated("Get Top n Users on the User's Level", event, logger)
        my_user = user_handler.get_user_by_id(my_user_id, is_test, session)
        user_level = my_user.level_id
        top_users_by_level = user_handler.get_top_users_by_level(user_level, n, attr, descending, is_test, session)
        for user in top_users_by_level:            
            top_users_by_level_list.append(user.to_dict())
        user_ranking_dict['top_users_by_level'] = top_users_by_level_list
        
        helper.log_method_initiated("Get Top n Users in a Period", event, logger)   
        top_users_by_period = user_handler.get_top_users_by_period(n, p, attr, descending, is_test, session)
        for user in top_users_by_period:            
            top_users_by_period_list.append(user.to_dict())
        user_ranking_dict['top_users_by_period'] = top_users_by_period_list
    except Exception:
        response = {
            "statusCode": 500,
            "body": "Server Error. Stacktrace: {}".format(traceback.format_exc())
        }
    
    response = {
            "statusCode": 200,
            'headers': {"content-type": "application/json; charset=utf-8"},
            "body": json.dumps(user_ranking_dict)
        }

    response_cors = helper.set_cors(response, event, is_test)
    return response_cors
    def test_get_open_items_for_user(self, monkeypatch):
        monkeypatch.setenv("CORS_ALLOW_ORIGIN", "http://localhost:4200")

        with Session() as session:

            session = setup_scenarios.create_levels_junior_and_senior_detectives(
                session)
            session = setup_scenarios.create_questions(session)

            junior_detective1 = user_handler.get_user_by_id("1", session)
            junior_detective2 = user_handler.get_user_by_id("2", session)
            junior_detective3 = user_handler.get_user_by_id("3", session)
            junior_detective4 = user_handler.get_user_by_id("4", session)
            junior_detective5 = user_handler.get_user_by_id("5", session)

            senior_detective1 = user_handler.get_user_by_id("11", session)

            # Creating 5 items

            item1 = Item()
            item1.content = "Item 1"
            item1.status = "open"
            item1.item_type_id = "Type1"
            item1.open_timestamp = datetime.now() + timedelta(seconds=1)
            item1 = item_handler.create_item(item1, session)

            url = URL()
            url.id = str(uuid4())
            url.url = 'www.test.com'

            item_url = ItemURL()
            item_url.id = str(uuid4())
            item_url.item_id = item1.id
            item_url.url_id = url.id

            session.add_all([url, item_url])

            item2 = Item()
            item2.content = "Item 2"
            item2.status = "open"
            item2.item_type_id = "Type1"
            item2.open_timestamp = datetime.now() + timedelta(seconds=2)
            item2 = item_handler.create_item(item2, session)

            item3 = Item()
            item3.content = "Item 3"
            item3.status = "open"
            item3.item_type_id = "Type1"
            item3.open_timestamp = datetime.now() + timedelta(seconds=3)
            item3 = item_handler.create_item(item3, session)

            item4 = Item()
            item4.content = "Item 4"
            item4.status = "open"
            item4.item_type_id = "Type1"
            item4.open_timestamp = datetime.now() + timedelta(seconds=4)
            item4 = item_handler.create_item(item4, session)

            item5 = Item()
            item5.content = "Item 5"
            item5.status = "open"
            item5.item_type_id = "Type1"
            item5.open_timestamp = datetime.now() + timedelta(seconds=5)
            item5 = item_handler.create_item(item5, session)

            items = item_handler.get_all_items(session)
            assert len(items) == 5

            open_items_for_senior = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_for_senior) == 5

            open_items_for_junior = item_handler.get_open_items_for_user(
                junior_detective1, 5, session)['items']
            assert len(open_items_for_junior) == 5

            # JuniorDetective 1 accepting item 1
            jr1 = review_handler.create_review(junior_detective1, item1,
                                               session)
            open_item_after_accept = item_handler.get_open_items_for_user(
                junior_detective1, 5, session)['items']
            assert len(open_item_after_accept) == 1

            item1 = item_handler.get_item_by_id(item1.id, session)
            assert item1.in_progress_reviews_level_1 == 1

            # Accepting event again should not create a new review
            review_handler.create_review(junior_detective1, item1, session)
            # app.create_review(accept_event, None, True, session)
            item1 = item_handler.get_item_by_id(item1.id, session)
            assert item1.in_progress_reviews_level_1 == 1

            # JuniorDetective 1 finishing review
            event = event_creator.get_review_event(jr1, item1.id,
                                                   "in progress", jr1.user_id,
                                                   1)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(jr1, item1.id, "closed",
                                                   jr1.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200

            # For JuniorDetective1 only 4 cases should be available
            open_items_after_submission = item_handler.get_open_items_for_user(
                junior_detective1, 5, session)['items']
            assert len(open_items_after_submission) == 4

            open_items_limit_3 = item_handler.get_open_items_for_user(
                junior_detective1, 3, session)['items']
            assert len(open_items_limit_3) == 3

            open_items_after_other_review = item_handler.get_open_items_for_user(
                junior_detective4, 5, session)['items']
            assert len(open_items_after_other_review) == 5
            # 4 Junior Detectives reviewing Item 2
            item2 = item_handler.get_item_by_id(item2.id, session)
            jr1 = review_handler.create_review(junior_detective1, item2,
                                               session)
            jr2 = review_handler.create_review(junior_detective2, item2,
                                               session)
            jr3 = review_handler.create_review(junior_detective3, item2,
                                               session)
            jr4 = review_handler.create_review(junior_detective4, item2,
                                               session)

            reviews = [jr1, jr2, jr3, jr4]
            for review in reviews:
                event = event_creator.get_review_event(review, item2.id,
                                                       "in progress",
                                                       review.user_id, 1)
                response = update_review(event, None)
                assert response['statusCode'] == 200
                event = event_creator.get_review_event(review, item2.id,
                                                       "closed",
                                                       review.user_id, 1)
                response = update_review(event, None)
                assert response['statusCode'] == 200

            # 4 Cases should be available for Detective 5
            open_items_after_other_review = item_handler.get_open_items_for_user(
                junior_detective5, 5, session)['items']
            assert len(open_items_after_other_review) == 4

            # 5 cases should be available for senior
            open_items_for_senior = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_for_senior) == 5

            # Senior detective accepting item 1
            sr1 = review_handler.create_review(senior_detective1, item1,
                                               session)

            open_item_after_accept = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_item_after_accept) == 1

            # Senior detective finishing review
            event = event_creator.get_review_event(sr1, item1.id,
                                                   "in progress", sr1.user_id,
                                                   1)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(sr1, item1.id, "closed",
                                                   sr1.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200

            # For SeniorDetective1 only 4 cases should be available
            open_items_after_submission = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_after_submission) == 4

            # SeniorDetective 1 accepting item 3
            item3 = item_handler.get_item_by_id(item3.id, session)
            sr1 = review_handler.create_review(senior_detective1, item3,
                                               session)
            open_item_after_accept = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_item_after_accept) == 1

            item3 = item_handler.get_item_by_id(item3.id, session)
            assert item3.in_progress_reviews_level_2 == 1

            # Accepting event again should not create a new review
            review_handler.create_review(senior_detective1, item3, session)
            item3 = item_handler.get_item_by_id(item3.id, session)
            assert item3.in_progress_reviews_level_2 == 1

            # SeniorDetective 1 finishing review
            event = event_creator.get_review_event(sr1, item3.id,
                                                   "in progress", sr1.user_id,
                                                   1)
            response = update_review(event, None)
            assert response['statusCode'] == 200
            event = event_creator.get_review_event(sr1, item3.id, "closed",
                                                   sr1.user_id, 1)
            response = update_review(event, None)
            assert response['statusCode'] == 200

            # Accepting closed item again should not create a new review
            event = event_creator.get_create_review_event(
                senior_detective1.id, item3.id)
            response = create_review.create_review(event, None)
            assert response['statusCode'] == 500

            open_items_for_senior = item_handler.get_open_items_for_user(
                senior_detective1, 5, session)['items']
            assert len(open_items_for_senior) == 3

            event = {
                "requestContext": {
                    "identity": {
                        "cognitoAuthenticationProvider":
                        "...CognitoSignIn:{}".format(senior_detective1.id)
                    }
                }
            }
            response = get_open_items(event, None)
            # assert 'is_open_review' in response['headers']
            # assert response['headers']['is_open_review'] == "False"
            body = json.loads(response['body'])
            assert 'is_open_review' in body
            assert body['is_open_review'] is False
            assert len(body['items']) == 3