Skip to content

Commit c237df6

Browse files
committed
tests
1 parent 161b1b4 commit c237df6

File tree

6 files changed

+236
-85
lines changed

6 files changed

+236
-85
lines changed

edc_consent/consent_definition.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,14 @@ def get_consent_for(
124124
raise_if_not_consented: bool | None = None,
125125
) -> ConsentLikeModel | None:
126126
"""Returns a subject consent using this consent_definition's
127-
model_cls and version.
127+
`model_cls` and `version`.
128128
129129
If it does not exist and this consent_definition updates a
130-
previous (update_cdef), will try again with the update_cdef's
130+
previous (`update_cdef`), will try again with the `update_cdef's`
131131
model_cls and version.
132132
133-
Finally, if the subject cosent does not exist raises a
134-
NotConsentedError.
133+
Finally, if the subject consent does not exist raises a
134+
`NotConsentedError`.
135135
"""
136136
consent_obj = None
137137
raise_if_not_consented = (

edc_consent/managers.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,16 @@ class ConsentObjectsByCdefManager(ConsentObjectsManager):
2424
def get_queryset(self):
2525
qs = super().get_queryset()
2626
cdef = site_consents.get_consent_definition(model=qs.model._meta.label_lower)
27-
return qs.filter(version=cdef.version)
27+
# return qs.filter(
28+
# version=cdef.version,
29+
# consent_datetime__gte=cdef.start,
30+
# consent_datetime__lte=cdef.end,
31+
# )
32+
return qs.filter(
33+
version=cdef.version,
34+
consent_datetime__gte=cdef.start,
35+
consent_datetime__lte=cdef.end,
36+
).exclude(consent_datetime__lt=cdef.start, consent_datetime__gt=cdef.end)
2837

2938

3039
class CurrentSiteByCdefManager(CurrentSiteManager):
@@ -37,4 +46,14 @@ class CurrentSiteByCdefManager(CurrentSiteManager):
3746
def get_queryset(self):
3847
qs = super().get_queryset()
3948
cdef = site_consents.get_consent_definition(model=qs.model._meta.label_lower)
40-
return qs.filter(version=cdef.version)
49+
# return qs.filter(
50+
# version=cdef.version,
51+
# consent_datetime__gte=cdef.start,
52+
# consent_datetime__lte=cdef.end,
53+
# )
54+
return qs.filter(
55+
site_id=cdef.site.site_id,
56+
version=cdef.version,
57+
consent_datetime__gte=cdef.start,
58+
consent_datetime__lte=cdef.end,
59+
).exclude(consent_datetime__lt=cdef.start, consent_datetime__gt=cdef.end)

edc_consent/site_consents.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ def validate_period_overlap_or_raise(self, cdef: ConsentDefinition):
9999
f"Got {cdef.name}."
100100
)
101101

102+
def get_consent_for(
103+
self, subject_identifier: str, report_datetime: datetime, site_id: int
104+
):
105+
from edc_sites.site import sites as site_sites # avoid circular import
106+
107+
single_site = site_sites.get(site_id)
108+
cdef = self.get_consent_definition(report_datetime=report_datetime, site=single_site)
109+
return cdef.get_consent_for(subject_identifier)
110+
102111
def get_consent_definition(
103112
self,
104113
model: str = None,

edc_consent/tests/test_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"sites.E101",
2020
"edc_navbar.E002",
2121
"edc_navbar.E003",
22+
"edc_sites.E001",
2223
],
2324
ETC_DIR=str(base_dir / app_name / "tests" / "etc"),
2425
EDC_NAVBAR_DEFAULT="edc_consent",

edc_consent/tests/tests/test_consent_model.py

Lines changed: 51 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
from django.contrib.sites.models import Site
77
from django.test import TestCase, override_settings, tag
88
from edc_protocol.research_protocol_config import ResearchProtocolConfig
9-
from edc_sites.site import sites as site_sites
109
from edc_utils import get_utcnow
1110
from edc_visit_schedule.site_visit_schedules import site_visit_schedules
1211
from faker import Faker
1312
from model_bakery import baker
1413

