Coverage for test / idm_ror_test.py: 99%
159 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-25 18:06 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-25 18:06 +0000
1# SPDX-FileCopyrightText: 2024 Elia Rizzetto <elia.rizzetto2@unibo.it>
2# SPDX-FileCopyrightText: 2026 Marta Soricetti <marta.soricetti@unibo.it>
3#
4# SPDX-License-Identifier: ISC
6import json
7import sqlite3
8import os.path
9import unittest
10from os import makedirs
11from os.path import exists, join
13from oc_ds_converter.oc_idmanager import *
14from oc_ds_converter.oc_idmanager.ror import RORManager
15from oc_ds_converter.oc_idmanager.oc_data_storage.sqlite_manager import SqliteStorageManager
16from oc_ds_converter.oc_idmanager.oc_data_storage.in_memory_manager import InMemoryStorageManager
17from oc_ds_converter.oc_idmanager.oc_data_storage.redis_manager import RedisStorageManager
19class RORIdentifierManagerTest(unittest.TestCase):
20 """This class aim at testing ror identifiers manager."""
22 def setUp(self):
23 if not exists("tmp"):
24 makedirs("tmp")
26 self.test_dir = os.path.join("test","data")
27 self.test_json_path = join(self.test_dir, "glob.json")
28 with open(self.test_json_path, encoding="utf-8") as fp:
29 self.data = json.load(fp)
31 self.valid_ror_1 = "https://ror.org/040jc3p57"
32 self.valid_ror_2 = "01111rn36"
33 self.invalid_ror_1 = "la673822"
34 self.invalid_ror_2 = ".org/560jc3p57"
37 def test_ror_normalise(self):
38 rm = RORManager()
39 self.assertEqual(
40 rm.normalise(self.valid_ror_1),
41 rm.normalise(self.valid_ror_1.replace("https://", "")),
42 )
43 self.assertEqual(
44 rm.normalise(self.valid_ror_2),
45 rm.normalise("https://ror.org/" + self.valid_ror_2),
46 )
48 def test_ror_is_valid(self):
49 rm = RORManager()
50 self.assertTrue(rm.is_valid(self.valid_ror_1))
51 self.assertTrue(rm.is_valid(self.valid_ror_2))
52 self.assertFalse(rm.is_valid(self.invalid_ror_1))
53 self.assertFalse(rm.is_valid(self.invalid_ror_2))
55 rm_file = RORManager(storage_manager=InMemoryStorageManager(self.test_json_path))
56 self.assertTrue(rm_file.normalise(self.valid_ror_1, include_prefix=True) in self.data)
57 self.assertTrue(rm_file.normalise(self.valid_ror_2, include_prefix=True) in self.data)
59 self.assertTrue(rm_file.is_valid(rm_file.normalise(self.valid_ror_1, include_prefix=True)))
60 self.assertTrue(rm_file.is_valid(rm_file.normalise(self.valid_ror_2, include_prefix=True)))
61 self.assertFalse(rm_file.is_valid(rm_file.normalise(self.invalid_ror_2, include_prefix=True)))
63 rm_nofile_noapi = RORManager(storage_manager=InMemoryStorageManager(self.test_json_path), use_api_service=False)
64 self.assertTrue(rm_nofile_noapi.is_valid(self.valid_ror_1))
65 self.assertFalse(rm_nofile_noapi.is_valid(self.invalid_ror_1))
67 def test_ror_exists(self):
68 with self.subTest(msg="get_extra_info = True, allow_extra_api=None"):
69 jm = RORManager()
70 output = jm.exists(self.valid_ror_1, get_extra_info=True, allow_extra_api=None)
71 expected_output = (True, {"valid": True})
72 self.assertEqual(output, expected_output)
73 with self.subTest(msg="get_extra_info = True, allow_extra_api=None"):
74 jm = RORManager()
75 output = jm.exists(self.valid_ror_2, get_extra_info=True, allow_extra_api=None)
76 expected_output = (True, {"valid": True})
77 self.assertEqual(output, expected_output)
78 with self.subTest(msg="get_extra_info = True, allow_extra_api=None"):
79 jm = RORManager()
80 output = jm.exists(self.invalid_ror_1, get_extra_info=True, allow_extra_api=None)
81 expected_output = (False, {"valid": False})
82 self.assertEqual(output, expected_output)
84 def test_ror_default(self):
85 jm_nofile = RORManager()
86 # No support files (it generates it)
87 # Default storage manager : in Memory + generates file on method call (not automatically)
88 # uses API
89 self.assertTrue(jm_nofile.is_valid(self.valid_ror_1))
90 self.assertTrue(jm_nofile.is_valid(self.valid_ror_2))
92 self.assertFalse(jm_nofile.is_valid(self.invalid_ror_1))
93 self.assertFalse(jm_nofile.is_valid(self.invalid_ror_2))
94 jm_nofile.storage_manager.store_file()
95 validated_ids = [self.valid_ror_1, self.valid_ror_2, self.invalid_ror_1, self.invalid_ror_2]
96 # check that the support file was correctly created
97 self.assertTrue(os.path.exists("storage/id_value.json"))
98 lj = open("storage/id_value.json")
99 load_dict = json.load(lj)
100 lj.close()
101 # check that all the validated ids are stored in the json file
102 self.assertTrue(all(jm_nofile.normalise(x, include_prefix=True) in load_dict for x in validated_ids))
103 jm_nofile.storage_manager.delete_storage()
104 # check that the support file was correctly deleted
105 self.assertFalse(os.path.exists("storage/id_value.json"))
107 ##### IN MEMORY STORAGE MANAGER
109 def test_ror_memory_file_noapi(self):
110 # Uses support file (without updating it)
111 # Uses InMemoryStorageManager storage manager
112 # does not use API (so a syntactically correct id is considered to be valid)
113 rm_file = RORManager(storage_manager=InMemoryStorageManager(self.test_json_path), use_api_service=False)
114 self.assertTrue(rm_file.normalise(self.valid_ror_1, include_prefix=True) in self.data)
115 self.assertTrue(rm_file.normalise(self.valid_ror_2, include_prefix=True) in self.data)
116 self.assertTrue(rm_file.is_valid(self.valid_ror_1))
117 self.assertFalse(rm_file.is_valid(self.invalid_ror_1)) # is stored in support file as invalid
118 self.assertTrue(rm_file.is_valid(
119 "ror:03ztgj036")) # is not stored in support file as invalid, does not exist but has correct syntax
121 def test_ror_memory_file_api(self):
122 # Uses support file (without updating it)
123 # Uses InMemoryStorageManager storage manager
124 # uses API (so a syntactically correct id which is not valid is considered to be invalid)
125 rm_file = RORManager(storage_manager=InMemoryStorageManager(self.test_json_path), use_api_service=True)
126 self.assertFalse(rm_file.is_valid("ror:03ztgj036"))
128 def test_ror_memory_nofile_noapi(self):
129 # Does not use support file
130 # Uses InMemoryStorageManager storage manager
131 # Does not use API (so a syntactically correct id which is not valid is considered to be valid)
132 rm_nofile_noapi = RORManager(storage_manager=InMemoryStorageManager(), use_api_service=False)
133 self.assertTrue(rm_nofile_noapi.is_valid(self.valid_ror_1))
134 self.assertTrue(rm_nofile_noapi.is_valid("ror:03ztgj036"))
135 rm_nofile_noapi.storage_manager.delete_storage()
137 #### SQLITE STORAGE MANAGER
139 def test_ror_sqlite_nofile_api(self):
140 # No support files (it generates it)
141 # Uses SqliteStorageManager
142 # uses API
143 sql_rm_nofile = RORManager(storage_manager=SqliteStorageManager())
144 self.assertTrue(sql_rm_nofile.is_valid(self.valid_ror_1))
145 self.assertTrue(sql_rm_nofile.is_valid(self.valid_ror_2))
147 self.assertFalse(sql_rm_nofile.is_valid(self.invalid_ror_1))
148 self.assertFalse(sql_rm_nofile.is_valid(self.invalid_ror_2))
150 # check that the support db was correctly created and that it contains all the validated ids
151 self.assertTrue(os.path.exists("storage/id_valid_dict.db"))
152 validated_ids = [self.valid_ror_1, self.valid_ror_2, self.invalid_ror_1, self.invalid_ror_2]
153 all_ids_stored = sql_rm_nofile.storage_manager.get_all_keys()
154 # check that all the validated ids are stored in the json file
155 self.assertTrue(all(sql_rm_nofile.normalise(x, include_prefix=True) in all_ids_stored for x in validated_ids))
156 sql_rm_nofile.storage_manager.delete_storage()
157 # check that the support file was correctly deleted
158 self.assertFalse(os.path.exists("storage/id_valid_dict.db"))
160 def test_ror_sqlite_file_api(self):
161 # Uses support file
162 # Uses SqliteStorageManager
163 # does not use API (so a syntactically correct id is considered to be valid)
164 # db creation
165 test_sqlite_db = os.path.join(self.test_dir, "database.db")
166 if os.path.exists(test_sqlite_db):
167 os.remove(test_sqlite_db)
168 to_insert = [self.invalid_ror_1, self.valid_ror_1, self.valid_ror_2]
169 sql_file = RORManager(storage_manager=SqliteStorageManager(test_sqlite_db), use_api_service=True)
170 for id in to_insert:
171 norm_id = sql_file.normalise(id, include_prefix=True)
172 is_valid = 1 if sql_file.is_valid(norm_id) else 0
173 insert_tup = (norm_id, is_valid)
174 sql_file.storage_manager.cur.execute(f"INSERT OR REPLACE INTO info VALUES (?,?)", insert_tup)
175 sql_file.storage_manager.con.commit()
176 sql_file.storage_manager.con.close()
178 sql_no_api = RORManager(storage_manager=SqliteStorageManager(test_sqlite_db), use_api_service=False)
179 all_db_keys = sql_no_api.storage_manager.get_all_keys()
180 # check that all the normalised ind in the list were correctly inserted in the db
181 self.assertTrue(all(sql_no_api.normalise(x, include_prefix=True) in all_db_keys for x in to_insert))
182 self.assertTrue(sql_no_api.is_valid(self.valid_ror_1)) # is stored in support file as valid
183 self.assertTrue(sql_no_api.is_valid(self.valid_ror_2)) # is stored in support file as valid
184 self.assertFalse(sql_no_api.is_valid(self.invalid_ror_1)) # is stored in support file as invalid
185 self.assertTrue(sql_no_api.is_valid(
186 "ror:03ztgj036")) # is not stored in support file as invalid, does not exist but has correct syntax
187 sql_no_api.storage_manager.delete_storage()
189 def test_ror_sqlite_nofile_noapi(self):
190 # Does not use support file
191 # Uses SqliteStorageManager
192 # Does not use API (so a syntactically correct id which is not valid is considered to be valid)
193 rm_nofile_noapi = RORManager(storage_manager=SqliteStorageManager(), use_api_service=False)
194 self.assertTrue(rm_nofile_noapi.is_valid(self.valid_ror_1))
195 self.assertTrue(rm_nofile_noapi.is_valid("ror:03ztgj036"))
196 rm_nofile_noapi.storage_manager.delete_storage()
198 #### REDIS STORAGE MANAGER
199 def test_ror_redis_nofile_api(self):
200 # No available data in redis db
201 # Storage manager : RedisStorageManager
202 # uses API
203 rm_nofile = RORManager(storage_manager=RedisStorageManager(testing=True))
204 self.assertTrue(rm_nofile.is_valid(self.valid_ror_1))
205 self.assertTrue(rm_nofile.is_valid(self.valid_ror_2))
207 self.assertFalse(rm_nofile.is_valid(self.invalid_ror_1))
208 self.assertFalse(rm_nofile.is_valid(self.invalid_ror_2))
209 # check that the redis db was correctly filled and that it contains all the validated ids
211 validated_ids = {self.valid_ror_1, self.valid_ror_2, self.invalid_ror_1, self.invalid_ror_2}
212 validated_ids = {rm_nofile.normalise(x, include_prefix=True) for x in validated_ids}
213 all_ids_stored = rm_nofile.storage_manager.get_all_keys()
214 # check that all the validated ids are stored in the json file
215 self.assertEqual(validated_ids, all_ids_stored)
216 rm_nofile.storage_manager.delete_storage()
217 # check that the support file was correctly deleted
218 self.assertEqual(rm_nofile.storage_manager.get_all_keys(), set())
220 def test_ror_redis_file_api(self):
221 # Uses data in redis db
222 # Uses RedisStorageManager
223 # fills db
225 # use API to save validity values
226 to_insert = [self.invalid_ror_1, self.valid_ror_1, self.valid_ror_2]
227 storage_manager = RedisStorageManager(testing=True)
228 redis_file = RORManager(storage_manager=storage_manager, use_api_service=True)
229 for id in to_insert:
230 norm_id = redis_file.normalise(id, include_prefix=True)
231 is_valid = redis_file.is_valid(norm_id)
232 # insert_tup = (norm_id, is_valid)
233 redis_file.storage_manager.set_value(norm_id, is_valid)
235 # does not use API, retrieve values from DB
236 redis_no_api = RORManager(storage_manager=storage_manager, use_api_service=False)
237 all_db_keys = redis_no_api.storage_manager.get_all_keys()
238 # check that all the normalised ids in the list were correctly inserted in the db
239 self.assertTrue(all(redis_no_api.normalise(x, include_prefix=True) in all_db_keys for x in to_insert))
240 self.assertTrue(redis_no_api.is_valid(self.valid_ror_1)) # is stored in support file as valid
241 self.assertTrue(redis_no_api.is_valid(self.valid_ror_2)) # is stored in support file as valid
242 self.assertFalse(redis_no_api.is_valid(self.invalid_ror_1)) # is stored in support file as invalid
243 self.assertTrue(redis_no_api.is_valid("ror:03ztgj036")) # is not stored in support file as invalid, does not exist but has correct syntax
244 redis_no_api.storage_manager.delete_storage()
246 def test_ror_redis_nofile_noapi(self):
247 # No data in redis db
248 # Uses RedisStorageManager
249 # Does not use API (so a syntactically correct id which is not valid is considered to be valid)
250 rm_nofile_noapi = RORManager(storage_manager=RedisStorageManager(testing=True), use_api_service=False)
251 self.assertTrue(rm_nofile_noapi.is_valid(self.valid_ror_1))
252 self.assertTrue(rm_nofile_noapi.is_valid("ror:03ztgj036"))
254 rm_nofile_noapi.storage_manager.delete_storage()