1717
1818# Import functions from the notify-slack script
1919sys .path .insert (0 , os .path .join (os .path .dirname (__file__ ), '../../bin' ))
20- notify_slack = SourceFileLoader ('notify_slack' , 'bin/mas-devops-notify-slack' ).load_module ()
20+ script_path = os .path .join (os .path .dirname (__file__ ), '../../bin/mas-devops-notify-slack' )
21+ notify_slack = SourceFileLoader ('notify_slack' , script_path ).load_module ()
2122
2223
2324def testSendMessage ():
@@ -242,7 +243,14 @@ def test_notifyProvisionRoks_missing_url():
242243@patch .object (SlackUtil , 'updateThreadConfigMap' )
243244def test_notifyPipelineStart_new_thread (mock_update , mock_create , mock_post , mock_get ):
244245 """Test notifyPipelineStart creates new thread when none exists"""
245- mock_get .return_value = None
246+ # First call returns None, second call returns the created thread info
247+ thread_info = {
248+ 'instanceId' : 'test-instance' ,
249+ 'channel_0' : 'C123' ,
250+ 'threadId_0' : '1234567890.123456' ,
251+ 'channel_count' : '1'
252+ }
253+ mock_get .side_effect = [None , thread_info ]
246254 mock_response = Mock ()
247255 mock_response .data = {'ok' : True , 'channel' : 'C123' , 'ts' : '1234567890.123456' }
248256 mock_response .__getitem__ = lambda self , key : mock_response .data [key ] if key in ['ts' , 'channel' ] else None
@@ -251,6 +259,7 @@ def test_notifyPipelineStart_new_thread(mock_update, mock_create, mock_post, moc
251259 result = notify_slack .notifyPipelineStart (['#test-channel' ], 'test-instance' , 'Install' )
252260
253261 assert result is not None
262+ assert result == thread_info
254263 mock_post .assert_called_once ()
255264 mock_create .assert_called_once ()
256265 mock_update .assert_called_once ()
@@ -292,7 +301,16 @@ def test_notifyPipelineStart_empty_instance_id():
292301@patch .object (SlackUtil , 'updateThreadConfigMap' )
293302def test_notifyPipelineStart_multiple_channels (mock_update , mock_create , mock_post , mock_get ):
294303 """Test notifyPipelineStart with multiple channels"""
295- mock_get .return_value = None
304+ # First call returns None, second call returns the created thread info
305+ thread_info = {
306+ 'instanceId' : 'test-instance' ,
307+ 'channel_0' : 'C123' ,
308+ 'threadId_0' : '1234567890.123456' ,
309+ 'channel_1' : 'C456' ,
310+ 'threadId_1' : '1234567890.123457' ,
311+ 'channel_count' : '2'
312+ }
313+ mock_get .side_effect = [None , thread_info ]
296314 mock_response1 = Mock ()
297315 mock_response1 .data = {'ok' : True , 'channel' : 'C123' , 'ts' : '1234567890.123456' }
298316 mock_response1 .__getitem__ = lambda self , key : mock_response1 .data [key ] if key in ['ts' , 'channel' ] else None
@@ -332,27 +350,37 @@ def test_notifyAnsibleStart_success(mock_update, mock_post, mock_get):
332350 mock_update .assert_called_once ()
333351
334352
335- @patch ('bin.mas-devops-notify-slack.notifyPipelineStart' )
336353@patch .object (SlackUtil , 'getThreadConfigMap' )
337354@patch .object (SlackUtil , 'postMessageBlocks' )
338355@patch .object (SlackUtil , 'updateThreadConfigMap' )
339- def test_notifyAnsibleStart_creates_thread_if_missing (mock_update , mock_post , mock_get , mock_pipeline_start ):
356+ def test_notifyAnsibleStart_creates_thread_if_missing (mock_update , mock_post , mock_get ):
340357 """Test notifyAnsibleStart creates pipeline thread if it doesn't exist"""
341- mock_get .return_value = None
342- mock_pipeline_start .return_value = {
358+ # First call returns None (no thread), second call returns None (checking again in notifyPipelineStart),
359+ # third call returns thread info (after creation), fourth call returns thread info (for ansible start)
360+ thread_info = {
343361 'instanceId' : 'test-instance' ,
344362 'channel_0' : 'C123' ,
345363 'threadId_0' : '1234567890.123456' ,
346364 'channel_count' : '1'
347365 }
348- mock_response = Mock ()
349- mock_response .data = {'ok' : True , 'ts' : '1234567890.123457' }
350- mock_post .return_value = mock_response
366+ mock_get .side_effect = [None , None , thread_info , thread_info ]
351367
352- result = notify_slack .notifyAnsibleStart (['#test-channel' ], 'install-mas' , 'test-instance' , 'Install' )
368+ # Mock for notifyPipelineStart's postMessageBlocks call
369+ mock_pipeline_response = Mock ()
370+ mock_pipeline_response .data = {'ok' : True , 'channel' : 'C123' , 'ts' : '1234567890.123456' }
371+ mock_pipeline_response .__getitem__ = lambda self , key : mock_pipeline_response .data [key ] if key in ['ts' , 'channel' ] else None
372+
373+ # Mock for notifyAnsibleStart's postMessageBlocks call
374+ mock_task_response = Mock ()
375+ mock_task_response .data = {'ok' : True , 'ts' : '1234567890.123457' }
376+
377+ mock_post .side_effect = [mock_pipeline_response , mock_task_response ]
378+
379+ with patch .object (SlackUtil , 'createThreadConfigMap' ):
380+ result = notify_slack .notifyAnsibleStart (['#test-channel' ], 'install-mas' , 'test-instance' , 'Install' )
353381
354382 assert result is True
355- mock_pipeline_start . assert_called_once ()
383+ assert mock_post . call_count == 2 # Once for pipeline start, once for task start
356384
357385
358386def test_notifyAnsibleStart_missing_instance_id ():
@@ -447,26 +475,36 @@ def test_notifyAnsibleComplete_missing_instance_id():
447475 assert exc_info .value .code == 1
448476
449477
450- @patch ('bin.mas-devops-notify-slack.notifyPipelineStart' )
451478@patch .object (SlackUtil , 'getThreadConfigMap' )
452479@patch .object (SlackUtil , 'postMessageBlocks' )
453- def test_notifyAnsibleComplete_creates_thread_if_missing (mock_post , mock_get , mock_pipeline_start ):
480+ def test_notifyAnsibleComplete_creates_thread_if_missing (mock_post , mock_get ):
454481 """Test notifyAnsibleComplete creates pipeline thread if it doesn't exist"""
455- mock_get .return_value = None
456- mock_pipeline_start .return_value = {
482+ # First call returns None (no thread), second call returns None (checking again in notifyPipelineStart),
483+ # third call returns thread info (after creation), fourth call returns thread info (for ansible complete)
484+ thread_info = {
457485 'instanceId' : 'test-instance' ,
458486 'channel_0' : 'C123' ,
459487 'threadId_0' : '1234567890.123456' ,
460488 'channel_count' : '1'
461489 }
462- mock_response = Mock ()
463- mock_response .data = {'ok' : True }
464- mock_post .return_value = mock_response
490+ mock_get .side_effect = [None , None , thread_info , thread_info ]
465491
466- result = notify_slack .notifyAnsibleComplete (['#test-channel' ], 0 , 'install-mas' , 'test-instance' , 'Install' )
492+ # Mock for notifyPipelineStart's postMessageBlocks call
493+ mock_pipeline_response = Mock ()
494+ mock_pipeline_response .data = {'ok' : True , 'channel' : 'C123' , 'ts' : '1234567890.123456' }
495+ mock_pipeline_response .__getitem__ = lambda self , key : mock_pipeline_response .data [key ] if key in ['ts' , 'channel' ] else None
496+
497+ # Mock for notifyAnsibleComplete's postMessageBlocks call
498+ mock_complete_response = Mock ()
499+ mock_complete_response .data = {'ok' : True }
500+
501+ mock_post .side_effect = [mock_pipeline_response , mock_complete_response ]
502+
503+ with patch .object (SlackUtil , 'createThreadConfigMap' ), patch .object (SlackUtil , 'updateThreadConfigMap' ):
504+ result = notify_slack .notifyAnsibleComplete (['#test-channel' ], 0 , 'install-mas' , 'test-instance' , 'Install' )
467505
468506 assert result is True
469- mock_pipeline_start . assert_called_once ()
507+ assert mock_post . call_count == 2 # Once for pipeline start, once for task complete
470508
471509
472510# Tests for notifyPipelineComplete function
@@ -586,7 +624,6 @@ def test_notifyPipelineComplete_with_duration(mock_delete, mock_post, mock_get):
586624 result = notify_slack .notifyPipelineComplete (['#test-channel' ], 0 , 'test-instance' , 'Install' )
587625
588626 assert result is True
589- # Verify that the message includes duration text
590- call_args = mock_post .call_args [0 ][1 ]
591- message_text = call_args [1 ]['text' ]['text' ]
592- assert 'Duration' in message_text or 'duration' in message_text .lower ()
627+ # Verify that postMessageBlocks was called
628+ mock_post .assert_called_once ()
629+ mock_delete .assert_called_once ()
0 commit comments