def test_create_tagreport_1(self):
        os.environ["STAGE"] = "dev"

        with Session() as session:

            # creating items
            item = Item()
            item.content = "RKI bestätigt Covid-19 Sterblichkeitsrate von 0,01 Prozent in (...) - Corona Transition "
            item.language = "de"
            item = item_handler.create_item(item, session)
            list_tags = [
                'Corona-Maßnahmen', 'Senkung der Treibhausgasemissionen',
                'China', 'Film', 'Menschen', 'Kanzlerkandidatur', 'sars-cov-2',
                '#verunglimpft', 'g.co/privacytools', 'Gregor Gysi',
                'Bundestagswahl2021', '19', '-',
                'Statistik falsch interpretiert', 'Bild.de', 'JF',
                'MdB Hansjörg Müller (AFD)', '100 Tage', 'Gruene',
                '#notwendige Polizeimaßnahmen', 'Sonne'
            ]
            for _ in range(200):
                list_tags.append(
                    random.choice(list_tags) + "-" + random.choice(list_tags))
            # store tags
            event = {"item": item.to_dict(), "Tags": list_tags}
            context = ""
            EnrichItem.store_itemtags(event, context)

            event = ""
            context = ""
            s = time.perf_counter()
            GetTags.create_tagreport(event, context)
            elapsed = time.perf_counter() - s
            assert elapsed < 30
Esempio n. 2
0
def test_questions_and_answers():
    with Session() as session:

        q1 = ReviewQuestion()
        q1.id = "1"
        q1.content = "Es ist eine Quelle angegeben."

        q2 = ReviewQuestion()
        q2.id = "2"
        q2.content = "Die Rechtschreibung ist korrekt."

        o1 = AnswerOption()
        o1.id = "1"
        o1.text = "Stimme zu"
        o1.value = 4

        q1.options = [o1]

        assert len(q1.options) == 1
        assert len(o1.questions) == 1

        q2.options = [o1]

        assert len(q1.options) == 1
        assert len(o1.questions) == 2

        session.add(q1)
        session.add(q2)
        session.add(o1)
        options = session.query(AnswerOption).all()
        assert len(options) == 1
def test_get_items(test_item_type, item1, item2, item_with_type):

    with Session() as session:

        session.add(test_item_type)
        session.add(item1)
        session.add(item2)
        session.add(item_with_type)
        session.commit()

        event = {}
        response_body = json.loads(get_items(event, None)['body'])
        assert len(response_body) == 3
        assert all('test' in i['item_type']['name'] for i in response_body)

        event = {'queryStringParameters': None}
        response_body = json.loads(get_items(event, None)['body'])
        assert len(response_body) == 3
        assert all('test' in i['item_type']['name'] for i in response_body)

        event = get_event('status', 'open')
        response_body = json.loads(get_items(event, None)['body'])
        assert len(response_body) == 2
        assert all('test' in i['item_type']['name'] for i in response_body)

        event = get_event('NotAnAttribute', 'open')
        response = get_items(event, None)
        assert response['statusCode'] == 400
def test_submit_unsafe_item(monkeypatch):
    # Set environment variable
    monkeypatch.setenv("STAGE", "dev")
    monkeypatch.setenv("MOTO_ACCOUNT_ID", '891514678401')
    from moto import mock_ses, mock_stepfunctions
    with mock_stepfunctions(), mock_ses():
        # Initialize mock clients
        sf_client = boto3.client('stepfunctions', region_name="eu-central-1")
        sf_client.create_state_machine(
            name='SearchFactChecks_new-dev',
            definition='{}',
            roleArn=
            'arn:aws:iam::891514678401:role/detektivkollektiv-stepfunct-StateMachineLambdaRole'
        )
        ses_client = boto3.client("ses", region_name="eu-central-1")
        ses_client.verify_email_identity(EmailAddress="*****@*****.**")

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

            # Submit first item
            response = submit_item(create_event2(), None)

            assert response['statusCode'] == 403
            assert response['headers']['new-item-created'] == "True"

            # Check database entries
            assert session.query(Item).count() == 1
            assert session.query(Submission).count() == 1
            submission = session.query(Submission).first()
            assert submission.status == 'Unsafe'
            assert submission.item.urls[0].url.unsafe is None
            assert submission.item.urls[1].url.unsafe == "GOOGLE:MALWARE"
