Coverage for tests / test_updateRecord.py: 16%

87 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-28 08:43 +0000

1# This file is part of dax_apdb. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (http://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

9# This program is free software: you can redistribute it and/or modify 

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

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

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

20# along with this program. If not, see <http://www.gnu.org/licenses/>. 

21 

22import json 

23import unittest 

24 

25from lsst.dax.apdb.apdbUpdateRecord import ( 

26 ApdbCloseDiaObjectValidityRecord, 

27 ApdbReassignDiaSourceToDiaObjectRecord, 

28 ApdbReassignDiaSourceToSSObjectRecord, 

29 ApdbUpdateNDiaSourcesRecord, 

30 ApdbUpdateRecord, 

31 ApdbWithdrawDiaForcedSourceRecord, 

32 ApdbWithdrawDiaSourceRecord, 

33) 

34 

35 

36class ApdbUpdateRecordTestCase(unittest.TestCase): 

37 """A test case for ApdbUpdateRecord sub-classes.""" 

38 

39 update_time_ns1 = 2_000_000_000_000_000_000 

40 update_time_ns2 = 2_000_000_001_000_000_000 

41 

42 def test_all_types(self) -> None: 

43 """Test that we know full set of update types.""" 

44 self.assertEqual( 

45 set(ApdbUpdateRecord._update_types), 

46 { 

47 "reassign_diasource_to_diaobject", 

48 "reassign_diasource_to_ssobject", 

49 "withdraw_diasource", 

50 "withdraw_diaforcedsource", 

51 "close_diaobject_validity", 

52 "update_n_dia_sources", 

53 }, 

54 ) 

55 

56 def test_reassign_diasource_to_ssobject(self) -> None: 

57 """Test round-tripping ApdbReassignDiaSourceToSSObjectRecord class.""" 

58 record = ApdbReassignDiaSourceToSSObjectRecord( 

59 update_time_ns=self.update_time_ns1, 

60 update_order=0, 

61 diaSourceId=123456, 

62 ssObjectId=1, 

63 ssObjectReassocTimeMjdTai=60000.0, 

64 ra=45.0, 

65 dec=-45.0, 

66 midpointMjdTai=59999.0, 

67 ) 

68 self.assertEqual(record.record_id(), (("diaSourceId", 123456),)) 

69 self.assertEqual(record.record_payload(), (("ssObjectId", 1), ("ssObjectReassocTimeMjdTai", 60000.0))) 

70 

71 record_json = record.to_json() 

72 record_dict = json.loads(record_json) 

73 self.assertEqual( 

74 record_dict, 

75 { 

76 "diaSourceId": 123456, 

77 "ssObjectId": 1, 

78 "ssObjectReassocTimeMjdTai": 60000.0, 

79 "ra": 45.0, 

80 "dec": -45.0, 

81 "midpointMjdTai": 59999.0, 

82 "update_type": "reassign_diasource_to_ssobject", 

83 }, 

84 ) 

85 

86 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

87 self.assertIsInstance(record2, ApdbReassignDiaSourceToSSObjectRecord) 

88 self.assertEqual(record2, record) 

89 

90 def test_reassign_diasource_to_diaobject(self) -> None: 

91 """Test round-tripping ApdbReassignDiaSourceToDiaObjectRecord class.""" 

92 record = ApdbReassignDiaSourceToDiaObjectRecord( 

93 update_time_ns=self.update_time_ns1, 

94 update_order=0, 

95 diaSourceId=123456, 

96 diaObjectId=321, 

97 ra=45.0, 

98 dec=-45.0, 

99 midpointMjdTai=59999.0, 

100 ) 

101 self.assertEqual(record.record_id(), (("diaSourceId", 123456),)) 

102 self.assertEqual(record.record_payload(), (("diaObjectId", 321),)) 

103 

104 record_json = record.to_json() 

105 record_dict = json.loads(record_json) 

106 self.assertEqual( 

107 record_dict, 

108 { 

109 "diaSourceId": 123456, 

110 "diaObjectId": 321, 

111 "ra": 45.0, 

112 "dec": -45.0, 

113 "midpointMjdTai": 59999.0, 

114 "update_type": "reassign_diasource_to_diaobject", 

115 }, 

116 ) 

117 

118 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

119 self.assertIsInstance(record2, ApdbReassignDiaSourceToDiaObjectRecord) 

