Coverage for tests/test_samples.py: 100%
88 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-01 22:07 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-01 22:07 +0000
1import peprs
2import pytest
4from pepdbagent.exceptions import SampleNotFoundError
6from .utils import PEPDBAgentContextManager
9@pytest.mark.skipif(
10 not PEPDBAgentContextManager().db_setup(),
11 reason="DB is not setup",
12)
13class TestSamples:
14 @pytest.mark.parametrize(
15 "namespace, name, sample_name",
16 [
17 ["namespace1", "amendments1", "pig_0h"],
18 ],
19 )
20 def test_retrieve_one_sample(self, namespace, name, sample_name):
21 with PEPDBAgentContextManager(add_data=True) as agent:
22 one_sample = agent.sample.get(namespace, name, sample_name, raw=False)
23 assert isinstance(one_sample, peprs.Sample)
24 assert one_sample.sample_name == sample_name
26 @pytest.mark.parametrize(
27 "namespace, name, sample_name",
28 [
29 ["namespace1", "amendments1", "pig_0h"],
30 ],
31 )
32 def test_retrieve_raw_sample(self, namespace, name, sample_name):
33 with PEPDBAgentContextManager(add_data=True) as agent:
34 one_sample = agent.sample.get(namespace, name, sample_name)
35 assert isinstance(one_sample, dict)
36 assert one_sample["sample_name"] == sample_name
38 @pytest.mark.parametrize(
39 "namespace, name, sample_name",
40 [
41 ["namespace2", "custom_index", "frog_1"],
42 ],
43 )
44 def test_retrieve_sample_with_modified_sample_id(
45 self, namespace, name, sample_name
46 ):
47 with PEPDBAgentContextManager(add_data=True) as agent:
48 one_sample = agent.sample.get(namespace, name, sample_name, raw=False)
49 assert isinstance(one_sample, peprs.Sample)
50 assert one_sample.sample_id == "frog_1"
52 @pytest.mark.parametrize(
53 "namespace, name, sample_name",
54 [
55 ["namespace1", "amendments1", "pig_0h"],
56 ],
57 )
58 def test_update(self, namespace, name, sample_name):
59 with PEPDBAgentContextManager(add_data=True) as agent:
60 agent.sample.update(
61 namespace=namespace,
62 name=name,
63 tag="default",
64 sample_name=sample_name,
65 update_dict={"organism": "butterfly"},
66 )
67 one_sample = agent.sample.get(namespace, name, sample_name, raw=False)
68 assert one_sample.organism == "butterfly"
70 @pytest.mark.parametrize(
71 "namespace, name, sample_name",
72 [
73 ["namespace1", "amendments1", "pig_0h"],
74 ],
75 )
76 def test_update_sample_name(self, namespace, name, sample_name):
77 with PEPDBAgentContextManager(add_data=True) as agent:
78 agent.sample.update(
79 namespace=namespace,
80 name=name,
81 tag="default",
82 sample_name=sample_name,
83 update_dict={"sample_name": "butterfly"},
84 )
85 one_sample = agent.sample.get(namespace, name, "butterfly", raw=False)
86 assert one_sample.sample_name == "butterfly"
88 @pytest.mark.parametrize(
89 "namespace, name, sample_name",
90 [
91 ["namespace2", "custom_index", "frog_1"],
92 ],
93 )
94 def test_update_custom_sample_id(self, namespace, name, sample_name):
95 with PEPDBAgentContextManager(add_data=True) as agent:
96 agent.sample.update(
97 namespace=namespace,
98 name=name,
99 tag="default",
100 sample_name=sample_name,
101 update_dict={"sample_id": "butterfly"},
102 )
103 one_sample = agent.sample.get(namespace, name, "butterfly", raw=False)
104 assert one_sample.sample_id == "butterfly"
106 @pytest.mark.parametrize(
107 "namespace, name, sample_name",
108 [
109 ["namespace1", "amendments1", "pig_0h"],
110 ],
111 )
112 def test_add_new_attributes(self, namespace, name, sample_name):
113 with PEPDBAgentContextManager(add_data=True) as agent:
114 agent.sample.update(
115 namespace=namespace,
116 name=name,
117 tag="default",
118 sample_name=sample_name,
119 update_dict={"new_attr": "butterfly"},
120 )
121 prj = agent.project.get(namespace, name, raw=False)
123 assert prj.get_sample(sample_name).new_attr == "butterfly"
125 @pytest.mark.parametrize(
126 "namespace, name, sample_name",
127 [
128 ["namespace1", "amendments1", "pig_0h"],
129 ],
130 )
131 def test_project_timestamp_was_changed(self, namespace, name, sample_name):
132 with PEPDBAgentContextManager(add_data=True) as agent:
133 annotation1 = agent.annotation.get(namespace, name, "default")
134 import time
136 time.sleep(0.2)
137 agent.sample.update(
138 namespace=namespace,
139 name=name,
140 tag="default",
141 sample_name=sample_name,
142 update_dict={"new_attr": "butterfly"},
143 )
144 annotation2 = agent.annotation.get(namespace, name, "default")
146 assert (
147 annotation1.results[0].last_update_date
148 != annotation2.results[0].last_update_date
149 )
151 @pytest.mark.parametrize(
152 "namespace, name, sample_name",
153 [
154 ["namespace1", "amendments1", "pig_0h"],
155 ],
156 )
157 def test_delete_sample(self, namespace, name, sample_name):
158 with PEPDBAgentContextManager(add_data=True) as agent:
159 one_sample = agent.sample.get(namespace, name, sample_name, raw=False)
160 assert isinstance(one_sample, peprs.Sample)
162 agent.sample.delete(namespace, name, tag="default", sample_name=sample_name)
164 with pytest.raises(SampleNotFoundError):
165 agent.sample.get(
166 namespace, name, tag="default", sample_name=sample_name, raw=False
167 )
169 @pytest.mark.parametrize(
170 "namespace, name, tag, sample_dict",
171 [
172 [
173 "namespace1",
174 "amendments1",
175 "default",
176 {
177 "sample_name": "new_sample",
178 "time": "new_time",
179 },
180 ],
181 ],
182 )
183 def test_add_sample(self, namespace, name, tag, sample_dict):
184 with PEPDBAgentContextManager(add_data=True) as agent:
185 prj = agent.project.get(namespace, name, raw=False)
186 agent.sample.add(namespace, name, tag, sample_dict)
188 prj2 = agent.project.get(namespace, name, raw=False)
190 assert len(prj.samples) + 1 == len(prj2.samples)
191 assert prj2.samples[-1].sample_name == sample_dict["sample_name"]
193 @pytest.mark.parametrize(
194 "namespace, name, tag, sample_dict",
195 [
196 [
197 "namespace1",
198 "amendments1",
199 "default",
200 {
201 "sample_name": "pig_0h",
202 "time": "new_time",
203 },
204 ],
205 ],
206 )
207 def test_overwrite_sample(self, namespace, name, tag, sample_dict):
208 with PEPDBAgentContextManager(add_data=True) as agent:
209 # peprs/polars infers numeric values from the sample table, so the
210 # original time is loaded as int (not string).
211 assert (
212 agent.project.get(namespace, name, raw=False).get_sample("pig_0h").time
213 == 0
214 )
215 agent.sample.add(namespace, name, tag, sample_dict, overwrite=True)
217 assert (
218 agent.project.get(namespace, name, raw=False).get_sample("pig_0h").time
219 == "new_time"
220 )
222 @pytest.mark.parametrize(
223 "namespace, name, tag, sample_dict",
224 [
225 [
226 "namespace1",
227 "amendments1",
228 "default",
229 {
230 "sample_name": "new_sample",
231 "time": "new_time",
232 },
233 ],
234 ],
235 )
236 def test_delete_and_add(self, namespace, name, tag, sample_dict):
237 with PEPDBAgentContextManager(add_data=True) as agent:
238 prj = agent.project.get(namespace, name, raw=False)
239 sample_dict = agent.sample.get(namespace, name, "pig_0h", raw=True)
240 agent.sample.delete(namespace, name, tag, "pig_0h")
241 agent.sample.add(namespace, name, tag, sample_dict)
242 prj2 = agent.project.get(namespace, name, raw=False)
243 assert (
244 prj.get_sample("pig_0h").to_dict()
245 == prj2.get_sample("pig_0h").to_dict()
246 )