Esempio n. 5
0
def confirm_submission(event, context):

    helper.log_method_initiated("Confirm submission", event, logger)

    submission_id = event['pathParameters']['submission_id']

    stage = os.environ['STAGE']
    if stage == 'prod':
        link = 'https://codetekt.org'
    else:
        link = 'https://{}.codetekt.org'.format(stage)

    body_html = io.open(os.path.join(os.path.dirname(__file__), 'resources',
                                     'submission_confirmed_webpage.html'), mode='r', encoding='utf-8').read().format(link)

    with Session() as session:                                 

        try:
            submission_handler.confirm_submission(submission_id, session)
            response = {
                'statusCode': 200,
                'headers': {"content-type": "text/html; charset=utf-8"},
                'body': body_html
            }

        except Exception:
            response = {
                "statusCode": 500,
                "body": "Could not confirm submission. Stacktrace: {}".format(traceback.format_exc())
            }

        return helper.set_cors(response, event)
def test_reset_locked_items(item, pair, old_junior_review, new_senior_review):

    with Session() as session:

        session.add(item)
        session.add(old_junior_review)
        session.add(new_senior_review)
        session.add(pair)
        session.commit()

        rips = session.query(Review).all()
        assert len(rips) == 2

        response = reset_locked_items(None, None)
        assert response['statusCode'] == 200
        assert "1" in response['body']

        rips = session.query(Review).all()
        assert len(rips) == 1
        item = item_handler.get_item_by_id(item.id, session)
        assert item.in_progress_reviews_level_2 == 1
        assert item.in_progress_reviews_level_1 == 0

        # reload object instead of refreshing the session
        pair = session.query(ReviewPair).one()
        assert pair.junior_review_id == None
        assert pair.senior_review_id == new_senior_review.id
Esempio n. 7
0
def reset_locked_items(event, context):

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    helper.log_method_initiated("Reset locked items", event, logger)

    with Session() as session:

        try:
            reviews_in_progress = review_handler.get_old_reviews_in_progress(
                session)
            review_handler.delete_old_reviews_in_progress(
                reviews_in_progress, session)
            return {
                "statusCode": 200,
                'headers': {
                    "content-type": "application/json; charset=utf-8"
                },
                "body": "{} Review(s) deleted".format(len(reviews_in_progress))
            }
        except Exception:
            return {
                "statusCode":
                400,
                "body":
                "Something went wrong. Check HTTP POST payload. Stacktrace: {}"
                .format(traceback.format_exc())
            }
    def test_extract_claim_1(self):
        with Session() as session:
            urls = [
                "https://www.spiegel.de/wissenschaft/mensch/corona-krise-und-klimawandel-fuenf-desinformations-tricks-die-jeder-kennen-sollte-a-6892ff9b-fb28-43ae-8438-55b49d607e57?sara_ecid=soci_upd_wbMbjhOSvViISjc8RPU89NcCvtlFcJ"
            ]
            item = create_item_with_urls(session, urls)

            event = {
                "item": {
                    "content":
                    "Wollen wir auch einen Channel für solche Themen anlegen?"
                    "https://www.spiegel.de/wissenschaft/mensch/corona-krise-und-klimawandel-fuenf"
                    "-desinformations-tricks-die-jeder-kennen-sollte-a-6892ff9b-fb28-43ae-8438-55b49d607e57"
                    "?sara_ecid=soci_upd_wbMbjhOSvViISjc8RPU89NcCvtlFcJ",
                    "id":
                    item.id,
                    "language":
                    ""
                }
            }

            resp = ExtractClaim.extract_claim(event, "")
            text_0 = "Wollen wir auch einen Channel für solche Themen anlegen?"
            title = "Corona-Krise und Klimawandel: Fünf Desinformations-Tricks, die jeder kennen sollte " \
                "- DER SPIEGEL "
            assert resp["title"] == title
            assert resp["concatenation"]["Text"] == text_0 + '\n' + title
