@@ -3,6 +3,7 @@ import { act, fireEvent, render, screen, waitFor } from "@testing-library/react"
33import { beforeEach , describe , expect , it , vi } from "vitest"
44import { TemplateStorageContextProvider } from "../../context/TemplateStorageContext"
55import type { TemplateRecord } from "../../storage"
6+ import type { TemplateStorageProvider } from "../../storage/types"
67import { useEditorStore } from "../../store"
78import { SettingsModal } from "./SettingsModal"
89
@@ -31,36 +32,30 @@ function renderModal(opts: {
3132 data ?: TemplateRecord
3233 onClose ?: ( ) => void
3334 onSaved ?: ( r : TemplateRecord ) => void
34- onDeleted ?: ( ) => void
35- deleteTemplate ?: ( ( id : string ) => Promise < void > ) | undefined
36- // biome-ignore lint/suspicious/noExplicitAny: test stub
37- saveTemplate ?: ( r : any ) => Promise < TemplateRecord >
35+ onDeleteRequested ?: ( ( id : string ) => Promise < void > ) | undefined
36+ saveTemplate ?: ( r : unknown ) => Promise < TemplateRecord >
3837} ) {
3938 const data = opts . data ?? makeTemplate ( )
4039
41- const provider = {
40+ const provider : TemplateStorageProvider = {
4241 getProviderName : ( ) => "test" ,
4342 getCurrentUserSession : ( ) => ( { id : "u1" } ) ,
4443 listTemplates : async ( ) => [ ] ,
4544 getTemplate : async ( ) => data ,
46- // biome-ignore lint/suspicious/noExplicitAny: test stub
4745 saveTemplate :
48- opts . saveTemplate ?? ( async ( _r : any ) => makeTemplate ( { id : "saved" } ) ) ,
46+ opts . saveTemplate ??
47+ ( async ( _r : unknown ) => makeTemplate ( { id : "saved" } ) ) ,
4948 setTemplatePinned : vi . fn ( ) ,
50- ...( opts . deleteTemplate !== undefined
51- ? { deleteTemplate : opts . deleteTemplate }
52- : { } ) ,
5349 }
5450
5551 return render (
5652 < ChakraProvider >
57- { /* biome-ignore lint/suspicious/noExplicitAny: test stub */ }
58- < TemplateStorageContextProvider provider = { provider as any } >
53+ < TemplateStorageContextProvider provider = { provider } >
5954 < SettingsModal
6055 data = { data }
6156 onClose = { opts . onClose ?? vi . fn ( ) }
6257 onSaved = { opts . onSaved }
63- onDeleted = { opts . onDeleted }
58+ onDeleteRequested = { opts . onDeleteRequested }
6459 />
6560 </ TemplateStorageContextProvider >
6661 </ ChakraProvider > ,
@@ -77,22 +72,22 @@ describe("SettingsModal", () => {
7772 } )
7873
7974 describe ( "delete confirmation flow" , ( ) => {
80- it ( "does NOT call deleteTemplate immediately when Delete is clicked" , async ( ) => {
81- const deleteTemplate = vi . fn ( async ( ) => { } )
82- renderModal ( { deleteTemplate } )
75+ it ( "does NOT call onDeleteRequested immediately when Delete is clicked" , async ( ) => {
76+ const onDeleteRequested = vi . fn ( async ( ) => { } )
77+ renderModal ( { onDeleteRequested } )
8378
8479 expect ( await screen . findByText ( "Template Settings" ) ) . toBeTruthy ( )
8580
8681 act ( ( ) => {
8782 fireEvent . click ( screen . getByText ( "Delete" ) )
8883 } )
8984
90- // deleteTemplate must NOT have been called yet
91- expect ( deleteTemplate ) . not . toHaveBeenCalled ( )
85+ // onDeleteRequested must NOT have been called yet
86+ expect ( onDeleteRequested ) . not . toHaveBeenCalled ( )
9287 } )
9388
9489 it ( "shows the confirmation panel after clicking Delete" , async ( ) => {
95- renderModal ( { deleteTemplate : vi . fn ( async ( ) => { } ) } )
90+ renderModal ( { onDeleteRequested : vi . fn ( async ( ) => { } ) } )
9691
9792 expect ( await screen . findByText ( "Template Settings" ) ) . toBeTruthy ( )
9893
@@ -106,9 +101,9 @@ describe("SettingsModal", () => {
106101 expect ( screen . getByText ( "Yes, delete" ) ) . toBeTruthy ( )
107102 } )
108103
109- it ( "does NOT call deleteTemplate when confirmation is dismissed with Cancel" , async ( ) => {
110- const deleteTemplate = vi . fn ( async ( ) => { } )
111- renderModal ( { deleteTemplate } )
104+ it ( "does NOT call onDeleteRequested when confirmation is dismissed with Cancel" , async ( ) => {
105+ const onDeleteRequested = vi . fn ( async ( ) => { } )
106+ renderModal ( { onDeleteRequested } )
112107
113108 expect ( await screen . findByText ( "Template Settings" ) ) . toBeTruthy ( )
114109
@@ -126,16 +121,15 @@ describe("SettingsModal", () => {
126121
127122 // Panel should be gone
128123 expect ( screen . queryByText ( "Delete template?" ) ) . toBeNull ( )
129- // deleteTemplate still must not have been called
130- expect ( deleteTemplate ) . not . toHaveBeenCalled ( )
124+ // onDeleteRequested still must not have been called
125+ expect ( onDeleteRequested ) . not . toHaveBeenCalled ( )
131126 } )
132127
133- it ( "calls deleteTemplate only after clicking Yes, delete" , async ( ) => {
134- const deleteTemplate = vi . fn ( async ( ) => { } )
135- const onDeleted = vi . fn ( )
128+ it ( "calls onDeleteRequested only after clicking Yes, delete" , async ( ) => {
129+ const onDeleteRequested = vi . fn ( async ( ) => { } )
136130 const onClose = vi . fn ( )
137131
138- renderModal ( { deleteTemplate , onDeleted , onClose } )
132+ renderModal ( { onDeleteRequested , onClose } )
139133
140134 expect ( await screen . findByText ( "Template Settings" ) ) . toBeTruthy ( )
141135
@@ -152,16 +146,15 @@ describe("SettingsModal", () => {
152146 } )
153147
154148 await waitFor ( ( ) => {
155- expect ( deleteTemplate ) . toHaveBeenCalledTimes ( 1 )
156- expect ( deleteTemplate ) . toHaveBeenCalledWith ( "t-1" )
149+ expect ( onDeleteRequested ) . toHaveBeenCalledTimes ( 1 )
150+ expect ( onDeleteRequested ) . toHaveBeenCalledWith ( "t-1" )
157151 } )
158152
159- expect ( onDeleted ) . toHaveBeenCalledTimes ( 1 )
160153 expect ( onClose ) . toHaveBeenCalled ( )
161154 } )
162155
163156 it ( "Delete button is disabled while confirmation panel is open" , async ( ) => {
164- renderModal ( { deleteTemplate : vi . fn ( async ( ) => { } ) } )
157+ renderModal ( { onDeleteRequested : vi . fn ( async ( ) => { } ) } )
165158
166159 expect ( await screen . findByText ( "Template Settings" ) ) . toBeTruthy ( )
167160
0 commit comments