@@ -240,6 +240,201 @@ describe.each([HotswapMode.FALL_BACK, HotswapMode.HOTSWAP_ONLY])('%p mode', (hot
240240 } ) ;
241241 } ) ;
242242
243+ test ( 'correctly evaluates CFN intrinsic functions in hotswappable properties' , async ( ) => {
244+ setup . setCurrentCfnStackTemplate ( {
245+ Resources : {
246+ Bucket : {
247+ Type : 'AWS::S3::Bucket' ,
248+ } ,
249+ Dashboard : {
250+ Type : 'AWS::QuickSight::Dashboard' ,
251+ Properties : {
252+ AwsAccountId : '123456789012' ,
253+ DashboardId : 'my-dashboard' ,
254+ Name : {
255+ 'Fn::Join' : [ '-' , [ 'dashboard' , { Ref : 'Bucket' } ] ] ,
256+ } ,
257+ Definition : { old : { } } ,
258+ } ,
259+ } ,
260+ } ,
261+ } ) ;
262+ setup . pushStackResourceSummaries ( setup . stackSummaryOf ( 'Bucket' , 'AWS::S3::Bucket' , 'my-bucket' ) ) ;
263+ const cdkStackArtifact = setup . cdkStackArtifactOf ( {
264+ template : {
265+ Resources : {
266+ Bucket : {
267+ Type : 'AWS::S3::Bucket' ,
268+ } ,
269+ Dashboard : {
270+ Type : 'AWS::QuickSight::Dashboard' ,
271+ Properties : {
272+ AwsAccountId : '123456789012' ,
273+ DashboardId : 'my-dashboard' ,
274+ Name : {
275+ 'Fn::Join' : [ '-' , [ 'dashboard' , { Ref : 'Bucket' } ] ] ,
276+ } ,
277+ Definition : { new : { } } ,
278+ } ,
279+ } ,
280+ } ,
281+ } ,
282+ } ) ;
283+
284+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
285+
286+ expect ( deployStackResult ) . not . toBeUndefined ( ) ;
287+ expect ( mockQuickSightClient ) . toHaveReceivedCommandWith ( UpdateDashboardCommand , {
288+ AwsAccountId : '123456789012' ,
289+ DashboardId : 'my-dashboard' ,
290+ Name : 'dashboard-my-bucket' ,
291+ Definition : { new : { } } ,
292+ } ) ;
293+ } ) ;
294+
295+ test ( 'correctly evaluates CFN intrinsic functions in ImportMode for DataSet' , async ( ) => {
296+ setup . setCurrentCfnStackTemplate ( {
297+ Resources : {
298+ Param : {
299+ Type : 'AWS::SSM::Parameter' ,
300+ } ,
301+ DataSet : {
302+ Type : 'AWS::QuickSight::DataSet' ,
303+ Properties : {
304+ AwsAccountId : '123456789012' ,
305+ DataSetId : 'my-dataset' ,
306+ Name : 'MyDataSet' ,
307+ ImportMode : { Ref : 'Param' } ,
308+ PhysicalTableMap : { old : { } } ,
309+ } ,
310+ } ,
311+ } ,
312+ } ) ;
313+ setup . pushStackResourceSummaries ( setup . stackSummaryOf ( 'Param' , 'AWS::SSM::Parameter' , 'SPICE' ) ) ;
314+ const cdkStackArtifact = setup . cdkStackArtifactOf ( {
315+ template : {
316+ Resources : {
317+ Param : {
318+ Type : 'AWS::SSM::Parameter' ,
319+ } ,
320+ DataSet : {
321+ Type : 'AWS::QuickSight::DataSet' ,
322+ Properties : {
323+ AwsAccountId : '123456789012' ,
324+ DataSetId : 'my-dataset' ,
325+ Name : 'MyDataSet' ,
326+ ImportMode : { Ref : 'Param' } ,
327+ PhysicalTableMap : { new : { } } ,
328+ } ,
329+ } ,
330+ } ,
331+ } ,
332+ } ) ;
333+
334+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
335+
336+ expect ( deployStackResult ) . not . toBeUndefined ( ) ;
337+ expect ( mockQuickSightClient ) . toHaveReceivedCommandWith ( UpdateDataSetCommand , {
338+ AwsAccountId : '123456789012' ,
339+ DataSetId : 'my-dataset' ,
340+ Name : 'MyDataSet' ,
341+ PhysicalTableMap : { new : { } } ,
342+ ImportMode : 'SPICE' ,
343+ } ) ;
344+ } ) ;
345+
346+ test ( 'hotswaps hotswappable properties and reports non-hotswappable properties when both change together' , async ( ) => {
347+ setup . setCurrentCfnStackTemplate ( {
348+ Resources : {
349+ DataSet : {
350+ Type : 'AWS::QuickSight::DataSet' ,
351+ Properties : {
352+ AwsAccountId : '123456789012' ,
353+ DataSetId : 'my-dataset' ,
354+ Name : 'MyDataSet' ,
355+ ImportMode : 'SPICE' ,
356+ PhysicalTableMap : { old : { } } ,
357+ Permissions : [ { Principal : 'old-principal' } ] ,
358+ } ,
359+ } ,
360+ } ,
361+ } ) ;
362+ const cdkStackArtifact = setup . cdkStackArtifactOf ( {
363+ template : {
364+ Resources : {
365+ DataSet : {
366+ Type : 'AWS::QuickSight::DataSet' ,
367+ Properties : {
368+ AwsAccountId : '123456789012' ,
369+ DataSetId : 'my-dataset' ,
370+ Name : 'MyDataSet' ,
371+ ImportMode : 'SPICE' ,
372+ PhysicalTableMap : { new : { } } ,
373+ Permissions : [ { Principal : 'new-principal' } ] ,
374+ } ,
375+ } ,
376+ } ,
377+ } ,
378+ } ) ;
379+
380+ if ( hotswapMode === HotswapMode . FALL_BACK ) {
381+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
382+ expect ( deployStackResult ) . toBeUndefined ( ) ;
383+ expect ( mockQuickSightClient ) . not . toHaveReceivedCommand ( UpdateDataSetCommand ) ;
384+ } else {
385+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
386+ expect ( deployStackResult ) . not . toBeUndefined ( ) ;
387+ expect ( mockQuickSightClient ) . toHaveReceivedCommandWith ( UpdateDataSetCommand , {
388+ AwsAccountId : '123456789012' ,
389+ DataSetId : 'my-dataset' ,
390+ Name : 'MyDataSet' ,
391+ PhysicalTableMap : { new : { } } ,
392+ ImportMode : 'SPICE' ,
393+ } ) ;
394+ }
395+ } ) ;
396+
397+ test ( 'does not hotswap Credentials changes on DataSource' , async ( ) => {
398+ setup . setCurrentCfnStackTemplate ( {
399+ Resources : {
400+ DataSource : {
401+ Type : 'AWS::QuickSight::DataSource' ,
402+ Properties : {
403+ AwsAccountId : '123456789012' ,
404+ DataSourceId : 'my-datasource' ,
405+ Name : 'MyDataSource' ,
406+ Credentials : { CredentialPair : { Username : 'old-user' , Password : 'old-pass' } } ,
407+ } ,
408+ } ,
409+ } ,
410+ } ) ;
411+ const cdkStackArtifact = setup . cdkStackArtifactOf ( {
412+ template : {
413+ Resources : {
414+ DataSource : {
415+ Type : 'AWS::QuickSight::DataSource' ,
416+ Properties : {
417+ AwsAccountId : '123456789012' ,
418+ DataSourceId : 'my-datasource' ,
419+ Name : 'MyDataSource' ,
420+ Credentials : { CredentialPair : { Username : 'new-user' , Password : 'new-pass' } } ,
421+ } ,
422+ } ,
423+ } ,
424+ } ,
425+ } ) ;
426+
427+ if ( hotswapMode === HotswapMode . FALL_BACK ) {
428+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
429+ expect ( deployStackResult ) . toBeUndefined ( ) ;
430+ } else {
431+ const deployStackResult = await hotswapMockSdkProvider . tryHotswapDeployment ( hotswapMode , cdkStackArtifact ) ;
432+ expect ( deployStackResult ) . not . toBeUndefined ( ) ;
433+ expect ( deployStackResult ?. noOp ) . toEqual ( true ) ;
434+ }
435+ expect ( mockQuickSightClient ) . not . toHaveReceivedCommand ( UpdateDataSourceCommand ) ;
436+ } ) ;
437+
243438 test ( 'does not hotswap when non-hotswappable property changes' , async ( ) => {
244439 setup . setCurrentCfnStackTemplate ( {
245440 Resources : {
0 commit comments