1
1
import type { Meta , StoryObj } from "@storybook/react" ;
2
2
import { expect , spyOn , within } from "@storybook/test" ;
3
+ import type { WorkspaceApp , WorkspaceResource } from "api/typesGenerated" ;
3
4
import {
4
5
MockFailedWorkspace ,
5
6
MockStartingWorkspace ,
@@ -12,11 +13,12 @@ import {
12
13
mockApiError ,
13
14
} from "testHelpers/entities" ;
14
15
import { withProxyProvider } from "testHelpers/storybook" ;
15
- import TaskPage , { data } from "./TaskPage" ;
16
+ import TaskPage , { data , WorkspaceDoesNotHaveAITaskError } from "./TaskPage" ;
16
17
17
18
const meta : Meta < typeof TaskPage > = {
18
19
title : "pages/TaskPage" ,
19
20
component : TaskPage ,
21
+ decorators : [ withProxyProvider ( ) ] ,
20
22
parameters : {
21
23
layout : "fullscreen" ,
22
24
} ,
@@ -95,6 +97,117 @@ export const TerminatedBuildWithStatus: Story = {
95
97
} ,
96
98
} ;
97
99
100
+ export const SidebarAppDisabled : Story = {
101
+ beforeEach : ( ) => {
102
+ spyOn ( data , "fetchTask" ) . mockResolvedValue ( {
103
+ prompt : "Create competitors page" ,
104
+ workspace : {
105
+ ...MockWorkspace ,
106
+ latest_build : {
107
+ ...MockWorkspace . latest_build ,
108
+ has_ai_task : true ,
109
+ ai_task_sidebar_app_id : "claude-code" ,
110
+ resources : mockResources ( {
111
+ health : "disabled" ,
112
+ } ) ,
113
+ } ,
114
+ } ,
115
+ } ) ;
116
+ } ,
117
+ } ;
118
+
119
+ export const SidebarAppLoading : Story = {
120
+ beforeEach : ( ) => {
121
+ spyOn ( data , "fetchTask" ) . mockResolvedValue ( {
122
+ prompt : "Create competitors page" ,
123
+ workspace : {
124
+ ...MockWorkspace ,
125
+ latest_build : {
126
+ ...MockWorkspace . latest_build ,
127
+ has_ai_task : true ,
128
+ ai_task_sidebar_app_id : "claude-code" ,
129
+ resources : mockResources ( {
130
+ health : "initializing" ,
131
+ } ) ,
132
+ } ,
133
+ } ,
134
+ } ) ;
135
+ } ,
136
+ } ;
137
+
138
+ export const SidebarAppHealthy : Story = {
139
+ beforeEach : ( ) => {
140
+ spyOn ( data , "fetchTask" ) . mockResolvedValue ( {
141
+ prompt : "Create competitors page" ,
142
+ workspace : {
143
+ ...MockWorkspace ,
144
+ latest_build : {
145
+ ...MockWorkspace . latest_build ,
146
+ has_ai_task : true ,
147
+ ai_task_sidebar_app_id : "claude-code" ,
148
+ resources : mockResources ( {
149
+ health : "healthy" ,
150
+ } ) ,
151
+ } ,
152
+ } ,
153
+ } ) ;
154
+ } ,
155
+ } ;
156
+
157
+ export const BuildNoAITask : Story = {
158
+ beforeEach : ( ) => {
159
+ spyOn ( data , "fetchTask" ) . mockImplementation ( ( ) => {
160
+ throw new WorkspaceDoesNotHaveAITaskError ( MockWorkspace ) ;
161
+ } ) ;
162
+ } ,
163
+ } ;
164
+
165
+ const mockResources = (
166
+ claudeCodeAppOverrides ?: Partial < WorkspaceApp > ,
167
+ ) : readonly WorkspaceResource [ ] => [
168
+ {
169
+ ...MockWorkspaceResource ,
170
+ agents : [
171
+ {
172
+ ...MockWorkspaceAgent ,
173
+ apps : [
174
+ {
175
+ ...MockWorkspaceApp ,
176
+ id : "claude-code" ,
177
+ display_name : "Claude Code" ,
178
+ slug : "claude-code" ,
179
+ icon : "/icon/claude.svg" ,
180
+ statuses : [
181
+ MockWorkspaceAppStatus ,
182
+ {
183
+ ...MockWorkspaceAppStatus ,
184
+ id : "2" ,
185
+ message : "Planning changes" ,
186
+ state : "working" ,
187
+ } ,
188
+ ] ,
189
+ ...claudeCodeAppOverrides ,
190
+ } ,
191
+ {
192
+ ...MockWorkspaceApp ,
193
+ id : "vscode" ,
194
+ slug : "vscode" ,
195
+ display_name : "VS Code Web" ,
196
+ icon : "/icon/code.svg" ,
197
+ } ,
198
+ {
199
+ ...MockWorkspaceApp ,
200
+ slug : "zed" ,
201
+ id : "zed" ,
202
+ display_name : "Zed" ,
203
+ icon : "/icon/zed.svg" ,
204
+ } ,
205
+ ] ,
206
+ } ,
207
+ ] ,
208
+ } ,
209
+ ] ;
210
+
98
211
export const Active : Story = {
99
212
decorators : [ withProxyProvider ( ) ] ,
100
213
beforeEach : ( ) => {
@@ -104,48 +217,7 @@ export const Active: Story = {
104
217
...MockWorkspace ,
105
218
latest_build : {
106
219
...MockWorkspace . latest_build ,
107
- resources : [
108
- {
109
- ...MockWorkspaceResource ,
110
- agents : [
111
- {
112
- ...MockWorkspaceAgent ,
113
- apps : [
114
- {
115
- ...MockWorkspaceApp ,
116
- id : "claude-code" ,
117
- display_name : "Claude Code" ,
118
- slug : "claude-code" ,
119
- icon : "/icon/claude.svg" ,
120
- statuses : [
121
- MockWorkspaceAppStatus ,
122
- {
123
- ...MockWorkspaceAppStatus ,
124
- id : "2" ,
125
- message : "Planning changes" ,
126
- state : "working" ,
127
- } ,
128
- ] ,
129
- } ,
130
- {
131
- ...MockWorkspaceApp ,
132
- id : "vscode" ,
133
- slug : "vscode" ,
134
- display_name : "VS Code Web" ,
135
- icon : "/icon/code.svg" ,
136
- } ,
137
- {
138
- ...MockWorkspaceApp ,
139
- slug : "zed" ,
140
- id : "zed" ,
141
- display_name : "Zed" ,
142
- icon : "/icon/zed.svg" ,
143
- } ,
144
- ] ,
145
- } ,
146
- ] ,
147
- } ,
148
- ] ,
220
+ resources : mockResources ( ) ,
149
221
} ,
150
222
latest_app_status : {
151
223
...MockWorkspaceAppStatus ,
0 commit comments