Esempio n. 9
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
Esempio n. 10
0
def store_itemtags(event, context):
    """stores tags of an item

    Parameters
    ----------
    event: dict, required
        item
        Tags

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: application/json

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    with Session() as session:
        # extract item id
        item_id = event['item']['id']

        # Store all tags of the item
        for str_tag in event['Tags']:
            tag_handler.store_tag_for_item(item_id, str_tag, session)
Esempio n. 11
0
def update_item(event, context):
    """stores data related to item

    Parameters
    ----------
    event: dict, required
        item

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: application/json

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    with Session() as session:

        # Parse event dict to Item object
        item = Item()
        json_event = event['item']
        for key in json_event:
            setattr(item, key, json_event[key])

        update_object(item, session)
Esempio n. 12
0
def post_comment_on_item(event, context=None):
    """
    Creates comment on item from archive
    """

    with Session() as session:

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

        try:
            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)

        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. Could not read user_id from context data.",
                event)

        if 'item_id' not in body:
            return helper.get_text_response(
                400, "Malformed request. Please provide an item_id.", event)

        try:
            item = item_handler.get_item_by_id(body['item_id'], session)
        except:
            return helper.get_text_response(404, "Item not found", event)

        # Save qualitative_comment
        if 'comment' in body:
            try:
                comment = comment_handler.create_comment(
                    session,
                    comment=body['comment'],
                    user_id=user_id,
                    parent_type='item',
                    parent_id=item.id)
                response = {
                    "statusCode": 201,
                    'headers': {
                        "content-type": "application/json; charset=utf-8"
                    },
                    "body": json.dumps(comment.to_dict())
                }
                return helper.set_cors(response, event)

            except:
                return helper.get_text_response(
                    404, "No qualitative comment found.", event)
Esempio n. 13
0
def store_itemphrases(event, context):
    """stores key phrases of an item

    Parameters
    ----------
    event: dict, required
        item
        KeyPhrases

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: application/json

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    with Session() as session:

        # Store all entities of the item
        for str_phrase in event['KeyPhrases']:
            phrase = Keyphrase()
            # search for entity in database
            try:
                phrase = keyphrase_handler.get_phrase_by_content(str_phrase, session)
            except Exception:
                # store phrase in database
                phrase.id = str(uuid4())
                phrase.phrase = str_phrase
                try:
                    update_object(phrase, session)
                except Exception as e:
                    logger.error(
                        "Could not store key phrase. Exception: %s", e, exc_info=True)
                    raise
            # store item keyphrase in database
            itemphrase = ItemKeyphrase()
            # item phrase already exists?
            item_id = event['item']['id']
            try:
                itemphrase = keyphrase_handler.get_itemphrase_by_phrase_and_item_id(
                    phrase.id, item_id, session)
            except Exception:
                itemphrase.id = str(uuid4())
                itemphrase.item_id = item_id
                itemphrase.keyphrase_id = phrase.id
                try:
                    update_object(itemphrase, session)
                except Exception as e:
                    logger.error(
                        "Could not store item key phrase. Exception: %s", e, exc_info=True)
                    raise
Esempio n. 14
0
def store_itemsentiment(event, context):
    """stores sentiment of an item

    Parameters
    ----------
    event: dict, required
        item
        Sentiment

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: application/json

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    with Session() as session:

        # Store the sentiment of the item
        sentiment = Sentiment()
        # search for sentiment in database
        str_sentiment = event['Sentiment']
        try:
            sentiment = sentiment_handler.get_sentiment_by_content(str_sentiment, session)
        except Exception:
            # store sentiment in database
            sentiment.id = str(uuid4())
            sentiment.sentiment = str_sentiment
            try:
                update_object(sentiment, session)
            except Exception as e:
                logger.error(
                    "Could not store sentiment. Exception: %s", e, exc_info=True)
                raise
        # store item sentiment in database
        itemsentiment = ItemSentiment()
        # item entity already exists?
        item_id = event['item']['id']
        try:
            itemsentiment = sentiment_handler.get_itemsentiment_by_sentiment_and_item_id(
                sentiment.id, item_id, session)
        except Exception:
            itemsentiment.id = str(uuid4())
            itemsentiment.item_id = item_id
            itemsentiment.sentiment_id = sentiment.id
            try:
                update_object(itemsentiment, session)
            except Exception as e:
                logger.error(
                    "Could not store item sentiment. Exception: %s", e, exc_info=True)
                raise
