Coverage for tasks/tests/rapid3_tests.py: 15%
97 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 13:48 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 13:48 +0000
1"""
2camcops_server/tasks/tests/rapid3_tests.py
4===============================================================================
6 Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
7 Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
9 This file is part of CamCOPS.
11 CamCOPS is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 CamCOPS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.
24===============================================================================
26"""
28from unittest import mock
29import unittest
31from camcops_server.tasks.rapid3 import Rapid3
34# =============================================================================
35# Unit tests
36# =============================================================================
39class Rapid3Tests(unittest.TestCase):
40 def setUp(self) -> None:
41 super().setUp()
43 self.request = mock.Mock()
45 def test_rapid3_calculation(self) -> None:
46 rapid3 = Rapid3()
48 # a-j total 13
49 # expected FN = 13/3 = 4.3 (1 dp)
50 rapid3.q1a = 1
51 rapid3.q1b = 2
52 rapid3.q1c = 3
53 rapid3.q1d = 0
54 rapid3.q1e = 1
55 rapid3.q1f = 0
56 rapid3.q1g = 3
57 rapid3.q1h = 0
58 rapid3.q1i = 1
59 rapid3.q1j = 2
61 # k-m not scored formally
62 rapid3.q1k = 3
63 rapid3.q1l = 0
64 rapid3.q1m = 1
66 rapid3.q2 = 0.5
67 rapid3.q3 = 2.0
69 # cumulative = 4.3 + 0.5 + 2.0 = 6.8
71 self.assertEqual(rapid3.rapid3(), 6.8)
73 def test_rapid3_none_when_field_none(self) -> None:
74 rapid3 = Rapid3()
76 self.assertIsNone(rapid3.rapid3())
78 def test_complete_when_all_answers_valid(self) -> None:
79 rapid3 = Rapid3()
81 rapid3.q1a = 0
82 rapid3.q1b = 0
83 rapid3.q1c = 0
84 rapid3.q1d = 0
85 rapid3.q1e = 0
86 rapid3.q1f = 0
87 rapid3.q1g = 0
88 rapid3.q1h = 0
89 rapid3.q1i = 0
90 rapid3.q1j = 0
92 rapid3.q1k = 0
93 rapid3.q1l = 0
94 rapid3.q1m = 0
96 rapid3.q2 = 0.0
97 rapid3.q3 = 0.0
99 self.assertTrue(rapid3.is_complete())
101 def test_incomplete_when_any_field_none(self) -> None:
102 all_fields = [
103 "q1a",
104 "q1b",
105 "q1c",
106 "q1d",
107 "q1e",
108 "q1f",
109 "q1g",
110 "q1h",
111 "q1i",
112 "q1j",
113 "q1k",
114 "q1l",
115 "q1m",
116 "q2",
117 "q3",
118 ]
120 for none_field in all_fields:
121 rapid3 = Rapid3()
123 for field in all_fields:
124 setattr(rapid3, field, 0.0)
126 setattr(rapid3, none_field, None)
127 self.assertFalse(
128 rapid3.is_complete(),
129 msg=f"Failed when setting {none_field} to None",
130 )
132 def test_incomplete_when_any_field_invalid(self) -> None:
133 all_fields = [
134 "q1a",
135 "q1b",
136 "q1c",
137 "q1d",
138 "q1e",
139 "q1f",
140 "q1g",
141 "q1h",
142 "q1i",
143 "q1j",
144 "q1k",
145 "q1l",
146 "q1m",
147 "q2",
148 "q3",
149 ]
151 for invalid_field in all_fields:
152 rapid3 = Rapid3()
154 for field in all_fields:
155 setattr(rapid3, field, 0.0)
157 setattr(rapid3, invalid_field, 10.5)
158 self.assertFalse(
159 rapid3.is_complete(),
160 msg=f"Failed when setting {invalid_field} invalid",
161 )
163 def test_disease_severity_n_a_for_none(self) -> None:
164 rapid3 = Rapid3()
166 with mock.patch.object(rapid3, "rapid3") as mock_rapid3:
167 mock_rapid3.return_value = None
168 with mock.patch.object(rapid3, "wxstring") as mock_wxstring:
169 rapid3.disease_severity(self.request)
171 mock_wxstring.assert_called_once_with(self.request, "n_a")
173 def test_disease_severity_near_remission_for_3(self) -> None:
174 rapid3 = Rapid3()
176 with mock.patch.object(rapid3, "rapid3") as mock_rapid3:
177 mock_rapid3.return_value = 3.0
178 with mock.patch.object(rapid3, "wxstring") as mock_wxstring:
179 rapid3.disease_severity(self.request)
181 mock_wxstring.assert_called_once_with(self.request, "near_remission")
183 def test_disease_severity_low_for_6(self) -> None:
184 rapid3 = Rapid3()
186 with mock.patch.object(rapid3, "rapid3") as mock_rapid3:
187 mock_rapid3.return_value = 6
188 with mock.patch.object(rapid3, "wxstring") as mock_wxstring:
189 rapid3.disease_severity(self.request)
191 mock_wxstring.assert_called_once_with(self.request, "low_severity")
193 def test_disease_severity_moderate_for_12(self) -> None:
194 rapid3 = Rapid3()
196 with mock.patch.object(rapid3, "rapid3") as mock_rapid3:
197 mock_rapid3.return_value = 12
198 with mock.patch.object(rapid3, "wxstring") as mock_wxstring:
199 rapid3.disease_severity(self.request)
201 mock_wxstring.assert_called_once_with(
202 self.request, "moderate_severity"
203 )
205 def test_disease_severity_high_for_12point1(self) -> None:
206 rapid3 = Rapid3()
208 with mock.patch.object(rapid3, "rapid3") as mock_rapid3:
209 mock_rapid3.return_value = 12.1
210 with mock.patch.object(rapid3, "wxstring") as mock_wxstring:
211 rapid3.disease_severity(self.request)
213 mock_wxstring.assert_called_once_with(self.request, "high_severity")