Coverage for cc_modules/cc_testfactories.py: 97%

87 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-11-08 23:14 +0000

1#!/usr/bin/env python 

2 

3""" 

4camcops_server/cc_modules/cc_testfactories.py 

5 

6=============================================================================== 

7 

8 Copyright (C) 2012, University of Cambridge, Department of Psychiatry. 

9 Created by Rudolf Cardinal (rnc1001@cam.ac.uk). 

10 

11 This file is part of CamCOPS. 

12 

13 CamCOPS is free software: you can redistribute it and/or modify 

14 it under the terms of the GNU General Public License as published by 

15 the Free Software Foundation, either version 3 of the License, or 

16 (at your option) any later version. 

17 

18 CamCOPS is distributed in the hope that it will be useful, 

19 but WITHOUT ANY WARRANTY; without even the implied warranty of 

20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

21 GNU General Public License for more details. 

22 

23 You should have received a copy of the GNU General Public License 

24 along with CamCOPS. If not, see <https://www.gnu.org/licenses/>. 

25 

26=============================================================================== 

27 

28**Factory Boy SQL Alchemy test factories.** 

29 

30""" 

31 

32from cardinal_pythonlib.datetimefunc import ( 

33 convert_datetime_to_utc, 

34 format_datetime, 

35) 

36import factory 

37import pendulum 

38 

39from camcops_server.cc_modules.cc_constants import DateFormat 

40from camcops_server.cc_modules.cc_device import Device 

41from camcops_server.cc_modules.cc_email import Email 

42from camcops_server.cc_modules.cc_group import Group 

43from camcops_server.cc_modules.cc_patient import Patient 

44from camcops_server.cc_modules.cc_taskschedule import ( 

45 PatientTaskSchedule, 

46 PatientTaskScheduleEmail, 

47 TaskSchedule, 

48 TaskScheduleItem, 

49) 

50from camcops_server.cc_modules.cc_user import User 

51 

52 

53# sqlalchemy_session gets poked in by DemoRequestCase.setUp() 

54class BaseFactory(factory.alchemy.SQLAlchemyModelFactory): 

55 pass 

56 

57 

58class DeviceFactory(BaseFactory): 

59 class Meta: 

60 model = Device 

61 

62 id = factory.Sequence(lambda n: n) 

63 name = factory.Sequence(lambda n: f"Test device {n}") 

64 

65 

66class GroupFactory(BaseFactory): 

67 class Meta: 

68 model = Group 

69 

70 name = factory.Sequence(lambda n: f"Group {n}") 

71 

72 

73class UserFactory(BaseFactory): 

74 class Meta: 

75 model = User 

76 

77 username = factory.Sequence(lambda n: f"user{n}") 

78 hashedpw = "" 

79 

80 

81class GenericTabletRecordFactory(BaseFactory): 

82 default_iso_datetime = "1970-01-01T12:00" 

83 

84 _device = factory.SubFactory(DeviceFactory) 

85 _group = factory.SubFactory(GroupFactory) 

86 _adding_user = factory.SubFactory(UserFactory) 

87 

88 @factory.lazy_attribute 

89 def _when_added_exact(self) -> pendulum.DateTime: 

90 return pendulum.parse(self.default_iso_datetime) 

91 

92 @factory.lazy_attribute 

93 def _when_added_batch_utc(self) -> pendulum.DateTime: 

94 era_time = pendulum.parse(self.default_iso_datetime) 

95 return convert_datetime_to_utc(era_time) 

96 

97 @factory.lazy_attribute 

98 def _era(self) -> str: 

99 era_time = pendulum.parse(self.default_iso_datetime) 

100 return format_datetime(era_time, DateFormat.ISO8601) 

101 

102 @factory.lazy_attribute 

103 def _current(self) -> bool: 

104 # _current = True gets ignored for some reason 

105 return True 

106 

107 class Meta: 

108 exclude = ("default_iso_datetime",) 

109 abstract = True 

110 

111 

112class PatientFactory(GenericTabletRecordFactory): 

113 class Meta: 

114 model = Patient 

115 

116 id = factory.Sequence(lambda n: n) 

117 

118 

119class ServerCreatedPatientFactory(PatientFactory): 

120 @factory.lazy_attribute 

121 def _device(self) -> Device: 

122 # Should have been created in BasicDatabaseTestCase.setUp 

123 return Device.get_server_device( 

124 ServerCreatedPatientFactory._meta.sqlalchemy_session 

125 ) 

126 

127 

128class TaskScheduleFactory(BaseFactory): 

129 class Meta: 

130 model = TaskSchedule 

131 

132 group = factory.SubFactory(GroupFactory) 

133 

134 

135class TaskScheduleItemFactory(BaseFactory): 

136 class Meta: 

137 model = TaskScheduleItem 

138 

139 task_schedule = factory.SubFactory(TaskScheduleFactory) 

140 

141 

142class PatientTaskScheduleFactory(BaseFactory): 

143 class Meta: 

144 model = PatientTaskSchedule 

145 

146 task_schedule = factory.SubFactory(TaskScheduleFactory) 

147 # If patient has not been set explicitly, 

148 # ensure Patient and TaskSchedule end up in the same group 

149 start_datetime = None 

150 patient = factory.SubFactory( 

151 ServerCreatedPatientFactory, 

152 _group=factory.SelfAttribute("..task_schedule.group"), 

153 ) 

154 

155 

156class EmailFactory(BaseFactory): 

157 class Meta: 

158 model = Email 

159 

160 @factory.post_generation 

161 def sent_at_utc( 

162 self, create: bool, extracted: pendulum.DateTime, **kwargs 

163 ) -> None: 

164 if not create: 

165 return 

166 

167 self.sent_at_utc = extracted 

168 

169 @factory.post_generation 

170 def sent(self, create: bool, extracted: bool, **kwargs) -> None: 

171 if not create: 

172 return 

173 

174 self.sent = extracted 

175 

176 

177class PatientTaskScheduleEmailFactory(BaseFactory): 

178 class Meta: 

179 model = PatientTaskScheduleEmail