120 self.assertEqual(record2, record) 

121 

122 def test_close_diaobject_validity(self) -> None: 

123 """Test round-tripping ApdbCloseDiaObjectValidityRecord class.""" 

124 record = ApdbCloseDiaObjectValidityRecord( 

125 update_time_ns=self.update_time_ns1, 

126 update_order=0, 

127 diaObjectId=321, 

128 validityEndMjdTai=60000.0, 

129 nDiaSources=None, 

130 ra=45.0, 

131 dec=-45.0, 

132 ) 

133 self.assertEqual(record.record_id(), (("diaObjectId", 321),)) 

134 self.assertEqual(record.record_payload(), (("validityEndMjdTai", 60000.0),)) 

135 

136 record_json = record.to_json() 

137 record_dict = json.loads(record_json) 

138 self.assertEqual( 

139 record_dict, 

140 { 

141 "diaObjectId": 321, 

142 "validityEndMjdTai": 60000.0, 

143 "nDiaSources": None, 

144 "ra": 45.0, 

145 "dec": -45.0, 

146 "update_type": "close_diaobject_validity", 

147 }, 

148 ) 

149 

150 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

151 self.assertIsInstance(record2, ApdbCloseDiaObjectValidityRecord) 

152 self.assertEqual(record2, record) 

153 

154 # Also check record_payload with nDiaSources != None 

155 record = ApdbCloseDiaObjectValidityRecord( 

156 update_time_ns=self.update_time_ns1, 

157 update_order=0, 

158 diaObjectId=321, 

159 validityEndMjdTai=60000.0, 

160 nDiaSources=3, 

161 ra=45.0, 

162 dec=-45.0, 

163 ) 

164 self.assertEqual(record.record_id(), (("diaObjectId", 321),)) 

165 self.assertEqual(record.record_payload(), (("validityEndMjdTai", 60000.0), ("nDiaSources", 3))) 

166 

167 def test_update_n_dia_sources(self) -> None: 

168 """Test round-tripping ApdbUpdateNDiaSourcesRecord class.""" 

169 record = ApdbUpdateNDiaSourcesRecord( 

170 update_time_ns=self.update_time_ns1, 

171 update_order=0, 

172 diaObjectId=321, 

173 nDiaSources=6, 

174 ra=45.0, 

175 dec=-45.0, 

176 ) 

177 self.assertEqual(record.record_id(), (("diaObjectId", 321),)) 

178 self.assertEqual(record.record_payload(), (("nDiaSources", 6),)) 

179 

180 record_json = record.to_json() 

181 record_dict = json.loads(record_json) 

182 self.assertEqual( 

183 record_dict, 

184 { 

185 "diaObjectId": 321, 

186 "nDiaSources": 6, 

187 "ra": 45.0, 

188 "dec": -45.0, 

189 "update_type": "update_n_dia_sources", 

190 }, 

191 ) 

192 

193 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

194 self.assertIsInstance(record2, ApdbUpdateNDiaSourcesRecord) 

195 self.assertEqual(record2, record) 

196 

197 def test_withdraw_diasource(self) -> None: 

198 """Test round-tripping ApdbWithdrawDiaSourceRecord class.""" 

199 record = ApdbWithdrawDiaSourceRecord( 

200 update_time_ns=self.update_time_ns1, 

201 update_order=0, 

202 diaSourceId=123456, 

203 timeWithdrawnMjdTai=61000.0, 

204 ra=45.0, 

205 dec=-45.0, 

206 midpointMjdTai=60000.0, 

207 ) 

208 self.assertEqual(record.record_id(), (("diaSourceId", 123456),)) 

209 self.assertEqual(record.record_payload(), (("timeWithdrawnMjdTai", 61000.0),)) 

210 

211 record_json = record.to_json() 

212 record_dict = json.loads(record_json) 

213 self.assertEqual( 

214 record_dict, 

215 { 

216 "diaSourceId": 123456, 

217 "timeWithdrawnMjdTai": 61000.0, 

218 "ra": 45.0, 

219 "dec": -45.0, 

220 "midpointMjdTai": 60000.0, 

221 "update_type": "withdraw_diasource", 

222 }, 

223 ) 

224 

225 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

226 self.assertIsInstance(record2, ApdbWithdrawDiaSourceRecord) 

