@@ -1008,16 +1008,26 @@ func TestTasksNotification(t *testing.T) {
10081008isNotificationSent :false ,
10091009taskPrompt :"NonNotifiedTransition" ,
10101010},
1011- // Should send TemplateTaskWorking when the AI task transitions to 'Working'.
1011+ // ShouldNOT send TemplateTaskWorking when the AI task's FIRST status is 'Working' (obvious state) .
10121012{
10131013name :"TemplateTaskWorking" ,
10141014latestAppStatuses :nil ,
10151015newAppStatus :codersdk .WorkspaceAppStatusStateWorking ,
10161016isAITask :true ,
1017- isNotificationSent :true ,
1017+ isNotificationSent :false ,
10181018notificationTemplate :notifications .TemplateTaskWorking ,
10191019taskPrompt :"TemplateTaskWorking" ,
10201020},
1021+ // Should send TemplateTaskIdle when the AI task's FIRST status is 'Idle' (task completed immediately).
1022+ {
1023+ name :"InitialTemplateTaskIdle" ,
1024+ latestAppStatuses :nil ,
1025+ newAppStatus :codersdk .WorkspaceAppStatusStateIdle ,
1026+ isAITask :true ,
1027+ isNotificationSent :true ,
1028+ notificationTemplate :notifications .TemplateTaskIdle ,
1029+ taskPrompt :"InitialTemplateTaskIdle" ,
1030+ },
10211031// Should send TemplateTaskWorking when the AI task transitions to 'Working' from 'Idle'.
10221032{
10231033name :"TemplateTaskWorkingFromIdle" ,
@@ -1051,6 +1061,64 @@ func TestTasksNotification(t *testing.T) {
10511061notificationTemplate :notifications .TemplateTaskIdle ,
10521062taskPrompt :"This is a very long task prompt that should be truncated to 160 characters. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." ,
10531063},
1064+ // Should send TemplateTaskCompleted when the AI task transitions to 'Complete'.
1065+ {
1066+ name :"TemplateTaskCompleted" ,
1067+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateWorking },
1068+ newAppStatus :codersdk .WorkspaceAppStatusStateComplete ,
1069+ isAITask :true ,
1070+ isNotificationSent :true ,
1071+ notificationTemplate :notifications .TemplateTaskCompleted ,
1072+ taskPrompt :"TemplateTaskCompleted" ,
1073+ },
1074+ // Should send TemplateTaskFailed when the AI task transitions to 'Failure'.
1075+ {
1076+ name :"TemplateTaskFailed" ,
1077+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateWorking },
1078+ newAppStatus :codersdk .WorkspaceAppStatusStateFailure ,
1079+ isAITask :true ,
1080+ isNotificationSent :true ,
1081+ notificationTemplate :notifications .TemplateTaskFailed ,
1082+ taskPrompt :"TemplateTaskFailed" ,
1083+ },
1084+ // Should send TemplateTaskCompleted when the AI task transitions from 'Idle' to 'Complete'.
1085+ {
1086+ name :"TemplateTaskCompletedFromIdle" ,
1087+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateIdle },
1088+ newAppStatus :codersdk .WorkspaceAppStatusStateComplete ,
1089+ isAITask :true ,
1090+ isNotificationSent :true ,
1091+ notificationTemplate :notifications .TemplateTaskCompleted ,
1092+ taskPrompt :"TemplateTaskCompletedFromIdle" ,
1093+ },
1094+ // Should send TemplateTaskFailed when the AI task transitions from 'Idle' to 'Failure'.
1095+ {
1096+ name :"TemplateTaskFailedFromIdle" ,
1097+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateIdle },
1098+ newAppStatus :codersdk .WorkspaceAppStatusStateFailure ,
1099+ isAITask :true ,
1100+ isNotificationSent :true ,
1101+ notificationTemplate :notifications .TemplateTaskFailed ,
1102+ taskPrompt :"TemplateTaskFailedFromIdle" ,
1103+ },
1104+ // Should NOT send notification when transitioning from 'Complete' to 'Complete' (no change).
1105+ {
1106+ name :"NoNotificationCompleteToComplete" ,
1107+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateComplete },
1108+ newAppStatus :codersdk .WorkspaceAppStatusStateComplete ,
1109+ isAITask :true ,
1110+ isNotificationSent :false ,
1111+ taskPrompt :"NoNotificationCompleteToComplete" ,
1112+ },
1113+ // Should NOT send notification when transitioning from 'Failure' to 'Failure' (no change).
1114+ {
1115+ name :"NoNotificationFailureToFailure" ,
1116+ latestAppStatuses : []codersdk.WorkspaceAppStatusState {codersdk .WorkspaceAppStatusStateFailure },
1117+ newAppStatus :codersdk .WorkspaceAppStatusStateFailure ,
1118+ isAITask :true ,
1119+ isNotificationSent :false ,
1120+ taskPrompt :"NoNotificationFailureToFailure" ,
1121+ },
10541122} {
10551123t .Run (tc .name ,func (t * testing.T ) {
10561124t .Parallel ()