tests/New-ModuleFromTemplate.Tests.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#Requires -Modules Pester, testing

Import-ModuleFromPath -Parent 
. "${PSScriptRoot}\TestHelper.ps1"
$mut = 'Templates'
$sut = 'New-ModuleFromTemplate'

Describe "'$sut' tests with mandatory parameters only" {

    $destination = "${TestDrive}\mymodule"
    $moduleName = "mymodule"
    $description = 'My description'
    & $sut -DestinationPath $destination -ModuleName $moduleName -Description $description -NoPrompt

    $itemsWhichShouldExist = @(
        @{ path = "${destination}\$moduleName" }
        @{ path = "${destination}\${moduleName}\${moduleName}.psd1" }
        @{ path = "${destination}\${moduleName}\${moduleName}.psm1" }
        @{ path = "${destination}\${moduleName}\src" }
        @{ path = "${destination}\${moduleName}\tests" }
    )

    $itemsWhichShouldNotExist = @(
        @{ path = "${destination}\.gitignore" }
        @{ path = "${destination}\appveyor.yml" }
        @{ path = "${destination}\LICENSE" }
        @{ path = "${destination}\README.md" }
    )

    It "should create item '<path>'" -TestCases $itemsWhichShouldExist {
        Param ($path)

        $path | Should exist
    }

    It "should not create item '<path>'" -TestCases $itemsWhichShouldNotExist {
        Param ($path)

        $path | Should not exist
    }
}

Describe "'$sut' tests with mandatory parameters only and GitHub parameter specified" {

    $destination = "${TestDrive}\mymodule"
    $moduleName = "mymodule"
    $description = 'My description'
    & $sut -DestinationPath $destination -ModuleName $moduleName -Description $description -NoPrompt -GitHub

    $itemsWhichShouldExist = @(
        @{ path = "${destination}\.gitignore" }
        @{ path = "${destination}\appveyor.yml" }
        @{ path = "${destination}\LICENSE" }
        @{ path = "${destination}\README.md" }
        @{ path = "${destination}\$moduleName" }
        @{ path = "${destination}\${moduleName}\${moduleName}.psd1" }
        @{ path = "${destination}\${moduleName}\${moduleName}.psm1" }
        @{ path = "${destination}\${moduleName}\src" }
        @{ path = "${destination}\${moduleName}\tests" }
    )

    It "should create item '<path>'" -TestCases $itemsWhichShouldExist {
        Param ($path)

        $path | Should exist
    }
}

Describe "'$sut' tests with invalid parameters" {

    $errorThrowingArguments = @(
        @{  arguments = @{ DestinationPath='' } + (Get-ValidModuleName)
            expectedErrorContent = 'DestinationPath'
        }, 
        @{  arguments = @{ DestinationPath=$null } + (Get-ValidModuleName)
            expectedErrorContent = 'DestinationPath'
        }, 
        @{  arguments = (Get-ValidDestination) + @{ ModuleName='' }
            expectedErrorContent = 'ModuleName'
        }, 
        @{  arguments = (Get-ValidDescription) + @{ ModuleName=$null }
            expectedErrorContent = 'ModuleName'
        },
        @{  arguments = (Get-ValidMandatoryArgs) + @{ Author="" }
            expectedErrorContent = 'Author'
        },
        @{  arguments = (Get-ValidMandatoryArgs) + @{ Author=$null }
            expectedErrorContent = 'Author'
        }
    )

    It "should throw an error because of <expectedErrorContent>." -TestCases $errorThrowingArguments {
        Param($arguments, $expectedErrorContent)
        { & $sut @arguments } | Should throw $expectedErrorContent
    }
}

Describe "'$sut' without NoPrompt parameter" {

    Mock -CommandName 'Invoke-Plaster' -ModuleName $mut -MockWith { }

    It "should not auto fill non mandatory parameters" {
        $args = Get-ValidMandatoryArgs
        & $sut @args 

        # The Invoke-Plaster cmdlet should not contain any values for the non mandatory parameters
        # because they should be prompted to input.
        Assert-MockCalled -CommandName 'Invoke-Plaster' -ModuleName $mut -ParameterFilter {
            !$PSBoundParameters.ContainsKey("Author") -and
                !$PSBoundParameters.ContainsKey("Version") -and
                !$PSBoundParameters.ContainsKey("Company") -and
                !$PSBoundParameters.ContainsKey("PowerShellVersion")
        }
    }

    It "should use default values for parameters when passing NoPrompt switch" {
        $args = Get-ValidMandatoryArgs
        & $sut @args -NoPrompt

        Assert-MockCalled -CommandName 'Invoke-Plaster' -ModuleName $mut -ParameterFilter { 
            $Author -eq 'Unknown' -and 
            $Version -eq '0.1.0' -and
            $Company -eq 'Unknown' -and
            $PowerShellVersion -eq 'None'
        }
    }
}