227 self.assertEqual(record2, record) 

228 

229 def test_withdraw_diaforcedsource(self) -> None: 

230 """Test round-tripping ApdbWithdrawDiaForcedSourceRecord class.""" 

231 record = ApdbWithdrawDiaForcedSourceRecord( 

232 update_time_ns=self.update_time_ns1, 

233 update_order=0, 

234 diaObjectId=1234, 

235 visit=555, 

236 detector=123, 

237 timeWithdrawnMjdTai=61000.0, 

238 ra=45.0, 

239 dec=-45.0, 

240 midpointMjdTai=60000.0, 

241 ) 

242 self.assertEqual(record.record_id(), (("diaObjectId", 1234), ("visit", 555), ("detector", 123))) 

243 self.assertEqual(record.record_payload(), (("timeWithdrawnMjdTai", 61000.0),)) 

244 

245 record_json = record.to_json() 

246 record_dict = json.loads(record_json) 

247 self.assertEqual( 

248 record_dict, 

249 { 

250 "diaObjectId": 1234, 

251 "visit": 555, 

252 "detector": 123, 

253 "timeWithdrawnMjdTai": 61000.0, 

254 "ra": 45.0, 

255 "dec": -45.0, 

256 "midpointMjdTai": 60000.0, 

257 "update_type": "withdraw_diaforcedsource", 

258 }, 

259 ) 

260 

261 record2 = ApdbUpdateRecord.from_json(self.update_time_ns1, 0, record_json) 

262 self.assertIsInstance(record2, ApdbWithdrawDiaForcedSourceRecord) 

263 self.assertEqual(record2, record) 

264 

265 def test_ordering(self) -> None: 

266 """Test ordering of records.""" 

267 record1 = ApdbReassignDiaSourceToSSObjectRecord( 

268 update_time_ns=self.update_time_ns1, 

269 update_order=0, 

270 diaSourceId=1, 

271 ssObjectId=1, 

272 ssObjectReassocTimeMjdTai=60000.0, 

273 ra=45.0, 

274 dec=-45.0, 

275 midpointMjdTai=60000.0, 

276 ) 

277 record2 = ApdbWithdrawDiaSourceRecord( 

278 update_time_ns=self.update_time_ns1, 

279 update_order=1, 

280 diaSourceId=123456, 

281 timeWithdrawnMjdTai=61000.0, 

282 ra=45.0, 

283 dec=-45.0, 

284 midpointMjdTai=60000.0, 

285 ) 

286 record3 = ApdbReassignDiaSourceToSSObjectRecord( 

287 update_time_ns=self.update_time_ns1, 

288 update_order=3, 

289 diaSourceId=2, 

290 ssObjectId=3, 

291 ssObjectReassocTimeMjdTai=60000.0, 

292 ra=45.0, 

293 dec=-45.0, 

294 midpointMjdTai=60000.0, 

295 ) 

296 record4 = ApdbWithdrawDiaSourceRecord( 

297 update_time_ns=self.update_time_ns2, 

298 update_order=0, 

299 diaSourceId=123456, 

300 timeWithdrawnMjdTai=61000.0, 

301 ra=45.0, 

302 dec=-45.0, 

303 midpointMjdTai=60000.0, 

304 ) 

305 record5 = ApdbWithdrawDiaForcedSourceRecord( 

306 update_time_ns=self.update_time_ns2, 

307 update_order=1, 

308 diaObjectId=1234, 

309 visit=555, 

310 detector=123, 

311 timeWithdrawnMjdTai=61000.0, 

312 ra=45.0, 

313 dec=-45.0, 

314 midpointMjdTai=60000.0, 

315 ) 

316 

317 unordered = [record5, record3, record1, record4, record2] 

318 ordered = sorted(unordered) 

319 self.assertTrue(ordered[0] < ordered[1] < ordered[2] < ordered[3] < ordered[4]) 

320 self.assertIs(ordered[0], record1) 

321 self.assertIs(ordered[1], record2) 

322 self.assertIs(ordered[2], record3) 

323 self.assertIs(ordered[3], record4) 

324 self.assertIs(ordered[4], record5) 

325 

326 with self.assertRaisesRegex(TypeError, "ordering is not supported between"): 

327 record1 < (1, 2, 3) 

328 

329 

330if __name__ == "__main__": 

331 unittest.main()