def test_tags_to_dict():
    with Session() as session:
        user = User(id=str(uuid4()), name='user1')
        level = Level(id=1, description='beginner')

        item = Item(id=str(uuid4()), content='item')

        tag1 = Tag(id=str(uuid4()), tag='tag1')
        tag2 = Tag(id=str(uuid4()), tag='tag2')
        tag3 = Tag(id=str(uuid4()), tag='tag3')

        review = Review()
        review.id = str(uuid4())
        review.is_peer_review = False
        review.user_id = user.id
        review.item_id = item.id

        session.add_all([user, item, tag1, tag2, tag3, review, level])
        session.commit()

        review_dict = review.to_dict(with_tags=True, with_user=True)
        assert 'tags' in review_dict
        assert len(review_dict['tags']) == 0

        item_tag1 = ItemTag(id=str(uuid4()),
                            item_id=item.id,
                            tag_id=tag1.id,
                            review_id=review.id)
        session.add(item_tag1)
        session.commit()
        session.refresh(review)

        review_dict = review.to_dict(with_tags=True, with_user=True)
        assert 'tags' in review_dict
        assert len(review_dict['tags']) == 1
        assert review_dict['tags'][0] == 'tag1'

        item_tag2 = ItemTag(id=str(uuid4()),
                            item_id=item.id,
                            tag_id=tag2.id,
                            review_id=review.id)
        session.add(item_tag2)
        session.commit()
        session.refresh(review)

        review_dict = review.to_dict(with_tags=True, with_user=True)
        assert 'tags' in review_dict
        assert len(review_dict['tags']) == 2
        assert 'tag2' in review_dict['tags']

        session.delete(item_tag1)
        session.commit()
        session.refresh(review)
        review_dict = review.to_dict(with_tags=True, with_user=True)
        assert 'tags' in review_dict
        assert len(review_dict['tags']) == 1
        assert review_dict['tags'][0] == 'tag2'
Esempio n. 16
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()
Esempio n. 17
0
def test_get_all_questions(fixtures):

    with Session() as session:

        session.add_all(fixtures)
        session.commit()

        review_questions = review_question_handler.get_all_review_questions_db(session)

        assert len(review_questions) == 3
Esempio n. 18
0
def test_get_items_by_url():
    os.environ["STAGE"] = "dev"
    with Session() as session:
        item = Item()
        item.content = "Test content"
        item.language = "de"
        item.status = "closed"
        item = item_handler.create_item(item, session)

        item2 = Item()
        item2.content = "Test content2"
        item2.language = "de"
        item2.status = "closed"
        item2 = item_handler.create_item(item2, session)

        url = URL()
        url.id = "url_id"
        url.url = "www.test.de/artikel1"

        item_url = ItemURL()
        item_url.id = "item_url_id"
        item_url.item_id = item.id
        item_url.url_id = url.id

        session.add_all([url, item_url])
        session.commit()

        # Testing get_items without url query param 204
        for event in [{}, {"queryStringParameters": None}]:
            response = get_closed_items(event, None)
            assert response['statusCode'] == 200
            body = json.loads(response['body'])
            assert len(body) == 2

        # Testing get_items with url query param 200
        for url in [url.url, url.url + '?queryparam=shouldbeignored']:
            response = get_closed_items(get_url_event(url), None)
            assert response['statusCode'] == 200
            body = json.loads(response['body'])
            assert len(body) == 1
            assert body[0]['id'] == item.id

        # Testing get_items with url query param 204 - no item with url
        for url in ['sinnloseUrl', 'www.test.de/artikel2', 'www.test.de']:
            response = get_closed_items(get_url_event(url), None)
            assert response['statusCode'] == 204

        # Testing get_items with url query param 204 - item not closed
        item.status = "open"
        session.merge(item)
        session.commit()
        response = get_closed_items(get_url_event("www.test.de/artikel1"),
                                    None)
        assert response['statusCode'] == 204
