@@ -242,4 +242,287 @@ resources:
242
242
$log | Should - BeLike " *ERROR* Arguments must be of the same type*"
243
243
244
244
}
245
+ g
246
+ Context ' Resource name expression evaluation' {
247
+ It ' Simple parameter expression in resource name: <expression>' - TestCases @ (
248
+ @ { expression = " [parameters('resourceName')]" ; paramValue = ' TestResource' ; expected = ' TestResource' }
249
+ @ { expression = " [parameters('serviceName')]" ; paramValue = ' MyService' ; expected = ' MyService' }
250
+ ) {
251
+ param ($expression , $paramValue , $expected )
252
+ $yaml = @"
253
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
254
+ parameters:
255
+ resourceName:
256
+ type: string
257
+ defaultValue: $paramValue
258
+ serviceName:
259
+ type: string
260
+ defaultValue: $paramValue
261
+ resources:
262
+ - name: "$expression "
263
+ type: Microsoft/OSInfo
264
+ properties: {}
265
+ "@
266
+ $out = .\dsc\target\debug\dsc.exe config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
267
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
268
+ $out.results [0 ].name | Should - Be $expected
269
+ }
270
+
271
+ It ' Concat function in resource name: <expression>' - TestCases @ (
272
+ @ { expression = " [concat('prefix-', parameters('name'))]" ; paramValue = ' test' ; expected = ' prefix-test' }
273
+ @ { expression = " [concat(parameters('prefix'), '-', parameters('suffix'))]" ; expected = ' start-end' }
274
+ @ { expression = " [concat('Resource-', string(parameters('index')))]" ; expected = ' Resource-42' }
275
+ ) {
276
+ param ($expression , $paramValue , $expected )
277
+ $yaml = @"
278
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
279
+ parameters:
280
+ name:
281
+ type: string
282
+ defaultValue: ${paramValue}
283
+ prefix:
284
+ type: string
285
+ defaultValue: start
286
+ suffix:
287
+ type: string
288
+ defaultValue: end
289
+ index:
290
+ type: int
291
+ defaultValue: 42
292
+ resources:
293
+ - name: "$expression "
294
+ type: Microsoft/OSInfo
295
+ properties: {}
296
+ "@
297
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
298
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
299
+ $out.results [0 ].name | Should - Be $expected
300
+ }
301
+
302
+ It ' Format function in resource name: <expression>' - TestCases @ (
303
+ @ { expression = " [format('Service-{0}', parameters('id'))]" ; expected = ' Service-123' }
304
+ @ { expression = " [format('{0}-{1}-{2}', parameters('env'), parameters('app'), parameters('ver'))]" ; expected = ' prod-web-v1' }
305
+ @ { expression = " [format('Resource_{0:D3}', parameters('num'))]" ; expected = ' Resource_005' }
306
+ ) {
307
+ param ($expression , $expected )
308
+ $yaml = @"
309
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
310
+ parameters:
311
+ id:
312
+ type: string
313
+ defaultValue: '123'
314
+ env:
315
+ type: string
316
+ defaultValue: prod
317
+ app:
318
+ type: string
319
+ defaultValue: web
320
+ ver:
321
+ type: string
322
+ defaultValue: v1
323
+ num:
324
+ type: int
325
+ defaultValue: 5
326
+ resources:
327
+ - name: "$expression "
328
+ type: Microsoft/OSInfo
329
+ properties: {}
330
+ "@
331
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
332
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
333
+ $out.results [0 ].name | Should - Be $expected
334
+ }
335
+
336
+ It ' Complex expression in resource name: <expression>' - TestCases @ (
337
+ @ { expression = " [concat(parameters('prefix'), '-', string(add(parameters('base'), parameters('offset'))))]" ; expected = ' server-105' }
338
+ @ { expression = " [format('{0}-{1}', parameters('type'), if(equals(parameters('env'), 'prod'), 'production', 'development'))]" ; expected = ' web-production' }
339
+ @ { expression = " [toLower(concat(parameters('region'), '-', parameters('service')))]" ; expected = ' eastus-webapp' }
340
+ ) {
341
+ param ($expression , $expected )
342
+ $yaml = @"
343
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
344
+ parameters:
345
+ prefix:
346
+ type: string
347
+ defaultValue: server
348
+ base:
349
+ type: int
350
+ defaultValue: 100
351
+ offset:
352
+ type: int
353
+ defaultValue: 5
354
+ type:
355
+ type: string
356
+ defaultValue: web
357
+ env:
358
+ type: string
359
+ defaultValue: prod
360
+ region:
361
+ type: string
362
+ defaultValue: EASTUS
363
+ service:
364
+ type: string
365
+ defaultValue: WebApp
366
+ resources:
367
+ - name: "$expression "
368
+ type: Microsoft/OSInfo
369
+ properties: {}
370
+ "@
371
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
372
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
373
+ $out.results [0 ].name | Should - Be $expected
374
+ }
375
+
376
+ It ' Expression with object parameter access: <expression>' - TestCases @ (
377
+ @ { expression = " [parameters('config').name]" ; expected = ' MyApp' }
378
+ @ { expression = " [concat(parameters('config').prefix, '-', parameters('config').id)]" ; expected = ' app-001' }
379
+ @ { expression = " [parameters('servers')[0]]" ; expected = ' web01' }
380
+ @ { expression = " [parameters('servers')[parameters('config').index]]" ; expected = ' db01' }
381
+ ) {
382
+ param ($expression , $expected )
383
+ $yaml = @"
384
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
385
+ parameters:
386
+ config:
387
+ type: object
388
+ defaultValue:
389
+ name: MyApp
390
+ prefix: app
391
+ id: '001'
392
+ index: 1
393
+ servers:
394
+ type: array
395
+ defaultValue:
396
+ - web01
397
+ - db01
398
+ - cache01
399
+ resources:
400
+ - name: "$expression "
401
+ type: Microsoft/OSInfo
402
+ properties: {}
403
+ "@
404
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
405
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
406
+ $out.results [0 ].name | Should - Be $expected
407
+ }
408
+
409
+ It ' Resource name expression error cases: <expression>' - TestCases @ (
410
+ @ { expression = " [parameters('nonexistent')]" ; errorPattern = " *Parameter 'nonexistent' not found*" }
411
+ @ { expression = " [concat()]" ; errorPattern = " *requires at least 1 argument*" }
412
+ @ { expression = " [add('text', 'more')]" ; errorPattern = " *must be a number*" }
413
+ @ { expression = " [parameters('config').nonexistent]" ; errorPattern = " *Property 'nonexistent' not found*" }
414
+ @ { expression = " [parameters('array')[10]]" ; errorPattern = " *Index out of bounds*" }
415
+ ) {
416
+ param ($expression , $errorPattern )
417
+ $yaml = @"
418
+ `$ schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
419
+ parameters:
420
+ config:
421
+ type: object
422
+ defaultValue:
423
+ name: test
424
+ array:
425
+ type: array
426
+ defaultValue:
427
+ - item1
428
+ - item2
429
+ resources:
430
+ - name: "$expression "
431
+ type: Microsoft/OSInfo
432
+ properties: {}
433
+ "@
434
+ dsc config get - i $yaml 2> $TestDrive / error.log | Out-Null
435
+ $LASTEXITCODE | Should - Be 2
436
+ $errorLog = Get-Content $TestDrive / error.log - Raw
437
+ $errorLog | Should - BeLike $errorPattern
438
+ }
439
+
440
+ It ' Resource name expression must evaluate to string' {
441
+ $yaml = @'
442
+ $schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
443
+ parameters:
444
+ number:
445
+ type: int
446
+ defaultValue: 42
447
+ resources:
448
+ - name: "[parameters('number')]"
449
+ type: Microsoft/OSInfo
450
+ properties: {}
451
+ '@
452
+ dsc config get - i $yaml 2> $TestDrive / error.log | Out-Null
453
+ $LASTEXITCODE | Should - Be 2
454
+ $errorLog = Get-Content $TestDrive / error.log - Raw
455
+ $errorLog | Should - BeLike " *Resource name expression must evaluate to a string*"
456
+ }
457
+
458
+ It ' Multiple resources with different name expressions' {
459
+ $yaml = @'
460
+ $schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
461
+ parameters:
462
+ env:
463
+ type: string
464
+ defaultValue: test
465
+ appId:
466
+ type: int
467
+ defaultValue: 1
468
+ resources:
469
+ - name: "[concat('web-', parameters('env'))]"
470
+ type: Microsoft/OSInfo
471
+ properties: {}
472
+ - name: "[format('app-{0:D2}', parameters('appId'))]"
473
+ type: Microsoft/OSInfo
474
+ properties: {}
475
+ - name: "static-name"
476
+ type: Microsoft/OSInfo
477
+ properties: {}
478
+ '@
479
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
480
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
481
+ $out.results [0 ].name | Should - Be ' web-test'
482
+ $out.results [1 ].name | Should - Be ' app-01'
483
+ $out.results [2 ].name | Should - Be ' static-name'
484
+ }
485
+
486
+ It ' Resource name expression with conditional logic' {
487
+ $yaml = @'
488
+ $schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
489
+ parameters:
490
+ isProd:
491
+ type: bool
492
+ defaultValue: true
493
+ serviceName:
494
+ type: string
495
+ defaultValue: api
496
+ resources:
497
+ - name: "[concat(parameters('serviceName'), if(parameters('isProd'), '-prod', '-dev'))]"
498
+ type: Microsoft/OSInfo
499
+ properties: {}
500
+ '@
501
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
502
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
503
+ $out.results [0 ].name | Should - Be ' api-prod'
504
+ }
505
+
506
+ It ' Resource name with nested function calls' {
507
+ $yaml = @'
508
+ $schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
509
+ parameters:
510
+ config:
511
+ type: object
512
+ defaultValue:
513
+ services:
514
+ - web
515
+ - api
516
+ - db
517
+ selectedIndex: 1
518
+ resources:
519
+ - name: "[toUpper(parameters('config').services[parameters('config').selectedIndex])]"
520
+ type: Microsoft/OSInfo
521
+ properties: {}
522
+ '@
523
+ $out = dsc config get - i $yaml 2> $TestDrive / error.log | ConvertFrom-Json
524
+ $LASTEXITCODE | Should - Be 0 - Because (Get-Content $TestDrive / error.log - Raw | Out-String )
525
+ $out.results [0 ].name | Should - Be ' API'
526
+ }
527
+ }
245
528
}
0 commit comments