11import { fireEvent , render , screen , waitFor , within } from "@testing-library/react" ;
22import userEvent from "@testing-library/user-event" ;
3+ import type { ComponentProps } from "react" ;
34import { afterEach , describe , expect , it , vi } from "vitest" ;
45import { ObjectiveDialogContent } from "./objective-dialog-content" ;
56
@@ -26,65 +27,55 @@ afterEach(() => {
2627 delete ( window as typeof window & { matchMedia ?: typeof window . matchMedia } ) . matchMedia ;
2728} ) ;
2829
30+ type ObjectiveDialogContentProps = ComponentProps < typeof ObjectiveDialogContent > ;
31+
32+ function createObjectiveDialogContentProps (
33+ overrides : Partial < ObjectiveDialogContentProps > = { }
34+ ) : ObjectiveDialogContentProps {
35+ return {
36+ mode : "enable" ,
37+ draftObjective : "Investigate regressions" ,
38+ draftEvaluatorProviderId : "claude" ,
39+ draftEvaluatorModel : "" ,
40+ draftMaxSupervisionCount : "0" ,
41+ draftScheduledAt : "" ,
42+ isMaxSupervisionCountValid : true ,
43+ disableObjective : "" ,
44+ onDraftObjectiveChange : vi . fn ( ) ,
45+ onDraftEvaluatorProviderChange : vi . fn ( ) ,
46+ onDraftEvaluatorModelChange : vi . fn ( ) ,
47+ onDraftMaxSupervisionCountChange : vi . fn ( ) ,
48+ onDraftScheduledAtChange : vi . fn ( ) ,
49+ ...overrides ,
50+ } ;
51+ }
52+
53+ function renderObjectiveDialogContent ( overrides : Partial < ObjectiveDialogContentProps > = { } ) {
54+ return render ( < ObjectiveDialogContent { ...createObjectiveDialogContentProps ( overrides ) } /> ) ;
55+ }
56+
2957describe ( "ObjectiveDialogContent" , ( ) => {
30- it ( "does not render the supervisor intro strip by default for enable and edit modes" , ( ) => {
31- const { rerender } = render (
32- < ObjectiveDialogContent
33- mode = "enable"
34- draftObjective = "Investigate regressions"
35- draftEvaluatorProviderId = "claude"
36- draftEvaluatorModel = ""
37- draftMaxSupervisionCount = "0"
38- draftScheduledAt = ""
39- disableObjective = ""
40- onDraftObjectiveChange = { vi . fn ( ) }
41- onDraftEvaluatorProviderChange = { vi . fn ( ) }
42- onDraftEvaluatorModelChange = { vi . fn ( ) }
43- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
44- onDraftScheduledAtChange = { vi . fn ( ) }
45- />
58+ it ( "renders the max supervision count field as valid by default in shared-content tests" , ( ) => {
59+ renderObjectiveDialogContent ( ) ;
60+
61+ expect ( screen . getByLabelText ( "supervisor.field.max_supervision_count" ) ) . toHaveAttribute (
62+ "aria-invalid" ,
63+ "false"
4664 ) ;
65+ } ) ;
66+
67+ it ( "does not render the supervisor intro strip by default for enable and edit modes" , ( ) => {
68+ const { rerender } = renderObjectiveDialogContent ( ) ;
4769
4870 expect ( document . querySelector ( ".supervisor-dialog-intro" ) ) . toBeNull ( ) ;
4971
50- rerender (
51- < ObjectiveDialogContent
52- mode = "edit"
53- draftObjective = "Investigate regressions"
54- draftEvaluatorProviderId = "claude"
55- draftEvaluatorModel = ""
56- draftMaxSupervisionCount = "0"
57- draftScheduledAt = ""
58- disableObjective = ""
59- onDraftObjectiveChange = { vi . fn ( ) }
60- onDraftEvaluatorProviderChange = { vi . fn ( ) }
61- onDraftEvaluatorModelChange = { vi . fn ( ) }
62- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
63- onDraftScheduledAtChange = { vi . fn ( ) }
64- />
65- ) ;
72+ rerender ( < ObjectiveDialogContent { ...createObjectiveDialogContentProps ( { mode : "edit" } ) } /> ) ;
6673
6774 expect ( document . querySelector ( ".supervisor-dialog-intro" ) ) . toBeNull ( ) ;
6875 } ) ;
6976
7077 it ( "renders a flat supervisor intro strip when showIntro is true for enable and edit modes" , ( ) => {
71- const { rerender } = render (
72- < ObjectiveDialogContent
73- mode = "enable"
74- showIntro
75- draftObjective = "Investigate regressions"
76- draftEvaluatorProviderId = "claude"
77- draftEvaluatorModel = ""
78- draftMaxSupervisionCount = "0"
79- draftScheduledAt = ""
80- disableObjective = ""
81- onDraftObjectiveChange = { vi . fn ( ) }
82- onDraftEvaluatorProviderChange = { vi . fn ( ) }
83- onDraftEvaluatorModelChange = { vi . fn ( ) }
84- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
85- onDraftScheduledAtChange = { vi . fn ( ) }
86- />
87- ) ;
78+ const { rerender } = renderObjectiveDialogContent ( { showIntro : true } ) ;
8879
8980 let intro = document . querySelector ( ".supervisor-dialog-intro" ) ;
9081 let introIcon = document . querySelector ( ".supervisor-dialog-intro__icon" ) ;
@@ -109,19 +100,7 @@ describe("ObjectiveDialogContent", () => {
109100
110101 rerender (
111102 < ObjectiveDialogContent
112- mode = "edit"
113- showIntro
114- draftObjective = "Investigate regressions"
115- draftEvaluatorProviderId = "claude"
116- draftEvaluatorModel = ""
117- draftMaxSupervisionCount = "0"
118- draftScheduledAt = ""
119- disableObjective = ""
120- onDraftObjectiveChange = { vi . fn ( ) }
121- onDraftEvaluatorProviderChange = { vi . fn ( ) }
122- onDraftEvaluatorModelChange = { vi . fn ( ) }
123- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
124- onDraftScheduledAtChange = { vi . fn ( ) }
103+ { ...createObjectiveDialogContentProps ( { mode : "edit" , showIntro : true } ) }
125104 />
126105 ) ;
127106
@@ -148,22 +127,11 @@ describe("ObjectiveDialogContent", () => {
148127 } ) ;
149128
150129 it ( "renders compact control classes instead of large form controls" , ( ) => {
151- render (
152- < ObjectiveDialogContent
153- mode = "edit"
154- draftObjective = "Investigate regressions"
155- draftEvaluatorProviderId = "claude"
156- draftEvaluatorModel = "sonnet"
157- draftMaxSupervisionCount = "3"
158- draftScheduledAt = ""
159- disableObjective = ""
160- onDraftObjectiveChange = { vi . fn ( ) }
161- onDraftEvaluatorProviderChange = { vi . fn ( ) }
162- onDraftEvaluatorModelChange = { vi . fn ( ) }
163- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
164- onDraftScheduledAtChange = { vi . fn ( ) }
165- />
166- ) ;
130+ renderObjectiveDialogContent ( {
131+ mode : "edit" ,
132+ draftEvaluatorModel : "sonnet" ,
133+ draftMaxSupervisionCount : "3" ,
134+ } ) ;
167135
168136 const textarea = screen . getByLabelText ( "supervisor.field.objective" ) ;
169137 expect ( textarea ) . toHaveClass ( "input" , "textarea" ) ;
@@ -203,22 +171,11 @@ describe("ObjectiveDialogContent", () => {
203171 it ( "keeps objective editing behavior unchanged" , ( ) => {
204172 const onDraftObjectiveChange = vi . fn ( ) ;
205173
206- render (
207- < ObjectiveDialogContent
208- mode = "enable"
209- draftObjective = ""
210- draftEvaluatorProviderId = "heuristic"
211- draftEvaluatorModel = ""
212- draftMaxSupervisionCount = "0"
213- draftScheduledAt = ""
214- disableObjective = ""
215- onDraftObjectiveChange = { onDraftObjectiveChange }
216- onDraftEvaluatorProviderChange = { vi . fn ( ) }
217- onDraftEvaluatorModelChange = { vi . fn ( ) }
218- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
219- onDraftScheduledAtChange = { vi . fn ( ) }
220- />
221- ) ;
174+ renderObjectiveDialogContent ( {
175+ draftObjective : "" ,
176+ draftEvaluatorProviderId : "heuristic" ,
177+ onDraftObjectiveChange,
178+ } ) ;
222179
223180 const textarea = screen . getByLabelText ( "supervisor.field.objective" ) ;
224181 fireEvent . change ( textarea , { target : { value : "Ship a safe rollout plan" } } ) ;
@@ -231,22 +188,10 @@ describe("ObjectiveDialogContent", () => {
231188 const user = userEvent . setup ( ) ;
232189 const onDraftEvaluatorProviderChange = vi . fn ( ) ;
233190
234- render (
235- < ObjectiveDialogContent
236- mode = "enable"
237- draftObjective = ""
238- draftEvaluatorProviderId = "claude"
239- draftEvaluatorModel = ""
240- draftMaxSupervisionCount = "0"
241- draftScheduledAt = ""
242- disableObjective = ""
243- onDraftObjectiveChange = { vi . fn ( ) }
244- onDraftEvaluatorProviderChange = { onDraftEvaluatorProviderChange }
245- onDraftEvaluatorModelChange = { vi . fn ( ) }
246- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
247- onDraftScheduledAtChange = { vi . fn ( ) }
248- />
249- ) ;
191+ renderObjectiveDialogContent ( {
192+ draftObjective : "" ,
193+ onDraftEvaluatorProviderChange,
194+ } ) ;
250195
251196 await user . click ( screen . getByRole ( "button" , { name : "supervisor.field.evaluator Claude" } ) ) ;
252197
@@ -268,22 +213,11 @@ describe("ObjectiveDialogContent", () => {
268213 ( query ) => query . includes ( "max-width: 899px" ) || query . includes ( "pointer: coarse" )
269214 ) ;
270215
271- render (
272- < ObjectiveDialogContent
273- mode = "enable"
274- draftObjective = ""
275- draftEvaluatorProviderId = "codex"
276- draftEvaluatorModel = ""
277- draftMaxSupervisionCount = "0"
278- draftScheduledAt = ""
279- disableObjective = ""
280- onDraftObjectiveChange = { vi . fn ( ) }
281- onDraftEvaluatorProviderChange = { onDraftEvaluatorProviderChange }
282- onDraftEvaluatorModelChange = { vi . fn ( ) }
283- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
284- onDraftScheduledAtChange = { vi . fn ( ) }
285- />
286- ) ;
216+ renderObjectiveDialogContent ( {
217+ draftObjective : "" ,
218+ draftEvaluatorProviderId : "codex" ,
219+ onDraftEvaluatorProviderChange,
220+ } ) ;
287221
288222 const trigger = screen . getByRole ( "button" , {
289223 name : "supervisor.field.evaluator Codex" ,
@@ -310,22 +244,16 @@ describe("ObjectiveDialogContent", () => {
310244 const onDraftMaxSupervisionCountChange = vi . fn ( ) ;
311245 const onDraftScheduledAtChange = vi . fn ( ) ;
312246
313- render (
314- < ObjectiveDialogContent
315- mode = "enable"
316- draftObjective = ""
317- draftEvaluatorProviderId = "codex"
318- draftEvaluatorModel = "o3"
319- draftMaxSupervisionCount = "5"
320- draftScheduledAt = "2026-05-11T03:00"
321- disableObjective = ""
322- onDraftObjectiveChange = { vi . fn ( ) }
323- onDraftEvaluatorProviderChange = { vi . fn ( ) }
324- onDraftEvaluatorModelChange = { onDraftEvaluatorModelChange }
325- onDraftMaxSupervisionCountChange = { onDraftMaxSupervisionCountChange }
326- onDraftScheduledAtChange = { onDraftScheduledAtChange }
327- />
328- ) ;
247+ renderObjectiveDialogContent ( {
248+ draftObjective : "" ,
249+ draftEvaluatorProviderId : "codex" ,
250+ draftEvaluatorModel : "o3" ,
251+ draftMaxSupervisionCount : "5" ,
252+ draftScheduledAt : "2026-05-11T03:00" ,
253+ onDraftEvaluatorModelChange,
254+ onDraftMaxSupervisionCountChange,
255+ onDraftScheduledAtChange,
256+ } ) ;
329257
330258 fireEvent . change ( screen . getByLabelText ( "supervisor.field.evaluator_model" ) , {
331259 target : { value : "gpt-5" } ,
@@ -339,23 +267,13 @@ describe("ObjectiveDialogContent", () => {
339267 } ) ;
340268
341269 it ( "renders the semantic warning icon for disable mode" , ( ) => {
342- render (
343- < ObjectiveDialogContent
344- mode = "disable"
345- showIntro
346- draftObjective = ""
347- draftEvaluatorProviderId = "codex"
348- draftEvaluatorModel = ""
349- draftMaxSupervisionCount = "0"
350- draftScheduledAt = ""
351- disableObjective = "Current objective"
352- onDraftObjectiveChange = { vi . fn ( ) }
353- onDraftEvaluatorProviderChange = { vi . fn ( ) }
354- onDraftEvaluatorModelChange = { vi . fn ( ) }
355- onDraftMaxSupervisionCountChange = { vi . fn ( ) }
356- onDraftScheduledAtChange = { vi . fn ( ) }
357- />
358- ) ;
270+ renderObjectiveDialogContent ( {
271+ mode : "disable" ,
272+ showIntro : true ,
273+ draftObjective : "" ,
274+ draftEvaluatorProviderId : "codex" ,
275+ disableObjective : "Current objective" ,
276+ } ) ;
359277
360278 expect ( document . querySelector ( ".supervisor-dialog-intro" ) ) . toBeNull ( ) ;
361279 expect (
0 commit comments