@@ -9,66 +9,168 @@ function makeMsg(
99 code = 'CDK_TOOLKIT_I5502' ,
1010 progress ?: { completed : number ; total : number }
1111) : DeployMessage {
12- return { message, code, level : 'info' , time : new Date ( ) , timestamp : new Date ( ) , progress } as DeployMessage ;
12+ return {
13+ message,
14+ code,
15+ level : 'info' ,
16+ time : new Date ( ) ,
17+ timestamp : new Date ( ) ,
18+ progress,
19+ } as DeployMessage ;
20+ }
21+
22+ function makeResourceMsg ( resourceType : string , status : string ) : DeployMessage {
23+ return makeMsg ( `MyStack | ${ status } | AWS::${ resourceType } | LogicalId` ) ;
1324}
1425
1526describe ( 'DeployStatus' , ( ) => {
16- it ( 'renders deploying state with gradient text' , ( ) => {
17- const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { false } hasError = { false } /> ) ;
27+ describe ( 'header state' , ( ) => {
28+ it ( 'shows "Deploying to AWS" when not complete' , ( ) => {
29+ const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { false } hasError = { false } /> ) ;
1830
19- expect ( lastFrame ( ) ) . toContain ( 'Deploying to AWS' ) ;
20- } ) ;
31+ expect ( lastFrame ( ) ) . toContain ( 'Deploying to AWS' ) ;
32+ } ) ;
2133
22- it ( 'renders success state when complete' , ( ) => {
23- const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { true } hasError = { false } /> ) ;
34+ it ( 'shows success message when complete without error' , ( ) => {
35+ const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { true } hasError = { false } /> ) ;
36+ const frame = lastFrame ( ) ! ;
2437
25- expect ( lastFrame ( ) ) . toContain ( 'Deploy to AWS Complete' ) ;
26- } ) ;
38+ expect ( frame ) . toContain ( '✓' ) ;
39+ expect ( frame ) . toContain ( 'Deploy to AWS Complete' ) ;
40+ } ) ;
2741
28- it ( 'renders failure state when complete with error' , ( ) => {
29- const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { true } hasError = { true } /> ) ;
42+ it ( 'shows failure message when complete with error' , ( ) => {
43+ const { lastFrame } = render ( < DeployStatus messages = { [ ] } isComplete = { true } hasError = { true } /> ) ;
44+ const frame = lastFrame ( ) ! ;
3045
31- expect ( lastFrame ( ) ) . toContain ( 'Deploy to AWS Failed' ) ;
46+ expect ( frame ) . toContain ( '✗' ) ;
47+ expect ( frame ) . toContain ( 'Deploy to AWS Failed' ) ;
48+ } ) ;
3249 } ) ;
3350
34- it ( 'renders resource events during deployment' , ( ) => {
35- const messages = [
36- makeMsg ( 'MyStack | CREATE_IN_PROGRESS | AWS::Lambda::Function | MyFunc' ) ,
37- makeMsg ( 'MyStack | CREATE_COMPLETE | AWS::Lambda::Function | MyFunc' ) ,
38- ] ;
51+ describe ( 'resource event parsing' , ( ) => {
52+ it ( 'displays parsed resource type and status from CDK event messages' , ( ) => {
53+ const messages = [
54+ makeResourceMsg ( 'Lambda::Function' , 'CREATE_IN_PROGRESS' ) ,
55+ makeResourceMsg ( 'Lambda::Function' , 'CREATE_COMPLETE' ) ,
56+ ] ;
3957
40- const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
58+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
59+ const frame = lastFrame ( ) ! ;
4160
42- expect ( lastFrame ( ) ) . toContain ( 'Lambda::Function' ) ;
43- expect ( lastFrame ( ) ) . toContain ( 'CREATE_COMPLETE' ) ;
44- } ) ;
61+ expect ( frame ) . toContain ( 'Lambda::Function' ) ;
62+ expect ( frame ) . toContain ( 'CREATE_COMPLETE' ) ;
63+ } ) ;
4564
46- it ( 'renders progress bar when progress data exists ' , ( ) => {
47- const messages = [ makeMsg ( 'deploying ', 'CDK_TOOLKIT_I5502' , { completed : 3 , total : 10 } ) ] ;
65+ it ( 'strips AWS:: prefix from resource types ' , ( ) => {
66+ const messages = [ makeResourceMsg ( 'S3::Bucket ', 'CREATE_COMPLETE' ) ] ;
4867
49- const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
68+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
5069
51- expect ( lastFrame ( ) ) . toContain ( '3/10' ) ;
52- } ) ;
70+ expect ( lastFrame ( ) ) . toContain ( 'S3::Bucket' ) ;
71+ expect ( lastFrame ( ) ) . not . toContain ( 'AWS::S3::Bucket' ) ;
72+ } ) ;
73+
74+ it ( 'skips CLEANUP messages' , ( ) => {
75+ const messages = [
76+ makeResourceMsg ( 'Lambda::Function' , 'CREATE_COMPLETE' ) ,
77+ makeMsg ( 'MyStack | CLEANUP_IN_PROGRESS | AWS::Lambda::Function | OldFunc' ) ,
78+ ] ;
79+
80+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
81+ const frame = lastFrame ( ) ! ;
82+
83+ expect ( frame ) . toContain ( 'CREATE_COMPLETE' ) ;
84+ expect ( frame ) . not . toContain ( 'CLEANUP' ) ;
85+ } ) ;
86+
87+ it ( 'ignores non-resource-event messages (non-I5502 codes)' , ( ) => {
88+ const messages = [ makeMsg ( 'Some general info' , 'CDK_TOOLKIT_I1234' ) ] ;
89+
90+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
91+
92+ // Should show deploying text but no resource lines
93+ expect ( lastFrame ( ) ) . toContain ( 'Deploying to AWS' ) ;
94+ expect ( lastFrame ( ) ) . not . toContain ( 'Some general info' ) ;
95+ } ) ;
5396
54- it ( 'skips CLEANUP messages' , ( ) => {
55- const messages = [
56- makeMsg ( 'MyStack | CREATE_COMPLETE | AWS::Lambda::Function | MyFunc' ) ,
57- makeMsg ( 'MyStack | CLEANUP_IN_PROGRESS | AWS::Lambda::Function | OldFunc' ) ,
58- ] ;
97+ it ( 'shows only last 8 resource events' , ( ) => {
98+ const messages = Array . from ( { length : 12 } , ( _ , i ) =>
99+ makeResourceMsg ( `Service::Resource${ i } ` , 'CREATE_COMPLETE' )
100+ ) ;
59101
60- const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
102+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
103+ const frame = lastFrame ( ) ! ;
61104
62- expect ( lastFrame ( ) ) . toContain ( 'Lambda::Function' ) ;
63- expect ( lastFrame ( ) ) . toContain ( 'CREATE_COMPLETE' ) ;
105+ // First 4 should be trimmed (12 - 8 = 4)
106+ expect ( frame ) . not . toContain ( 'Resource0' ) ;
107+ expect ( frame ) . not . toContain ( 'Resource3' ) ;
108+ // Last 8 should be visible
109+ expect ( frame ) . toContain ( 'Resource4' ) ;
110+ expect ( frame ) . toContain ( 'Resource11' ) ;
111+ } ) ;
64112 } ) ;
65113
66- it ( 'ignores non-resource-event messages' , ( ) => {
67- const messages = [ makeMsg ( 'Some general info' , 'CDK_TOOLKIT_I1234' ) ] ;
114+ describe ( 'progress bar' , ( ) => {
115+ it ( 'renders progress bar with completed/total count' , ( ) => {
116+ const messages = [ makeMsg ( 'deploying' , 'CDK_TOOLKIT_I5502' , { completed : 3 , total : 10 } ) ] ;
68117
69- const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
118+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
119+ const frame = lastFrame ( ) ! ;
120+
121+ expect ( frame ) . toContain ( '3/10' ) ;
122+ expect ( frame ) . toContain ( '█' ) ;
123+ expect ( frame ) . toContain ( '░' ) ;
124+ } ) ;
125+
126+ it ( 'shows full progress bar on completion' , ( ) => {
127+ const messages = [ makeMsg ( 'done' , 'CDK_TOOLKIT_I5502' , { completed : 10 , total : 10 } ) ] ;
128+
129+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { true } hasError = { false } /> ) ;
130+ const frame = lastFrame ( ) ! ;
131+
132+ // On completion, bar shows total/total
133+ expect ( frame ) . toContain ( '10/10' ) ;
134+ } ) ;
135+
136+ it ( 'does not show progress bar when no progress data' , ( ) => {
137+ const messages = [ makeResourceMsg ( 'Lambda::Function' , 'CREATE_COMPLETE' ) ] ;
138+
139+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
140+
141+ expect ( lastFrame ( ) ) . not . toContain ( '█' ) ;
142+ expect ( lastFrame ( ) ) . not . toContain ( '░' ) ;
143+ } ) ;
144+
145+ it ( 'uses most recent progress data' , ( ) => {
146+ const messages = [
147+ makeMsg ( 'step1' , 'CDK_TOOLKIT_I5502' , { completed : 2 , total : 10 } ) ,
148+ makeMsg ( 'step2' , 'CDK_TOOLKIT_I5502' , { completed : 7 , total : 10 } ) ,
149+ ] ;
150+
151+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { false } hasError = { false } /> ) ;
152+
153+ // Should show the latest progress
154+ expect ( lastFrame ( ) ) . toContain ( '7/10' ) ;
155+ } ) ;
156+ } ) ;
70157
71- // Should still show the deploying text but no resource lines
72- expect ( lastFrame ( ) ) . toContain ( 'Deploying to AWS' ) ;
158+ describe ( 'error state details' , ( ) => {
159+ it ( 'shows last 3 resource events on failure' , ( ) => {
160+ const messages = [
161+ makeResourceMsg ( 'Lambda::Function' , 'CREATE_COMPLETE' ) ,
162+ makeResourceMsg ( 'IAM::Role' , 'CREATE_COMPLETE' ) ,
163+ makeResourceMsg ( 'S3::Bucket' , 'CREATE_COMPLETE' ) ,
164+ makeResourceMsg ( 'DynamoDB::Table' , 'CREATE_FAILED' ) ,
165+ ] ;
166+
167+ const { lastFrame } = render ( < DeployStatus messages = { messages } isComplete = { true } hasError = { true } /> ) ;
168+ const frame = lastFrame ( ) ! ;
169+
170+ // Last 3 of 4 resource events should show
171+ expect ( frame ) . toContain ( 'IAM::Role' ) ;
172+ expect ( frame ) . toContain ( 'S3::Bucket' ) ;
173+ expect ( frame ) . toContain ( 'DynamoDB::Table' ) ;
174+ } ) ;
73175 } ) ;
74176} ) ;
0 commit comments