Skip to content

Commit 8456537

Browse files
author
petru
committed
feat: Update Mock-EnvironmentVariable
Add the posibility to mock multiple environment variables at once.
1 parent 441802b commit 8456537

File tree

2 files changed

+319
-21
lines changed

2 files changed

+319
-21
lines changed

src/PesterExtensions/Public/Mock-EnvironmentVariable.ps1

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
function Restore {
22
param (
3-
[string]
4-
$Variable,
5-
6-
[EnvironmentVariableTarget[]]
7-
$Targets,
8-
93
[hashtable]
104
$Backup
115
)
12-
foreach ($target in $targets) {
13-
[Environment]::SetEnvironmentVariable($Variable, $Backup[$target], $target)
6+
foreach ($variable in $Backup.Keys) {
7+
foreach ($target in $Backup.$variable.Keys) {
8+
[Environment]::SetEnvironmentVariable($variable, $Backup.$variable.$target, $target)
9+
}
1410
}
1511
}
1612

17-
function Set-Values {
13+
function Backup {
1814
param (
19-
[string]
20-
$Variable,
15+
[string[]]
16+
$Variables,
2117

2218
[EnvironmentVariableTarget[]]
2319
$Targets,
@@ -26,13 +22,17 @@ function Set-Values {
2622
$value
2723
)
2824
$Backup = @{}
29-
30-
foreach ($target in $Targets) {
31-
$OriginalValue = [Environment]::GetEnvironmentVariable($Variable, $target)
32-
$Backup.Add($target, $OriginalValue)
33-
if ($Value) {
34-
[Environment]::SetEnvironmentVariable($Variable, $Value, $target)
25+
26+
foreach ($variable in $Variables) {
27+
$VariableBackup = @{}
28+
foreach ($target in $Targets) {
29+
$OriginalValue = [Environment]::GetEnvironmentVariable($variable, $target)
30+
$VariableBackup.Add($target, $OriginalValue)
31+
if ($Value) {
32+
[Environment]::SetEnvironmentVariable($variable, $Value, $target)
33+
}
3534
}
35+
$Backup.Add($variable, $VariableBackup)
3636
}
3737

3838
return $Backup
@@ -42,7 +42,7 @@ function Set-Values {
4242
function Mock-EnvironmentVariable {
4343
param (
4444
[parameter(Mandatory = $true)]
45-
[string]
45+
[string[]]
4646
$Variable,
4747

4848
[Parameter(Mandatory = $true)]
@@ -58,11 +58,10 @@ function Mock-EnvironmentVariable {
5858
$Targets = @([EnvironmentVariableTarget]::Process)
5959
)
6060

61-
$Backup = Set-Values -Variable $Variable -Targets $Targets -value $Value
61+
$Backup = Backup -Variables $Variable -Targets $Targets -value $Value
6262

6363
try { Invoke-Command -ScriptBlock $Fixture }
64-
catch { throw $_ }
65-
finally { Restore -Variable $Variable -Targets $Targets -Backup $Backup }
64+
finally { Restore -Backup $Backup }
6665

6766
<#
6867
.PARAMETER Variable

tests/PesterExtensions/Public/Mock-EnvironmentVariable.Tests.ps1

Lines changed: 299 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,305 @@ Describe 'Check env mocking' -ForEach @(
288288
}
289289
}
290290

291+
Describe 'Check env mocking' -ForEach @(
292+
@{
293+
Arguments = @{
294+
Value = 'Mocked Value';
295+
}
296+
MockedTargets = @([EnvironmentVariableTarget]::Process)
297+
InitialValue = 'Initial Value';
298+
ValueInsideTheScript = 'Mocked Value';
299+
Script = { }
300+
}
301+
@{
302+
Arguments = @{
303+
Value = 'Mocked Value'
304+
}
305+
MockedTargets = @([EnvironmentVariableTarget]::Process)
306+
InitialValue = $null;
307+
ValueInsideTheScript = 'Mocked Value';
308+
Script = { }
309+
}
310+
@{
311+
Arguments = @{ }
312+
MockedTargets = @([EnvironmentVariableTarget]::Process)
313+
InitialValue = 'Initial Value';
314+
ValueInsideTheScript = 'Initial Value';
315+
Script = { }
316+
}
317+
@{
318+
MockedTargets = @([EnvironmentVariableTarget]::Process)
319+
Script = { }
320+
}
321+
@{
322+
Arguments = @{
323+
Value = 'Mocked Value'
324+
}
325+
MockedTargets = @([EnvironmentVariableTarget]::Process)
326+
InitialValue = 'Initial Value';
327+
ValueInsideTheScript = 'Mocked Value';
328+
Script = {
329+
foreach ($variable in $args[0]) {
330+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value')
331+
}
332+
}
333+
}
334+
@{
335+
Arguments = @{ }
336+
MockedTargets = @([EnvironmentVariableTarget]::Process)
337+
InitialValue = 'Initial Value';
338+
ValueInsideTheScript = 'Initial Value';
339+
Script = {
340+
foreach ($variable in $args[0]) {
341+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value')
342+
}
343+
}
344+
}
345+
@{
346+
Arguments = @{
347+
Value = 'Mocked Value'
348+
}
349+
MockedTargets = @([EnvironmentVariableTarget]::Process)
350+
InitialValue = $null;
351+
ValueInsideTheScript = 'Mocked Value';
352+
Script = {
353+
foreach ($variable in $args[0]) {
354+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value')
355+
}
356+
}
357+
}
358+
@{
359+
Arguments = @{ }
360+
MockedTargets = @([EnvironmentVariableTarget]::Process)
361+
InitialValue = $null;
362+
ValueInsideTheScript = $null;
363+
Script = {
364+
foreach ($variable in $args[0]) {
365+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value')
366+
}
367+
}
368+
}
369+
@{
370+
Arguments = @{
371+
Value = 'Mocked Value';
372+
Targets = @([EnvironmentVariableTarget]::User)
373+
}
374+
MockedTargets = @([EnvironmentVariableTarget]::User)
375+
InitialValue = 'Initial Value';
376+
ValueInsideTheScript = 'Mocked Value';
377+
Script = { }
378+
}
379+
@{
380+
Arguments = @{
381+
Value = 'Mocked Value';
382+
Targets = @([EnvironmentVariableTarget]::User)
383+
}
384+
MockedTargets = @([EnvironmentVariableTarget]::User)
385+
InitialValue = $null;
386+
ValueInsideTheScript = 'Mocked Value';
387+
Script = { }
388+
}
389+
@{
390+
Arguments = @{
391+
Targets = @([EnvironmentVariableTarget]::User)
392+
}
393+
MockedTargets = @([EnvironmentVariableTarget]::User)
394+
InitialValue = 'Initial Value';
395+
ValueInsideTheScript = 'Initial Value';
396+
Script = { }
397+
}
398+
@{
399+
Arguments = @{
400+
Targets = @([EnvironmentVariableTarget]::User)
401+
}
402+
MockedTargets = @([EnvironmentVariableTarget]::User)
403+
Script = { }
404+
}
405+
@{
406+
Arguments = @{
407+
Targets = @([EnvironmentVariableTarget]::User)
408+
Value = 'Mocked Value'
409+
}
410+
MockedTargets = @([EnvironmentVariableTarget]::User)
411+
InitialValue = 'Initial Value';
412+
ValueInsideTheScript = 'Mocked Value';
413+
Script = {
414+
foreach ($variable in $args[0]) {
415+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
416+
}
417+
}
418+
}
419+
@{
420+
Arguments = @{
421+
Targets = @([EnvironmentVariableTarget]::User)
422+
}
423+
MockedTargets = @([EnvironmentVariableTarget]::User)
424+
InitialValue = 'Initial Value';
425+
ValueInsideTheScript = 'Initial Value';
426+
Script = {
427+
foreach ($variable in $args[0]) {
428+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
429+
}
430+
}
431+
}
432+
@{
433+
Arguments = @{
434+
Value = 'Mocked Value';
435+
Targets = @([EnvironmentVariableTarget]::User)
436+
}
437+
MockedTargets = @([EnvironmentVariableTarget]::User)
438+
InitialValue = $null;
439+
ValueInsideTheScript = 'Mocked Value';
440+
Script = {
441+
foreach ($variable in $args[0]) {
442+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
443+
}
444+
}
445+
}
446+
@{
447+
Arguments = @{
448+
Targets = @([EnvironmentVariableTarget]::User)
449+
}
450+
MockedTargets = @([EnvironmentVariableTarget]::User)
451+
InitialValue = $null;
452+
ValueInsideTheScript = $null;
453+
Script = {
454+
foreach ($variable in $args[0]) {
455+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
456+
}
457+
}
458+
}
459+
460+
@{
461+
Arguments = @{
462+
Value = 'Mocked Value';
463+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
464+
}
465+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
466+
InitialValue = 'Initial Value';
467+
ValueInsideTheScript = 'Mocked Value';
468+
Script = { }
469+
}
470+
@{
471+
Arguments = @{
472+
Value = 'Mocked Value';
473+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
474+
}
475+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
476+
InitialValue = $null;
477+
ValueInsideTheScript = 'Mocked Value';
478+
Script = { }
479+
}
480+
@{
481+
Arguments = @{
482+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
483+
}
484+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
485+
InitialValue = 'Initial Value';
486+
ValueInsideTheScript = 'Initial Value';
487+
Script = { }
488+
}
489+
@{
490+
Arguments = @{
491+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
492+
}
493+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
494+
Script = { }
495+
}
496+
@{
497+
Arguments = @{
498+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
499+
Value = 'Mocked Value'
500+
}
501+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
502+
InitialValue = 'Initial Value';
503+
ValueInsideTheScript = 'Mocked Value';
504+
Script = {
505+
foreach ($variable in $args[0]) {
506+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
507+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'Process')
508+
}
509+
}
510+
}
511+
@{
512+
Arguments = @{
513+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
514+
}
515+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
516+
InitialValue = 'Initial Value';
517+
ValueInsideTheScript = 'Initial Value';
518+
Script = {
519+
foreach ($variable in $args[0]) {
520+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
521+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'Process')
522+
}
523+
}
524+
}
525+
@{
526+
Arguments = @{
527+
Value = 'Mocked Value';
528+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
529+
}
530+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
531+
InitialValue = $null;
532+
ValueInsideTheScript = 'Mocked Value';
533+
Script = {
534+
foreach ($variable in $args[0]) {
535+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'User')
536+
[Environment]::SetEnvironmentVariable($variable, 'Some updated value', 'Process')
537+
}
538+
}
539+
}
540+
@{
541+
Arguments = @{
542+
Targets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
543+
}
544+
MockedTargets = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Process)
545+
InitialValue = $null;
546+
ValueInsideTheScript = $null;
547+
Script = {
548+
[Environment]::SetEnvironmentVariable($args[0], 'Some updated value', 'User')
549+
[Environment]::SetEnvironmentVariable($args[0], 'Some updated value', 'Process')
550+
}
551+
}
552+
) {
553+
BeforeAll {
554+
$variables = @(
555+
"test_$(New-Guid)"
556+
"test_$(New-Guid)"
557+
"test_$(New-Guid)"
558+
)
559+
foreach ($target in $MockedTargets) {
560+
foreach ($environmentVariableName in $variables) {
561+
[Environment]::SetEnvironmentVariable($environmentVariableName, $InitialValue, $target)
562+
}
563+
}
564+
}
565+
It 'Test <MockedTargets>' {
566+
Mock-EnvironmentVariable -Variable $variables @arguments -Fixture {
567+
foreach ($target in $MockedTargets) {
568+
foreach ($environmentVariableName in $variables) {
569+
[Environment]::GetEnvironmentVariable($environmentVariableName, $target) | Should -Be $ValueInsideTheScript
570+
}
571+
}
572+
Invoke-Command -ScriptBlock $script -ArgumentList $variables
573+
}
574+
foreach ($target in $MockedTargets) {
575+
foreach ($environmentVariableName in $variables) {
576+
[Environment]::GetEnvironmentVariable($environmentVariableName, $target) | Should -Be $InitialValue
577+
}
578+
}
579+
}
580+
AfterAll {
581+
foreach ($target in $MockedTargets) {
582+
foreach ($environmentVariableName in $variables) {
583+
[Environment]::SetEnvironmentVariable($environmentVariableName, $null, $target)
584+
}
585+
}
586+
}
587+
}
588+
589+
291590
Describe 'Should throw' -ForEach @(
292591
@{
293592
InitialValue = 'Initial Value';

0 commit comments

Comments
 (0)