Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
385 changes: 327 additions & 58 deletions tests/test_restapi_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,55 +71,55 @@ def test_search_my_libraries(session):
es_result = result.json()
assert es_result['totalItems'] > 300 and es_result['totalItems'] < 400

# def test_search_instance_type(session):
# query_params = {'_q': 'instanceType:DigitalResource',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 7000 and es_result['totalItems'] < 8000
#
# def test_search_work_find_category(session):
# query_params = {'_q': 'workCategory:"saogf:Sk%C3%B6nlitteratur"',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 300 and es_result['totalItems'] < 400
#
# def test_search_work_identify_category(session):
# query_params = {'_q': 'workCategory:"saogf:Romaner"',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 200 and es_result['totalItems'] < 300
#
# def test_search_work_none_category(session):
# query_params = {'_q': 'workCategory:"saogf:Deckare"',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 20 and es_result['totalItems'] < 30
#
# def test_search_instance_category(session):
# query_params = {'_q': 'instanceCategory:"https://id.kb.se/term/saobf/Print"',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 9000 and es_result['totalItems'] < 10000
def test_search_instance_type(session):
query_params = {'_q': 'instanceType:DigitalResource',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 7000 and es_result['totalItems'] < 8000

def test_search_work_find_category(session):
query_params = {'_q': 'workCategory:"saogf:Sk%C3%B6nlitteratur"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 300 and es_result['totalItems'] < 400

def test_search_work_identify_category(session):
query_params = {'_q': 'workCategory:"saogf:Romaner"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 200 and es_result['totalItems'] < 300

def test_search_work_none_category(session):
query_params = {'_q': 'workCategory:"saogf:Deckare"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 20 and es_result['totalItems'] < 30

def test_search_instance_category(session):
query_params = {'_q': 'instanceCategory:"https://id.kb.se/term/saobf/Print"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 9000 and es_result['totalItems'] < 10000

def test_search_language(session):
query_params = {'_q': 'language:"lang:swe"',
Expand Down Expand Up @@ -191,14 +191,283 @@ def test_search_bibliography(session):
es_result = result.json()
assert es_result['totalItems'] > 100 and es_result['totalItems'] < 300

# def test_search_work_type(session):
# query_params = {'_q': 'workType:Serial',
# '_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
# result = session.get(FIND_API,
# params=query_params)
# assert result.status_code == 200
#
# es_result = result.json()
# assert es_result['totalItems'] > 50 and es_result['totalItems'] < 200
def test_search_work_type(session):
query_params = {'_q': 'workType:Serial',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 50 and es_result['totalItems'] < 200

def test_o_search_subject(session):
app_config = {
'defaultSiteFilters': [TYPE_WORK_FILTER],
'relationFilters': [{'objectType': 'Concept', 'predicates': ['subject']}]
}
query_params = {'_o': 'https://id.kb.se/term/sao/Finansiering',
'_appConfig': json.dumps(app_config)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 50
assert es_result['stats']['_predicates'][0]['totalItems'] > 50

def test_o_search_instance_category(session):
app_config = {
'defaultSiteFilters': [TYPE_WORK_FILTER],
'relationFilters': [{'objectType': 'Concept', 'predicates': ['librissearch:instanceCategory']}]
}
query_params = {'_o': 'https://id.kb.se/term/saobf/Print',
'_appConfig': json.dumps(app_config)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 5000
assert es_result['stats']['_predicates'][0]['totalItems'] > 5000

def test_o_search_work_category(session):
app_config = {
'defaultSiteFilters': [TYPE_WORK_FILTER],
'relationFilters': [{'objectType': 'Concept', 'predicates': ['librissearch:workCategory']}]
}
query_params = {'_o': 'https://id.kb.se/term/saogf/Sk%C3%B6nlitteratur',
'_appConfig': json.dumps(app_config)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 300
assert es_result['stats']['_predicates'][0]['totalItems'] > 300

def test_o_p_search(session):
query_params = {'_o': 'https://id.kb.se/term/sao/Finansiering',
'_p': 'fieldOfActivity',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 0 and es_result['totalItems'] < 10

def test_r_search(session):
query_params = {'_r': 'itemHeldBy:"sigel:S"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 300 and es_result['totalItems'] < 400

def test_q_r_search(session):
query_params = {'_q': 'grisfesten',
'_r': 'itemHeldByOrg:"sigel:org/UUB"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] == 1

def test_like_search(session):
query_params = {'_q': 'contributor:"libris:tr579gmc1g104f7#it"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
exact_total_items = es_result['totalItems']

query_params = {'_q': 'contributor~"libris:tr579gmc1g104f7#it"',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
like_total_items = es_result['totalItems']

assert like_total_items > exact_total_items

def test_and_search(session):
query_params = {'_q': 'language:"lang:nor" yearPublished:1989',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 5 and es_result['totalItems'] < 10

def test_or_search(session):
query_params = {'_q': 'language:"lang:nor" OR yearPublished:1989',
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()
assert es_result['totalItems'] > 300 and es_result['totalItems'] < 400

def test_not_search(session):
def total_items(q):
query_params = {'_q': q,
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200
es_result = result.json()
return es_result['totalItems']

assert total_items('') - total_items('NOT language:"lang:nor"') == total_items('language:"lang:nor"')

def test_suggest(session):
query_params = {'_q': 'grisf',
'_suggest': True,
'cursor': 5,
'_limit': 5,
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200
es_result = result.json()
assert next((x for x in es_result['items'] if x['hasTitle'][0]['mainTitle'] == 'Grisfesten'), False)

def test_suggest_for_filter(session):
query_params = {'_q': 'contributor:(astrid li)',
'_suggest': True,
'cursor': 21,
'_limit': 5,
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200
es_result = result.json()
astrid_lindgren = next((x for x in es_result['items'] if x['@id'] == ROOT_URL + '/fcrtpljz1qp2bdv#it'), False)
assert astrid_lindgren and astrid_lindgren['_qualifiers']

def test_get_search_mappings(session):
query_params = {'_q': 'hej',
'_r': 'itemHeldBy:"sigel:S"',
'_mappingOnly': True,
'_appConfig': json.dumps(DEFAULT_WORK_FILTER)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()

q_mapping = next((x for x in es_result['search']['mapping'] if x['variable'] == '_q'), False)
r_mapping = next((x for x in es_result['search']['mapping'] if x['variable'] == '_r'), False)
default_site_filter_mapping = next((x for x in es_result['search']['mapping'] if x['variable'] == 'defaultSiteFilters'), False)

assert q_mapping
assert r_mapping
assert default_site_filter_mapping

assert q_mapping['property']['@id'] == 'https://id.kb.se/vocab/textQuery'
assert q_mapping['equals'] == 'hej'
assert q_mapping['up']['@id'] == '/find?_q=&_r=itemHeldBy:%22sigel:S%22'

assert r_mapping['property']['@id'] == 'https://id.kb.se/ns/librissearch/itemHeldBy'
assert r_mapping['equals']['@id'] == 'https://libris.kb.se/library/S'
assert r_mapping['up']['@id'] == '/find?_q=hej&_r=' # TODO: Should not include empty _r?

assert default_site_filter_mapping['property']['@id'] == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
assert default_site_filter_mapping['equals']['@id'] == 'https://id.kb.se/vocab/Work'

def test_get_stats(session):
for type in ['Instance', 'Work']:
statistics = {
"sliceList": [
{"dimensionChain": ["rdf:type"], "itemLimit": 100},
{"dimensionChain": ["instanceType"], "itemLimit": 100},
{"dimensionChain": ["findCategory"], "itemLimit": 20,
"slice": {"dimensionChain": ["identifyCategory"], "itemLimit": 50}
},
{"dimensionChain": ["instanceCategory"], "itemLimit": 100},
{"dimensionChain": ["language"], "itemLimit": 100, "connective": "OR"},
{"dimensionChain": ["itemHeldByOrg"], "itemLimit": 1000, "connective": "OR", "countTopLevelDocs": True},
{"dimensionChain": ["yearPublished"], "itemLimit": 500, "range": True},
{"dimensionChain": ["contributor"], "itemLimit": 20},
{"dimensionChain": ["subject"], "itemLimit": 100},
{"dimensionChain": ["bibliography"], "itemLimit": 200},
{"dimensionChain": ["workType"], "itemLimit": 100}
]
}
app_config = {
'statistics': statistics,
}
query_params = {'_q': 'type:' + type,
'_appConfig': json.dumps(app_config)}
result = session.get(FIND_API,
params=query_params)
assert result.status_code == 200

es_result = result.json()

def find_observation(slice_by_dimension, property, value):
slice = slice_by_dimension[property]
assert slice
return next((x for x in slice['observation'] if x['object']['@id'] == value), False)

def assert_observation(observation, min_items):
assert observation and observation['totalItems'] > min_items

sbd = es_result['stats']['sliceByDimension']

assert sbd

physical_resource = find_observation(sbd, 'librissearch:instanceType', 'https://id.kb.se/vocab/PhysicalResource')
assert_observation(physical_resource, 5000)

facklitteratur = find_observation(sbd, 'librissearch:findCategory','https://id.kb.se/term/saogf/Facklitteratur')
assert_observation(facklitteratur, 5000)

offentligt_tryck = find_observation(facklitteratur['sliceByDimension'], 'librissearch:identifyCategory','https://id.kb.se/term/saogf/Offentligt%20tryck')
assert_observation(offentligt_tryck, 5000)

print = find_observation(sbd, 'librissearch:instanceCategory', 'https://id.kb.se/term/saobf/Print')
assert_observation(print, 5000)

language = find_observation(sbd, 'language', 'https://id.kb.se/language/swe')
assert_observation(language, 10000)

kb = find_observation(sbd, 'librissearch:itemHeldByOrg', 'https://libris.kb.se/library/org/KB')
assert_observation(kb, 300)

year_published_slice = sbd['librissearch:yearPublished']
assert year_published_slice
year_1997 = next((x for x in year_published_slice['observation'] if x['object'] == '1997'), False)
assert_observation(year_1997, 500)
assert year_published_slice['search'] == {
"mapping": {
"greaterThanOrEquals": "",
"lessThanOrEquals": "",
"variable": "yearPublished"
},
"template": f"/find?_q=type:{type}+%7B%3FyearPublished%7D"
}

lars_ahlstrom = find_observation(sbd, 'contributor', ROOT_URL + '/sq47c3sb51r8z7b#it')
assert_observation(lars_ahlstrom, 100)

finansiering = find_observation(sbd, 'subject', 'https://id.kb.se/term/sao/Finansiering')
assert_observation(finansiering, 50)

nb = find_observation(sbd, 'bibliography', 'https://libris.kb.se/library/NB')
assert_observation(nb, 5000)

monograph = find_observation(sbd, 'librissearch:workType', 'https://id.kb.se/vocab/Monograph')
assert_observation(monograph, 10000)