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_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
def test_store_itemurl(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") from urllib.parse import urlparse session = get_db_session(True, None) str_url = "https://smopo.ch/zehntausende-als-falsche-coronatote-deklariert/" # creating items item = Item() item.content = str_url item = item_handler.create_item(item, True, session) # store a url event = {"item": item.to_dict(), "Claim": {"urls": [str_url]}} context = "" EnrichItem.store_itemurl(event, context, True, session) url = url_handler.get_url_by_content(str_url, True, session) itemurl = url_handler.get_itemurl_by_url_and_item_id( url.id, item.id, True, session) domain = urlparse(str_url).hostname claimant = claimant_handler.get_claimant_by_name(domain, True, session) assert url.url == str_url assert itemurl.id is not None assert claimant.claimant == domain assert url.claimant_id is not None
def test_store_itemtag(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) # 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, True, session) list_tags = ['RKI', 'Covid', 'Corona Transition'] # store tags event = {"item": item.to_dict(), "Tags": list_tags} context = "" EnrichItem.store_itemtags(event, context, True, session) tag = tag_handler.get_tag_by_content(list_tags[0], True, session) assert tag.tag == list_tags[0] itemtag = tag_handler.get_itemtag_by_tag_and_item_id( tag.id, item.id, True, session) assert itemtag.id is not None event = {"pathParameters": {"item_id": item.id}} ret = GetTags.get_tags_for_item(event, context, True, session) body = ret['body'] # Deserialize if body is string if isinstance(body, str): tags = json.loads(body)['Tags'] else: tags = body['Tags'] assert tags == list_tags
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
def test_create_item(): session = get_db_session(True, None) item = Item() item.content = "Testitem" item = item_handler.create_item(item, True, 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
def test_get_online_factcheck_by_itemid_2(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) # creating items item = Item() item.content = "https://corona-transition.org/rki-bestatigt-covid-19-sterblichkeitsrate-von-0-01-prozent-in" \ "-deutschland?fbclid=IwAR2vLIkW_3EejFaeC5_wC_410uKhN_WMpWDMAcI-dF9TTsZ43MwaHeSl4n8%22 " item.language = "de" item = item_handler.create_item(item, True, session) # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": item.language, }, "KeyPhrases": [ "das Zahlenmaterial", "es", "den letzten 7 Tagen", "das RKI", "sich" ], "Entities": [ "RKI", "0,01 Prozent", "19 Sterblichkeitsrate", "Corona Transition", "Covid" ], "Sentiment": "NEUTRAL" } context = "" EnrichItem.store_itementities(event, context, True, session) EnrichItem.store_itemphrases(event, context, True, session) event = {"pathParameters": {"item_id": item.id}} context = {} s = time.perf_counter() response = get_online_factcheck.get_online_factcheck( event, context, True, session) elapsed = time.perf_counter() - s body = response['body'] # Deserialize if body is string if isinstance(body, str): factcheck = json.loads(body) else: factcheck = body assert factcheck[ 'url'] == 'https://correctiv.org/faktencheck/2020/07/09/nein-rki-bestaetigt-nicht-eine-covid-19-sterblichkeitsrate-von-001-prozent-in-deutschland/' assert factcheck[ 'title'] == 'Falsch. Das Robert-Koch-Institut bestätigte nicht eine Covid-19- Sterblichkeitsrate von 0,01 Prozent in Deutschland.' assert elapsed < 3
def test_post_tags_for_item_2(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) # creating items item = Item() item.content = "https://corona-transition.org/rki-bestatigt-covid-19-sterblichkeitsrate-von-0-01-prozent-in" \ "-deutschland?fbclid=IwAR2vLIkW_3EejFaeC5_wC_410uKhN_WMpWDMAcI-dF9TTsZ43MwaHeSl4n8%22 " item.language = "de" item = item_handler.create_item(item, True, session) event = {"pathParameters": {"item_id": item.id}} context = "" response = GetTags.get_tags_for_item(event, context, True, session) body = response['body'] # Deserialize if body is string if isinstance(body, str): tags = json.loads(body)['Tags'] else: tags = body['Tags'] assert tags == [] json.dumps({"tags": ["RKI", "Covid-19"]}) event = { "pathParameters": { "item_id": item.id }, "body": json.dumps({"tags": ["RKI", "Covid-19"]}) } response = GetTags.post_tags_for_item(event, context, True, session) body = response['body'] # Deserialize if body is string if isinstance(body, str): tags_added = json.loads(body)['added tags'] tags_removed = json.loads(body)['removed tags'] else: tags_added = body['added tags'] tags_removed = body['removed tags'] assert 'RKI' in tags_added assert 'Covid-19' in tags_added assert len(tags_removed) == 0 assert tags_removed == [] response = GetTags.get_tags_for_item(event, context, True, session) body = response['body'] # Deserialize if body is string if isinstance(body, str): tags = json.loads(body)['Tags'] else: tags = body['Tags'] assert tags == ['RKI', 'Covid-19']
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_closed_items(): # pre-stuff os.environ["STAGE"] = "dev" with Session() as session: context = None # create item item = Item() item.content = "Test content" item.language = "de" item.status = "closed" item = item_handler.create_item(item, session) # create events with tags event1 = { "pathParameters": { "item_id": item.id }, "body": json.dumps({"tags": ['C', 'B', 'D']}) } event2 = { "pathParameters": { "item_id": item.id }, "body": json.dumps({"tags": ['B', 'C']}) } event3 = { "pathParameters": { "item_id": item.id }, "body": json.dumps({"tags": ['A', 'B']}) } # post tags GetTags.post_tags_for_item(event1, context) GetTags.post_tags_for_item(event2, context) GetTags.post_tags_for_item(event3, context) # Check if tags are sorted by number of mentions response = get_closed_items(event1, context) body = response['body'] tags = json.loads(body)[0]['tags'] assert tags in [['B', 'C', 'A', 'D'], ['B', 'C', 'D', 'A']]
def test_get_online_factcheck_by_itemid_5(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) # creating items item = Item() item.content = "Ein in sozialen Medien kursierendes Video soll angeblich große Schwächen der zum Corona-Test genutzten PCR-Methode offenbaren. 'Sensation! Naomi Seibt widerlegt den PCR Test von Prof Drosten! KEIN Virus EXISTENT!!!', heißt es etwa (hier archiviert, hier Video archiviert)" item.language = "de" item = item_handler.create_item(item, True, session) # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": item.language, }, "KeyPhrases": ["Drosten", "Test", "Corona", "PCR"], "Entities": [] } context = "" EnrichItem.store_itementities(event, context, True, session) EnrichItem.store_itemphrases(event, context, True, session) event = {"pathParameters": {"item_id": item.id}} context = {} s = time.perf_counter() response = get_online_factcheck.get_online_factcheck( event, context, True, session) elapsed = time.perf_counter() - s body = response['body'] # Deserialize if body is string if isinstance(body, str): factcheck = json.loads(body) else: factcheck = body assert factcheck[ 'url'] == 'https://correctiv.org/faktencheck/2020/11/23/nein-christian-drosten-hat-2014-nicht-gesagt-dass-er-pcr-tests-fuer-untauglich-halte/' assert factcheck[ 'title'] == 'Fehlender Kontext. Drosten sagte nicht, PCR-Tests seien „untauglich“ – er kritisierte die Teststrategie 2014 in der MERS-Epidemie. Seine Aussagen lassen sich nicht auf die heutige Coronavirus-Pandemie übertragen.' assert elapsed < 3
def test_store_factcheck_empty(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") session = get_db_session(True, None) # creating items item = Item() item.content = "item is referencing some fact checks" item = item_handler.create_item(item, True, session) # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": "en", }, "FactChecks": [""] } context = "" EnrichItem.store_factchecks(event, context, True, session) assert 1 == 1
def test_get_online_factcheck_by_itemid_4(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) # creating items item = Item() item.content = "https://kopp-report.de/helios-kliniken-veroeffentlichen-corona-fakten-keine-pandemie-von-nationaler-tragweite/?fbclid=IwAR1fMRjkKXXYQUiNxYrgYczcffvNZbW-F3z8Q4f4Ar00caSNO1KjFtyJrG4" item.language = None item = item_handler.create_item(item, True, session) # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": item.language, }, "KeyPhrases": [], "Entities": [], "Sentiment": "NEUTRAL" } context = "" EnrichItem.store_itementities(event, context, True, session) EnrichItem.store_itemphrases(event, context, True, session) event = {"pathParameters": {"item_id": item.id}} context = {} s = time.perf_counter() response = get_online_factcheck.get_online_factcheck( event, context, True, session) elapsed = time.perf_counter() - s body = response['body'] # Deserialize if body is string assert body == 'No factcheck found. Exception: Language of Claim not recognized.' assert elapsed < 3
def item(): item = Item() item.id = str(uuid4()) item.content = 'Test item' return item
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
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()
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 submit_item(event, context, is_test=False, session=None): client = boto3.client('stepfunctions', region_name="eu-central-1") helper.log_method_initiated("Item submission", event, logger) if session == None: session = connection_handler.get_db_session(False, None) try: body = event['body'] if isinstance(body, str): body_dict = json.loads(body) else: body_dict = body content = body_dict["content"] del body_dict["content"] if ("type" in body_dict): type = body_dict["type"] del body_dict["type"] else: type = None if ("item_type_id" in body_dict): item_type_id = body_dict["item_type_id"] del body_dict["item_type_id"] else: item_type_id = None submission = Submission() helper.body_to_object(body_dict, submission) # add ip address ip_address = event['requestContext']['identity']['sourceIp'] setattr(submission, 'ip_address', ip_address) try: # Item already exists, item_id in submission is the id of the found item item = item_handler.get_item_by_content(content, is_test, session) submission.item_id = item.id new_item_created = False except Exception: # Item does not exist yet, item_id in submission is the id of the newly created item item = Item() item.content = content item.item_type_id = item_type_id item.type = type item = item_handler.create_item(item, is_test, session) new_item_created = True submission.item_id = item.id stage = os.environ['STAGE'] client.start_execution( stateMachineArn= 'arn:aws:states:eu-central-1:891514678401:stateMachine:SearchFactChecks_new-' + stage, name='SFC_' + item.id, input="{\"item\":{" "\"id\":\"" + item.id + "\"," "\"content\":\"" + remove_control_characters(item.content) + "\" } }") # Create submission submission_handler.create_submission_db(submission, is_test, session) if submission.mail: send_confirmation_mail(submission) response = { "statusCode": 201, 'headers': { "content-type": "application/json; charset=utf-8", "new-item-created": str(new_item_created) }, "body": json.dumps(item.to_dict()) } except Exception: response = { "statusCode": 400, "body": "Could not create item and/or submission. Check HTTP POST payload. Stacktrace: {}" .format(traceback.format_exc()) } response_cors = helper.set_cors(response, event, is_test) return response_cors
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 test_get_factchecks_by_itemid_db(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") # import EnrichItem session = get_db_session(True, None) # creating items item = Item() item.content = "item is referencing some fact checks" item = item_handler.create_item(item, True, session) factcheck = external_factcheck_handler.get_factcheck_by_itemid( item.id, True, session) assert factcheck is None # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": "en", }, "FactChecks": [{ "claimReview": [{ "publisher": { "site": "dpa-factchecking.com" }, "url": "https://dpa-factchecking.com/austria/200625-99-562594/", "title": "Fotos zeigen Polizisten in Australien - kein Zusammenhang zu Stuttgart", "reviewDate": "2020-06-29T00:00:00Z", "textualRating": "Die Bilder stammen nicht aus Deutschland.", "languageCode": "de" }] }] } context = "" EnrichItem.store_factchecks(event, context, True, session) factcheck = external_factcheck_handler.get_factcheck_by_itemid( item.id, True, session) assert factcheck.url == "https://dpa-factchecking.com/austria/200625-99-562594/" # store another fact check event = { "item": { "id": item.id, "content": item.content, "language": "en", }, "FactChecks": [{ "claimReview": [{ "publisher": { "site": "leadstories.com" }, "url": "https://leadstories.com/hoax-alert/2020/08/fact-check-video-does-not-prove-masks" "-kill-or-that-microchips-will-be-forced-into-everyone-through-vaccines.html", "title": "Fact Check: Video Does NOT Prove Face Masks Kill", "reviewDate": "2020-08-07T19:16:06Z", "textualRating": "Bad Info", "languageCode": "en" }] }] } context = "" EnrichItem.store_factchecks(event, context, True, session) factcheck = external_factcheck_handler.get_factcheck_by_itemid( item.id, True, session) assert factcheck.url == "https://dpa-factchecking.com/austria/200625-99-562594/"
def test_post_tags_for_item(): # pre-stuff os.environ["STAGE"] = "dev" with Session() as session: # create item item = Item() item.content = "https://corona-transition.org/rki-bestatigt-covid-19-sterblichkeitsrate-von-0-01-prozent-in" \ "-deutschland?fbclid=IwAR2vLIkW_3EejFaeC5_wC_410uKhN_WMpWDMAcI-dF9TTsZ43MwaHeSl4n8%22 " item.language = "de" item = item_handler.create_item(item, session) # store a fact check event = { "item": { "id": item.id, "content": item.content, "language": item.language, }, "Tags": ["RKI", "Covid", "Corona Transition"] } context = "" EnrichItem.store_itemtags(event, context) # create event event = {"pathParameters": {"item_id": item.id}} response = GetTags.get_tags_for_item(event, context) body = response['body'] tags = json.loads(body)['Tags'] assert tags == ['RKI', 'Covid', 'Corona Transition'] # create event with 1 already existing tag and 1 new tag event = { "pathParameters": { "item_id": item.id }, "body": json.dumps({"tags": ['RKI', 'Covid-19']}) } response = GetTags.post_tags_for_item(event, context) body = response['body'] tags_added = json.loads(body)['added new tags'] tags_counter_increased = json.loads(body)['increased tag counter'] assert tags_added == ['Covid-19'] assert len(tags_counter_increased) == 1 assert 'RKI' in tags_counter_increased assert 'Covid-19' not in tags_counter_increased response = GetTags.get_tags_for_item(event, context) body = response['body'] tags = json.loads(body)['Tags'] assert tags == ['RKI', 'Covid', 'Corona Transition', 'Covid-19'] assert tags != ['Covid', 'Corona Transition', 'Covid-19', 'RKI'] # Check counts: RKI posted twice, all other once assert session.query(ItemTag).join(Tag).filter( Tag.tag == 'RKI').count() == 2 assert session.query(ItemTag).join(Tag).filter( Tag.tag == 'Covid').count() == 1 assert session.query(ItemTag).join(Tag).filter( Tag.tag == 'Corona Transition').count() == 1 assert session.query(ItemTag).join(Tag).filter( Tag.tag == 'Covid-19').count() == 1
def get_item(item_content='Test content'): item = Item() item.id = str(uuid4()) item.content = item_content return item
def submit_item(event, context): client = boto3.client('stepfunctions', region_name="eu-central-1") helper.log_method_initiated("Item submission", event, logger) with Session() as session: try: body = event['body'] if isinstance(body, str): body_dict = json.loads(body) else: body_dict = body content = body_dict["content"] del body_dict["content"] if "type" in body_dict: type = body_dict["type"] del body_dict["type"] else: type = None if "item_type_id" in body_dict: item_type_id = body_dict["item_type_id"] del body_dict["item_type_id"] else: item_type_id = None if "item" in body_dict: del body_dict["item"] submission = Submission() helper.body_to_object(body_dict, submission) # add ip address ip_address = event['requestContext']['identity']['sourceIp'] setattr(submission, 'ip_address', ip_address) try: # Item already exists, item_id in submission is the id of the found item item = item_handler.get_item_by_content(content, session) submission.item_id = item.id new_item_created = False except Exception: # Item does not exist yet, item_id in submission is the id of the newly created item item = Item() item.content = content item.item_type_id = item_type_id item.type = type item = item_handler.create_item(item, session) new_item_created = True if content: str_urls = re.findall( 'http[s]?://(?:[a-zA-ZäöüÄÖÜ]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', content) url_handler.prepare_and_store_urls(item, str_urls, session) submission.item_id = item.id submission.status = item.status # Create submission submission_handler.create_submission_db(submission, session) if submission.mail: if item.status != 'Unsafe': send_confirmation_mail(submission) # Create response if item.status == 'Unsafe': response = { "statusCode": 403, "headers": { "content-type": "application/json; charset=utf-8", "new-item-created": str(new_item_created) }, "body": "Item not valid" } else: response = { "statusCode": 201, "headers": { "content-type": "application/json; charset=utf-8", "new-item-created": str(new_item_created) }, "body": json.dumps(item.to_dict()) } except Exception as e: logger.error("Couldn't submit item. Exception: %s", e) response = { "statusCode": 400, "body": "Could not create item and/or submission. Check HTTP POST payload. Stacktrace: {}" .format(traceback.format_exc()) } ## start SearchFactChecks only for safe items if (item.status != 'Unsafe') and (new_item_created == True): stage = os.environ['STAGE'] client.start_execution( stateMachineArn= 'arn:aws:states:eu-central-1:891514678401:stateMachine:SearchFactChecks_new-' + stage, name='SFC_' + item.id, input="{\"item\":{" "\"id\":\"" + item.id + "\"," "\"content\":\"" + remove_control_characters(item.content) + "\" } }") response_cors = helper.set_cors(response, event) return response_cors
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
def test_DocSim_vs_RegExp(self, monkeypatch): monkeypatch.setenv("DBNAME", "Test") os.environ["STAGE"] = "dev" session = get_db_session(True, None) claim_factcheck_dicts = [ { "claim": "https://www.facebook.com/DieSteffi82/posts/5064896943550398", "factcheck": "https://correctiv.org/faktencheck/2020/12/23/nein-abstrichstaebchen-von-corona-schnelltests-sind-nicht-verseucht/", "stepfunction": {} }, { # nicht extrahierbar "claim": "In Ägypten war das eine Strafe für Slaves... Breche die Drüse der Blutenzephalitis: https://www.facebook.com/photo.php?fbid=3591706030868619&set=a.368339826538605&type=3", "factcheck": "https://correctiv.org/faktencheck/2020/12/23/nein-nasenabstriche-fuer-einen-corona-test-gleichen-nicht-einer-strafe-fuer-sklaven-im-alten-aegypten/", "stepfunction": {} }, { # twitter benötigt eine andere extraktionsmethode "claim": "An der Universität Cambridge wurden alle 9000 Studenten mit PCR getestet. Alle Tests stellten sich im nach hinein als falsch positiv heraus - 100% falsche Ergebnisse und auf diesem Test beruhen, Foderungen und Massnahmen. Es reicht jetzt wirklich.: https://twitter.com/LuanaNussbaum/status/1336956296017350657?s=20", "factcheck": "https://correctiv.org/faktencheck/2020/12/23/nein-an-der-universitaet-cambridge-wurden-nicht-9-000-studierende-falsch-positiv-auf-corona-getestet/", "stepfunction": {} }, { "claim": "https://www.facebook.com/Silberjungede-Wir-wollen-Augen-öffnen-Thorsten-Schulte-155330287422/videos/381310726307004/", "factcheck": "https://correctiv.org/faktencheck/2020/12/22/dauer-lockdown-angela-merkels-aussage-wird-irrefuehrend-interpretiert/", "stepfunction": {} }, { "claim": "https://www.facebook.com/svensworld000/videos/2792271450987454/", "factcheck": "https://correctiv.org/faktencheck/2020/12/21/video-keine-belege-dass-ein-corona-schnelltest-positiv-auf-fruchtsaft-reagierte/", "stepfunction": {} }, { "claim": "https://corona-transition.org/rki-bestatigt-covid-19-sterblichkeitsrate-von-0-01-prozent-in" \ "-deutschland?fbclid=IwAR2vLIkW_3EejFaeC5_wC_410uKhN_WMpWDMAcI-dF9TTsZ43MwaHeSl4n8%22 ", "factcheck": "https://correctiv.org/faktencheck/2020/07/09/nein-rki-bestaetigt-nicht-eine-covid-19-sterblichkeitsrate-von-001-prozent-in-deutschland/", "stepfunction": {} }, { "claim": "https://kopp-report.de/helios-kliniken-veroeffentlichen-corona-fakten-keine-pandemie-von-nationaler-tragweite/?fbclid=IwAR1fMRjkKXXYQUiNxYrgYczcffvNZbW-F3z8Q4f4Ar00caSNO1KjFtyJrG4", "factcheck": "https://correctiv.org/faktencheck/medizin-und-gesundheit/2020/11/06/corona-zahlen-ueber-patienten-auf-intensivstationen-in-helios-kliniken-werden-irrefuehrend-verbreitet/", "stepfunction": {} }, { "claim": "Manche Corona-Tests brauchen keine externe Qualitätskontrolle", "factcheck": "https://www.br.de/nachrichten/wissen/warum-viele-corona-tests-noch-keine-qualitaetskontrolle-brauchen,SI1KrNC", "stepfunction": {} }, # { # "claim": "https://viralvirus.de/politik/obama-finanzierte-labor-in-wuhan/?fbclid=IwAR3qOdSnC-A7h6wvPQcOFmuFPgLGNOImn_Ee6_vjAGeAmVJ9MVZnoNeFMBk", # "factcheck": "https://correctiv.org/faktencheck/2020/07/21/nein-die-us-regierung-unter-obama-hat-das-institut-fuer-virologie-in-wuhan-nicht-mit-37-millionen-dollar-unterstuetzt/", # "stepfunction": {} # }, { "claim": "Spanien korrigiert Anzahl der Corona-Toten von über 26.000 auf 2.000. Bin mal gespannt, wie lange D-A-CH noch an den FAKE-Zahlen festhalten wollen.", "factcheck": "https://correctiv.org/faktencheck/2020/06/16/nein-spanien-hat-die-zahl-der-corona-toten-nicht-auf-2-000-korrigiert/", "stepfunction": {} }, { "claim": "GERADE VON NTV AUFGENOMMEN!!!! MERKEL EMPFÄNGT MINSITERPRÄSIDENTEN IM KANZLERAMT.WO IST DER SICHERHEITSABSTAND, WO SIND DIE MASKEN??? SELBST SÖDER TRÄGT KEINE, ABER WEHE DER STEHT IN BAYERN VOR EINER PK, DA KOMMT DER DANN MIT MASKE REIN.WAS EIN VERLOGENES VOLK", "factcheck": "https://correctiv.org/faktencheck/2020/06/24/nein-merkel-hat-die-ministerpraesidenten-nicht-ohne-sicherheitsabstand-empfangen/", "stepfunction": {} }, { "claim": "https://www.bitchute.com/video/WGkyGAUdwqlh/", "factcheck": "https://correctiv.org/faktencheck/2020/12/17/sprachnachricht-verbreitet-unbelegte-behauptung-ueber-corona-tests-mit-voreingestelltem-ergebnis/", "stepfunction": {} }, { "claim": "https://www.facebook.com/corinnas.angelika.winkler/videos/4668198303252715", "factcheck": "https://correctiv.org/faktencheck/2020/12/16/video-nein-corona-schnelltest-reagiert-nicht-positiv-auf-rotwein/", "stepfunction": {} }, { "claim": "https://www.facebook.com/steffen.mono/videos/1531749847023893/", "factcheck": "https://correctiv.org/faktencheck/2020/12/16/positiver-corona-test-bei-apfelmus-hat-keine-aussagekraft/", "stepfunction": {} }, { "claim": "https://www.ots.at/presseaussendung/OTS_20201210_OTS0242/fpoe-schnedlitz-macht-live-coronatest-im-parlament", "factcheck": "https://correctiv.org/faktencheck/2020/12/15/antigen-schnelltest-falsch-durchgefuehrt-fpoe-politiker-testet-cola-auf-corona/", "stepfunction": {} }, { # twitter benötigt eine andere extraktionsmethode "claim": "Ich übersetzte das mal für die #Gerichte: Jeder Patient mit #Lungenentzündung, der Kontakt mit einer positiv getesteten Person hatte, wird als Covid19 Fall gemeldet, auch wenn er selbst negativ getestet wurde. https://twitter.com/QuakDr/status/1332601338514038784", "factcheck": "https://correctiv.org/faktencheck/2020/12/15/es-stimmt-nicht-dass-jeder-patient-mit-lungenentzuendung-als-corona-fall-gezaehlt-wird/", "stepfunction": {} }, { # nicht extrahierbar "claim": "Lothar Wieler vom RKI: Wir haben viel gelernt.. unabhängig davon ob es das Virus gibt, oder nicht Diese Aussage muss man sich mal auf der Zunge zergehen lassen! https://www.facebook.com/photo.php?fbid=3466879523407507&set=a.897173730378112&type=3", "factcheck": "https://correctiv.org/faktencheck/2020/12/15/ob-es-das-virus-gibt-oder-nicht-zitat-von-rki-chef-lothar-wieler-aus-dem-kontext-gerissen/", "stepfunction": {} }, { # nicht extrahierbar "claim": "Die Schweizer Zulassungsbehörde hat soeben den deutschen mRNA-Corona-Impfstoff als zu gefährlich und unkalkulierbar ABGELEHNT. ***** TELEBASEL.CH Swissmedic: Stand heute können wir keine Zulassung für einen Impfstoff erteilen https://www.facebook.com/photo.php?fbid=1187531251644128&set=a.135783410152256&type=3", "factcheck": "https://correctiv.org/faktencheck/2020/12/14/schweiz-nein-einem-corona-impfstoff-wurde-nicht-die-zulassung-verweigert-weil-er-zu-gefaehrlich-und-unkalkulierbar-sei/", "stepfunction": {} }, { # Forbidden to extract "claim": "Italien: Studie belegt stark erhöhten CO2-Wert unter der Maske https://2020news.de/italien-studie-belegt-stark-erhoehten-co2-wert-unter-der-maske/", "factcheck": "https://correctiv.org/faktencheck/2020/12/14/nein-eine-angebliche-studie-belegt-keinen-zu-hohen-co2-wert-unter-masken/", "stepfunction": {} }, { "claim": "https://www.facebook.com/yhardt/videos/10222050726953076", "factcheck": "https://correctiv.org/faktencheck/2020/12/10/impfstudie-alles-deutet-darauf-hin-dass-dieser-arzt-in-brasilien-nicht-durch-eine-corona-impfung-starb/", "stepfunction": {} }, { # nicht extrahierbar "claim": "Warum ist es notwendig, tief in der Nase nach dem Virus zu suchen?... Wäre es nicht ausreichend, auf das Stäbchen zu spucken, wenn doch angeblich das Virus au einem Meter schon ansteckend sein soll? https://www.facebook.com/photo.php?fbid=1773053819513552&set=a.794989853986625&type=3", "factcheck": "https://correctiv.org/faktencheck/2020/12/10/deshalb-wird-der-abstrich-fuer-pcr-tests-meist-am-nasenrachen-gemacht/", "stepfunction": {} }, { "claim": "https://fingersblog.com/2020/11/19/niederlande-nur-wer-geimpft-ist-darf-sich-wieder-frei-bewegen/", "factcheck": "https://correctiv.org/faktencheck/2020/12/10/vorteile-fuer-menschen-die-sich-gegen-covid-19-impfen-lassen-niederlaendischer-gesundheitsminister-spricht-von-missverstaendnis/", "stepfunction": {} }, { "claim": "https://corona-transition.org/amtliche-anweisung-an-arzte-und-apotheker-bitte-sprechen-sie-die-risiken-nicht", "factcheck": "https://correctiv.org/faktencheck/2020/12/09/nein-jens-spahn-hat-nicht-gesagt-dass-apotheker-keine-bedenken-zu-corona-impfstoffen-aeussern-sollen/", "stepfunction": {} }, { "claim": "https://www.youtube.com/watch?v=io5ShKM4MV8&feature=youtu.be", "factcheck": "https://correctiv.org/faktencheck/2020/12/09/unwissenheit-ueber-covid-19-impfstoffe-aelteres-interview-mit-rki-chef-wieler-wird-irrefuehrend-verbreitet/", "stepfunction": {} }, { # nicht extrahierbar "claim": "Weisheit des Tages: Wenn man an COVID stirbt, wird man sehr leicht... https://www.facebook.com/groups/648478082346782/permalink/978930515968202/", "factcheck": "https://correctiv.org/faktencheck/2020/12/07/nein-diese-bilder-von-leichensaecken-und-einem-sarg-zeigen-nicht-dass-corona-todesfaelle-inszeniert-werden/", "stepfunction": {} }, { "claim": "https://www.facebook.com/permalink.php?story_fbid=2992046007562267&id=353649981401896", "factcheck": "https://correctiv.org/faktencheck/2020/12/07/nein-das-tragen-einer-maske-fuehrt-nicht-zu-sauerstoffmangel-bei-kindern/", "stepfunction": {} }, { "claim": "https://www.spiegel.de/wissenschaft/medizin/corona-krise-bringt-rekord-rueckgang-der-co2-emissionen-a-81f70390-624d-4717-ba35-f3bc130ad8df", "factcheck": "", "stepfunction": {} }, { "claim": "Kinderarzt besorgt: Corona-Geimpfte sind Teil eines medizinischen Experiments: https://www.compact-online.de/kinderarzt-besorgt-corona-geimpfte-sind-teil-eines-medizinischen-experiments/", "factcheck": "", "stepfunction": {} }, { "claim": "Baden-Württemberg: Zwangseinweisung für hartnäckige Quarantäneverweigerer beschlossen: https://de.rt.com/inland/110251-baden-wurttemberg-zwangseinweisung-fur-hartnackige/", "factcheck": "", "stepfunction": {} }, { "claim": "Gesundheitsexperten warnen vor kurzfristigen, aber heftigen Nebenwirkungen einer Corona-Impfung https://de.rt.com/inland/110211-gesundheitsexperten-warnen-vor-kurzfristigen-aber-heftigen-nebenwirkungen-corona-impfung/", "factcheck": "", "stepfunction": {} }, ] # search fact checks for all items count_fcExists = 0 count_kp_tp = 0 count_kp_fn = 0 count_noFc = 0 count_kp_tn = 0 count_kp_fp = 0 for i in range(len(claim_factcheck_dicts)): # creating item item = Item() item.content = claim_factcheck_dicts[i]["claim"] item = item_handler.create_item(item, True, session) claim_factcheck_dicts[i]["stepfunction"]["item"] = { "id": item.id, "content": item.content, "language": item.language, } #extract claim event = { "item": claim_factcheck_dicts[i]["stepfunction"]["item"] } context = "" claim = ExtractClaim.extract_claim(event, context) claim_factcheck_dicts[i]["stepfunction"]["Claim"] = claim # detect language event = { "Text": claim["concatenation"]["Text"] } try: claim_factcheck_dicts[i]["stepfunction"]["item"]["language"] = GetLanguage.get_language(event, context) except: continue # increment count of factchecks if claim_factcheck_dicts[i]["factcheck"] == "": count_noFc = count_noFc+1 else: count_fcExists = count_fcExists+1 # detect key phrases event["LanguageCode"] = claim_factcheck_dicts[i]["stepfunction"]["item"]["language"] claim_factcheck_dicts[i]["stepfunction"]["KeyPhrases"] = GetKeyPhrases.get_phrases(event, context) # detect entities claim_factcheck_dicts[i]["stepfunction"]["Entities"] = GetEntities.get_entities(event, context) # search factchecks with KeyPhrases event = { "item": claim_factcheck_dicts[i]["stepfunction"]["item"], "KeyPhrases": claim_factcheck_dicts[i]["stepfunction"]["KeyPhrases"], "Entities": claim_factcheck_dicts[i]["stepfunction"]["Entities"] } ret = SearchFactChecks.get_FactChecks(event, context) url = "" if 'claimReview' in ret[0]: url = ret[0]['claimReview'][0]['url'] if url == claim_factcheck_dicts[i]["factcheck"]: if url == "": count_kp_tn = count_kp_tn+1 else: count_kp_tp = count_kp_tp+1 else: if url == "": count_kp_fn = count_kp_fn+1 else: count_kp_fp = count_kp_fp+1 # calculate rate of false factchecks kp_fp = count_kp_fp/(count_fcExists+count_noFc) # calculate precision kp_pr = count_kp_tp/(count_kp_tp+count_kp_fp) # calculate Specitivity if count_noFc>0: kp_tn = count_kp_tn/count_noFc else: kp_tn = 1. if count_fcExists>0: # calculate Recall or Sensitivity, respectively kp_tp = count_kp_tp/count_fcExists # calculate false negatives kp_fn = count_kp_fn/count_fcExists else: kp_tp = 1. kp_fn = 1. logger = logging.getLogger() logger.setLevel(logging.INFO) logger.info('Precision (How much of the found factchecks are correct) for FactCheck Search: {}'.format(kp_pr)) logger.info('Recall (Sensitivity, how much of the factchecks were found) for FactCheck Search: {}'.format(kp_tp)) logger.info('Specifity (if no factcheck was found, how much of them are really without existing factcheck): {}'.format(kp_tn)) logger.info('False factchecks found: {}'.format(kp_fp)) logger.info('Existing Factcheck not found: {}'.format(kp_fn))
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