def test_create_item():
    with Session() as session:
        item = Item()
        item.content = "Testitem"
        item = item_handler.create_item(item, session)
        assert item.id is not None
        assert item.open_reviews == 4
        assert item.open_reviews_level_1 == 4
        assert item.open_reviews_level_2 == 4
        assert item.in_progress_reviews_level_1 == 0
        assert item.in_progress_reviews_level_2 == 0
        assert item.open_timestamp is not None
Esempio n. 20
0
def handle_item_closed(event, context):
    try:
        helper.log_method_initiated("Send notification", event, logger)

        if "detail" not in event or "item_id" not in event["detail"]:
            return BadRequest(event,
                              "Event contains no item_id.",
                              add_cors_headers=False).to_json_string()

        with Session() as session:
            item_id = event["detail"]["item_id"]
            item = item_handler.get_item_by_id(item_id, session)
            if item is None:
                return BadRequest(
                    event,
                    f"No item was found with the given item_id [{item_id}].",
                    add_cors_headers=False).to_json_string()
            item = item_handler.update_item_warning_tags(item, session)

            rating = int(item.result_score * 25)
            rating_text = get_rating_text(rating)

            parameters = dict(rating=rating,
                              rating_text=rating_text,
                              item_id=item.id,
                              content=item.content)

            for submission in item.submissions:
                if submission.mail is not None:
                    try:
                        mail_sender.send_notification("item_closed",
                                                      mail=submission.mail,
                                                      replacements=parameters)
                    except Exception as e:
                        logger.exception(e)

                if submission.telegram_id is not None:
                    try:
                        mail_sender.send_notification(
                            "item_closed",
                            telegram_id=submission.telegram_id,
                            replacements=parameters)
                    except Exception as e:
                        logger.exception(e)

            return Success(event, add_cors_headers=False).to_json_string()

    except Exception as e:
        return InternalError(event,
                             "Error sending notification",
                             e,
                             add_cors_headers=False).to_json_string()
def test_get_closed_items(item_id, review_id, review_answer_id, user_id,
                          comment_id):
    os.environ["STAGE"] = "dev"

    with Session() as session:

        item = Item(id=item_id)
        review = Review(id=review_id, item_id=item_id, user_id=user_id)
        review_question = ReviewQuestion(id='Question1')
        review_answer = ReviewAnswer(id=review_answer_id,
                                     review_id=review_id,
                                     review_question_id=review_question.id)
        user = User(id=user_id, name='User')
        level = Level(id=1, description='beginner')
        comment = Comment(id=comment_id,
                          comment='testcomment',
                          is_review_comment=True,
                          user_id=user_id,
                          item_id=item_id)
        session.add_all([
            item, review, review_question, review_answer, user, level, comment
        ])
        session.commit()

        # Test no query param
        event = {}
        response = get_item.get_item(event, None)
        assert response['statusCode'] == 400

        # Test invalid item id
        event = get_event('Quatsch_mit_Soße')
        response = get_item.get_item(event, None)
        assert response['statusCode'] == 404

        event = get_event(item_id)
        response = get_item.get_item(event, None)
        assert response['statusCode'] == 403

        item.status = 'closed'
        session.merge(item)
        session.commit()
        response = get_item.get_item(event, None)
        assert response['statusCode'] == 200
        body = json.loads(response['body'])
        assert body['id'] == item.id

        session.delete(user)
        session.expire_all()
        response = get_item.get_item(event, None)
        assert response['statusCode'] == 200
        body = json.loads(response['body'])
        assert body['users'][0] is None
