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

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. 

15 

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 

23 

24# from SPARQLWrapper import JSON, POST, SPARQLWrapper 

25 

26# BASE = os.path.join('test', 'fixer', 'ar_order') 

27# SERVER = 'http://127.0.0.1:8805/sparql' 

28 

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() 

34 

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() 

45 

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')) 

68 

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))