@@ -4,12 +4,14 @@ import { API } from "api/api";
4
4
import { MockUsers } from "pages/UsersPage/storybookData/users" ;
5
5
import { reactRouterParameters } from "storybook-addon-remix-react-router" ;
6
6
import {
7
+ MockAIPromptPresets ,
8
+ MockNewTaskData ,
9
+ MockPresets ,
10
+ MockTasks ,
7
11
MockTemplate ,
8
12
MockTemplateVersionExternalAuthGithub ,
9
13
MockTemplateVersionExternalAuthGithubAuthenticated ,
10
14
MockUserOwner ,
11
- MockWorkspace ,
12
- MockWorkspaceAppStatus ,
13
15
mockApiError ,
14
16
} from "testHelpers/entities" ;
15
17
import {
@@ -31,6 +33,7 @@ const meta: Meta<typeof TasksPage> = {
31
33
} ,
32
34
beforeEach : ( ) => {
33
35
spyOn ( API , "getTemplateVersionExternalAuth" ) . mockResolvedValue ( [ ] ) ;
36
+ spyOn ( API , "getTemplateVersionPresets" ) . mockResolvedValue ( null ) ;
34
37
spyOn ( API , "getUsers" ) . mockResolvedValue ( {
35
38
users : MockUsers ,
36
39
count : MockUsers . length ,
@@ -53,7 +56,7 @@ type Story = StoryObj<typeof TasksPage>;
53
56
export const LoadingAITemplates : Story = {
54
57
beforeEach : ( ) => {
55
58
spyOn ( data , "fetchAITemplates" ) . mockImplementation (
56
- ( ) => new Promise ( ( res ) => 1000 * 60 * 60 ) ,
59
+ ( ) => new Promise ( ( ) => 1000 * 60 * 60 ) ,
57
60
) ;
58
61
} ,
59
62
} ;
@@ -79,7 +82,7 @@ export const LoadingTasks: Story = {
79
82
beforeEach : ( ) => {
80
83
spyOn ( data , "fetchAITemplates" ) . mockResolvedValue ( [ MockTemplate ] ) ;
81
84
spyOn ( data , "fetchTasks" ) . mockImplementation (
82
- ( ) => new Promise ( ( res ) => 1000 * 60 * 60 ) ,
85
+ ( ) => new Promise ( ( ) => 1000 * 60 * 60 ) ,
83
86
) ;
84
87
} ,
85
88
play : async ( { canvasElement, step } ) => {
@@ -119,15 +122,77 @@ export const LoadedTasks: Story = {
119
122
} ,
120
123
} ;
121
124
122
- const newTaskData = {
123
- prompt : "Create a new task" ,
124
- workspace : {
125
- ...MockWorkspace ,
126
- id : "workspace-4" ,
127
- latest_app_status : {
128
- ...MockWorkspaceAppStatus ,
129
- message : "Task created successfully!" ,
130
- } ,
125
+ export const LoadedTasksWithPresets : Story = {
126
+ decorators : [ withProxyProvider ( ) ] ,
127
+ beforeEach : ( ) => {
128
+ const mockTemplateWithPresets = {
129
+ ...MockTemplate ,
130
+ id : "test-template-2" ,
131
+ name : "template-with-presets" ,
132
+ display_name : "Template with Presets" ,
133
+ } ;
134
+
135
+ spyOn ( data , "fetchAITemplates" ) . mockResolvedValue ( [
136
+ MockTemplate ,
137
+ mockTemplateWithPresets ,
138
+ ] ) ;
139
+ spyOn ( data , "fetchTasks" ) . mockResolvedValue ( MockTasks ) ;
140
+ spyOn ( API , "getTemplateVersionPresets" ) . mockImplementation (
141
+ async ( versionId ) => {
142
+ // Return presets only for the second template
143
+ if ( versionId === mockTemplateWithPresets . active_version_id ) {
144
+ return MockPresets ;
145
+ }
146
+ return null ;
147
+ } ,
148
+ ) ;
149
+ } ,
150
+ } ;
151
+
152
+ export const LoadedTasksWithAIPromptPresets : Story = {
153
+ decorators : [ withProxyProvider ( ) ] ,
154
+ beforeEach : ( ) => {
155
+ const mockTemplateWithPresets = {
156
+ ...MockTemplate ,
157
+ id : "test-template-2" ,
158
+ name : "template-with-presets" ,
159
+ display_name : "Template with AI Prompt Presets" ,
160
+ } ;
161
+
162
+ spyOn ( data , "fetchAITemplates" ) . mockResolvedValue ( [
163
+ MockTemplate ,
164
+ mockTemplateWithPresets ,
165
+ ] ) ;
166
+ spyOn ( data , "fetchTasks" ) . mockResolvedValue ( MockTasks ) ;
167
+ spyOn ( API , "getTemplateVersionPresets" ) . mockImplementation (
168
+ async ( versionId ) => {
169
+ // Return presets only for the second template
170
+ if ( versionId === mockTemplateWithPresets . active_version_id ) {
171
+ return MockAIPromptPresets ;
172
+ }
173
+ return null ;
174
+ } ,
175
+ ) ;
176
+ } ,
177
+ } ;
178
+
179
+ export const LoadedTasksEdgeCases : Story = {
180
+ decorators : [ withProxyProvider ( ) ] ,
181
+ beforeEach : ( ) => {
182
+ spyOn ( data , "fetchAITemplates" ) . mockResolvedValue ( [ MockTemplate ] ) ;
183
+ spyOn ( data , "fetchTasks" ) . mockResolvedValue ( MockTasks ) ;
184
+
185
+ // Test various edge cases for presets
186
+ spyOn ( API , "getTemplateVersionPresets" ) . mockImplementation ( async ( ) => {
187
+ return [
188
+ {
189
+ ID : "malformed" ,
190
+ Name : "Malformed Preset" ,
191
+ Default : true ,
192
+ } ,
193
+ // biome-ignore lint/suspicious/noExplicitAny: Testing malformed data edge cases
194
+ ] as any ;
195
+ } ) ;
131
196
} ,
132
197
} ;
133
198
@@ -154,15 +219,15 @@ export const CreateTaskSuccessfully: Story = {
154
219
spyOn ( data , "fetchAITemplates" ) . mockResolvedValue ( [ MockTemplate ] ) ;
155
220
spyOn ( data , "fetchTasks" )
156
221
. mockResolvedValueOnce ( MockTasks )
157
- . mockResolvedValue ( [ newTaskData , ...MockTasks ] ) ;
158
- spyOn ( data , "createTask" ) . mockResolvedValue ( newTaskData ) ;
222
+ . mockResolvedValue ( [ MockNewTaskData , ...MockTasks ] ) ;
223
+ spyOn ( data , "createTask" ) . mockResolvedValue ( MockNewTaskData ) ;
159
224
} ,
160
225
play : async ( { canvasElement, step } ) => {
161
226
const canvas = within ( canvasElement ) ;
162
227
163
228
await step ( "Run task" , async ( ) => {
164
229
const prompt = await canvas . findByLabelText ( / p r o m p t / i) ;
165
- await userEvent . type ( prompt , newTaskData . prompt ) ;
230
+ await userEvent . type ( prompt , MockNewTaskData . prompt ) ;
166
231
const submitButton = canvas . getByRole ( "button" , { name : / r u n t a s k / i } ) ;
167
232
await waitFor ( ( ) => expect ( submitButton ) . toBeEnabled ( ) ) ;
168
233
await userEvent . click ( submitButton ) ;
@@ -208,8 +273,8 @@ export const WithAuthenticatedExternalAuth: Story = {
208
273
beforeEach : ( ) => {
209
274
spyOn ( data , "fetchTasks" )
210
275
. mockResolvedValueOnce ( MockTasks )
211
- . mockResolvedValue ( [ newTaskData , ...MockTasks ] ) ;
212
- spyOn ( data , "createTask" ) . mockResolvedValue ( newTaskData ) ;
276
+ . mockResolvedValue ( [ MockNewTaskData , ...MockTasks ] ) ;
277
+ spyOn ( data , "createTask" ) . mockResolvedValue ( MockNewTaskData ) ;
213
278
spyOn ( API , "getTemplateVersionExternalAuth" ) . mockResolvedValue ( [
214
279
MockTemplateVersionExternalAuthGithubAuthenticated ,
215
280
] ) ;
@@ -235,8 +300,8 @@ export const MissingExternalAuth: Story = {
235
300
beforeEach : ( ) => {
236
301
spyOn ( data , "fetchTasks" )
237
302
. mockResolvedValueOnce ( MockTasks )
238
- . mockResolvedValue ( [ newTaskData , ...MockTasks ] ) ;
239
- spyOn ( data , "createTask" ) . mockResolvedValue ( newTaskData ) ;
303
+ . mockResolvedValue ( [ MockNewTaskData , ...MockTasks ] ) ;
304
+ spyOn ( data , "createTask" ) . mockResolvedValue ( MockNewTaskData ) ;
240
305
spyOn ( API , "getTemplateVersionExternalAuth" ) . mockResolvedValue ( [
241
306
MockTemplateVersionExternalAuthGithub ,
242
307
] ) ;
@@ -246,7 +311,7 @@ export const MissingExternalAuth: Story = {
246
311
247
312
await step ( "Submit is disabled" , async ( ) => {
248
313
const prompt = await canvas . findByLabelText ( / p r o m p t / i) ;
249
- await userEvent . type ( prompt , newTaskData . prompt ) ;
314
+ await userEvent . type ( prompt , MockNewTaskData . prompt ) ;
250
315
const submitButton = canvas . getByRole ( "button" , { name : / r u n t a s k / i } ) ;
251
316
expect ( submitButton ) . toBeDisabled ( ) ;
252
317
} ) ;
@@ -262,8 +327,8 @@ export const ExternalAuthError: Story = {
262
327
beforeEach : ( ) => {
263
328
spyOn ( data , "fetchTasks" )
264
329
. mockResolvedValueOnce ( MockTasks )
265
- . mockResolvedValue ( [ newTaskData , ...MockTasks ] ) ;
266
- spyOn ( data , "createTask" ) . mockResolvedValue ( newTaskData ) ;
330
+ . mockResolvedValue ( [ MockNewTaskData , ...MockTasks ] ) ;
331
+ spyOn ( data , "createTask" ) . mockResolvedValue ( MockNewTaskData ) ;
267
332
spyOn ( API , "getTemplateVersionExternalAuth" ) . mockRejectedValue (
268
333
mockApiError ( {
269
334
message : "Failed to load external auth" ,
@@ -275,7 +340,7 @@ export const ExternalAuthError: Story = {
275
340
276
341
await step ( "Submit is disabled" , async ( ) => {
277
342
const prompt = await canvas . findByLabelText ( / p r o m p t / i) ;
278
- await userEvent . type ( prompt , newTaskData . prompt ) ;
343
+ await userEvent . type ( prompt , MockNewTaskData . prompt ) ;
279
344
const submitButton = canvas . getByRole ( "button" , { name : / r u n t a s k / i } ) ;
280
345
expect ( submitButton ) . toBeDisabled ( ) ;
281
346
} ) ;
@@ -308,35 +373,3 @@ export const NonAdmin: Story = {
308
373
} ) ;
309
374
} ,
310
375
} ;
311
-
312
- const MockTasks = [
313
- {
314
- workspace : {
315
- ...MockWorkspace ,
316
- latest_app_status : MockWorkspaceAppStatus ,
317
- } ,
318
- prompt : "Create competitors page" ,
319
- } ,
320
- {
321
- workspace : {
322
- ...MockWorkspace ,
323
- id : "workspace-2" ,
324
- latest_app_status : {
325
- ...MockWorkspaceAppStatus ,
326
- message : "Avatar size fixed!" ,
327
- } ,
328
- } ,
329
- prompt : "Fix user avatar size" ,
330
- } ,
331
- {
332
- workspace : {
333
- ...MockWorkspace ,
334
- id : "workspace-3" ,
335
- latest_app_status : {
336
- ...MockWorkspaceAppStatus ,
337
- message : "Accessibility issues fixed!" ,
338
- } ,
339
- } ,
340
- prompt : "Fix accessibility issues" ,
341
- } ,
342
- ] ;
0 commit comments