Coverage for test/ar_order_test.py: 100%
0 statements
« prev ^ index » next coverage.py v6.5.0, created at 2025-07-14 14:06 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2025-07-14 14:06 +0000
1# #!python
2# # Copyright 2022-2023, Arcangelo Massari <arcangelo.massari@unibo.it>
3# #
4# # Permission to use, copy, modify, and/or distribute this software for any purpose
5# # with or without fee is hereby granted, provided that the above copyright notice
6# # and this permission notice appear in all copies.
7# #
8# # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9# # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
10# # FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
11# # OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
12# # DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
13# # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
14# # SOFTWARE.
16# import json
17# import os
18# import unittest
19# from shutil import copy
20# from subprocess import call
21# from sys import executable
22# from zipfile import ZipFile
24# from SPARQLWrapper import JSON, POST, SPARQLWrapper
26# BASE = os.path.join('test', 'fixer', 'ar_order')
27# SERVER = 'http://127.0.0.1:8805/sparql'
29# def reset_server(server:str=SERVER) -> None:
30# ts = SPARQLWrapper(server)
31# ts.setQuery('DELETE WHERE { GRAPH ?g { ?s ?p ?o } }')
32# ts.setMethod(POST)
33# ts.query()
35# class test_ar_order(unittest.TestCase):
36# @classmethod
37# def setUpClass(cls):
38# endpoint = 'http://127.0.0.1:8805/sparql'
39# reset_server(endpoint)
40# cls.server = SPARQLWrapper(endpoint)
41# cls.server.method = 'POST'
42# for entity in ['br', 'ar']:
43# cls.server.setQuery('LOAD <file:' + os.path.abspath(os.path.join(BASE, f'{entity}.nt')).replace('\\', '/') + '> INTO GRAPH <' + f'https://w3id.org/oc/meta/{entity}/' + '>')
44# cls.server.query()
46# @classmethod
47# def tearDownClass(cls):
48# os.remove(os.path.join(BASE, 'rdf', 'ar', '060', '10000', '1000.zip'))
49# os.remove(os.path.join(BASE, 'rdf', 'ar', '06360', '310000', '301000.zip'))
50# os.remove(os.path.join(BASE, 'rdf', 'ar', '060', '10000', '1000', 'prov', 'se.zip'))
51# os.remove(os.path.join(BASE, 'rdf', 'br', '06360', '70000', '67000.zip'))
52# os.remove(os.path.join(BASE, 'rdf', 'br', '06360', '70000', '67000', 'prov', 'se.zip'))
53# os.remove(os.path.join(BASE, 'rdf', 'ra', '06360', '200000', '197000.zip'))
54# os.remove(os.path.join(BASE, 'rdf', 'ar', '06360', '310000', '301000', 'prov', 'se.zip'))
55# os.remove(os.path.join(BASE, 'info_dir', '06360', 'creator', 'prov_file_ar.txt'))
56# os.remove(os.path.join(BASE, 'info_dir', '06360', 'creator', 'prov_file_br.txt'))
57# os.remove(os.path.join(BASE, 'info_dir', 'creator', 'prov_file_ar.txt'))
58# copy(os.path.join(BASE, '1000.zip'), os.path.join(BASE, 'rdf', 'ar', '060', '10000'))
59# copy(os.path.join(BASE, '301000.zip'), os.path.join(BASE, 'rdf', 'ar', '06360', '310000'))
60# copy(os.path.join(BASE, '06360', '67000.zip'), os.path.join(BASE, 'rdf', 'br', '06360', '70000', '67000.zip'))
61# copy(os.path.join(BASE, '06360', 'br', 'se.zip'), os.path.join(BASE, 'rdf', 'br', '06360', '70000', '67000', 'prov', 'se.zip'))
62# copy(os.path.join(BASE, '060', 'se.zip'), os.path.join(BASE, 'rdf', 'ar', '060', '10000', '1000', 'prov', 'se.zip'))
63# copy(os.path.join(BASE, '06360', 'se.zip'), os.path.join(BASE, 'rdf', 'ar', '06360', '310000', '301000', 'prov', 'se.zip'))
64# copy(os.path.join(BASE, '06360', 'prov_file_ar.txt'), os.path.join(BASE, 'info_dir', '06360', 'creator', 'prov_file_ar.txt'))
65# copy(os.path.join(BASE, '06360', 'prov_file_br.txt'), os.path.join(BASE, 'info_dir', '06360', 'creator', 'prov_file_br.txt'))
66# copy(os.path.join(BASE, '060', 'prov_file_ar.txt'), os.path.join(BASE, 'info_dir', 'creator', 'prov_file_ar.txt'))
67# copy(os.path.join(BASE, '06360', '197000.zip'), os.path.join(BASE, 'rdf', 'ra', '06360', '200000', '197000.zip'))
69# def test_fix_broken_roles_two_last(self):
70# self.maxDiff = None
71# call([executable, '-m', 'oc_meta.run.fixer.roles_order', '-c', os.path.join(BASE, 'meta_config.yaml'), '-r', 'https://orcid.org/0000-0002-8420-0696', '-m', '2'])
72# output = dict()
73# provenance_output = dict()
74# for filepath in [os.path.join(BASE, 'rdf', 'ar', '060', '10000', '1000.zip'), os.path.join(BASE, 'rdf', 'ar', '06360', '310000', '301000.zip')]:
75# with ZipFile(file=filepath, mode="r") as archive:
76# for zf_name in archive.namelist():
77# with archive.open(zf_name) as f:
78# data = json.load(f)
79# for graph in data:
80# graph_data = graph['@graph']
81# for agent in graph_data:
82# if agent['@id'] in ['https://w3id.org/oc/meta/ar/06021', 'https://w3id.org/oc/meta/ar/06022', 'https://w3id.org/oc/meta/ar/06023', 'https://w3id.org/oc/meta/ar/06024', 'https://w3id.org/oc/meta/ar/06025', 'https://w3id.org/oc/meta/ar/06026', 'https://w3id.org/oc/meta/ar/06027', 'https://w3id.org/oc/meta/ar/06360300897', 'https://w3id.org/oc/meta/ar/06360300898', 'https://w3id.org/oc/meta/ar/06360300899', 'https://w3id.org/oc/meta/ar/06360300895']:
83# if 'https://w3id.org/oc/ontology/hasNext' in agent:
84# output[agent['@id']] = agent['https://w3id.org/oc/ontology/hasNext'][0]['@id']
85# else:
86# output[agent['@id']] = ''
87# for filepath in [os.path.join(BASE, 'rdf', 'ar', '060', '10000', '1000', 'prov', 'se.zip'), os.path.join(BASE, 'rdf', 'ar', '06360', '310000', '301000', 'prov', 'se.zip')]:
88# with ZipFile(file=filepath, mode="r") as archive:
89# for zf_name in archive.namelist():
90# with archive.open(zf_name) as f:
91# data = json.load(f)
92# for graph in data:
93# graph_data = graph['@graph']
94# for agent in graph_data:
95# if agent['@id'] in ['https://w3id.org/oc/meta/ar/06025/prov/se/2', 'https://w3id.org/oc/meta/ar/06360300898/prov/se/2', 'https://w3id.org/oc/meta/ar/06360300898/prov/se/3', 'https://w3id.org/oc/meta/ar/06022/prov/se/2']:
96# provenance_output[agent['@id']] = agent['https://w3id.org/oc/ontology/hasUpdateQuery'][0]['@value']
97# elif agent['@id'] == 'https://w3id.org/oc/meta/ar/06360300895/prov/se/2':
98# provenance_output[agent['@id']] = {v['@id'] for v in agent['http://www.w3.org/ns/prov#wasDerivedFrom']}
99# query = '''
100# PREFIX oco: <https://w3id.org/oc/ontology/>
101# PREFIX pro: <http://purl.org/spar/pro/>
102# SELECT ?ar ?next WHERE {
103# ?br pro:isDocumentContextFor ?ar.
104# VALUES ?br {<https://w3id.org/oc/meta/br/0605> <https://w3id.org/oc/meta/br/0636066666>}
105# OPTIONAL {?ar oco:hasNext ?next.}
106# }
107# '''
108# self.server.setQuery(query)
109# self.server.setReturnFormat(JSON)
110# result = self.server.queryAndConvert()
111# result = {res['ar']['value']: res['next']['value'] if 'next' in res else None for res in result['results']['bindings']}
112# expected_result = {
113# 'https://w3id.org/oc/meta/ar/06021': 'https://w3id.org/oc/meta/ar/06022',
114# 'https://w3id.org/oc/meta/ar/06022': 'https://w3id.org/oc/meta/ar/06023',
115# 'https://w3id.org/oc/meta/ar/06023': 'https://w3id.org/oc/meta/ar/06024',
116# 'https://w3id.org/oc/meta/ar/06024': 'https://w3id.org/oc/meta/ar/06025',
117# 'https://w3id.org/oc/meta/ar/06025': 'https://w3id.org/oc/meta/ar/06026',
118# 'https://w3id.org/oc/meta/ar/06026': None,
119# 'https://w3id.org/oc/meta/ar/06027': None,
120# 'https://w3id.org/oc/meta/ar/06360300897': 'https://w3id.org/oc/meta/ar/06360300898',
121# 'https://w3id.org/oc/meta/ar/06360300898': 'https://w3id.org/oc/meta/ar/06360300899',
122# 'https://w3id.org/oc/meta/ar/06360300899': None,
123# 'https://w3id.org/oc/meta/ar/06360300895': None}
124# expected_provenance_output = {
125# 'https://w3id.org/oc/meta/ar/06022/prov/se/2': 'DELETE DATA { GRAPH <https://w3id.org/oc/meta/ar/> { <https://w3id.org/oc/meta/ar/06022> <https://w3id.org/oc/ontology/hasNext> <https://w3id.org/oc/meta/ar/06023> . } }',
126# 'https://w3id.org/oc/meta/ar/06025/prov/se/2': 'INSERT DATA { GRAPH <https://w3id.org/oc/meta/ar/> { <https://w3id.org/oc/meta/ar/06025> <https://w3id.org/oc/ontology/hasNext> <https://w3id.org/oc/meta/ar/06026> . } }',
127# 'https://w3id.org/oc/meta/ar/06360300898/prov/se/3': 'INSERT DATA { GRAPH <https://w3id.org/oc/meta/ar/> { <https://w3id.org/oc/meta/ar/06360300898> <https://w3id.org/oc/ontology/hasNext> <https://w3id.org/oc/meta/ar/06360300899> . } }',
128# 'https://w3id.org/oc/meta/ar/06360300898/prov/se/2': 'DELETE DATA { GRAPH <https://w3id.org/oc/meta/ar/> { <https://w3id.org/oc/meta/ar/06360300898> <https://w3id.org/oc/ontology/hasNext> <https://w3id.org/oc/meta/ar/06360300898> . } }',
129# 'https://w3id.org/oc/meta/ar/06360300895/prov/se/2': {'https://w3id.org/oc/meta/ar/06360300895/prov/se/1', 'https://w3id.org/oc/meta/ar/06360300896/prov/se/1'}}
130# expected_output = {
131# 'https://w3id.org/oc/meta/ar/06021': 'https://w3id.org/oc/meta/ar/06022',
132# 'https://w3id.org/oc/meta/ar/06022': 'https://w3id.org/oc/meta/ar/06023',
133# 'https://w3id.org/oc/meta/ar/06023': 'https://w3id.org/oc/meta/ar/06024',
134# 'https://w3id.org/oc/meta/ar/06024': 'https://w3id.org/oc/meta/ar/06025',
135# 'https://w3id.org/oc/meta/ar/06025': 'https://w3id.org/oc/meta/ar/06026',
136# 'https://w3id.org/oc/meta/ar/06026': '',
137# 'https://w3id.org/oc/meta/ar/06027': '',
138# 'https://w3id.org/oc/meta/ar/06360300897': 'https://w3id.org/oc/meta/ar/06360300898',
139# 'https://w3id.org/oc/meta/ar/06360300898': 'https://w3id.org/oc/meta/ar/06360300899',
140# 'https://w3id.org/oc/meta/ar/06360300899': '',
141# 'https://w3id.org/oc/meta/ar/06360300895': ''}
142# self.assertEqual((output, provenance_output, result), (expected_output, expected_provenance_output, expected_result))