Coverage for test / orcid_index_test.py: 99%
114 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: 2026 Arcangelo Massari <arcangelo.massari@unibo.it>
2#
3# SPDX-License-Identifier: ISC
5import os
6import shutil
7import tempfile
8import unittest
10from oc_ds_converter.datasource.orcid_index import (
11 OrcidIndexRedis,
12 PublishersRedis,
13 load_orcid_index_to_redis,
14 load_publishers_to_redis,
15)
18class TestOrcidIndexRedis(unittest.TestCase):
19 def setUp(self) -> None:
20 self.orcid_index = OrcidIndexRedis(testing=True)
22 def test_get_value_empty(self) -> None:
23 result = self.orcid_index.get_value("doi:10.1234/nonexistent")
24 self.assertIsNone(result)
26 def test_has_data_empty(self) -> None:
27 self.assertFalse(self.orcid_index.has_data())
29 def test_add_values_batch_and_get_value(self) -> None:
30 data = {
31 "doi:10.1234/test1": {"Author One orcid:0000-0001-2345-6789", "Author Two orcid:0000-0002-3456-7890"},
32 "doi:10.1234/test2": {"Author Three orcid:0000-0003-4567-8901"},
33 }
34 self.orcid_index.add_values_batch(data)
36 result1 = self.orcid_index.get_value("doi:10.1234/test1")
37 self.assertEqual(result1, {"Author One orcid:0000-0001-2345-6789", "Author Two orcid:0000-0002-3456-7890"})
39 result2 = self.orcid_index.get_value("doi:10.1234/test2")
40 self.assertEqual(result2, {"Author Three orcid:0000-0003-4567-8901"})
42 def test_has_data_after_insert(self) -> None:
43 self.orcid_index.add_values_batch({"doi:10.1234/test": {"value"}})
44 self.assertTrue(self.orcid_index.has_data())
46 def test_clear(self) -> None:
47 self.orcid_index.add_values_batch({"doi:10.1234/test": {"value"}})
48 self.assertTrue(self.orcid_index.has_data())
49 self.orcid_index.clear()
50 self.assertFalse(self.orcid_index.has_data())
53class TestLoadOrcidIndexToRedis(unittest.TestCase):
54 def setUp(self) -> None:
55 self.orcid_index = OrcidIndexRedis(testing=True)
56 self.temp_dir = tempfile.mkdtemp()
58 def tearDown(self) -> None:
59 shutil.rmtree(self.temp_dir)
61 def test_load_from_directory(self) -> None:
62 csv_content = '''"id","value"
63"10.1234/article1","Smith, John orcid:0000-0001-2345-6789"
64"10.1234/article1","Doe, Jane orcid:0000-0002-3456-7890"
65"10.1234/article2","Brown, Alice orcid:0000-0003-4567-8901"
66'''
67 csv_path = os.path.join(self.temp_dir, "orcid_index.csv")
68 with open(csv_path, "w", encoding="utf-8") as f:
69 f.write(csv_content)
71 load_orcid_index_to_redis(self.temp_dir, self.orcid_index)
73 result1 = self.orcid_index.get_value("doi:10.1234/article1")
74 self.assertEqual(result1, {"Smith, John orcid:0000-0001-2345-6789", "Doe, Jane orcid:0000-0002-3456-7890"})
76 result2 = self.orcid_index.get_value("doi:10.1234/article2")
77 self.assertEqual(result2, {"Brown, Alice orcid:0000-0003-4567-8901"})
79 def test_load_nonexistent_directory(self) -> None:
80 load_orcid_index_to_redis("/nonexistent/path", self.orcid_index)
81 self.assertFalse(self.orcid_index.has_data())
84class TestPublishersRedis(unittest.TestCase):
85 def setUp(self) -> None:
86 self.publishers_redis = PublishersRedis(testing=True)
88 def test_get_by_member_empty(self) -> None:
89 result = self.publishers_redis.get_by_member("999")
90 self.assertIsNone(result)
92 def test_set_and_get_by_member(self) -> None:
93 self.publishers_redis.set_publisher("123", "Test Publisher", {"10.1234", "10.5678"})
94 result = self.publishers_redis.get_by_member("123")
95 assert result is not None
96 self.assertEqual(result["name"], "Test Publisher")
97 self.assertEqual(result["prefixes"], {"10.1234", "10.5678"})
99 def test_get_by_prefix(self) -> None:
100 self.publishers_redis.set_publisher("123", "Test Publisher", {"10.1234"})
101 result = self.publishers_redis.get_by_prefix("10.1234")
102 assert result is not None
103 self.assertEqual(result["name"], "Test Publisher")
105 def test_get_by_prefix_not_found(self) -> None:
106 result = self.publishers_redis.get_by_prefix("10.9999")
107 self.assertIsNone(result)
109 def test_has_data_empty(self) -> None:
110 self.assertFalse(self.publishers_redis.has_data())
112 def test_has_data_after_insert(self) -> None:
113 self.publishers_redis.set_publisher("1", "Publisher", {"10.1000"})
114 self.assertTrue(self.publishers_redis.has_data())
116 def test_clear(self) -> None:
117 self.publishers_redis.set_publisher("1", "Publisher", {"10.1000"})
118 self.assertTrue(self.publishers_redis.has_data())
119 self.publishers_redis.clear()
120 self.assertFalse(self.publishers_redis.has_data())
122 def test_set_publishers_batch(self) -> None:
123 publishers = {
124 "1": {"name": "Publisher A", "prefixes": {"10.1111"}},
125 "2": {"name": "Publisher B", "prefixes": {"10.2222", "10.3333"}},
126 }
127 self.publishers_redis.set_publishers_batch(publishers)
129 result_a = self.publishers_redis.get_by_member("1")
130 assert result_a is not None
131 self.assertEqual(result_a["name"], "Publisher A")
132 self.assertEqual(result_a["prefixes"], {"10.1111"})
134 result_b = self.publishers_redis.get_by_prefix("10.2222")
135 assert result_b is not None
136 self.assertEqual(result_b["name"], "Publisher B")
138 result_c = self.publishers_redis.get_by_prefix("10.3333")
139 assert result_c is not None
140 self.assertEqual(result_c["name"], "Publisher B")
143class TestLoadPublishersToRedis(unittest.TestCase):
144 def setUp(self) -> None:
145 self.publishers_redis = PublishersRedis(testing=True)
146 self.temp_dir = tempfile.mkdtemp()
148 def tearDown(self) -> None:
149 shutil.rmtree(self.temp_dir)
151 def test_load_from_csv(self) -> None:
152 csv_content = '''"id","name","prefix"
153"100","Test Publisher 1","10.100"
154"100","Test Publisher 1","10.101"
155"200","Test Publisher 2","10.200"
156'''
157 csv_path = os.path.join(self.temp_dir, "publishers.csv")
158 with open(csv_path, "w", encoding="utf-8") as f:
159 f.write(csv_content)
161 load_publishers_to_redis(csv_path, self.publishers_redis)
163 result1 = self.publishers_redis.get_by_member("100")
164 assert result1 is not None
165 self.assertEqual(result1["name"], "Test Publisher 1")
166 self.assertEqual(result1["prefixes"], {"10.100", "10.101"})
168 result2 = self.publishers_redis.get_by_prefix("10.200")
169 assert result2 is not None
170 self.assertEqual(result2["name"], "Test Publisher 2")
172 def test_load_nonexistent_file(self) -> None:
173 load_publishers_to_redis("/nonexistent/file.csv", self.publishers_redis)
174 self.assertFalse(self.publishers_redis.has_data())
177if __name__ == "__main__":
178 unittest.main()