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
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'
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)
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'
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]
def test_page_defaults_to_1(): query = TextQuery({'sequences': []}, lambda x: None) assert query.page == 1