Skip to content

Commit 5f79224

Browse files
committed
Add factories for opinions and image reading sessions
1 parent 4972068 commit 5f79224

2 files changed

Lines changed: 114 additions & 1 deletion

File tree

manage_breast_screening/dicom/tests/factories.py

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import uuid
22

3-
from factory.declarations import Sequence, SubFactory
3+
from factory.declarations import RelatedFactory, Sequence, SubFactory, Trait
44
from factory.django import DjangoModelFactory, FileField
5+
from factory.helpers import post_generation
6+
7+
from manage_breast_screening.users.tests.factories import UserFactory
58

69
from .. import models
710

@@ -17,6 +20,22 @@ class Meta:
1720
description = "Test Study"
1821

1922

23+
class StudyWithImagesFactory(StudyFactory):
24+
class Meta:
25+
skip_postgeneration_save = True
26+
27+
@post_generation
28+
def num_images(obj, created, extracted, **kwargs):
29+
if not created:
30+
return
31+
32+
if not extracted:
33+
extracted = 1
34+
35+
for _ in range(extracted):
36+
ImageFactory(series__study=obj)
37+
38+
2039
class SeriesFactory(DjangoModelFactory):
2140
class Meta:
2241
model = models.Series
@@ -37,3 +56,62 @@ class Meta:
3756
laterality = "L"
3857
view_position = "CC"
3958
image_file = FileField(filename="image.jpg")
59+
60+
61+
class RecallForAssessmentDetailsFactory(DjangoModelFactory):
62+
class Meta:
63+
model = models.RecallForAssessmentDetails
64+
65+
right_breast_opinion = models.BreastOpinions.ABNORMAL
66+
left_breast_opinion = models.BreastOpinions.NORMAL
67+
68+
69+
class RetakeRequestFactory(DjangoModelFactory):
70+
class Meta:
71+
model = models.RetakeRequest
72+
73+
laterality = "R"
74+
view_position = "MLO"
75+
76+
77+
class ReadingFactory(DjangoModelFactory):
78+
class Meta:
79+
model = models.Reading
80+
skip_postgeneration_save = True
81+
82+
study = SubFactory(StudyWithImagesFactory)
83+
reader = SubFactory(UserFactory)
84+
opinion = models.Opinions.NORMAL
85+
86+
class Params:
87+
normal = Trait(opinion=models.Opinions.NORMAL)
88+
technical_recall = Trait(
89+
opinion=models.Opinions.TECHNICAL_RECALL,
90+
retake_request_1=RelatedFactory(
91+
RetakeRequestFactory, factory_related_name="reading"
92+
),
93+
)
94+
recall = Trait(
95+
opinion=models.Opinions.RECALL,
96+
recall_for_assessment_details=RelatedFactory(
97+
RecallForAssessmentDetailsFactory, factory_related_name="reading"
98+
),
99+
)
100+
101+
102+
class ReadingSessionItemFactory(DjangoModelFactory):
103+
class Meta:
104+
model = models.ReadingSessionItem
105+
106+
study = SubFactory(StudyFactory)
107+
order = Sequence(lambda i: i)
108+
109+
110+
class ReadingSessionFactory(DjangoModelFactory):
111+
class Meta:
112+
model = models.ReadingSession
113+
skip_postgeneration_save = True
114+
115+
reader = SubFactory(UserFactory)
116+
session_size = 50
117+
item_1 = RelatedFactory(ReadingSessionItemFactory, factory_related_name="session")
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import pytest
2+
3+
from ..models import BreastOpinions, Opinions
4+
from .factories import ReadingFactory, ReadingSessionFactory
5+
6+
7+
@pytest.mark.django_db
8+
def test_technical_recall_trait():
9+
opinion = ReadingFactory(technical_recall=True)
10+
assert opinion.opinion == Opinions.TECHNICAL_RECALL
11+
assert opinion.retake_requests.count() == 1
12+
13+
retake_request = opinion.retake_requests.first()
14+
assert retake_request.view_position == "MLO"
15+
assert retake_request.laterality == "R"
16+
17+
18+
@pytest.mark.django_db
19+
def test_recall_trait():
20+
opinion = ReadingFactory(recall=True)
21+
assert opinion.opinion == Opinions.RECALL
22+
assert (
23+
opinion.recall_for_assessment_details.right_breast_opinion
24+
== BreastOpinions.ABNORMAL
25+
)
26+
assert (
27+
opinion.recall_for_assessment_details.left_breast_opinion
28+
== BreastOpinions.NORMAL
29+
)
30+
31+
32+
@pytest.mark.django_db
33+
def test_reading_session():
34+
session = ReadingSessionFactory()
35+
assert session.items.count() == 1

0 commit comments

Comments
 (0)