Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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)}")
Beispiel #4
0
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}")
Beispiel #5
0
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,
        )
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
    )