@@ -2,13 +2,16 @@ import { describe, expect, it } from "vitest";
22
33import {
44 getTaskActions ,
5- getTaskUIState ,
5+ isStableTask ,
66 type Task ,
77 type TaskActions ,
8- type TaskUIState ,
98} from "@repo/shared" ;
109
11- import { minimalTask as task , taskState as state } from "../../../mocks/tasks" ;
10+ import {
11+ minimalTask as task ,
12+ task as fullTask ,
13+ taskState as state ,
14+ } from "../../../mocks/tasks" ;
1215
1316describe ( "getTaskActions" , ( ) => {
1417 interface TaskActionsTestCase {
@@ -20,136 +23,79 @@ describe("getTaskActions", () => {
2023 {
2124 name : "no workspace" ,
2225 overrides : { } ,
23- expected : { canPause : false , canResume : false } ,
26+ expected : { canPause : false , pauseDisabled : false , canResume : false } ,
2427 } ,
2528 {
26- name : "running workspace " ,
27- overrides : { workspace_id : "ws" , workspace_status : "running " } ,
28- expected : { canPause : true , canResume : false } ,
29+ name : "active task " ,
30+ overrides : { workspace_id : "ws" , status : "active " } ,
31+ expected : { canPause : true , pauseDisabled : false , canResume : false } ,
2932 } ,
3033 {
31- name : "stopped workspace " ,
32- overrides : { workspace_id : "ws" , workspace_status : "stopped " } ,
33- expected : { canPause : false , canResume : true } ,
34+ name : "paused task " ,
35+ overrides : { workspace_id : "ws" , status : "paused " } ,
36+ expected : { canPause : false , pauseDisabled : false , canResume : true } ,
3437 } ,
3538 {
36- name : "failed workspace " ,
37- overrides : { workspace_id : "ws" , workspace_status : "failed " } ,
38- expected : { canPause : false , canResume : true } ,
39+ name : "error task (both actions available) " ,
40+ overrides : { workspace_id : "ws" , status : "error " } ,
41+ expected : { canPause : true , pauseDisabled : false , canResume : true } ,
3942 } ,
4043 {
41- name : "canceled workspace " ,
42- overrides : { workspace_id : "ws" , workspace_status : "canceled " } ,
43- expected : { canPause : false , canResume : true } ,
44+ name : "unknown task (both actions available) " ,
45+ overrides : { workspace_id : "ws" , status : "unknown " } ,
46+ expected : { canPause : true , pauseDisabled : false , canResume : true } ,
4447 } ,
4548 {
46- name : "starting workspace " ,
47- overrides : { workspace_id : "ws" , workspace_status : "starting " } ,
48- expected : { canPause : false , canResume : false } ,
49+ name : "initializing task (pause disabled) " ,
50+ overrides : { workspace_id : "ws" , status : "initializing " } ,
51+ expected : { canPause : true , pauseDisabled : true , canResume : false } ,
4952 } ,
5053 {
51- name : "pending workspace " ,
52- overrides : { workspace_id : "ws" , workspace_status : "pending" } ,
53- expected : { canPause : false , canResume : false } ,
54+ name : "pending task (pause disabled) " ,
55+ overrides : { workspace_id : "ws" , status : "pending" } ,
56+ expected : { canPause : true , pauseDisabled : true , canResume : false } ,
5457 } ,
5558 {
56- name : "workspace_id null with running status" ,
57- overrides : { workspace_id : null , workspace_status : "running " } ,
58- expected : { canPause : false , canResume : false } ,
59+ name : "no workspace ignores task status" ,
60+ overrides : { workspace_id : null , status : "active " } ,
61+ expected : { canPause : false , pauseDisabled : false , canResume : false } ,
5962 } ,
6063 ] ) ( "$name" , ( { overrides, expected } ) => {
6164 expect ( getTaskActions ( task ( overrides ) ) ) . toEqual ( expected ) ;
6265 } ) ;
6366} ) ;
6467
65- describe ( "getTaskUIState" , ( ) => {
66- interface TaskUIStateTestCase {
67- name : string ;
68- overrides : Partial < Task > ;
69- expected : TaskUIState ;
70- }
71- it . each < TaskUIStateTestCase > ( [
72- // Error states (highest priority)
73- {
74- name : "task status error" ,
75- overrides : { status : "error" } ,
76- expected : "error" ,
77- } ,
78- {
79- name : "task state failed" ,
80- overrides : { current_state : state ( "failed" ) } ,
81- expected : "error" ,
82- } ,
83- {
84- name : "error takes priority over paused" ,
85- overrides : { status : "error" , workspace_status : "stopped" } ,
86- expected : "error" ,
87- } ,
88-
89- // Paused states
68+ describe ( "isStableTask" , ( ) => {
69+ it . each < { name : string ; overrides : Partial < Task > ; expected : boolean } > ( [
70+ { name : "error status" , overrides : { status : "error" } , expected : true } ,
71+ { name : "paused status" , overrides : { status : "paused" } , expected : true } ,
9072 {
91- name : "stopped workspace" ,
92- overrides : { workspace_status : "stopped" } ,
93- expected : "paused" ,
94- } ,
95- {
96- name : "stopping workspace" ,
97- overrides : { workspace_status : "stopping" } ,
98- expected : "paused" ,
99- } ,
100- {
101- name : "canceled workspace" ,
102- overrides : { workspace_status : "canceled" } ,
103- expected : "paused" ,
104- } ,
105-
106- // Initializing states
107- {
108- name : "starting workspace" ,
109- overrides : { workspace_status : "starting" } ,
110- expected : "initializing" ,
111- } ,
112- {
113- name : "pending workspace" ,
114- overrides : { workspace_status : "pending" } ,
115- expected : "initializing" ,
73+ name : "complete state" ,
74+ overrides : { current_state : state ( "complete" ) } ,
75+ expected : true ,
11676 } ,
117-
118- // Active states
77+ { name : "active status" , overrides : { status : "active" } , expected : false } ,
11978 {
120- name : "working state" ,
121- overrides : {
122- status : "active" ,
123- workspace_status : "running" ,
124- current_state : state ( "working" ) ,
125- } ,
126- expected : "working" ,
79+ name : "active with working state" ,
80+ overrides : { status : "active" , current_state : state ( "working" ) } ,
81+ expected : false ,
12782 } ,
12883 {
129- name : "idle state" ,
130- overrides : {
131- status : "active" ,
132- workspace_status : "running" ,
133- current_state : state ( "idle" ) ,
134- } ,
135- expected : "idle" ,
84+ name : "initializing status" ,
85+ overrides : { status : "initializing" } ,
86+ expected : false ,
13687 } ,
137-
138- // Complete state
13988 {
140- name : "complete state " ,
141- overrides : { current_state : state ( "complete" ) } ,
142- expected : "complete" ,
89+ name : "pending status " ,
90+ overrides : { status : "pending" } ,
91+ expected : false ,
14392 } ,
144-
145- // Default fallback
146- { name : "no workspace or state" , overrides : { } , expected : "idle" } ,
14793 {
148- name : "running but no state " ,
149- overrides : { workspace_status : "running" , current_state : null } ,
150- expected : "idle" ,
94+ name : "unknown status " ,
95+ overrides : { status : "unknown" } ,
96+ expected : false ,
15197 } ,
15298 ] ) ( "$name → $expected" , ( { overrides, expected } ) => {
153- expect ( getTaskUIState ( task ( overrides ) ) ) . toBe ( expected ) ;
99+ expect ( isStableTask ( fullTask ( overrides ) ) ) . toBe ( expected ) ;
154100 } ) ;
155101} ) ;
0 commit comments