15-
from consent_app.models import CrfOne, SubjectVisit
14+
from consent_app.models import CrfOne, SubjectConsent, SubjectVisit
1615
from consent_app.visit_schedules import get_visit_schedule
1716
from edc_consent.field_mixins import IdentityFieldsMixinError
1817
from edc_consent.site_consents import site_consents
@@ -51,6 +50,8 @@ def setUp(self):
5150
end=self.study_open_datetime + timedelta(days=100),
5251
version="2.0",
5352
)
53+
54+
self.consent_v3_start_date = self.study_open_datetime + timedelta(days=101)
5455
self.consent_v3 = consent_factory(
5556
proxy_model="consent_app.subjectconsentv3",
5657
start=self.study_open_datetime + timedelta(days=101),
@@ -63,6 +64,7 @@ def setUp(self):
6364
site_consents.register(self.consent_v3)
6465
self.dob = self.study_open_datetime - relativedelta(years=25)
6566

67+
@tag("1")
6668
def test_encryption(self):
6769
subject_consent = baker.make_recipe(
6870
"consent_app.subjectconsentv1",
@@ -72,6 +74,7 @@ def test_encryption(self):
7274
)
7375
self.assertEqual(subject_consent.first_name, "ERIK")
7476

77+
@tag("1")
7578
def test_gets_subject_identifier(self):
7679
"""Asserts a blank subject identifier is set to the
7780
subject_identifier_as_pk.
@@ -89,6 +92,7 @@ def test_gets_subject_identifier(self):
8992
self.assertIsNotNone(consent.subject_identifier)
9093
self.assertNotEqual(consent.subject_identifier, consent.subject_identifier_as_pk)
9194

95+
@tag("1")
9296
def test_subject_has_current_consent(self):
9397
subject_identifier = "123456789"
9498
identity = "987654321"
@@ -125,7 +129,12 @@ def test_subject_has_current_consent(self):
125129
)
126130
self.assertEqual(subject_consent.version, "2.0")
127131

128-
def test_model_updates(self):
132+
@tag("1")
133+
def test_model_updates_version_according_to_cdef_used(self):
134+
"""Asserts the consent model finds the cdef and updates
135+
column `version` using to the version number on the
136+
cdef.
137+
"""
129138
subject_identifier = "123456789"
130139
identity = "987654321"
131140
consent = baker.make_recipe(
@@ -156,20 +165,29 @@ def test_model_updates(self):
156165
)
157166
self.assertEqual(consent.version, "3.0")
158167

159-
def test_model_updates2(self):
168+
@tag("1")
169+
def test_model_updates_version_according_to_cdef_used2(self):
170+
"""Asserts the consent model finds the `cdef` and updates
171+
column `version` using to the version number on the
172+
`cdef`.
173+
174+
Note: we get the `model_cls` by looking up the `cdef` first.
175+
"""
160176
subject_identifier = "123456789"
161177
identity = "987654321"
178+
cdef = site_consents.get_consent_definition(report_datetime=self.study_open_datetime)
162179
consent = baker.make_recipe(
163-
"consent_app.subjectconsentv1",
180+
cdef.model,
164181
subject_identifier=subject_identifier,
165182
identity=identity,
166183
confirm_identity=identity,
167184
consent_datetime=self.study_open_datetime,
168185
dob=get_utcnow() - relativedelta(years=25),
169186
)
170187
self.assertEqual(consent.version, "1.0")
188+
cdef = site_consents.get_consent_definition(report_datetime=self.study_open_datetime)
171189
consent = baker.make_recipe(
172-
"consent_app.subjectconsentv3",
190+
cdef.model,
173191
subject_identifier=subject_identifier,
174192
identity=identity,
175193
confirm_identity=identity,
@@ -178,7 +196,11 @@ def test_model_updates2(self):
178196
)
179197
self.assertEqual(consent.version, "3.0")
180198

181-
def test_model_updates_or_first_based_on_date(self):
199+
def test_model_correctly_gets_v3_by_date(self):
200+
"""Asserts that a consent model instance created when the
201+
current date is within the V3 validity period correctly
202+
has `instance.version == 3.0`.
203+
"""
182204
traveller = time_machine.travel(self.study_open_datetime + timedelta(days=110))
183205
traveller.start()
184206
subject_identifier = "123456789"
@@ -194,11 +216,19 @@ def test_model_updates_or_first_based_on_date(self):
194216
self.assertEqual(consent.version, "3.0")
195217

196218
def test_model_updates_from_v1_to_v2(self):
197-
traveller = time_machine.travel(self.study_open_datetime)
198-
traveller.start()
219+
"""Assert, for a single participant, a second consent model
220+
instance submitted within the v2 validity period has
221+
version == 2.0.
222+
223+
Also note that there are now 2 instances of the consent
224+
model for this participant.
225+
"""
199226
subject_identifier = "123456789"
200227
identity = "987654321"
201228

229+
# travel to V1 validity period
230+
traveller = time_machine.travel(self.study_open_datetime)
231+
traveller.start()
202232
cdef = site_consents.get_consent_definition(report_datetime=get_utcnow())
203233
subject_consent = baker.make_recipe(
204234
cdef.model,
@@ -208,15 +238,18 @@ def test_model_updates_from_v1_to_v2(self):
208238
consent_datetime=get_utcnow(),
209239
dob=get_utcnow() - relativedelta(years=25),
210240
)
241+
self.assertEqual(subject_consent.version, "2.0")
211242
self.assertEqual(subject_consent.subject_identifier, subject_identifier)
212243
self.assertEqual(subject_consent.identity, identity)
213244
self.assertEqual(subject_consent.confirm_identity, identity)
214245
self.assertEqual(subject_consent.version, cdef.version)
215246
self.assertEqual(subject_consent.consent_definition_name, cdef.name)
216247
traveller.stop()
248+
249+
# travel to V2 validity period
250+
# create second consent for the same individual
217251
traveller = time_machine.travel(self.study_open_datetime + timedelta(days=51))
218252
traveller.start()
219-
220253
cdef = site_consents.get_consent_definition(report_datetime=get_utcnow())
221254
subject_consent = cdef.model_cls(
222255
subject_identifier=subject_identifier,
@@ -227,80 +260,13 @@ def test_model_updates_from_v1_to_v2(self):
227260
)
228261
subject_consent.save()
229262
subject_consent.refresh_from_db()
263+
self.assertEqual(subject_consent.version, "2.0")
230264
self.assertEqual(subject_consent.subject_identifier, subject_identifier)
231265
self.assertEqual(subject_consent.identity, identity)
232266
self.assertEqual(subject_consent.confirm_identity, identity)
233267
self.assertEqual(subject_consent.consent_definition_name, cdef.name)
234268

235-
def test_v3_extends_v2_end_date_up_to_v3_consent_datetime(self):
236-
# TODO: is this a valid test? How does it fill in data from
237-
# the previous consent?
238-
traveller = time_machine.travel(self.study_open_datetime)
239-
traveller.start()
240-
subject_identifier = "123456789"
241-
identity = "987654321"
242-
243-
# consent version 1
244-
cdef = site_consents.get_consent_definition(report_datetime=get_utcnow())
245-
subject_consent = baker.make_recipe(
246-
cdef.model,
247-
subject_identifier=subject_identifier,
248-
identity=identity,
249-
confirm_identity=identity,
250-
consent_datetime=get_utcnow(),
251-
dob=get_utcnow() - relativedelta(years=25),
252-
)
253-
self.assertEqual(subject_consent.consent_definition_name, cdef.name)
254-
self.assertEqual(subject_consent.version, "1.0")
255-
traveller.stop()
256-
257-
# consent version 2
258-
traveller = time_machine.travel(self.study_open_datetime + timedelta(days=51))
259-
traveller.start()
260-
cdef = site_consents.get_consent_definition(report_datetime=get_utcnow())
261-
subject_consent = baker.make_recipe(
262-
cdef.model,
263-
subject_identifier=subject_identifier,
264-
consent_datetime=get_utcnow(),
265-
dob=get_utcnow() - relativedelta(years=25),
266-
)
267-
self.assertEqual(subject_consent.consent_definition_name, cdef.name)
268-
self.assertEqual(subject_consent.version, "2.0")
269-
traveller.stop()
270-
271-
# consent version 3.0
272-
traveller = time_machine.travel(cdef.end + relativedelta(days=5))
273-
traveller.start()
274-
cdef = site_consents.get_consent_definition(report_datetime=get_utcnow())
275-
subject_consent = baker.make_recipe(
276-
cdef.model,
277-
subject_identifier=subject_identifier,
278-
consent_datetime=get_utcnow(),
279-
dob=get_utcnow() - relativedelta(years=25),
280-
)
281-
self.assertEqual(subject_consent.consent_definition_name, cdef.name)
282-
self.assertEqual(subject_consent.version, "3.0")
283-
self.assertEqual(cdef.version, "3.0")
284-
285-
# get cdef for 3.0
286-
cdef = site_consents.get_consent_definition(
287-
report_datetime=get_utcnow(), site=site_sites.get(subject_consent.site.id)
288-
)
289-
self.assertEqual(cdef.version, "3.0")
290-
291-
# use cdef-3.0 to get subject_consent 3.0
292-
subject_consent = cdef.get_consent_for(
293-
subject_identifier=subject_identifier, report_datetime=get_utcnow()
294-
)
295-
self.assertEqual(subject_consent.version, "3.0")
296-
297-
# use cdef-3.0 to get subject_consent 2.0 showing that the lower bound
298-
# of a cdef that updates is extended to return a 2.0 consent
299-
subject_consent = cdef.get_consent_for(
300-
subject_identifier=subject_identifier,
301-
report_datetime=cdef.start - relativedelta(days=1),
302-
)
303-
self.assertEqual(subject_consent.version, "2.0")
269+
self.assertEqual(SubjectConsent.objects.filter(identity, identity).count(), 2)
304270

305271
def test_first_consent_is_v2(self):
306272
traveller = time_machine.travel(self.study_open_datetime + timedelta(days=51))
@@ -619,10 +585,16 @@ def test_save_crf_with_consent_end_shortened_to_before_existing_subject_visit_ra
619585
subject_identifier=subject_identifier,
620586
report_datetime=datetime_within_consent_v3,
621587
)
588+
except NotConsentedError:
589+
self.fail("NotConsentedError unexpectedly raised")
590+
try:
622591
crf_one.save()
623592
except NotConsentedError:
624593
self.fail("NotConsentedError unexpectedly raised")
625594

595+
crf_one.report_datetime = get_utcnow()
596+
crf_one.save()
597+
626598
# now try to save CRF at within v4 period
627599
self.assertRaises(
628600
NotConsentedError,

0 commit comments

Comments
 (0)