示例#1
0
def test_text_query_adds_pagination_info(mocker, basex_session_mock, provider):
    basex_results = ['{"references": ["Mark.1.1"], "words": []}' for _ in range(23)]
    basex_string = f'[{",".join(basex_results)}]'
    mock_basex_on_query_execute(mocker, basex_session_mock, lambda: basex_string)
    result = provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert result.page == 1
    assert result.total_pages == 3
示例#2
0
def test_text_query_error_on_query(mocker, basex_session_mock, provider):
    def raise_exception():
        raise Exception()
    mock_basex_on_query_execute(mocker, basex_session_mock, raise_exception)
    with pytest.raises(ServerOverwhelmedError) as excinfo:
        provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert excinfo.value.message == 'Error executing XML database query: Exception'
def test_text_query_error_on_processing_results(mocker, basex_session_mock,
                                                provider):
    mock_basex_on_query_execute(mocker, basex_session_mock,
                                lambda: '{"invalid": "json"}')
    with pytest.raises(ProbableBugError) as excinfo:
        provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert excinfo.value.message == 'Error parsing XML database response JSON: Results are not a list'
示例#4
0
def _json_to_text_query(json: Union[Dict[Any, Any], None]) -> TextQuery:
    if json is None:
        raise ProbableBugError('Request does not contain a JSON body', 400)

    def on_parsing_error(message: str):
        raise ProbableBugError(f'Error parsing JSON: {message}', 400)

    return TextQuery(json, on_parsing_error)
示例#5
0
def test_text_query_returns_requested_page(mocker, basex_session_mock, provider):
    basex_results = [f'{{"references": ["Mark.1.{i}"], "words": []}}' for i in range(23)]
    basex_string = f'[{",".join(basex_results)}]'
    mock_basex_on_query_execute(mocker, basex_session_mock, lambda: basex_string)
    result = provider.text_query(TextQuery({'sequences': [], 'page': 2}, lambda x: None))
    assert result.page == 2
    assert len(result.passages) == 10
    assert result.passages[0].references[0].verse == 10
    assert result.passages[9].references[0].verse == 19
def test_text_query_handles_pagination_for_no_results(mocker,
                                                      basex_session_mock,
                                                      provider):
    basex_string = '[]'
    mock_basex_on_query_execute(mocker, basex_session_mock,
                                lambda: basex_string)
    result = provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert result.page == 1
    assert result.total_pages == 1
def test_text_query_handles_disallowed_attribute(provider):
    query = TextQuery(
        {'sequences': [[{
            'attributes': {
                'fake-attr': 'value'
            }
        }]]}, lambda x: None)
    with pytest.raises(ProbableBugError) as excinfo:
        provider.text_query(query)
    assert excinfo.value.message == 'Attribute \'fake-attr\' not allowed'
def test_text_query_excludes_null_attributes(mocker, basex_session_mock,
                                             provider):
    basex_results = [
        '{"references": ["Mark.1.1"], "words": [{"gender": "feminine", "matchedSequence": -1, "text": "ἣν", "tense": null, "matchedWordQuery": -1}]}'
    ]
    basex_string = f'[{",".join(basex_results)}]'
    mock_basex_on_query_execute(mocker, basex_session_mock,
                                lambda: basex_string)
    result = provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert "tense" not in result.passages[0].words[0].attributes
def test_text_query_handles_page_smaller_than_pagesize(mocker,
                                                       basex_session_mock,
                                                       provider):
    basex_results = [
        f'{{"references": ["Mark.1.1"], "words": []}}' for i in range(5)
    ]
    basex_string = f'[{",".join(basex_results)}]'
    mock_basex_on_query_execute(mocker, basex_session_mock,
                                lambda: basex_string)
    result = provider.text_query(TextQuery({'sequences': []}, lambda x: None))
    assert len(result.passages) == 5
def test_text_query_sanitizes_attribute_values(mocker, basex_session_mock,
                                               provider):
    basex_query_spy = mock_basex_on_query_execute(mocker, basex_session_mock,
                                                  lambda: '[]')
    query = TextQuery({'sequences': [[{
        'attributes': {
            'lemma': "&μετ'"
        }
    }]]}, lambda x: None)
    provider.text_query(query)
    assert "for $word0 in $sentence//w[@lemma='μετ’']" in basex_query_spy.call_args.args[
        1]
def test_text_query_handles_request_for_invalid_page(mocker,
                                                     basex_session_mock,
                                                     provider):
    basex_string = '[{"references": ["Mark.1.1"], "words": []}]'
    mock_basex_on_query_execute(mocker, basex_session_mock,
                                lambda: basex_string)
    with pytest.raises(ProbableBugError) as excinfo:
        provider.text_query(
            TextQuery({
                'sequences': [],
                'page': 2
            }, lambda x: None))
    assert excinfo.value.message == 'Requested page 2 is out of bounds for results with 1 total pages'
示例#12
0
def test_text_query_handles_word_query_with_no_attributes(mocker, basex_session_mock, provider):
    basex_query_spy = mock_basex_on_query_execute(mocker, basex_session_mock, lambda: '[]')
    query = TextQuery({
        'sequences': [
            [
                {
                    'attributes': {
                        'lemma': 'λόγος'
                    }
                },
                {
                    # no attributes
                }
            ]
        ]
    }, lambda x: None)
    provider.text_query(query)
    assert "for $word0 in $sentence//w[@lemma='λόγος'] for $word1 in $sentence//w" in basex_query_spy.call_args.args[1]
def test_build_query_string_adds_extra_attributes(mocker, basex_session_mock,
                                                  provider):
    basex_query_spy = mock_basex_on_query_execute(mocker, basex_session_mock,
                                                  lambda: '[]')
    query = TextQuery({'sequences': [[{
        'attributes': {
            'lemma': 'λόγος'
        }
    }]]}, lambda x: None)
    provider.text_query(query)
    assert '"class": data($w/@class)' in basex_query_spy.call_args.args[1]
    assert '"lemma": data($w/@lemma)' in basex_query_spy.call_args.args[1]
    assert '"normalized": data($w/@normalized)' in basex_query_spy.call_args.args[
        1]
    assert '"person": data($w/@person)' in basex_query_spy.call_args.args[1]
    assert '"number": data($w/@number)' in basex_query_spy.call_args.args[1]
    assert '"gender": data($w/@gender)' in basex_query_spy.call_args.args[1]
    assert '"case": data($w/@case)' in basex_query_spy.call_args.args[1]
    assert '"tense": data($w/@tense)' in basex_query_spy.call_args.args[1]
    assert '"voice": data($w/@voice)' in basex_query_spy.call_args.args[1]
    assert '"mood": data($w/@mood)' in basex_query_spy.call_args.args[1]
示例#14
0
def test_page_defaults_to_1():
    query = TextQuery({'sequences': []}, lambda x: None)
    assert query.page == 1