Esempio n. 22
0
def test_get_all_parent_questions(fixtures, child_question1, type_id_1):
    with Session() as session:

        session.add_all(fixtures)
        session.add(child_question1)
        session.commit()

        all_questions_type_1 = review_question_handler.get_review_questions_by_item_type_id(type_id_1, session)
        assert len(all_questions_type_1) == 2
        assert child_question1 in all_questions_type_1
        parent_questions_type_1 = review_question_handler.get_all_parent_questions(type_id_1, session)
        assert len(parent_questions_type_1) == 1
        assert child_question1 not in parent_questions_type_1
Esempio n. 23
0
def test_prepare_and_store_urls_with_unsafe_items():
    with Session() as session:
        str_urls = ["http://testsafebrowsing.appspot.com/s/malware.html"]

        item = Item()
        item = item_handler.create_item(item, session)

        url_handler.prepare_and_store_urls(item, str_urls, session)
        for str_url in str_urls:
            url = verify_and_get_url(item, str_url, session)
            assert url.unsafe is not None

        assert item.status == 'Unsafe'
Esempio n. 24
0
def test_prepare_and_store_urls_for_localhost_url():
    with Session() as session:
        str_urls = [
            "http://LOCALHOST/utes-moma-127-8-altmaier-will-haertere-strafen-bei-verstoessen-gegen-die-corona-regeln/",
            "http://127.0.0.1/utes-moma-127-8-altmaier-will-haertere-strafen-bei-verstoessen-gegen-die-corona-regeln/"
        ]

        item = Item()
        item = item_handler.create_item(item, session)

        url_handler.prepare_and_store_urls(item, str_urls, session)
        assert item.urls == []
        assert item.status != 'Unsafe'
    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_create_review(item_id, junior_user_id, senior_user_id):

    with Session() as session:

        session = setup_scenarios.create_questions(session)
        session = setup_scenarios.create_levels_junior_and_senior_detectives(session)
        item = Item(id=item_id, item_type_id="Type1")
        session.add(item)
        session.commit()        

        # Create junior review
        event = event_creator.get_create_review_event(junior_user_id, item_id)
        response = create_review.create_review(event, None)
        assert response['statusCode'] == 201
        reviews = session.query(Review).all()
        assert len(reviews) == 1
        review = Review()
        review = reviews[0]
        assert review.user_id == junior_user_id
        assert review.item_id == item_id
        question_ids = []
        for answer in review.review_answers:
            question_ids.append(answer.review_question_id)

        assert "other_type" not in question_ids
        parent_question_counter = 0
        for answer in review.review_answers:
            if answer.review_question.max_children > 0:
                child_questions = session.query(ReviewQuestion).filter(
                    ReviewQuestion.parent_question_id == answer.review_question_id).all()
                for child_question in child_questions:
                    assert child_question.id in question_ids
            if answer.review_question.parent_question_id is None:
                parent_question_counter += 1

        assert parent_question_counter == 6

        event = event_creator.get_create_review_event(senior_user_id, item_id)
        response = create_review.create_review(event, None)
        assert response['statusCode'] == 201
        reviews = session.query(Review).all()
        assert len(reviews) == 2
        reviews = session.query(Review).filter(
            Review.user_id == senior_user_id).all()
        assert len(reviews) == 1
        review = reviews[0]
        assert review.user_id == senior_user_id
        assert review.item_id == item_id
        for answer in review.review_answers:
            assert answer.review_question_id in question_ids
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
Esempio n. 28
0
def submit_issue(event, context):

    helper.log_method_initiated("Submit issue", event, logger)

    issue = Issue()  # create object from issue_model.py (DB table: issues)
    issue = helper.body_to_object(event['body'], issue)

    # add ip address
    try:
        ip_address = event['requestContext']['identity']['sourceIp']
        setattr(issue, 'ip_address', ip_address)
    except Exception:
        response = {
            "statusCode":
            400,
            "body":
            "Could not read/add ip address. Check HTTP POST payload. Stacktrace: {}"
            .format(traceback.format_exc())
        }

    with Session() as session:
        issue = add_object(issue, session)
        if issue is None:
            response = {
                "statusCode":
                400,
                "body":
                "Could not write issue to database. Check HTTP POST payload. Stacktrace: {}"
                .format(traceback.format_exc())
            }
            response_cors = helper.set_cors(response, event)
            return response_cors

        response = send_issue_notification(issue)
        if response == False:
            response = {
                "statusCode":
                500,
                "body":
                "Could not send issue mail. Stacktrace: {}".format(
                    traceback.format_exc())
            }
            response_cors = helper.set_cors(response, event)
            return response_cors

        else:
            response = {"statusCode": 201, "body": json.dumps(issue.to_dict())}
            response_cors = helper.set_cors(response, event)
            return response_cors
