def test_inclusion_text(fake_sqlalchemy_engine, monkeypatch, capsys, tmpdir): http_address = activate_responses(fake_sqlalchemy_engine) responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), results_per_page=10, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) bot.set_value("inclusion_text", "") bot.click("investigate_button") assert bot.display_cached bot.set_value("inclusion_text", "THIS TEXT DOES NOT EXIST IN ANY SENTENCE") bot.click("investigate_button") assert not bot.display_cached
def test_report_article_saver(fake_sqlalchemy_engine, monkeypatch, capsys, tmpdir): """Make sure creation of report with article saver state works.""" tmpdir = Path(tmpdir) http_address = activate_responses(fake_sqlalchemy_engine) responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), ) bot = SearchWidgetBot(widget, capsys, monkeypatch) bot.set_value("top_results", 2) bot.set_value("default_value_article_saver", _Save.ARTICLE) bot.click("investigate_button") bot.stdout_cached # clear standard output with cd_temp(tmpdir): bot.click("articles_button") assert "Creating the saved results report... " in bot.stdout_cached assert len([f for f in tmpdir.iterdir() if f.suffix == ".html"]) == 1
def test_article_saver_global(fake_sqlalchemy_engine, monkeypatch, capsys, saving_mode): """Make sure that default saving buttons result in correct checkboxes.""" responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) k = 10 http_address = activate_responses(fake_sqlalchemy_engine) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), results_per_page=k, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) bot.set_value("top_results", k) bot.set_value("default_value_article_saver", saving_mode) bot.click("investigate_button") captured_display_objects = bot.display_cached assert len(captured_display_objects) == k * bot.n_displays_per_result if saving_mode == _Save.NOTHING: assert not widget.article_saver.state elif saving_mode == _Save.PARAGRAPH: assert 0 < len(widget.article_saver.state) <= k assert all(x[1] != -1 for x in widget.article_saver.state) elif saving_mode == _Save.ARTICLE: assert 0 < len(widget.article_saver.state) <= k assert all(x[1] == -1 for x in widget.article_saver.state) else: raise ValueError(f"Unrecognized saving mode: {saving_mode}") for i, display_obj in enumerate(captured_display_objects): if isinstance(display_obj, ipywidgets.Checkbox): if display_obj.description == "Extract the paragraph": assert display_obj.value == (saving_mode == _Save.PARAGRAPH) elif display_obj.description == "Extract the entire article": assert display_obj.value == (saving_mode == _Save.ARTICLE) else: raise ValueError(f"Unrecognized checkbox, {i}") elif isinstance(display_obj, HTML): pass else: raise TypeError(f"Unrecognized type: {type(display_obj)}")
def test_article_saver_gets_updated( fake_sqlalchemy_engine, monkeypatch, capsys, saving_mode ): """Clicking paragraph or article checkbox modifies the ArticleSaver state.""" responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) k = 10 result_to_take = 3 http_address = activate_responses(fake_sqlalchemy_engine) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), results_per_page=k, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) bot.set_value("top_results", k) bot.set_value("default_value_article_saver", _Save.NOTHING) bot.click("investigate_button") captured_display_objects = bot.display_cached assert len(captured_display_objects) == k * bot.n_displays_per_result assert bot.get_value("default_value_article_saver") == _Save.NOTHING start = result_to_take * bot.n_displays_per_result end = (result_to_take + 1) * bot.n_displays_per_result meta, chb_paragraph, chb_article, out = captured_display_objects[start:end] # Check the checkbox if saving_mode == _Save.NOTHING: assert not widget.article_saver.state elif saving_mode == _Save.PARAGRAPH: chb_paragraph.value = True assert len(widget.article_saver.state) == 1 # actual len is 0 assert list(widget.article_saver.state)[0][1] != -1 elif saving_mode == _Save.ARTICLE: chb_article.value = True assert len(widget.article_saver.state) == 1 assert list(widget.article_saver.state)[0][1] == -1 # actual value 4 else: raise ValueError(f"Unrecognized saving mode: {saving_mode}")
def test_errors(fake_sqlalchemy_engine, monkeypatch, capsys): """Check that widget raises an error when bbs search server not working.""" with pytest.raises(Exception): SearchWidget( bbs_search_url="fake_address", bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), results_per_page=3, )
def test_paging( fake_sqlalchemy_engine, monkeypatch, capsys, query_text, k, results_per_page ): """Test that paging is displaying the right number results""" http_address = activate_responses(fake_sqlalchemy_engine) responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(connection=fake_sqlalchemy_engine), results_per_page=results_per_page, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) # Initial state assert ( 'Click on "Search Literature!" button to display some results.' in bot.stdout_cached ) assert not bot.display_cached bot.set_value("top_results", k) bot.set_value("granularity", "sentences") bot.set_value("query_text", query_text) bot.click("investigate_button") assert ( len(bot.display_cached) == min(results_per_page, k) * bot.n_displays_per_result ) results_left = k - min(results_per_page, k) # Make sure paging works while results_left > 0: bot.click("page_forward") displayed_results = min(results_per_page, results_left) assert len(bot.display_cached) == displayed_results * bot.n_displays_per_result results_left -= displayed_results
def get_search_widget_bot( fake_sqlalchemy_engine, monkeypatch, capsys, checkpoint_path=None ): http_address = activate_responses(fake_sqlalchemy_engine) responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) widget = SearchWidget( bbs_search_url=http_address, bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), checkpoint_path=checkpoint_path, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) return bot
def test_correct_results_order(fake_sqlalchemy_engine, monkeypatch, capsys): """Check that the most relevant sentence is the first result.""" n_sentences = fake_sqlalchemy_engine.execute( "SELECT COUNT(*) FROM sentences" ).fetchone()[0] most_relevant_sbiobert_id = 7 query_sbiobert = ( f"SELECT text FROM sentences WHERE sentence_id = {most_relevant_sbiobert_id}" ) most_relevant_sbiobert_text = fake_sqlalchemy_engine.execute( query_sbiobert ).fetchone()[0] embedding_model_sbiobert = Mock() embedding_model_sbiobert.embed.return_value = np.array([0, 1]) # 90 degrees embedding_models = { "SBioBERT": embedding_model_sbiobert, } precomputed_embeddings = { "SBioBERT": torch.ones((n_sentences, 2)).to(dtype=torch.float32) / 2 ** (1 / 2), # 45 degrees } norm = (0.1 ** 2 + 0.9 ** 2) ** (1 / 2) precomputed_embeddings["SBioBERT"][most_relevant_sbiobert_id - 1, :] = ( torch.tensor([0.1, 0.9]) / norm ) # ~90 degrees indices = np.arange(1, n_sentences + 1) searcher = SearchEngine( embedding_models, precomputed_embeddings, indices, connection=fake_sqlalchemy_engine, ) responses.add_callback( responses.POST, "http://test", callback=partial(request_callback, searcher=searcher), content_type="application/json", ) responses.add_callback( responses.POST, "http://test/help", callback=request_callback_help, content_type="application/json", ) k = 1 widget = SearchWidget( bbs_search_url="http://test", bbs_mysql_engine=fake_sqlalchemy_engine, article_saver=ArticleSaver(fake_sqlalchemy_engine), results_per_page=k, ) bot = SearchWidgetBot(widget, capsys, monkeypatch) bot.set_value("top_results", k) bot.set_value("print_paragraph", False) bot.set_value("sent_embedder", "SBioBERT") bot.click("investigate_button") captured_display_objects = bot.display_cached assert len(captured_display_objects) == k * bot.n_displays_per_result assert ( textwrap.fill(most_relevant_sbiobert_text, width=80) in captured_display_objects[-1].data )