You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sitc/rdf/tests.py

93 lines
2.8 KiB
Python

import operator
import types
import sys
from rdflib import term, RDF, Namespace
schema = Namespace('http://schema.org/')
def test(description, got, expected=None, func=None):
if isinstance(got, types.GeneratorType):
got = set(got)
try:
if expected is None:
func = func or operator.truth
expected = True
assert func(got)
else:
func = func or operator.eq
assert func(got, expected)
except AssertionError:
print('Test failed: {}'.format(description), file=sys.stderr)
print('\tExpected: {}'.format(expected), file=sys.stderr)
print('\tGot: {}'.format(got), file=sys.stderr)
raise Exception('Test failed: {}'.format(description))
def atLeast(lst, number):
return len(set(lst))>=number
def containsAll(lst, other):
for i in other:
if i not in lst:
print('{} not found'.format(i), file=sys.stderr)
return False
return True
def test_hotel(g):
test('Some triples are loaded',
len(g))
hotels = set(g.subjects(RDF.type, schema['Hotel']))
test('At least 2 hotels are loaded',
hotels,
2,
atLeast)
for hotel in hotels:
if 'GSIHOTEL' in hotel: # Do not check the example hotel
continue
props = g.predicates(hotel)
test('Each hotel has all required properties',
props,
list(schema[i] for i in ['description', 'email', 'logo', 'priceRange']),
func=containsAll)
reviews = set(g.subjects(RDF.type, schema['Review']))
test('At least 3 reviews are loaded',
reviews,
3,
atLeast)
for review in reviews:
props = g.predicates(review)
test('Each review has all required properties',
props,
list(schema[i] for i in ['itemReviewed', 'reviewBody', 'reviewRating']),
func=containsAll)
ratings = list(g.objects(review, schema['reviewRating']))
for rating in ratings:
value = g.value(rating, schema['ratingValue'])
test('The review should have ratings', value)
authors = set(g.objects(None, schema['author']))
for author in authors:
for prop in g.predicates(author, None):
if 'name' in str(prop).lower():
break
else:
assert "At least a reviewer has a name (surname, givenName...)"
print('All tests passed. Congratulations!')
print()
print('Now you can try to add the optional properties')
def test_example(g):
test('Some triples have been loaded',
len(g))
test('A person has been defined',
g.subjects(RDF.type, term.URIRef('http://xmlns.com/foaf/0.1/Person')))
print('All tests passed. Well done!')