Esempio n. 29
0
def handle_item_rejected(event, context):
    try:
        helper.log_method_initiated("Handle item rejected", event, logger)

        if "detail" not in event or "item_id" not in event["detail"]:
            return BadRequest(event,
                              "Event contains no item_id.",
                              add_cors_headers=False).to_json_string()

        with Session() as session:

            item_id = event["detail"]["item_id"]
            item = item_handler.get_item_by_id(item_id, session)

            if item is None:
                return BadRequest(
                    event,
                    f"No item was found with the given item_id [{item_id}].",
                    add_cors_headers=False).to_json_string()

            parameters = dict(content=item.content)

            for submission in item.submissions:
                if submission.mail is not None:
                    try:
                        mail_sender.send_notification("item_rejected",
                                                      mail=submission.mail,
                                                      replacements=parameters)
                    except Exception as e:
                        logger.exception(e)

                if submission.telegram_id is not None:
                    try:
                        mail_sender.send_notification(
                            "item_rejected",
                            telegram_id=submission.telegram_id,
                            replacements=parameters)
                    except Exception as e:
                        logger.exception(e)

            return Success(event, add_cors_headers=False).to_json_string()
    except Exception as e:
        response = InternalError(event,
                                 "Error sending notification",
                                 e,
                                 add_cors_headers=False).to_json_string()
        logger.error(response)

        return response
def get_closed_items(event, context):

    helper.log_method_initiated("Get all closed items", event, logger)

    with Session() as session:

        try:
            # Get all closed items
            print("\n \n \n Getting items \n \n \n")
            allow_all_origins = False

            if 'queryStringParameters' in event and isinstance(
                    event['queryStringParameters'],
                    dict) and 'url' in event['queryStringParameters']:
                url_without_query_params = event['queryStringParameters'][
                    'url'].split('?')[0]
                items = item_handler.get_closed_items_by_url(
                    url_without_query_params, session)
                allow_all_origins = True
            else:
                items = item_handler.get_all_closed_items(session)

            if len(items) == 0:
                response = {"statusCode": 204, "body": "No closed items found"}
            else:
                items_list = []
                for item in items:
                    items_list.append(
                        item.to_dict(with_tags=True, with_warnings=True))

                response = {
                    "statusCode": 200,
                    'headers': {
                        "content-type": "application/json; charset=utf-8"
                    },
                    "body": json.dumps(items_list)
                }

        except Exception:
            response = {
                "statusCode":
                400,
                "body":
                "Could not get closed items. Stacktrace: {}".format(
                    traceback.format_exc())
            }

    response_cors = helper.set_cors(response, event, allow_all_origins)
    return response_cors