#!/usr/bin/env python3 import pytest from numpy import isnan from hashlib import sha256 from rdflib import Namespace from probs_runner import PROBS, QUANTITYKIND, answer_queries from numpy.testing import assert_allclose from decimal import Decimal #from uuid import uuid4 PRODCOM2016 = Namespace("http://w3id.org/probs-lab/data/prodcom/2016/") PRODCOM2017 = Namespace("http://w3id.org/probs-lab/data/prodcom/2017/") GEONAMES = Namespace("https://sws.geonames.org/") def assert_exact_results(result, expected_value): assert len(result) == 1 assert result[0].bound == PROBS.ExactBound assert_allclose(result[0].measurement, expected_value, rtol=1e-3) def assert_no_measurement(result): assert len(result) == 1 assert isnan(result[0].measurement) class TestProdcomList2016: """Test PRODCOM List 2016 file conversion""" endpoint_data = [ "outputs/PRD_2016_20200617_185122.nt.gz" ] @pytest.mark.parametrize("code,parent,description", [ ("20136700", "201367", "Roasted iron pyrites"), ("23121150", "231211", "Optical glass of HS 7003, 7004 or 7005, bent, edge-worked, engraved, etc."), ("271232", "2712", \ "Boards and other bases, equipped with electrical switching or protecting apparatus, for a voltage > 1 000 V") ]) def test_object_attributes(self, rdfox, code, parent, description): # test object with parent from PRODCOM 2016 list has correct attributes obj_name = "\"PRODCOM Object from Code " + code + "\"" code_name = "\"" + code + "\"" code_description = "\"" + description + "\"" parent_name = "\"PRODCOM Object from Code " + parent + "\"" query = r""" PREFIX ufpc: SELECT ?a WHERE { ?a rdfs:label %s ; :hasClassificationCode ?b . ?b rdfs:label %s ; :codeDescription %s ; :partOfList ufpc:Prodcom2016List . ?c rdfs:label %s ; :objectComposedOf ?a . } """ % (obj_name, code_name, code_description, parent_name) result = rdfox.query_records(query) assert len(result) == 1 @pytest.mark.parametrize("code,description", [ ("0710", "Mining of iron ores"), ("1020", "Processing and preserving of fish, crustaceans and molluscs"), ("3230", "Manufacture of sports goods") ]) def test_object_no_parent(self, rdfox, code, description): # test object not having a parent from PRODCOM 2016 list has correct attributes obj_name = "\"PRODCOM Object from Code " + code + "\"" code_name = "\"" + code + "\"" code_description = "\"" + description + "\"" query = r""" PREFIX ufpc: SELECT ?a WHERE { ?a rdfs:label %s ; :hasClassificationCode ?b . ?b rdfs:label %s ; :codeDescription %s ; :partOfList ufpc:Prodcom2016List . FILTER NOT EXISTS { ?c :objectComposedOf ?a . } } """ % (obj_name, code_name, code_description) result = rdfox.query_records(query) assert len(result) == 1 class TestProdcomList2017: """Test PRODCOM List 2017 file conversion""" endpoint_data = [ "outputs/PRD_2017_20200617_185035.nt.gz" ] @pytest.mark.parametrize("code,parent,description", [ ("104125", "1041", "Palm oil, crude"), ("20121973", "201219", "Molybdenum oxides and hydroxides"), ("26601300", "266013", "Ultraviolet or infrared apparatus used in medical, surgical, dental or veterinary sciences") ]) def test_object_attributes(self, rdfox, code, parent, description): # test object with parent from PRODCOM 2017 list has correct attributes obj_name = "\"PRODCOM Object from Code " + code + "\"" code_name = "\"" + code + "\"" code_description = "\"" + description + "\"" parent_name = "\"PRODCOM Object from Code " + parent + "\"" query = r""" PREFIX ufpc: SELECT ?a WHERE { ?a rdfs:label %s ; :hasClassificationCode ?b . ?b rdfs:label %s ; :codeDescription %s ; :partOfList ufpc:Prodcom2017List . ?c rdfs:label %s ; :objectComposedOf ?a . } """ % (obj_name, code_name, code_description, parent_name) result = rdfox.query_records(query) assert len(result) == 1 @pytest.mark.parametrize("code,description", [ ("1083", "Processing of tea and coffee"), ("1723", "Manufacture of paper stationery"), ("0099t", "T-Codes") ]) def test_object_no_parent(self, rdfox, code, description): # test object not having a parent from PRODCOM 2017 list has correct attributes obj_name = "\"PRODCOM Object from Code " + code + "\"" code_name = "\"" + code + "\"" code_description = "\"" + description + "\"" query = r""" PREFIX ufpc: SELECT ?a WHERE { ?a rdfs:label %s ; :hasClassificationCode ?b . ?b rdfs:label %s ; :codeDescription %s ; :partOfList ufpc:Prodcom2017List . FILTER NOT EXISTS { ?c :objectComposedOf ?a . } } """ % (obj_name, code_name, code_description) result = rdfox.query_records(query) assert len(result) == 1