11# Copyright The IETF Trust 2026, All Rights Reserved
2+
23from unittest import mock
34
45from django .utils import timezone
@@ -35,8 +36,21 @@ def test_create(self):
3536 serializer .save ()
3637
3738 @mock .patch ("ietf.api.serializers_rpc.update_rfc_searchindex_task" )
38- def test_update (self , mock_update_searchindex_task ):
39+ @mock .patch ("ietf.api.serializers_rpc.trigger_red_precomputer_task" )
40+ def test_update (self , mock_trigger_red_task , mock_update_searchindex_task ):
41+ updates = WgRfcFactory .create_batch (2 )
42+ obsoletes = WgRfcFactory .create_batch (2 )
3943 rfc = WgRfcFactory (pages = 10 )
44+ updated_by = WgRfcFactory .create_batch (2 )
45+ obsoleted_by = WgRfcFactory .create_batch (2 )
46+ for d in updates :
47+ rfc .relateddocument_set .create (relationship_id = "updates" ,target = d )
48+ for d in obsoletes :
49+ rfc .relateddocument_set .create (relationship_id = "updates" ,target = d )
50+ for d in updated_by :
51+ d .relateddocument_set .create (relationship_id = "updates" ,target = rfc )
52+ for d in obsoleted_by :
53+ d .relateddocument_set .create (relationship_id = "updates" ,target = rfc )
4054 serializer = EditableRfcSerializer (
4155 instance = rfc ,
4256 data = {
@@ -59,11 +73,6 @@ def test_update(self, mock_update_searchindex_task):
5973 )
6074 self .assertTrue (serializer .is_valid ())
6175 result = serializer .save ()
62- self .assertTrue (mock_update_searchindex_task .delay .called )
63- self .assertEqual (
64- mock_update_searchindex_task .delay .call_args ,
65- mock .call (rfc .rfc_number ),
66- )
6776 result .refresh_from_db ()
6877 self .assertEqual (result .title , "Yadda yadda yadda" )
6978 self .assertEqual (
@@ -91,12 +100,42 @@ def test_update(self, mock_update_searchindex_task):
91100 result .part_of (),
92101 [Document .objects .get (name = "fyi999" )],
93102 )
103+ # Confirm that red precomputer was triggered correctly
104+ self .assertTrue (mock_trigger_red_task .delay .called )
105+ _ , mock_kwargs = mock_trigger_red_task .delay .call_args
106+ self .assertIn ("rfc_number_list" , mock_kwargs )
107+ expected_numbers = sorted (
108+ [
109+ d .rfc_number
110+ for d in [rfc ] + updates + obsoletes + updated_by + obsoleted_by
111+ ]
112+ )
113+ self .assertEqual (mock_kwargs ["rfc_number_list" ], expected_numbers )
114+ # Confirm that the search index update task was triggered correctly
115+ self .assertTrue (mock_update_searchindex_task .delay .called )
116+ self .assertEqual (
117+ mock_update_searchindex_task .delay .call_args ,
118+ mock .call (rfc .rfc_number ),
119+ )
94120
95121 @mock .patch ("ietf.api.serializers_rpc.update_rfc_searchindex_task" )
96- def test_partial_update (self , mock_update_searchindex_task ):
122+ @mock .patch ("ietf.api.serializers_rpc.trigger_red_precomputer_task" )
123+ def test_partial_update (self , mock_trigger_red_task , mock_update_searchindex_task ):
97124 # We could test other permutations of fields, but authors is a partial update
98125 # we know we are going to use, so verifying that one in particular.
126+ updates = WgRfcFactory .create_batch (2 )
127+ obsoletes = WgRfcFactory .create_batch (2 )
99128 rfc = WgRfcFactory (pages = 10 , abstract = "do or do not" , title = "padawan" )
129+ updated_by = WgRfcFactory .create_batch (2 )
130+ obsoleted_by = WgRfcFactory .create_batch (2 )
131+ for d in updates :
132+ rfc .relateddocument_set .create (relationship_id = "updates" ,target = d )
133+ for d in obsoletes :
134+ rfc .relateddocument_set .create (relationship_id = "updates" ,target = d )
135+ for d in updated_by :
136+ d .relateddocument_set .create (relationship_id = "updates" ,target = rfc )
137+ for d in obsoleted_by :
138+ d .relateddocument_set .create (relationship_id = "updates" ,target = rfc )
100139 serializer = EditableRfcSerializer (
101140 partial = True ,
102141 instance = rfc ,
@@ -113,11 +152,6 @@ def test_partial_update(self, mock_update_searchindex_task):
113152 )
114153 self .assertTrue (serializer .is_valid ())
115154 result = serializer .save ()
116- self .assertTrue (mock_update_searchindex_task .delay .called )
117- self .assertEqual (
118- mock_update_searchindex_task .delay .call_args ,
119- mock .call (rfc .rfc_number ),
120- )
121155 result .refresh_from_db ()
122156 self .assertEqual (rfc .title , "padawan" )
123157 self .assertEqual (
@@ -140,8 +174,27 @@ def test_partial_update(self, mock_update_searchindex_task):
140174 self .assertEqual (result .pages , 10 )
141175 self .assertEqual (result .std_level_id , "ps" )
142176 self .assertEqual (result .part_of (), [])
177+ # Confirm that the red precomputer was triggered correctly
178+ self .assertTrue (mock_trigger_red_task .delay .called )
179+ _ , mock_kwargs = mock_trigger_red_task .delay .call_args
180+ self .assertIn ("rfc_number_list" , mock_kwargs )
181+ expected_numbers = sorted (
182+ [
183+ d .rfc_number
184+ for d in [rfc ] + updates + obsoletes + updated_by + obsoleted_by
185+ ]
186+ )
187+ self .assertEqual (mock_kwargs ["rfc_number_list" ], expected_numbers )
188+ # Confirm that the search index update task was called correctly
189+ self .assertTrue (mock_update_searchindex_task .delay .called )
190+ self .assertEqual (
191+ mock_update_searchindex_task .delay .call_args ,
192+ mock .call (rfc .rfc_number ),
193+ )
143194
144195 # Test only a field on the Document itself to be sure that it works
196+ mock_trigger_red_task .delay .reset_mock ()
197+ mock_update_searchindex_task .delay .reset_mock ()
145198 serializer = EditableRfcSerializer (
146199 partial = True ,
147200 instance = rfc ,
@@ -151,3 +204,14 @@ def test_partial_update(self, mock_update_searchindex_task):
151204 result = serializer .save ()
152205 result .refresh_from_db ()
153206 self .assertEqual (rfc .title , "jedi master" )
207+ # Confirm that the red precomputer was triggered correctly
208+ self .assertTrue (mock_trigger_red_task .delay .called )
209+ _ , mock_kwargs = mock_trigger_red_task .delay .call_args
210+ self .assertIn ("rfc_number_list" , mock_kwargs )
211+ self .assertEqual (mock_kwargs ["rfc_number_list" ], expected_numbers )
212+ # Confirm that the search index update task was called correctly
213+ self .assertTrue (mock_update_searchindex_task .delay .called )
214+ self .assertEqual (
215+ mock_update_searchindex_task .delay .call_args ,
216+ mock .call (rfc .rfc_number ),
217+ )
0 commit comments