diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json new file mode 100644 index 00000000..2c6f7c64 --- /dev/null +++ b/.github/linters/.jscpd.json @@ -0,0 +1,11 @@ +{ + "threshold": 0, + "reporters": [ + "consoleFull" + ], + "ignore": [ + "**/tests/**", + "**/.github/workflows/Action-Test*" + ], + "absolute": true +} diff --git a/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/linters/.powershell-psscriptanalyzer.psd1 index 40d11d60..09cc3d0c 100644 --- a/.github/linters/.powershell-psscriptanalyzer.psd1 +++ b/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -1,18 +1,56 @@ -#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings -@{ - #CustomRulePath='path\to\CustomRuleModule.psm1' - #RecurseCustomRulePath='path\of\customrules' - #Severity = @( - # 'Error' - # 'Warning' - #) - #IncludeDefaultRules=${true} +@{ + Rules = @{ + PSAlignAssignmentStatement = @{ + Enable = $true + CheckHashtable = $true + } + PSAvoidLongLines = @{ + Enable = $true + MaximumLineLength = 150 + } + PSAvoidSemicolonsAsLineTerminators = @{ + Enable = $true + } + PSPlaceCloseBrace = @{ + Enable = $true + NewLineAfter = $false + IgnoreOneLineBlock = $true + NoEmptyLineBefore = $false + } + PSPlaceOpenBrace = @{ + Enable = $true + OnSameLine = $true + NewLineAfter = $true + IgnoreOneLineBlock = $true + } + PSProvideCommentHelp = @{ + Enable = $true + ExportedOnly = $false + BlockComment = $true + VSCodeSnippetCorrection = $false + Placement = 'begin' + } + PSUseConsistentIndentation = @{ + Enable = $true + IndentationSize = 4 + PipelineIndentation = 'IncreaseIndentationForFirstPipeline' + Kind = 'space' + } + PSUseConsistentWhitespace = @{ + Enable = $true + CheckInnerBrace = $true + CheckOpenBrace = $true + CheckOpenParen = $true + CheckOperator = $true + CheckPipe = $true + CheckPipeForRedundantWhitespace = $true + CheckSeparator = $true + CheckParameter = $true + IgnoreAssignmentOperatorInsideHashTable = $true + } + } ExcludeRules = @( - 'PSMissingModuleManifestField' - 'PSAvoidUsingWriteHost' + 'PSMissingModuleManifestField', # This rule is not applicable until the module is built. + 'PSUseToExportFieldsInManifest' ) - #IncludeRules = @( - # 'PSAvoidUsingWriteHost', - # 'MyCustomRuleName' - #) } diff --git a/.github/linters/.textlintrc b/.github/linters/.textlintrc new file mode 100644 index 00000000..db48de80 --- /dev/null +++ b/.github/linters/.textlintrc @@ -0,0 +1,513 @@ +{ + "filters": { + "comments": true + }, + "rules": { + "terminology": { + "defaultTerms": false, + "terms": [ + "Airbnb", + "Android", + "AppleScript", + "AppVeyor", + "AVA", + "BrowserStack", + "Browsersync", + "Codecov", + "CodePen", + "CodeSandbox", + "DefinitelyTyped", + "EditorConfig", + "ESLint", + "GitHub", + "GraphQL", + "GraphiQL", + "iOS", + "JavaScript", + "JetBrains", + "jQuery", + "LinkedIn", + "Lodash", + "MacBook", + "Markdown", + "OpenType", + "PayPal", + "PhpStorm", + "PowerShell", + "PlayStation", + "RubyMine", + "Sass", + "SemVer", + "TypeScript", + "UglifyJS", + "Wasm", + "WebAssembly", + "WebStorm", + "WordPress", + "YouTube", + [ + "Common[ .]js", + "CommonJS" + ], + [ + "JSDocs?", + "JSDoc" + ], + [ + "Node[ .]js", + "Node.js" + ], + [ + "React[ .]js", + "React" + ], + [ + "SauceLabs", + "Sauce Labs" + ], + [ + "StackOverflow", + "Stack Overflow" + ], + [ + "styled ?components", + "styled-components" + ], + [ + "HTTP[ /]2(?:\\.0)?", + "HTTP/2" + ], + [ + "OS X", + "macOS" + ], + [ + "Mac ?OS", + "macOS" + ], + [ + "a npm", + "an npm" + ], + "ECMAScript", + [ + "ES2015", + "ES6" + ], + [ + "ES7", + "ES2016" + ], + "3D", + [ + "3-D", + "3D" + ], + "Ajax", + "API", + "APIs", + "API's", + [ + "(? Workflow suggestion - before module is built @@ -57,8 +52,7 @@ jobs: - name: Test-PSModule uses: PSModule/Test-PSModule@main with: - Path: src - TestType: SourceCode + Settings: SourceCode ``` @@ -85,8 +79,7 @@ jobs: - name: Test-PSModule uses: PSModule/Test-PSModule@main with: - Path: outputs/modules - TestType: Module + Settings: Module ``` @@ -97,33 +90,98 @@ jobs: | Name | Description | Required | Default | | ---- | ----------- | -------- | ------- | -| `Path` | The path to the code to test. | `true` | | -| `TestType` | The type of tests to run. Can be either `Module` or `SourceCode`. | `true` | | | `Name` | The name of the module to test. The name of the repository is used if not specified. | `false` | | -| `TestsPath` | The path to the tests to run. | `false` | `tests` | -| `StackTraceVerbosity` | Verbosity level of the stack trace. Allowed values: `None`, `FirstLine`, `Filtered`, `Full`. | `false` | `Filtered` | -| `Verbosity` | Verbosity level of the test output. Allowed values: `None`, `Normal`, `Detailed`, `Diagnostic`. | `false` | `Detailed` | -| `Debug` | Enable debug output. | `'false'` | `false` | -| `Verbose` | Enable verbose output. | `'false'` | `false` | -| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | | `false` | -| `Prerelease` | Allow prerelease versions if available. | `'false'` | `false` | +| `Settings` | The type of tests to run. Can be either `Module` or `SourceCode`. | `true` | | +| `Debug` | Enable debug output. | `false` | `'false'` | +| `Verbose` | Enable verbose output. | `false` | `'false'` | +| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | | +| `Prerelease` | Allow prerelease versions if available. | `false` | `'false'` | +| `WorkingDirectory` | The working directory to use for the action. This is the root folder where tests and outputs are expected. | `false` | `'.'` | +| `StepSummary_Mode` | Controls which tests to show in the GitHub step summary. Allows "Full" (all tests), "Failed" (only failed tests), or "None" (disable step summary). | `false` | `Failed` | +| `StepSummary_ShowTestOverview` | Controls whether to show the test overview table in the GitHub step summary. | `false` | `false` | +| `StepSummary_ShowConfiguration` | Controls whether to show the configuration details in the GitHub step summary. | `false` | `false` | +| `Run_ExcludePath` | Directories/files to exclude from the run. | `false` | | +| `Run_ScriptBlock` | ScriptBlocks containing tests to be executed. | `false` | | +| `Run_Container` | ContainerInfo objects containing tests to be executed. | `false` | | +| `Run_TestExtension` | Filter used to identify test files (e.g. `.Tests.ps1`). | `false` | | +| `Run_Exit` | Whether to exit with a non-zero exit code on failure. | `false` | | +| `Run_Throw` | Whether to throw an exception on test failure. | `false` | | +| `Run_SkipRun` | Discovery only, skip actual test run. | `false` | | +| `Run_SkipRemainingOnFailure` | Skips remaining tests after the first failure. Options: `None`, `Run`, `Container`, `Block`. | `false` | | +| `Filter_Tag` | Tags of Describe/Context/It blocks to run. | `false` | | +| `Filter_ExcludeTag` | Tags of Describe/Context/It blocks to exclude. | `false` | | +| `Filter_Line` | Filter by file + scriptblock start line (e.g. `C:\tests\file1.Tests.ps1:37`). | `false` | | +| `Filter_ExcludeLine` | Exclude by file + scriptblock start line. Precedence over `Filter_Line`. | `false` | | +| `Filter_FullName` | Full name of a test with wildcards, joined by dot. E.g. `*.describe Get-Item.test1` | `false` | | +| `CodeCoverage_Enabled` | Enable code coverage. | `false` | | +| `CodeCoverage_OutputFormat` | Format for the coverage report. Possible values: `JaCoCo`, `CoverageGutters`, `Cobertura`. | `false` | | +| `CodeCoverage_OutputPath` | Where to save the code coverage report (relative to the current dir). | `false` | | +| `CodeCoverage_OutputEncoding` | Encoding of the coverage file. | `false` | | +| `CodeCoverage_Path` | Files/directories to measure coverage on (by default, reuses `Path` from the general settings). | `false` | | +| `CodeCoverage_ExcludeTests` | Exclude tests themselves from coverage. | `false` | | +| `CodeCoverage_RecursePaths` | Recurse through coverage directories. | `false` | | +| `CodeCoverage_CoveragePercentTarget` | Desired minimum coverage percentage. | `false` | | +| `CodeCoverage_UseBreakpoints` | **Experimental**: When `false`, use a Profiler-based tracer instead of breakpoints. | `false` | | +| `CodeCoverage_SingleHitBreakpoints` | Remove breakpoints after first hit. | `false` | | +| `TestResult_Enabled` | Enable test-result output (e.g. NUnitXml, JUnitXml). | `false` | | +| `TestResult_OutputFormat` | Possible values: `NUnitXml`, `NUnit2.5`, `NUnit3`, `JUnitXml`. | `false` | | +| `TestResult_OutputPath` | Where to save the test-result report (relative path). | `false` | | +| `TestResult_OutputEncoding` | Encoding of the test-result file. | `false` | | +| `Should_ErrorAction` | Controls if `Should` throws on error. Use `Stop` to throw, or `Continue` to fail at the end. | `false` | | +| `Debug_ShowFullErrors` | Show Pester internal stack on errors. (Deprecated – overrides `Output.StackTraceVerbosity` to `Full`). | `false` | | +| `Debug_WriteDebugMessages` | Write debug messages to screen. | `false` | | +| `Debug_WriteDebugMessagesFrom` | Filter debug messages by source. Wildcards allowed. | `false` | | +| `Debug_ShowNavigationMarkers` | Write paths after every block/test for easy navigation in Visual Studio Code. | `false` | | +| `Debug_ReturnRawResultObject` | Returns an unfiltered result object, for development only. | `false` | | +| `Output_Verbosity` | Verbosity: `None`, `Normal`, `Detailed`, `Diagnostic`. | `false` | | +| `Output_StackTraceVerbosity` | Stacktrace detail: `None`, `FirstLine`, `Filtered`, `Full`. | `false` | | +| `Output_CIFormat` | CI format of error output: `None`, `Auto`, `AzureDevops`, `GithubActions`. | `false` | | +| `Output_CILogLevel` | CI log level: `Error` or `Warning`. | `false` | | +| `Output_RenderMode` | How to render console output: `Auto`, `Ansi`, `ConsoleColor`, `Plaintext`. | `false` | | +| `TestDrive_Enabled` | Enable `TestDrive`. | `false` | | +| `TestRegistry_Enabled` | Enable `TestRegistry`. | `false` | | ### Outputs -| Name | Description | Possible values | -| ---- | ----------- | --------------- | -| `passed` | If the tests passed. | `true`, `false` | +| Output | Description | +|-------------------------|--------------------------------------| +| `Outcome` | Outcome of the test run. | +| `Conclusion` | Conclusion status of test execution. | +| `Executed` | Indicates if tests were executed. | +| `Result` | Overall result (`Passed`, `Failed`). | +| `FailedCount` | Number of failed tests. | +| `FailedBlocksCount` | Number of failed blocks. | +| `FailedContainersCount` | Number of failed containers. | +| `PassedCount` | Number of passed tests. | +| `SkippedCount` | Number of skipped tests. | +| `InconclusiveCount` | Number of inconclusive tests. | +| `NotRunCount` | Number of tests not run. | +| `TotalCount` | Total tests executed. | ## PSModule tests -The [PSModule framework tests](https://github.com/PSModule/Test-PSModule/blob/main/scripts/tests/PSModule/PSModule.Tests.ps1) verifies the following coding practices that the framework enforces: +### SourceCode tests + +The [PSModule - SourceCode tests](./scripts/tests/SourceCode/PSModule/PSModule.Tests.ps1) verifies the following coding practices that the framework enforces: + +| ID | Category | Description | +|---------------------|---------------------|--------------------------------------------------------------------------------------------| +| NumberOfProcessors | General | Should use `[System.Environment]::ProcessorCount` instead of `$env:NUMBER_OF_PROCESSORS`. | +| Verbose | General | Should not contain `-Verbose` unless it is explicitly disabled with `:$false`. | +| OutNull | General | Should use `$null = ...` instead of piping output to `Out-Null`. | +| NoTernary | General | Should not use ternary operations to maintain compatibility with PowerShell 5.1 and below. | +| LowercaseKeywords | General | All PowerShell keywords should be written in lowercase. | +| FunctionCount | Functions (Generic) | Each script file should contain exactly one function or filter. | +| FunctionName | Functions (Generic) | Script filenames should match the name of the function or filter they contain. | +| CmdletBinding | Functions (Generic) | Functions should include the `[CmdletBinding()]` attribute. | +| ParamBlock | Functions (Generic) | Functions should have a parameter block (`param()`). | +| FunctionTest | Functions (Public) | All public functions/filters should have corresponding tests. | -- Script filename and function/filter name should match. +### Module tests -## Tools +The [PSModule - Module tests](./scripts/tests/Module/PSModule/PSModule.Tests.ps1) verifies the following coding practices that the framework enforces: -- Pester | [Docs](https://www.pester.dev) | [GitHub](https://github.com/Pester/Pester) | [PS Gallery](https://www.powershellgallery.com/packages/Pester/) -- PSScriptAnalyzer [Docs](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) | [GitHub](https://github.com/PowerShell/PSScriptAnalyzer) | [PS Gallery](https://www.powershellgallery.com/packages/PSScriptAnalyzer/) -- PSResourceGet | [Docs](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.psresourceget/?view=powershellget-3.x) | [GitHub](https://github.com/PowerShell/PSResourceGet) | [PS Gallery](https://www.powershellgallery.com/packages/Microsoft.PowerShell.PSResourceGet/) -- [Test-ModuleManifest | Microsoft Learn](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/test-modulemanifest) -- [PowerShellGet | Microsoft Learn](https://learn.microsoft.com/en-us/powershell/module/PowerShellGet/test-scriptfileinfo) +| Name | Description | +| ------ | ----------- | +| Module Manifest exists | Verifies that a module manifest file is present. | +| Module Manifest is valid | Verifies that the module manifest file is valid. | diff --git a/action.yml b/action.yml index 9131b01c..27011343 100644 --- a/action.yml +++ b/action.yml @@ -9,24 +9,193 @@ inputs: Name: description: The name of the module to test. The name of the repository is used if not specified. required: false - Path: - description: The path to the code to test. - required: true - TestType: + Settings: description: The type of tests to run. Can be either 'Module' or 'SourceCode'. required: true - TestsPath: - description: The path to the tests to run. + StepSummary_Mode: + description: | + Controls which tests to show in the GitHub step summary. Allows "Full" (show all tests), "Failed" (only failed tests), or "None" (disable step summary). + required: false + StepSummary_ShowTestOverview: + description: | + Controls whether to show the test overview table in the GitHub step summary. + required: false + StepSummary_ShowConfiguration: + description: | + Controls whether to show the configuration details in the GitHub step summary. + required: false + Run_Path: + description: | + Directories to be searched for tests, paths directly to test files, or combination of both. + required: false + Run_ExcludePath: + description: | + Directories or files to be excluded from the run. + required: false + Run_ScriptBlock: + description: | + ScriptBlocks containing tests to be executed. + required: false + Run_Container: + description: | + ContainerInfo objects containing tests to be executed. + required: false + Run_TestExtension: + description: | + Filter used to identify test files. + required: false + Run_Exit: + description: | + Exit with non-zero exit code when the test run fails. Exit code is always set to `$LASTEXITCODE` even when this option is `$false`. + When used together with Throw, throwing an exception is preferred. + required: false + Run_Throw: + description: | + Throw an exception when test run fails. When used together with Exit, throwing an exception is preferred. + required: false + Run_SkipRun: + description: | + Runs the discovery phase but skips run. Use it with PassThru to get object populated with all tests. + required: false + Run_SkipRemainingOnFailure: + description: | + Skips remaining tests after failure for selected scope, options are None, Run, Container and Block. + required: false + Filter_Tag: + description: | + Tags of Describe, Context or It to be run. + required: false + Filter_ExcludeTag: + description: | + Tags of Describe, Context or It to be excluded from the run. + required: false + Filter_Line: + description: | + Filter by file and scriptblock start line, useful to run parsed tests programmatically to avoid problems with expanded names. + Example: 'C:\tests\file1.Tests.ps1:37' + required: false + Filter_ExcludeLine: + description: | + Exclude by file and scriptblock start line, takes precedence over Line. + required: false + Filter_FullName: + description: | + Full name of test with -like wildcards, joined by dot. Example: '*.describe Get-Item.test1' + required: false + CodeCoverage_Enabled: + description: | + Enable CodeCoverage. + required: false + CodeCoverage_OutputFormat: + description: | + Format to use for code coverage report. Possible values: JaCoCo, CoverageGutters, Cobertura + required: false + CodeCoverage_OutputPath: + description: | + Path relative to the current directory where code coverage report is saved. + required: false + CodeCoverage_OutputEncoding: + description: | + Encoding of the output file. + required: false + CodeCoverage_Path: + description: | + Directories or files to be used for code coverage, by default the Path(s) from general settings are used, unless overridden here. + required: false + CodeCoverage_ExcludeTests: + description: | + Exclude tests from code coverage. This uses the TestFilter from general configuration. + required: false + CodeCoverage_RecursePaths: + description: | + Will recurse through directories in the Path option. + required: false + CodeCoverage_CoveragePercentTarget: + description: | + Target percent of code coverage that you want to achieve. + required: false + CodeCoverage_UseBreakpoints: + description: | + EXPERIMENTAL: When false, use Profiler based tracer to do CodeCoverage instead of using breakpoints. + required: false + CodeCoverage_SingleHitBreakpoints: + description: | + Remove breakpoint when it is hit. required: false - default: tests - StackTraceVerbosity: - description: "Verbosity level of the stack trace. Allowed values: 'None', 'FirstLine', 'Filtered', 'Full'." + TestResult_Enabled: + description: | + Enable TestResult. required: false - default: 'Filtered' - Verbosity: - description: "Verbosity level of the test output. Allowed values: 'None', 'Normal', 'Detailed', 'Diagnostic'." + TestResult_OutputFormat: + description: | + Format to use for test result report. Possible values: NUnitXml, NUnit2.5, NUnit3 or JUnitXml + required: false + TestResult_OutputPath: + description: | + Path relative to the current directory where test result report is saved. + required: false + TestResult_OutputEncoding: + description: | + Encoding of the output file. + required: false + TestResult_TestSuiteName: + description: | + Set the name assigned to the root 'test-suite' element. + required: false + Should_ErrorAction: + description: | + Controls if Should throws on error. Use 'Stop' to throw on error, or 'Continue' to fail at the end of the test. + required: false + Debug_ShowFullErrors: + description: | + Show full errors including Pester internal stack. This property is deprecated, and if set to true it will override Output.StackTraceVerbosity to 'Full'. + required: false + Debug_WriteDebugMessages: + description: | + Write Debug messages to screen. + required: false + Debug_WriteDebugMessagesFrom: + description: | + Write Debug messages from a given source, WriteDebugMessages must be set to true for this to work. + You can use like wildcards to get messages from multiple sources, as well as * to get everything. + required: false + Debug_ShowNavigationMarkers: + description: | + Write paths after every block and test, for easy navigation in VSCode. + required: false + Debug_ReturnRawResultObject: + description: | + Returns unfiltered result object, this is for development only. Do not rely on this object for additional properties, + non-public properties will be renamed without previous notice. + required: false + Output_Verbosity: + description: | + The verbosity of output, options are None, Normal, Detailed and Diagnostic. + required: false + Output_StackTraceVerbosity: + description: | + The verbosity of stacktrace output, options are None, FirstLine, Filtered and Full. + required: false + Output_CIFormat: + description: | + The CI format of error output in build logs, options are None, Auto, AzureDevops and GithubActions. + required: false + Output_CILogLevel: + description: | + The CI log level in build logs, options are Error and Warning. + required: false + Output_RenderMode: + description: | + The mode used to render console output, options are Auto, Ansi, ConsoleColor and Plaintext. + required: false + TestDrive_Enabled: + description: | + Enable TestDrive. + required: false + TestRegistry_Enabled: + description: | + Enable TestRegistry. required: false - default: 'Detailed' Debug: description: Enable debug output. required: false @@ -42,44 +211,133 @@ inputs: description: Allow prerelease versions if available. required: false default: 'false' + WorkingDirectory: + description: The working directory to use for the action. This is the root folder where tests and outputs are expected. + required: false + default: '.' outputs: - passed: - description: If the tests passed. - value: ${{ fromJSON(steps.test.outputs.result).passed }} + Outcome: + description: | + The outcome of the test run. + value: ${{ steps.test.outcome }} + Conclusion: + description: | + The conclusion of the test run. + value: ${{ steps.test.conclusion }} + Executed: + description: | + Whether tests were executed. + value: ${{ steps.test.outputs.Executed }} + Result: + description: | + Overall result of the Pester test run (e.g., Passed, Failed). + value: ${{ steps.test.outputs.Result }} + FailedCount: + description: | + Number of failed tests. + value: ${{ steps.test.outputs.FailedCount }} + FailedBlocksCount: + description: | + Number of failed blocks. + value: ${{ steps.test.outputs.FailedBlocksCount }} + FailedContainersCount: + description: | + Number of failed containers. + value: ${{ steps.test.outputs.FailedContainersCount }} + PassedCount: + description: | + Number of passed tests. + value: ${{ steps.test.outputs.PassedCount }} + SkippedCount: + description: | + Number of skipped tests. + value: ${{ steps.test.outputs.SkippedCount }} + InconclusiveCount: + description: | + Number of inconclusive tests. + value: ${{ steps.test.outputs.InconclusiveCount }} + NotRunCount: + description: | + Number of tests not run. + value: ${{ steps.test.outputs.NotRunCount }} + TotalCount: + description: | + Total count of tests. + value: ${{ steps.test.outputs.TotalCount }} runs: using: composite steps: - - name: Run Test-PSModule - uses: PSModule/GitHub-Script@v1 + - name: Install-PSModuleHelpers + uses: PSModule/Install-PSModuleHelpers@v1 + + - name: Get test paths + shell: pwsh + id: paths + working-directory: ${{ inputs.WorkingDirectory }} + env: + PSMODULE_TEST_PSMODULE_INPUT_Name: ${{ inputs.Name }} + PSMODULE_TEST_PSMODULE_INPUT_Settings: ${{ inputs.Settings }} + run: | + # Get test paths + ${{ github.action_path }}/scripts/main.ps1 + + - name: Invoke-Pester + uses: PSModule/Invoke-Pester@v4 id: test env: - GITHUB_ACTION_INPUT_Name: ${{ inputs.Name }} - GITHUB_ACTION_INPUT_Path: ${{ inputs.Path }} - GITHUB_ACTION_INPUT_TestType: ${{ inputs.TestType }} - GITHUB_ACTION_INPUT_TestsPath: ${{ inputs.TestsPath }} - GITHUB_ACTION_INPUT_StackTraceVerbosity: ${{ inputs.StackTraceVerbosity }} - GITHUB_ACTION_INPUT_Verbosity: ${{ inputs.Verbosity }} + LocalTestPath: ${{ steps.paths.outputs.LocalTestPath }} + WorkingDirectory: ${{ inputs.WorkingDirectory }} with: Debug: ${{ inputs.Debug }} - Prerelease: ${{ inputs.Prerelease }} Verbose: ${{ inputs.Verbose }} Version: ${{ inputs.Version }} - Script: | - # Test-PSModule - . "${{ github.action_path }}\scripts\main.ps1" - - - name: Upload test results - uses: actions/upload-artifact@v4 - if: ${{ inputs.TestType == 'Module' && (success() || failure()) }} - with: - name: ${{ runner.os }}-Test-Report - path: ${{ github.workspace }}/outputs/Test-Report.xml - - - name: Upload code coverage report - uses: actions/upload-artifact@v4 - if: ${{ inputs.TestType == 'Module' && (success() || failure()) }} - with: - name: ${{ runner.os }}-CodeCoverage-Report - path: ${{ github.workspace }}/outputs/CodeCoverage-Report.xml + Prerelease: ${{ inputs.Prerelease }} + WorkingDirectory: ${{ inputs.WorkingDirectory }} + Path: ${{ steps.paths.outputs.TestPath }} + StepSummary_Mode: ${{ inputs.StepSummary_Mode }} + StepSummary_ShowTestOverview: ${{ inputs.StepSummary_ShowTestOverview }} + StepSummary_ShowConfiguration: ${{ inputs.StepSummary_ShowConfiguration }} + Run_Path: ${{ steps.paths.outputs.CodePath }} + Run_ExcludePath: ${{ inputs.Run_ExcludePath }} + Run_ScriptBlock: ${{ inputs.Run_ScriptBlock }} + Run_Container: ${{ inputs.Run_Container }} + Run_TestExtension: ${{ inputs.Run_TestExtension }} + Run_Exit: ${{ inputs.Run_Exit }} + Run_Throw: ${{ inputs.Run_Throw }} + Run_SkipRun: ${{ inputs.Run_SkipRun }} + Run_SkipRemainingOnFailure: ${{ inputs.Run_SkipRemainingOnFailure }} + Filter_Tag: ${{ inputs.Filter_Tag }} + Filter_ExcludeTag: ${{ inputs.Filter_ExcludeTag }} + Filter_Line: ${{ inputs.Filter_Line }} + Filter_ExcludeLine: ${{ inputs.Filter_ExcludeLine }} + Filter_FullName: ${{ inputs.Filter_FullName }} + CodeCoverage_Enabled: ${{ inputs.CodeCoverage_Enabled }} + CodeCoverage_OutputFormat: ${{ inputs.CodeCoverage_OutputFormat }} + CodeCoverage_OutputPath: ${{ inputs.CodeCoverage_OutputPath }} + CodeCoverage_OutputEncoding: ${{ inputs.CodeCoverage_OutputEncoding }} + CodeCoverage_Path: ${{ inputs.CodeCoverage_Path }} + CodeCoverage_ExcludeTests: ${{ inputs.CodeCoverage_ExcludeTests }} + CodeCoverage_RecursePaths: ${{ inputs.CodeCoverage_RecursePaths }} + CodeCoverage_CoveragePercentTarget: ${{ inputs.CodeCoverage_CoveragePercentTarget }} + CodeCoverage_UseBreakpoints: ${{ inputs.CodeCoverage_UseBreakpoints }} + CodeCoverage_SingleHitBreakpoints: ${{ inputs.CodeCoverage_SingleHitBreakpoints }} + TestResult_Enabled: ${{ inputs.TestResult_Enabled }} + TestResult_OutputFormat: ${{ inputs.TestResult_OutputFormat }} + TestResult_OutputPath: ${{ inputs.TestResult_OutputPath }} + TestResult_OutputEncoding: ${{ inputs.TestResult_OutputEncoding }} + TestResult_TestSuiteName: PSModuleTest-${{ inputs.Settings }}-${{ runner.os }} + Should_ErrorAction: ${{ inputs.Should_ErrorAction }} + Debug_ShowFullErrors: ${{ inputs.Debug_ShowFullErrors }} + Debug_WriteDebugMessages: ${{ inputs.Debug_WriteDebugMessages }} + Debug_WriteDebugMessagesFrom: ${{ inputs.Debug_WriteDebugMessagesFrom }} + Debug_ShowNavigationMarkers: ${{ inputs.Debug_ShowNavigationMarkers }} + Debug_ReturnRawResultObject: ${{ inputs.Debug_ReturnRawResultObject }} + Output_Verbosity: ${{ inputs.Output_Verbosity }} + Output_StackTraceVerbosity: ${{ inputs.Output_StackTraceVerbosity }} + Output_CIFormat: ${{ inputs.Output_CIFormat }} + Output_CILogLevel: ${{ inputs.Output_CILogLevel }} + Output_RenderMode: ${{ inputs.Output_RenderMode }} + TestDrive_Enabled: ${{ inputs.TestDrive_Enabled }} + TestRegistry_Enabled: ${{ inputs.TestRegistry_Enabled }} diff --git a/scripts/helpers/Resolve-PSModuleDependency.ps1 b/scripts/helpers/Resolve-PSModuleDependency.ps1 deleted file mode 100644 index 9e029eb9..00000000 --- a/scripts/helpers/Resolve-PSModuleDependency.ps1 +++ /dev/null @@ -1,60 +0,0 @@ -function Resolve-PSModuleDependency { - <# - .SYNOPSIS - Resolve dependencies for a module based on the manifest file. - - .DESCRIPTION - Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure - - .EXAMPLE - Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1' - - Installs all modules defined in the manifest file, following PSModuleInfo structure. - - .NOTES - Should later be adapted to support both pre-reqs, and dependencies. - Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion, - and latest version within a range MinimumVersion - MaximumVersion. - #> - [Alias('Resolve-PSModuleDependencies')] - [CmdletBinding()] - param( - # The path to the manifest file. - [Parameter(Mandatory)] - [string] $ManifestFilePath - ) - - Write-Verbose 'Resolving dependencies' - - $manifest = Import-PowerShellDataFile -Path $ManifestFilePath - Write-Verbose "Reading [$ManifestFilePath]" - Write-Verbose "Found [$($manifest.RequiredModules.Count)] modules to install" - - foreach ($requiredModule in $manifest.RequiredModules) { - $installParams = @{} - - if ($requiredModule -is [string]) { - $installParams.Name = $requiredModule - } else { - $installParams.Name = $requiredModule.ModuleName - $installParams.MinimumVersion = $requiredModule.ModuleVersion - $installParams.RequiredVersion = $requiredModule.RequiredVersion - $installParams.MaximumVersion = $requiredModule.MaximumVersion - } - $installParams.Force = $true - $installParams.Verbose = $false - - Write-Verbose "[$($installParams.Name)] - Installing module" - $VerbosePreferenceOriginal = $VerbosePreference - $VerbosePreference = 'SilentlyContinue' - Install-Module @installParams -AllowPrerelease:$false - $VerbosePreference = $VerbosePreferenceOriginal - Write-Verbose "[$($installParams.Name)] - Importing module" - $VerbosePreferenceOriginal = $VerbosePreference - $VerbosePreference = 'SilentlyContinue' - Import-Module @installParams - $VerbosePreference = $VerbosePreferenceOriginal - Write-Verbose "[$($installParams.Name)] - Done" - } - Write-Verbose 'Resolving dependencies - Done' -} diff --git a/scripts/helpers/Test-PSModule.ps1 b/scripts/helpers/Test-PSModule.ps1 deleted file mode 100644 index fc652979..00000000 --- a/scripts/helpers/Test-PSModule.ps1 +++ /dev/null @@ -1,186 +0,0 @@ -function Test-PSModule { - <# - .SYNOPSIS - Performs tests on a module. - #> - [OutputType([int])] - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSReviewUnusedParameter', '', Scope = 'Function', - Justification = 'Parameters are used in nested ScriptBlocks' - )] - param( - # Path to the folder where the code to test is located. - [Parameter(Mandatory)] - [string] $Path, - - # Run module tests. - [Parameter()] - [ValidateSet('SourceCode', 'Module')] - [string] $TestType = 'SourceCode', - - # Path to the folder where the tests are located. - [Parameter()] - [string] $TestsPath = 'tests', - - # Verbosity level of the stack trace. - [Parameter()] - [ValidateSet('None', 'FirstLine', 'Filtered', 'Full')] - [string] $StackTraceVerbosity = 'Filtered', - - # Verbosity level of the test output. - [Parameter()] - [ValidateSet('None', 'Normal', 'Detailed', 'Diagnostic')] - [string] $Verbosity = 'Detailed' - ) - - $moduleName = Split-Path -Path $Path -Leaf - $testSourceCode = $TestType -eq 'SourceCode' - $testModule = $TestType -eq 'Module' - $moduleTestsPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $TestsPath - - LogGroup 'Get test kit versions' { - $PSSAModule = Get-PSResource -Name PSScriptAnalyzer -Verbose:$false | Sort-Object Version -Descending | Select-Object -First 1 - $pesterModule = Get-PSResource -Name Pester -Verbose:$false | Sort-Object Version -Descending | Select-Object -First 1 - - Write-Verbose 'Testing with:' - Write-Verbose " PowerShell $($PSVersionTable.PSVersion.ToString())" - Write-Verbose " Pester $($pesterModule.version)" - Write-Verbose " PSScriptAnalyzer $($PSSAModule.version)" - } - - LogGroup 'Add test - Common - PSScriptAnalyzer' { - $containers = @() - $PSSATestsPath = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSScriptAnalyzer' - $settingsFileName = if ($testModule) { 'Settings.Module.psd1' } else { 'Settings.SourceCode.psd1' } - $settingsFilePath = Join-Path -Path $PSSATestsPath -ChildPath $settingsFileName - $containerParams = @{ - Path = Join-Path $PSSATestsPath 'PSScriptAnalyzer.Tests.ps1' - Data = @{ - Path = $Path - SettingsFilePath = $settingsFilePath - Debug = $false - Verbose = $false - } - } - Write-Verbose 'ContainerParams:' - Write-Verbose "$($containerParams | ConvertTo-Json)" - $containers += New-PesterContainer @containerParams - } - - LogGroup 'Add test - Common - PSModule' { - $containerParams = @{ - Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\Common.Tests.ps1' - Data = @{ - Path = $Path - Debug = $false - Verbose = $false - } - } - Write-Verbose 'ContainerParams:' - Write-Verbose "$($containerParams | ConvertTo-Json)" - $containers += New-PesterContainer @containerParams - } - - if ($testModule) { - LogGroup 'Add test - Module - PSModule' { - $containerParams = @{ - Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\Module.Tests.ps1' - Data = @{ - Path = $Path - Debug = $false - Verbose = $false - } - } - Write-Verbose 'ContainerParams:' - Write-Verbose "$($containerParams | ConvertTo-Json)" - $containers += New-PesterContainer @containerParams - } - } - - if ($testSourceCode) { - LogGroup 'Add test - SourceCode - PSModule' { - $containerParams = @{ - Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\SourceCode.Tests.ps1' - Data = @{ - Path = $Path - TestsPath = $moduleTestsPath - Debug = $false - Verbose = $false - } - } - Write-Verbose 'ContainerParams:' - Write-Verbose "$($containerParams | ConvertTo-Json)" - $containers += New-PesterContainer @containerParams - } - } - - if ($testModule) { - if (Test-Path -Path $moduleTestsPath) { - LogGroup "Add test - Module - $moduleName" { - $containerParams = @{ - Path = $moduleTestsPath - } - Write-Verbose 'ContainerParams:' - Write-Verbose "$($containerParams | ConvertTo-Json)" - $containers += New-PesterContainer @containerParams - } - } else { - Write-Warning "⚠️ No tests found - [$moduleTestsPath]" - } - } - - if ((Test-Path -Path $moduleTestsPath) -and $testModule) { - LogGroup 'Install module dependencies' { - $moduleManifestPath = Join-Path -Path $Path -ChildPath "$moduleName.psd1" - Resolve-PSModuleDependency -ManifestFilePath $moduleManifestPath - } - - LogGroup "Importing module: $moduleName" { - Add-PSModulePath -Path (Split-Path $Path -Parent) - $existingModule = Get-Module -Name $ModuleName -ListAvailable - $existingModule | Remove-Module -Force - $existingModule.RequiredModules | ForEach-Object { $_ | Remove-Module -Force -ErrorAction SilentlyContinue } - $existingModule.NestedModules | ForEach-Object { $_ | Remove-Module -Force -ErrorAction SilentlyContinue } - Import-Module -Name $moduleName -Force -RequiredVersion '999.0.0' -Global - } - } - - LogGroup 'Pester config' { - $pesterParams = @{ - Configuration = @{ - Run = @{ - Path = $Path - Container = $containers - PassThru = $true - } - TestResult = @{ - Enabled = $testModule - OutputFormat = 'NUnitXml' - OutputPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath 'outputs\Test-Report.xml' - TestSuiteName = 'Unit tests' - } - CodeCoverage = @{ - Enabled = $testModule - OutputPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath 'outputs\CodeCoverage-Report.xml' - OutputFormat = 'JaCoCo' - OutputEncoding = 'UTF8' - CoveragePercentTarget = 75 - } - Output = @{ - CIFormat = 'Auto' - StackTraceVerbosity = $StackTraceVerbosity - Verbosity = $Verbosity - } - } - } - Write-Verbose 'PesterParams:' - Write-Verbose "$($pesterParams | ConvertTo-Json -Depth 4 -WarningAction SilentlyContinue)" - } - - #region Run tests - $results = Invoke-Pester @pesterParams - #endregion - - $results -} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index c6b62ac5..1706791f 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -1,68 +1,38 @@ [CmdletBinding()] param() -$path = (Join-Path -Path $PSScriptRoot -ChildPath 'helpers') -LogGroup "Loading helper scripts from [$path]" { - Get-ChildItem -Path $path -Filter '*.ps1' -Recurse | ForEach-Object { - Write-Verbose "[$($_.FullName)]" - . $_.FullName - } +$env:GITHUB_REPOSITORY_NAME = $env:GITHUB_REPOSITORY -replace '.+/' +$moduleName = if ([string]::IsNullOrEmpty($env:PSMODULE_TEST_PSMODULE_INPUT_Name)) { + $env:GITHUB_REPOSITORY_NAME +} else { + $env:PSMODULE_TEST_PSMODULE_INPUT_Name } - -LogGroup 'Loading inputs' { - $moduleName = if ($env:GITHUB_ACTION_INPUT_Name | IsNullOrEmpty) { $env:GITHUB_REPOSITORY_NAME } else { $env:GITHUB_ACTION_INPUT_Name } - Write-Verbose "Module name: [$moduleName]" - - $codeToTest = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "$env:GITHUB_ACTION_INPUT_Path\$moduleName" - if (Test-Path -Path $codeToTest) { - Write-Verbose "Code to test: [$codeToTest]" - } else { - $codeToTest = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path +$settings = $env:PSMODULE_TEST_PSMODULE_INPUT_Settings +$testPath = Resolve-Path -Path "$PSScriptRoot/tests/$settings" | Select-Object -ExpandProperty Path + +$localTestPath = Resolve-Path -Path 'tests' | Select-Object -ExpandProperty Path +switch ($settings) { + 'Module' { + $modulePath = Resolve-Path -Path "outputs/module/$moduleName" | Select-Object -ExpandProperty Path + $codePath = Install-PSModule -Path $modulePath -PassThru } - - Write-Verbose "Code to test: [$codeToTest]" - if (-not (Test-Path -Path $codeToTest)) { - throw "Path [$codeToTest] does not exist." + 'SourceCode' { + $codePath = Resolve-Path -Path 'src' | Select-Object -ExpandProperty Path } - Write-Verbose "Test type to run: [$env:GITHUB_ACTION_INPUT_TestType]" - - $testsPath = $env:GITHUB_ACTION_INPUT_TestsPath - Write-Verbose "Path to tests: [$testsPath]" - if (-not (Test-Path -Path $testsPath)) { - throw "Path [$testsPath] does not exist." + default { + throw "Invalid test type: [$settings]" } - - $StackTraceVerbosity = $env:GITHUB_ACTION_INPUT_StackTraceVerbosity - Write-Verbose "StackTraceVerbosity: [$StackTraceVerbosity]" - $Verbosity = $env:GITHUB_ACTION_INPUT_Verbosity - Write-Verbose "Verbosity: [$Verbosity]" - -} - -$params = @{ - Path = $codeToTest - TestType = $env:GITHUB_ACTION_INPUT_TestType - TestsPath = $testsPath - StackTraceVerbosity = $StackTraceVerbosity - Verbosity = $Verbosity -} -$results = Test-PSModule @params - -LogGroup 'Test results' { - Write-Verbose ($results | Out-String) -} - -$failedTests = $results.FailedCount - -if ($failedTests -gt 0) { - Write-Host '::error::❌ Some tests failed.' -} -if ($results.Result -ne 'Passed') { - Write-Host '::error::❌ Some tests failed.' -} -if ($failedTests -eq 0) { - Write-Host '::notice::✅ All tests passed.' } -Set-GitHubOutput -Name 'passed' -Value ($failedTests -eq 0) -exit $failedTests +[pscustomobject]@{ + ModuleName = $moduleName + Settings = $settings + CodePath = $codePath + LocalTestPath = $localTestPath + TestPath = $testPath +} | Format-List | Out-String + +"ModuleName=$moduleName" >> $env:GITHUB_OUTPUT +"CodePath=$codePath" >> $env:GITHUB_OUTPUT +"LocalTestPath=$localTestPath" >> $env:GITHUB_OUTPUT +"TestPath=$testPath" >> $env:GITHUB_OUTPUT diff --git a/scripts/tests/Module/Module.Configuration.ps1 b/scripts/tests/Module/Module.Configuration.ps1 new file mode 100644 index 00000000..de7fdea7 --- /dev/null +++ b/scripts/tests/Module/Module.Configuration.ps1 @@ -0,0 +1,11 @@ +@{ + TestResult = @{ + Enabled = $true + } + CodeCoverage = @{ + Enabled = $true + } + Output = @{ + Verbosity = 'Detailed' + } +} diff --git a/scripts/tests/Module/PSModule/PSModule.Container.ps1 b/scripts/tests/Module/PSModule/PSModule.Container.ps1 new file mode 100644 index 00000000..05395f66 --- /dev/null +++ b/scripts/tests/Module/PSModule/PSModule.Container.ps1 @@ -0,0 +1,6 @@ +@{ + Path = Get-ChildItem -Path $PSScriptRoot -Filter *.Tests.ps1 | Select-Object -ExpandProperty FullName + Data = @{ + Path = $env:PSMODULE_INVOKE_PESTER_INPUT_Run_Path + } +} diff --git a/scripts/tests/PSModule/Module.Tests.ps1 b/scripts/tests/Module/PSModule/PSModule.Tests.ps1 similarity index 50% rename from scripts/tests/PSModule/Module.Tests.ps1 rename to scripts/tests/Module/PSModule/PSModule.Tests.ps1 index 772f2a5b..8bf00f5e 100644 --- a/scripts/tests/PSModule/Module.Tests.ps1 +++ b/scripts/tests/Module/PSModule/PSModule.Tests.ps1 @@ -2,45 +2,39 @@ 'PSReviewUnusedParameter', 'Path', Justification = 'Path is used to specify the path to the module to test.' )] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidUsingWriteHost', '', + Justification = 'Log outputs to GitHub Actions logs.' +)] [CmdLetBinding()] -Param( +param( [Parameter(Mandatory)] [string] $Path ) BeforeAll { - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseDeclaredVarsMoreThanAssignments', 'moduleName', - Justification = 'moduleName is used in the test.' - )] - $moduleName = Split-Path -Path $Path -Leaf + $moduleName = Split-Path -Path (Split-Path -Path $Path -Parent) -Leaf + $moduleManifestPath = Join-Path -Path $Path -ChildPath "$moduleName.psd1" + Write-Verbose "Module Manifest Path: [$moduleManifestPath]" } Describe 'PSModule - Module tests' { Context 'Module' { - It 'The module should be available' { - Get-Module -Name $moduleName -ListAvailable | Should -Not -BeNullOrEmpty - Write-Verbose (Get-Module -Name $moduleName -ListAvailable | Out-String) - } It 'The module should be importable' { - { Import-Module -Name $moduleName -RequiredVersion 999.0.0 -Force } | Should -Not -Throw + { Import-Module -Name $moduleName } | Should -Not -Throw } } - Context "Module Manifest" { - BeforeAll { - $moduleManifestPath = Join-Path -Path $Path -ChildPath "$moduleName.psd1" - Write-Verbose "Module Manifest Path: [$moduleManifestPath]" - } + Context 'Module Manifest' { It 'Module Manifest exists' { $result = Test-Path -Path $moduleManifestPath $result | Should -Be $true - Write-Verbose $result + Write-Host "$($result | Format-List | Out-String)" } It 'Module Manifest is valid' { $result = Test-ModuleManifest -Path $moduleManifestPath $result | Should -Not -Be $null - Write-Verbose $result + Write-Host "$($result | Format-List | Out-String)" } # It 'has a valid license URL' {} # It 'has a valid project URL' {} diff --git a/scripts/tests/PSModule/Common.Tests.ps1 b/scripts/tests/PSModule/Common.Tests.ps1 deleted file mode 100644 index 843e8b17..00000000 --- a/scripts/tests/PSModule/Common.Tests.ps1 +++ /dev/null @@ -1,42 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSReviewUnusedParameter', 'Path', - Justification = 'Path is used to specify the path to the module to test.' -)] -[CmdLetBinding()] -Param( - [Parameter(Mandatory)] - [string] $Path -) - -# These tests are for the whole module and its parts. The scope of these tests are on the src folder and the specific module folder within it. -Describe 'Script files' { - Context 'Module design tests' { - # It 'Script file should only contain one function or filter' {} - # It 'All script files have tests' {} # Look for the folder name in tests called the same as section/folder name of functions - } - - Describe 'Function/filter design' { - # It 'comment based doc block start is indented with 4 spaces' {} - # It 'comment based doc is indented with 8 spaces' {} - # It 'has synopsis for all functions' {} - # It 'has description for all functions' {} - # It 'has examples for all functions' {} - # It 'has output documentation for all functions' {} - # It 'has [CmdletBinding()] attribute' {} - # It 'boolean parameters in CmdletBinding() attribute are written without assignments' {} - # I.e. [CmdletBinding(ShouldProcess)] instead of [CmdletBinding(ShouldProcess = $true)] - # It 'has [OutputType()] attribute' {} - # It 'has verb 'New','Set','Disable','Enable' etc. and uses "ShoudProcess" in the [CmdletBinding()] attribute' {} - } - - Describe 'Parameter design' { - # It 'has parameter description for all functions' {} - # It 'has parameter validation for all functions' {} - # It 'parameters have [Parameters()] attribute' {} - # It 'boolean parameters to the [Parameter()] attribute are written without assignments' {} - # I.e. [Parameter(Mandatory)] instead of [Parameter(Mandatory = $true)] - # It 'datatype for parameters are written on the same line as the parameter name' {} - # It 'datatype for parameters and parameter name are separated by a single space' {} - # It 'parameters are separated by a blank line' {} - } -} diff --git a/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 b/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 deleted file mode 100644 index 2a6039b8..00000000 --- a/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 +++ /dev/null @@ -1,55 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSReviewUnusedParameter', 'Path', - Justification = 'Path is being used.' -)] -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSReviewUnusedParameter', 'SettingsFilePath', - Justification = 'SettingsFilePath is being used.' -)] -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseDeclaredVarsMoreThanAssignments', 'relativeSettingsFilePath', - Justification = 'relativeSettingsFilePath is being used.' -)] -[CmdLetBinding()] -Param( - [Parameter(Mandatory)] - [string] $Path, - - [Parameter(Mandatory)] - [string] $SettingsFilePath -) - -BeforeDiscovery { - $rules = [Collections.Generic.List[System.Collections.Specialized.OrderedDictionary]]::new() - $ruleObjects = Get-ScriptAnalyzerRule -Verbose:$false | Sort-Object -Property Severity, CommonName - foreach ($ruleObject in $ruleObjects) { - $rules.Add( - [ordered]@{ - RuleName = $ruleObject.RuleName - CommonName = $ruleObject.CommonName - Severity = $ruleObject.Severity - Description = $ruleObject.Description - } - ) - } - Write-Warning "Discovered [$($rules.Count)] rules" - $relativeSettingsFilePath = $SettingsFilePath.Replace($PSScriptRoot, '').Trim('\').Trim('/') -} - -Describe "PSScriptAnalyzer tests using settings file [$relativeSettingsFilePath]" { - BeforeAll { - $testResults = Invoke-ScriptAnalyzer -Path $Path -Settings $SettingsFilePath -Recurse -Verbose:$false - Write-Warning "Found [$($testResults.Count)] issues" - } - - Context 'Severity: <_>' -ForEach 'Error', 'Warning', 'Information' { - It ' ()' -ForEach ($rules | Where-Object -Property Severity -EQ $_) { - $issues = [Collections.Generic.List[string]]::new() - $testResults | Where-Object -Property RuleName -EQ $RuleName | ForEach-Object { - $relativePath = $_.ScriptPath.Replace($Path, '').Trim('\').Trim('/') - $issues.Add(([Environment]::NewLine + " - $relativePath`:L$($_.Line):C$($_.Column)")) - } - $issues -join '' | Should -BeNullOrEmpty -Because $Description - } - } -} diff --git a/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 b/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 deleted file mode 100644 index 7c3a739c..00000000 --- a/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 +++ /dev/null @@ -1,47 +0,0 @@ -@{ - Rules = @{ - PSAlignAssignmentStatement = @{ - Enable = $true - CheckHashtable = $true - } - PSAvoidLongLines = @{ - Enable = $true - MaximumLineLength = 150 - } - PSAvoidSemicolonsAsLineTerminators = @{ - Enable = $true - } - PSPlaceCloseBrace = @{ - Enable = $true - NewLineAfter = $false - IgnoreOneLineBlock = $true - NoEmptyLineBefore = $false - } - PSPlaceOpenBrace = @{ - Enable = $true - OnSameLine = $true - NewLineAfter = $true - IgnoreOneLineBlock = $true - } - PSProvideCommentHelp = @{ - Enable = $true - ExportedOnly = $false - BlockComment = $true - VSCodeSnippetCorrection = $false - Placement = 'begin' - } - PSUseConsistentIndentation = @{ - Enable = $true - IndentationSize = 4 - PipelineIndentation = 'IncreaseIndentationForFirstPipeline' - Kind = 'space' - } - PSUseConsistentWhitespace = @{ - Enable = $false - } - } - ExcludeRules = @( - 'PSAvoidUsingCmdletAliases', - 'PSUseToExportFieldsInManifest' - ) -} diff --git a/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 b/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 deleted file mode 100644 index e9081f9a..00000000 --- a/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 +++ /dev/null @@ -1,57 +0,0 @@ -@{ - Rules = @{ - PSAlignAssignmentStatement = @{ - Enable = $true - CheckHashtable = $true - } - PSAvoidLongLines = @{ - Enable = $true - MaximumLineLength = 150 - } - PSAvoidSemicolonsAsLineTerminators = @{ - Enable = $true - } - PSPlaceCloseBrace = @{ - Enable = $true - NewLineAfter = $false - IgnoreOneLineBlock = $true - NoEmptyLineBefore = $false - } - PSPlaceOpenBrace = @{ - Enable = $true - OnSameLine = $true - NewLineAfter = $true - IgnoreOneLineBlock = $true - } - PSProvideCommentHelp = @{ - Enable = $true - ExportedOnly = $false - BlockComment = $true - VSCodeSnippetCorrection = $false - Placement = 'begin' - } - PSUseConsistentIndentation = @{ - Enable = $true - IndentationSize = 4 - PipelineIndentation = 'IncreaseIndentationForFirstPipeline' - Kind = 'space' - } - PSUseConsistentWhitespace = @{ - Enable = $true - CheckInnerBrace = $true - CheckOpenBrace = $true - CheckOpenParen = $true - CheckOperator = $true - CheckPipe = $true - CheckPipeForRedundantWhitespace = $true - CheckSeparator = $true - CheckParameter = $true - IgnoreAssignmentOperatorInsideHashTable = $true - } - } - ExcludeRules = @( - 'PSMissingModuleManifestField', # This rule is not applicable until the module is built. - 'PSAvoidUsingCmdletAliases', - 'PSUseToExportFieldsInManifest' - ) -} diff --git a/scripts/tests/SourceCode/PSModule/PSModule.Container.ps1 b/scripts/tests/SourceCode/PSModule/PSModule.Container.ps1 new file mode 100644 index 00000000..dbfef337 --- /dev/null +++ b/scripts/tests/SourceCode/PSModule/PSModule.Container.ps1 @@ -0,0 +1,7 @@ +@{ + Path = Get-ChildItem -Path $PSScriptRoot -Filter *.Tests.ps1 | Select-Object -ExpandProperty FullName + Data = @{ + Path = $env:PSMODULE_INVOKE_PESTER_INPUT_Run_Path + TestsPath = $env:LocalTestPath + } +} diff --git a/scripts/tests/PSModule/SourceCode.Tests.ps1 b/scripts/tests/SourceCode/PSModule/PSModule.Tests.ps1 similarity index 81% rename from scripts/tests/PSModule/SourceCode.Tests.ps1 rename to scripts/tests/SourceCode/PSModule/PSModule.Tests.ps1 index bbed2449..ef2efcf3 100644 --- a/scripts/tests/PSModule/SourceCode.Tests.ps1 +++ b/scripts/tests/SourceCode/PSModule/PSModule.Tests.ps1 @@ -10,8 +10,16 @@ 'PSUseDeclaredVarsMoreThanAssignments', 'functionBearingFiles', Justification = 'Variables are used in the test.' )] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidUsingWriteHost', '', + Justification = 'Logging to Github Actions.' +)] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidLongLines', '', + Justification = 'Consistent formatting of ternary operator usage' +)] [CmdLetBinding()] -Param( +param( # The path to the 'src' folder of the repo. [Parameter(Mandatory)] [string] $Path, @@ -23,80 +31,80 @@ Param( BeforeAll { $scriptFiles = Get-ChildItem -Path $Path -Include *.psm1, *.ps1 -Recurse -File - LogGroup "Found $($scriptFiles.Count) script files in [$Path]" { - $scriptFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + Write-Host "::group:: - Script files [$($scriptFiles.Count)]" + $scriptFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $functionsPath = Join-Path -Path $Path -ChildPath 'functions' $functionFiles = (Test-Path -Path $functionsPath) ? (Get-ChildItem -Path $functionsPath -File -Filter '*.ps1' -Recurse) : $null - - LogGroup "Found $($functionFiles.Count) function files in [$functionsPath]" { - $functionFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + Write-Host "::group:: - Function files [$($functionFiles.Count)]" + $functionFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $privateFunctionsPath = Join-Path -Path $functionsPath -ChildPath 'private' - $privateFunctionFiles = (Test-Path -Path $privateFunctionsPath) ? - (Get-ChildItem -Path $privateFunctionsPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($privateFunctionFiles.Count) private function files in [$privateFunctionsPath]" { - $privateFunctionFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + $privateFunctionFiles = (Test-Path -Path $privateFunctionsPath) ? (Get-ChildItem -Path $privateFunctionsPath -File -Filter '*.ps1' -Recurse) : $null + Write-Host "::group:: - Private [$($privateFunctionFiles.Count)]" + $privateFunctionFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $publicFunctionsPath = Join-Path -Path $functionsPath -ChildPath 'public' $publicFunctionFiles = (Test-Path -Path $publicFunctionsPath) ? (Get-ChildItem -Path $publicFunctionsPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($publicFunctionFiles.Count) public function files in [$publicFunctionsPath]" { - $publicFunctionFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + Write-Host "::group:: - Public [$($publicFunctionFiles.Count)]" + $publicFunctionFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $variablesPath = Join-Path -Path $Path -ChildPath 'variables' $variableFiles = (Test-Path -Path $variablesPath) ? (Get-ChildItem -Path $variablesPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($variableFiles.Count) variable files in [$variablesPath]" { - $variableFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + Write-Host "::group:: - Variable files [$($variableFiles.Count)]" + $variableFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $privateVariablesPath = Join-Path -Path $variablesPath -ChildPath 'private' - $privateVariableFiles = (Test-Path -Path $privateVariablesPath) ? - (Get-ChildItem -Path $privateVariablesPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($privateVariableFiles.Count) private variable files in [$privateVariablesPath]" { - $privateVariableFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + $privateVariableFiles = (Test-Path -Path $privateVariablesPath) ? (Get-ChildItem -Path $privateVariablesPath -File -Filter '*.ps1' -Recurse) : $null + Write-Host "::group:: - Private [$($privateVariableFiles.Count)]" + $privateVariableFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $publicVariablesPath = Join-Path -Path $variablesPath -ChildPath 'public' - $publicVariableFiles = (Test-Path -Path $publicVariablesPath) ? - (Get-ChildItem -Path $publicVariablesPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($publicVariableFiles.Count) public variable files in [$publicVariablesPath]" { - $publicVariableFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + $publicVariableFiles = (Test-Path -Path $publicVariablesPath) ? (Get-ChildItem -Path $publicVariablesPath -File -Filter '*.ps1' -Recurse) : $null + Write-Host "::group:: - Public [$($publicVariableFiles.Count)]" + $publicVariableFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $classPath = Join-Path -Path $Path -ChildPath 'classes' $classFiles = (Test-Path -Path $classPath) ? (Get-ChildItem -Path $classPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($classFiles.Count) class files in [$classPath]" { - $classFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + Write-Host "::group:: - Class [$($classFiles.Count)]" + $classFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $privateClassPath = Join-Path -Path $classPath -ChildPath 'private' - $privateClassFiles = (Test-Path -Path $privateClassPath) ? - (Get-ChildItem -Path $privateClassPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($privateClassFiles.Count) private class files in [$privateClassPath]" { - $privateClassFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + $privateClassFiles = (Test-Path -Path $privateClassPath) ? (Get-ChildItem -Path $privateClassPath -File -Filter '*.ps1' -Recurse) : $null + Write-Host "::group:: - Private [$($privateClassFiles.Count)]" + $privateClassFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' $publicClassPath = Join-Path -Path $classPath -ChildPath 'public' - $publicClassFiles = (Test-Path -Path $publicClassPath) ? - (Get-ChildItem -Path $publicClassPath -File -Filter '*.ps1' -Recurse) : $null - LogGroup "Found $($publicClassFiles.Count) public class files in [$publicClassPath]" { - $publicClassFiles | ForEach-Object { - Write-Verbose " - $($_.FullName)" -Verbose - } + $publicClassFiles = (Test-Path -Path $publicClassPath) ? (Get-ChildItem -Path $publicClassPath -File -Filter '*.ps1' -Recurse) : $null + Write-Host "::group:: - Public [$($publicClassFiles.Count)]" + $publicClassFiles | ForEach-Object { + Write-Host " - $($_.FullName)" } + Write-Host '::endgroup::' + $testFiles = Get-ChildItem -Path $TestsPath -Include *.Tests.ps1 -Recurse -File + Write-Host "::group:: - Test files [$($testFiles.Count)]" + $testFiles | ForEach-Object { + Write-Host " - $($_.FullName)" + } + Write-Host '::endgroup::' } Describe 'PSModule - SourceCode tests' { @@ -110,7 +118,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:NumberOfProcessors:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping NumberOfProcessors test' + Write-Host "::warning title=Skipping NumberOfProcessors test:: - $relativePath - $skipReason" } else { $issues += " - $($_.Path):L$($_.LineNumber)" } @@ -127,7 +135,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:Verbose:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping Verbose test' + Write-Host "::warning title=Skipping Verbose test:: - $relativePath - $skipReason" } else { Select-String -Path $filePath -Pattern '\s(-Verbose(?::\$true)?)\b(?!:\$false)' -AllMatches | ForEach-Object { $issues += " - $relativePath`:L$($_.LineNumber) - $($_.Line)" @@ -145,7 +153,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:OutNull:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping OutNull test' + Write-Host "::warning title=Skipping OutNull test:: - $relativePath - $skipReason" } else { Select-String -Path $filePath -Pattern 'Out-Null' -AllMatches | ForEach-Object { $issues += " - $relativePath`:L$($_.LineNumber) - $($_.Line)" @@ -163,7 +171,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:NoTernary:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping NoTernary test' + Write-Host "::warning title=Skipping NoTernary test:: - $relativePath - $skipReason" } else { Select-String -Path $filePath -Pattern '(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping LowercaseKeywords test' + Write-Host "::warning title=Skipping LowercaseKeywords test:: - $relativePath - $skipReason" } else { $errors = $null $tokens = $null @@ -201,8 +209,8 @@ Describe 'PSModule - SourceCode tests' { } } - Context 'classes' { - } + # Context 'classes' { + # } Context 'functions' { Context 'Generic' { @@ -237,7 +245,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionCount:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionCount test' + Write-Host "::warning title=Skipping FunctionCount test:: - $relativePath - $skipReason" } else { $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) @@ -258,7 +266,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionName:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionName test' + Write-Host "::warning title=Skipping FunctionName test:: - $relativePath - $skipReason" } else { $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) @@ -279,7 +287,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:CmdletBinding:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping CmdletBinding test' + Write-Host "::warning title=Skipping CmdletBinding test:: - $relativePath - $skipReason" } else { $scriptAst = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) $tokens = $scriptAst.FindAll({ $true }, $true) @@ -305,7 +313,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:ParamBlock:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping ParamBlock test' + Write-Host "::warning title=Skipping ParamBlock test:: - $relativePath - $skipReason" } else { $scriptAst = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) $tokens = $scriptAst.FindAll({ $args[0] -is [System.Management.Automation.Language.ParamBlockAst] }, $true) @@ -357,7 +365,7 @@ Describe 'PSModule - SourceCode tests' { $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionTest:(?.+)' -AllMatches if ($skipTest.Matches.Count -gt 0) { $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value - Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionTest test' + Write-Host "::warning title=Skipping FunctionTest test:: - $relativePath - $skipReason" } else { $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) @@ -372,14 +380,9 @@ Describe 'PSModule - SourceCode tests' { Should -BeNullOrEmpty -Because 'a test should exist for each of the functions in the module' } } - Context 'private functions' {} + # Context 'private functions' {} } - Context 'variables' { - } - - Context 'Module manifest' { - # It 'Module Manifest exists (maifest.psd1 or modulename.psd1)' {} - # It 'Module Manifest is valid' {} - } + # Context 'variables' { + # } } diff --git a/scripts/tests/SourceCode/SourceCode.Configuration.ps1 b/scripts/tests/SourceCode/SourceCode.Configuration.ps1 new file mode 100644 index 00000000..e76f767f --- /dev/null +++ b/scripts/tests/SourceCode/SourceCode.Configuration.ps1 @@ -0,0 +1,8 @@ +@{ + TestResult = @{ + Enabled = $true + } + Output = @{ + Verbosity = 'Detailed' + } +} diff --git a/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/New-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md diff --git a/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1 similarity index 98% rename from tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1 index ebe988d3..b0fdcc2f 100644 --- a/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 +++ b/tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1 @@ -14,7 +14,7 @@ ProcessorArchitecture = 'None' RequiredModules = @( @{ - ModuleVersion = '1.0' + ModuleVersion = '1.1.5' ModuleName = 'PSSemVer' } 'Utilities' diff --git a/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psm1 similarity index 81% rename from tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psm1 index 3553dd95..63117b65 100644 --- a/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 +++ b/tests/outputTestRepo/outputs/module/PSModuleTest/PSModuleTest.psm1 @@ -3,42 +3,42 @@ param() $scriptName = $MyInvocation.MyCommand.Name -Write-Verbose "[$scriptName] Importing module" +Write-Debug "[$scriptName] Importing module" #region - Data import -Write-Verbose "[$scriptName] - [data] - Processing folder" +Write-Debug "[$scriptName] - [data] - Processing folder" $dataFolder = (Join-Path $PSScriptRoot 'data') -Write-Verbose "[$scriptName] - [data] - [$dataFolder]" +Write-Debug "[$scriptName] - [data] - [$dataFolder]" Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing" + Write-Debug "[$scriptName] - [data] - [$($_.Name)] - Importing" New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done" + Write-Debug "[$scriptName] - [data] - [$($_.Name)] - Done" } -Write-Verbose "[$scriptName] - [data] - Done" +Write-Debug "[$scriptName] - [data] - Done" #endregion - Data import #region - From /init -Write-Verbose "[$scriptName] - [/init] - Processing folder" +Write-Debug "[$scriptName] - [/init] - Processing folder" #region - From /init/initializer.ps1 -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Importing" +Write-Debug "[$scriptName] - [/init/initializer.ps1] - Importing" Write-Verbose '-------------------------------' Write-Verbose '--- THIS IS AN INITIALIZER ---' Write-Verbose '-------------------------------' -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Done" +Write-Debug "[$scriptName] - [/init/initializer.ps1] - Done" #endregion - From /init/initializer.ps1 -Write-Verbose "[$scriptName] - [/init] - Done" +Write-Debug "[$scriptName] - [/init] - Done" #endregion - From /init #region - From /classes -Write-Verbose "[$scriptName] - [/classes] - Processing folder" +Write-Debug "[$scriptName] - [/classes] - Processing folder" #region - From /classes/Book.ps1 -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Importing" +Write-Debug "[$scriptName] - [/classes/Book.ps1] - Importing" class Book { # Class properties @@ -86,10 +86,10 @@ class Book { } } -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Done" +Write-Debug "[$scriptName] - [/classes/Book.ps1] - Done" #endregion - From /classes/Book.ps1 #region - From /classes/BookList.ps1 -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Importing" +Write-Debug "[$scriptName] - [/classes/BookList.ps1] - Importing" class BookList { # Static property to hold the list of books @@ -178,17 +178,17 @@ class BookList { } } -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Done" +Write-Debug "[$scriptName] - [/classes/BookList.ps1] - Done" #endregion - From /classes/BookList.ps1 -Write-Verbose "[$scriptName] - [/classes] - Done" +Write-Debug "[$scriptName] - [/classes] - Done" #endregion - From /classes #region - From /private -Write-Verbose "[$scriptName] - [/private] - Processing folder" +Write-Debug "[$scriptName] - [/private] - Processing folder" #region - From /private/Get-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" +Write-Debug "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" Function Get-InternalPSModule { <# @@ -209,10 +209,10 @@ Function Get-InternalPSModule { Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" +Write-Debug "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" #endregion - From /private/Get-InternalPSModule.ps1 #region - From /private/Set-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" +Write-Debug "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" Function Set-InternalPSModule { <# @@ -237,17 +237,17 @@ Function Set-InternalPSModule { Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" +Write-Debug "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" #endregion - From /private/Set-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private] - Done" +Write-Debug "[$scriptName] - [/private] - Done" #endregion - From /private #region - From /public -Write-Verbose "[$scriptName] - [/public] - Processing folder" +Write-Debug "[$scriptName] - [/public] - Processing folder" #region - From /public/Get-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" +Write-Debug "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" #Requires -Modules Utilities @@ -272,10 +272,10 @@ function Get-PSModuleTest { Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" +Write-Debug "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" #endregion - From /public/Get-PSModuleTest.ps1 #region - From /public/New-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" +Write-Debug "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" #Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} @@ -304,10 +304,10 @@ function New-PSModuleTest { Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" +Write-Debug "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" #endregion - From /public/New-PSModuleTest.ps1 #region - From /public/Set-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" +Write-Debug "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" function Set-PSModuleTest { <# @@ -336,10 +336,10 @@ function Set-PSModuleTest { } } -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" +Write-Debug "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" #endregion - From /public/Set-PSModuleTest.ps1 #region - From /public/Test-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" +Write-Debug "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" function Test-PSModuleTest { <# @@ -362,19 +362,19 @@ function Test-PSModuleTest { Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" +Write-Debug "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" #endregion - From /public/Test-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public] - Done" +Write-Debug "[$scriptName] - [/public] - Done" #endregion - From /public #region - From /finally.ps1 -Write-Verbose "[$scriptName] - [/finally.ps1] - Importing" +Write-Debug "[$scriptName] - [/finally.ps1] - Importing" Write-Verbose '------------------------------' Write-Verbose '--- THIS IS A LAST LOADER ---' Write-Verbose '------------------------------' -Write-Verbose "[$scriptName] - [/finally.ps1] - Done" +Write-Debug "[$scriptName] - [/finally.ps1] - Done" #endregion - From /finally.ps1 $exports = @{ diff --git a/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/tests/outputTestRepo/outputs/module/PSModuleTest/assemblies/LsonLib.dll similarity index 100% rename from tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll rename to tests/outputTestRepo/outputs/module/PSModuleTest/assemblies/LsonLib.dll diff --git a/tests/outputs/modules/PSModuleTest/data/Config.psd1 b/tests/outputTestRepo/outputs/module/PSModuleTest/data/Config.psd1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/data/Config.psd1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/data/Config.psd1 diff --git a/tests/outputs/modules/PSModuleTest/data/Settings.psd1 b/tests/outputTestRepo/outputs/module/PSModuleTest/data/Settings.psd1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/data/Settings.psd1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/data/Settings.psd1 diff --git a/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml b/tests/outputTestRepo/outputs/module/PSModuleTest/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml rename to tests/outputTestRepo/outputs/module/PSModuleTest/formats/CultureInfo.Format.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/tests/outputTestRepo/outputs/module/PSModuleTest/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml rename to tests/outputTestRepo/outputs/module/PSModuleTest/formats/Mygciview.Format.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/tests/outputTestRepo/outputs/module/PSModuleTest/modules/OtherPSModule.psm1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/modules/OtherPSModule.psm1 diff --git a/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/tests/outputTestRepo/outputs/module/PSModuleTest/scripts/loader.ps1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/scripts/loader.ps1 rename to tests/outputTestRepo/outputs/module/PSModuleTest/scripts/loader.ps1 diff --git a/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/tests/outputTestRepo/outputs/module/PSModuleTest/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml rename to tests/outputTestRepo/outputs/module/PSModuleTest/types/DirectoryInfo.Types.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/tests/outputTestRepo/outputs/module/PSModuleTest/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml rename to tests/outputTestRepo/outputs/module/PSModuleTest/types/FileInfo.Types.ps1xml diff --git a/tests/outputTestRepo/tests/Environments/Environment.Tests.ps1 b/tests/outputTestRepo/tests/Environments/Environment.Tests.ps1 new file mode 100644 index 00000000..211be946 --- /dev/null +++ b/tests/outputTestRepo/tests/Environments/Environment.Tests.ps1 @@ -0,0 +1,15 @@ +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty + } +} diff --git a/tests/outputTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 b/tests/outputTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..7a49dadb --- /dev/null +++ b/tests/outputTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 @@ -0,0 +1,44 @@ +[CmdletBinding()] +param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } + } +} diff --git a/tests/srcTestRepo/README.md b/tests/srcTestRepo/README.md new file mode 100644 index 00000000..b459e352 --- /dev/null +++ b/tests/srcTestRepo/README.md @@ -0,0 +1,3 @@ +# Test module + +This is a test readme. diff --git a/tests/srcTestRepo/icon/icon.png b/tests/srcTestRepo/icon/icon.png new file mode 100644 index 00000000..be83fd5f Binary files /dev/null and b/tests/srcTestRepo/icon/icon.png differ diff --git a/tests/srcTestRepo/mkdocs.yml b/tests/srcTestRepo/mkdocs.yml new file mode 100644 index 00000000..df5e17ad --- /dev/null +++ b/tests/srcTestRepo/mkdocs.yml @@ -0,0 +1,75 @@ +site_name: -{{ REPO_NAME }}- +theme: + name: material + language: en + font: + text: Roboto + code: Sono + logo: Assets/icon.png + favicon: Assets/icon.png + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + primary: black + accent: green + icon: material/toggle-switch-off-outline + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + primary: indigo + accent: green + icon: material/toggle-switch + name: Switch to system preference + icon: + repo: material/github + features: + - navigation.instant + - navigation.instant.progress + - navigation.indexes + - navigation.top + - navigation.tracking + - navigation.expand + - search.suggest + - search.highlight + +repo_name: -{{ REPO_OWNER }}-/-{{ REPO_NAME }}- +repo_url: https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}- + +plugins: + - search + +markdown_extensions: + - toc: + permalink: true # Adds a link icon to headings + - attr_list + - admonition + - md_in_html + - pymdownx.details # Enables collapsible admonitions + +extra: + social: + - icon: fontawesome/brands/discord + link: https://discord.gg/jedJWCPAhD + name: -{{ REPO_OWNER }}- on Discord + - icon: fontawesome/brands/github + link: https://github.com/-{{ REPO_OWNER }}-/ + name: -{{ REPO_OWNER }}- on GitHub + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + actions: + - accept + - reject diff --git a/tests/src/assemblies/LsonLib.dll b/tests/srcTestRepo/src/assemblies/LsonLib.dll similarity index 100% rename from tests/src/assemblies/LsonLib.dll rename to tests/srcTestRepo/src/assemblies/LsonLib.dll diff --git a/tests/src/classes/private/SecretWriter.ps1 b/tests/srcTestRepo/src/classes/private/SecretWriter.ps1 similarity index 100% rename from tests/src/classes/private/SecretWriter.ps1 rename to tests/srcTestRepo/src/classes/private/SecretWriter.ps1 diff --git a/tests/src/classes/public/Book.ps1 b/tests/srcTestRepo/src/classes/public/Book.ps1 similarity index 100% rename from tests/src/classes/public/Book.ps1 rename to tests/srcTestRepo/src/classes/public/Book.ps1 diff --git a/tests/src/data/Config.psd1 b/tests/srcTestRepo/src/data/Config.psd1 similarity index 100% rename from tests/src/data/Config.psd1 rename to tests/srcTestRepo/src/data/Config.psd1 diff --git a/tests/src/data/Settings.psd1 b/tests/srcTestRepo/src/data/Settings.psd1 similarity index 100% rename from tests/src/data/Settings.psd1 rename to tests/srcTestRepo/src/data/Settings.psd1 diff --git a/tests/src/finally.ps1 b/tests/srcTestRepo/src/finally.ps1 similarity index 100% rename from tests/src/finally.ps1 rename to tests/srcTestRepo/src/finally.ps1 diff --git a/tests/src/formats/CultureInfo.Format.ps1xml b/tests/srcTestRepo/src/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/src/formats/CultureInfo.Format.ps1xml rename to tests/srcTestRepo/src/formats/CultureInfo.Format.ps1xml diff --git a/tests/src/formats/Mygciview.Format.ps1xml b/tests/srcTestRepo/src/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/src/formats/Mygciview.Format.ps1xml rename to tests/srcTestRepo/src/formats/Mygciview.Format.ps1xml diff --git a/tests/src/functions/private/Get-InternalPSModule.ps1 b/tests/srcTestRepo/src/functions/private/Get-InternalPSModule.ps1 similarity index 100% rename from tests/src/functions/private/Get-InternalPSModule.ps1 rename to tests/srcTestRepo/src/functions/private/Get-InternalPSModule.ps1 diff --git a/tests/src/functions/private/Set-InternalPSModule.ps1 b/tests/srcTestRepo/src/functions/private/Set-InternalPSModule.ps1 similarity index 100% rename from tests/src/functions/private/Set-InternalPSModule.ps1 rename to tests/srcTestRepo/src/functions/private/Set-InternalPSModule.ps1 diff --git a/tests/src/functions/public/Test-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 52% rename from tests/src/functions/public/Test-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 index 4056e2f6..57257f1d 100644 --- a/tests/src/functions/public/Test-PSModuleTest.ps1 +++ b/tests/srcTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -1,5 +1,9 @@ -#SkipTest:Verbose:Just want to test that a function can have multiple skips. -function Test-PSModuleTest { +#Requires -Modules Utilities +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.1.4' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } +#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } + +function Get-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -16,5 +20,4 @@ function Test-PSModuleTest { [string] $Name ) Write-Output "Hello, $Name!" - Write-Verbose 'Verbose message' -Verbose } diff --git a/tests/src/functions/public/New-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 81% rename from tests/src/functions/public/New-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 index 8fc0641f..5fa16bc3 100644 --- a/tests/src/functions/public/New-PSModuleTest.ps1 +++ b/tests/srcTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 @@ -1,6 +1,5 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} -#SkipTest:FunctionTest:Difficult to test due to the nature of the function. -#SkipTest:Verbose:Just want to test that a function can have multiple skips. +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.1.4'} + function New-PSModuleTest { <# .SYNOPSIS @@ -28,11 +27,11 @@ function New-PSModuleTest { [Parameter(Mandatory)] [string] $Name ) - Write-Debug "Debug message" - Write-Verbose "Verbose message" -Verbose Write-Output "Hello, $Name!" } New-Alias New-PSModuleTestAlias3 New-PSModuleTest New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/srcTestRepo/src/functions/public/PSModule/PSModule.md b/tests/srcTestRepo/src/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/tests/srcTestRepo/src/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/tests/src/functions/public/Set-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/Set-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/srcTestRepo/src/functions/public/SomethingElse/SomethingElse.md b/tests/srcTestRepo/src/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/tests/srcTestRepo/src/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/tests/src/functions/public/Get-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/Test-PSModuleTest.ps1 similarity index 83% rename from tests/src/functions/public/Get-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/Test-PSModuleTest.ps1 index 0e9aacfe..26be2b9b 100644 --- a/tests/src/functions/public/Get-PSModuleTest.ps1 +++ b/tests/srcTestRepo/src/functions/public/Test-PSModuleTest.ps1 @@ -1,6 +1,4 @@ -#Requires -Modules Utilities - -function Get-PSModuleTest { +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. diff --git a/tests/src/functions/public/completers.ps1 b/tests/srcTestRepo/src/functions/public/completers.ps1 similarity index 100% rename from tests/src/functions/public/completers.ps1 rename to tests/srcTestRepo/src/functions/public/completers.ps1 diff --git a/tests/src/header.ps1 b/tests/srcTestRepo/src/header.ps1 similarity index 100% rename from tests/src/header.ps1 rename to tests/srcTestRepo/src/header.ps1 diff --git a/tests/src/init/initializer.ps1 b/tests/srcTestRepo/src/init/initializer.ps1 similarity index 100% rename from tests/src/init/initializer.ps1 rename to tests/srcTestRepo/src/init/initializer.ps1 diff --git a/tests/src/modules/OtherPSModule.psm1 b/tests/srcTestRepo/src/modules/OtherPSModule.psm1 similarity index 100% rename from tests/src/modules/OtherPSModule.psm1 rename to tests/srcTestRepo/src/modules/OtherPSModule.psm1 diff --git a/tests/src/scripts/loader.ps1 b/tests/srcTestRepo/src/scripts/loader.ps1 similarity index 100% rename from tests/src/scripts/loader.ps1 rename to tests/srcTestRepo/src/scripts/loader.ps1 diff --git a/tests/src/types/DirectoryInfo.Types.ps1xml b/tests/srcTestRepo/src/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/src/types/DirectoryInfo.Types.ps1xml rename to tests/srcTestRepo/src/types/DirectoryInfo.Types.ps1xml diff --git a/tests/src/types/FileInfo.Types.ps1xml b/tests/srcTestRepo/src/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/src/types/FileInfo.Types.ps1xml rename to tests/srcTestRepo/src/types/FileInfo.Types.ps1xml diff --git a/tests/src/variables/private/PrivateVariables.ps1 b/tests/srcTestRepo/src/variables/private/PrivateVariables.ps1 similarity index 100% rename from tests/src/variables/private/PrivateVariables.ps1 rename to tests/srcTestRepo/src/variables/private/PrivateVariables.ps1 diff --git a/tests/src/variables/public/Moons.ps1 b/tests/srcTestRepo/src/variables/public/Moons.ps1 similarity index 100% rename from tests/src/variables/public/Moons.ps1 rename to tests/srcTestRepo/src/variables/public/Moons.ps1 diff --git a/tests/src/variables/public/Planets.ps1 b/tests/srcTestRepo/src/variables/public/Planets.ps1 similarity index 100% rename from tests/src/variables/public/Planets.ps1 rename to tests/srcTestRepo/src/variables/public/Planets.ps1 diff --git a/tests/src/variables/public/SolarSystems.ps1 b/tests/srcTestRepo/src/variables/public/SolarSystems.ps1 similarity index 100% rename from tests/src/variables/public/SolarSystems.ps1 rename to tests/srcTestRepo/src/variables/public/SolarSystems.ps1 diff --git a/tests/srcTestRepo/tests/Environment.Tests.ps1 b/tests/srcTestRepo/tests/Environment.Tests.ps1 new file mode 100644 index 00000000..211be946 --- /dev/null +++ b/tests/srcTestRepo/tests/Environment.Tests.ps1 @@ -0,0 +1,15 @@ +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty + } +} diff --git a/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 b/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..7a49dadb --- /dev/null +++ b/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 @@ -0,0 +1,44 @@ +[CmdletBinding()] +param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } + } +} diff --git a/tests/srcWithManifestTestRepo/README.md b/tests/srcWithManifestTestRepo/README.md new file mode 100644 index 00000000..b459e352 --- /dev/null +++ b/tests/srcWithManifestTestRepo/README.md @@ -0,0 +1,3 @@ +# Test module + +This is a test readme. diff --git a/tests/srcWithManifestTestRepo/icon/icon.png b/tests/srcWithManifestTestRepo/icon/icon.png new file mode 100644 index 00000000..be83fd5f Binary files /dev/null and b/tests/srcWithManifestTestRepo/icon/icon.png differ diff --git a/tests/srcWithManifestTestRepo/mkdocs.yml b/tests/srcWithManifestTestRepo/mkdocs.yml new file mode 100644 index 00000000..df5e17ad --- /dev/null +++ b/tests/srcWithManifestTestRepo/mkdocs.yml @@ -0,0 +1,75 @@ +site_name: -{{ REPO_NAME }}- +theme: + name: material + language: en + font: + text: Roboto + code: Sono + logo: Assets/icon.png + favicon: Assets/icon.png + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + primary: black + accent: green + icon: material/toggle-switch-off-outline + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + primary: indigo + accent: green + icon: material/toggle-switch + name: Switch to system preference + icon: + repo: material/github + features: + - navigation.instant + - navigation.instant.progress + - navigation.indexes + - navigation.top + - navigation.tracking + - navigation.expand + - search.suggest + - search.highlight + +repo_name: -{{ REPO_OWNER }}-/-{{ REPO_NAME }}- +repo_url: https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}- + +plugins: + - search + +markdown_extensions: + - toc: + permalink: true # Adds a link icon to headings + - attr_list + - admonition + - md_in_html + - pymdownx.details # Enables collapsible admonitions + +extra: + social: + - icon: fontawesome/brands/discord + link: https://discord.gg/jedJWCPAhD + name: -{{ REPO_OWNER }}- on Discord + - icon: fontawesome/brands/github + link: https://github.com/-{{ REPO_OWNER }}-/ + name: -{{ REPO_OWNER }}- on GitHub + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + actions: + - accept + - reject diff --git a/tests/srcWithManifest/assemblies/LsonLib.dll b/tests/srcWithManifestTestRepo/src/assemblies/LsonLib.dll similarity index 100% rename from tests/srcWithManifest/assemblies/LsonLib.dll rename to tests/srcWithManifestTestRepo/src/assemblies/LsonLib.dll diff --git a/tests/srcWithManifest/classes/private/SecretWriter.ps1 b/tests/srcWithManifestTestRepo/src/classes/private/SecretWriter.ps1 similarity index 100% rename from tests/srcWithManifest/classes/private/SecretWriter.ps1 rename to tests/srcWithManifestTestRepo/src/classes/private/SecretWriter.ps1 diff --git a/tests/srcWithManifest/classes/public/Book.ps1 b/tests/srcWithManifestTestRepo/src/classes/public/Book.ps1 similarity index 100% rename from tests/srcWithManifest/classes/public/Book.ps1 rename to tests/srcWithManifestTestRepo/src/classes/public/Book.ps1 diff --git a/tests/srcWithManifest/data/Config.psd1 b/tests/srcWithManifestTestRepo/src/data/Config.psd1 similarity index 100% rename from tests/srcWithManifest/data/Config.psd1 rename to tests/srcWithManifestTestRepo/src/data/Config.psd1 diff --git a/tests/srcWithManifest/data/Settings.psd1 b/tests/srcWithManifestTestRepo/src/data/Settings.psd1 similarity index 100% rename from tests/srcWithManifest/data/Settings.psd1 rename to tests/srcWithManifestTestRepo/src/data/Settings.psd1 diff --git a/tests/srcWithManifest/finally.ps1 b/tests/srcWithManifestTestRepo/src/finally.ps1 similarity index 100% rename from tests/srcWithManifest/finally.ps1 rename to tests/srcWithManifestTestRepo/src/finally.ps1 diff --git a/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml b/tests/srcWithManifestTestRepo/src/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/srcWithManifest/formats/CultureInfo.Format.ps1xml rename to tests/srcWithManifestTestRepo/src/formats/CultureInfo.Format.ps1xml diff --git a/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/tests/srcWithManifestTestRepo/src/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/srcWithManifest/formats/Mygciview.Format.ps1xml rename to tests/srcWithManifestTestRepo/src/formats/Mygciview.Format.ps1xml diff --git a/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/tests/srcWithManifestTestRepo/src/functions/private/Get-InternalPSModule.ps1 similarity index 100% rename from tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 rename to tests/srcWithManifestTestRepo/src/functions/private/Get-InternalPSModule.ps1 diff --git a/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/tests/srcWithManifestTestRepo/src/functions/private/Set-InternalPSModule.ps1 similarity index 100% rename from tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 rename to tests/srcWithManifestTestRepo/src/functions/private/Set-InternalPSModule.ps1 diff --git a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 52% rename from tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 index 4056e2f6..57257f1d 100644 --- a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -1,5 +1,9 @@ -#SkipTest:Verbose:Just want to test that a function can have multiple skips. -function Test-PSModuleTest { +#Requires -Modules Utilities +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.1.4' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } +#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } + +function Get-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -16,5 +20,4 @@ function Test-PSModuleTest { [string] $Name ) Write-Output "Hello, $Name!" - Write-Verbose 'Verbose message' -Verbose } diff --git a/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 81% rename from tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 index 8fc0641f..5fa16bc3 100644 --- a/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 +++ b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 @@ -1,6 +1,5 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} -#SkipTest:FunctionTest:Difficult to test due to the nature of the function. -#SkipTest:Verbose:Just want to test that a function can have multiple skips. +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.1.4'} + function New-PSModuleTest { <# .SYNOPSIS @@ -28,11 +27,11 @@ function New-PSModuleTest { [Parameter(Mandatory)] [string] $Name ) - Write-Debug "Debug message" - Write-Verbose "Verbose message" -Verbose Write-Output "Hello, $Name!" } New-Alias New-PSModuleTestAlias3 New-PSModuleTest New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/srcWithManifestTestRepo/src/functions/public/PSModule/PSModule.md b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/SomethingElse.md b/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/Test-PSModuleTest.ps1 similarity index 83% rename from tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/Test-PSModuleTest.ps1 index 0e9aacfe..26be2b9b 100644 --- a/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 +++ b/tests/srcWithManifestTestRepo/src/functions/public/Test-PSModuleTest.ps1 @@ -1,6 +1,4 @@ -#Requires -Modules Utilities - -function Get-PSModuleTest { +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. diff --git a/tests/srcWithManifestTestRepo/src/functions/public/completers.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/completers.ps1 new file mode 100644 index 00000000..6b1adbb7 --- /dev/null +++ b/tests/srcWithManifestTestRepo/src/functions/public/completers.ps1 @@ -0,0 +1,8 @@ +Register-ArgumentCompleter -CommandName New-PSModuleTest -ParameterName Name -ScriptBlock { + param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) + $null = $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters + + 'Alice', 'Bob', 'Charlie' | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { + [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) + } +} diff --git a/tests/srcWithManifest/header.ps1 b/tests/srcWithManifestTestRepo/src/header.ps1 similarity index 100% rename from tests/srcWithManifest/header.ps1 rename to tests/srcWithManifestTestRepo/src/header.ps1 diff --git a/tests/srcWithManifest/init/initializer.ps1 b/tests/srcWithManifestTestRepo/src/init/initializer.ps1 similarity index 100% rename from tests/srcWithManifest/init/initializer.ps1 rename to tests/srcWithManifestTestRepo/src/init/initializer.ps1 diff --git a/tests/srcWithManifest/manifest.psd1 b/tests/srcWithManifestTestRepo/src/manifest.psd1 similarity index 100% rename from tests/srcWithManifest/manifest.psd1 rename to tests/srcWithManifestTestRepo/src/manifest.psd1 diff --git a/tests/srcWithManifest/modules/OtherPSModule.psm1 b/tests/srcWithManifestTestRepo/src/modules/OtherPSModule.psm1 similarity index 100% rename from tests/srcWithManifest/modules/OtherPSModule.psm1 rename to tests/srcWithManifestTestRepo/src/modules/OtherPSModule.psm1 diff --git a/tests/srcWithManifest/scripts/loader.ps1 b/tests/srcWithManifestTestRepo/src/scripts/loader.ps1 similarity index 100% rename from tests/srcWithManifest/scripts/loader.ps1 rename to tests/srcWithManifestTestRepo/src/scripts/loader.ps1 diff --git a/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/tests/srcWithManifestTestRepo/src/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml rename to tests/srcWithManifestTestRepo/src/types/DirectoryInfo.Types.ps1xml diff --git a/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/tests/srcWithManifestTestRepo/src/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/srcWithManifest/types/FileInfo.Types.ps1xml rename to tests/srcWithManifestTestRepo/src/types/FileInfo.Types.ps1xml diff --git a/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/tests/srcWithManifestTestRepo/src/variables/private/PrivateVariables.ps1 similarity index 100% rename from tests/srcWithManifest/variables/private/PrivateVariables.ps1 rename to tests/srcWithManifestTestRepo/src/variables/private/PrivateVariables.ps1 diff --git a/tests/srcWithManifest/variables/public/Moons.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/Moons.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/Moons.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/Moons.ps1 diff --git a/tests/srcWithManifest/variables/public/Planets.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/Planets.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 diff --git a/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/SolarSystems.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/SolarSystems.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/SolarSystems.ps1 diff --git a/tests/srcWithManifestTestRepo/tests/Environments/Environment.Tests.ps1 b/tests/srcWithManifestTestRepo/tests/Environments/Environment.Tests.ps1 new file mode 100644 index 00000000..211be946 --- /dev/null +++ b/tests/srcWithManifestTestRepo/tests/Environments/Environment.Tests.ps1 @@ -0,0 +1,15 @@ +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty + } +} diff --git a/tests/srcWithManifestTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 b/tests/srcWithManifestTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..7a49dadb --- /dev/null +++ b/tests/srcWithManifestTestRepo/tests/MyTests/PSModuleTest.Tests.ps1 @@ -0,0 +1,44 @@ +[CmdletBinding()] +param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } + } +} diff --git a/tests/srcWithManifestTestRepo/tools/1-build.ps1 b/tests/srcWithManifestTestRepo/tools/1-build.ps1 new file mode 100644 index 00000000..e762395b --- /dev/null +++ b/tests/srcWithManifestTestRepo/tools/1-build.ps1 @@ -0,0 +1 @@ +"1 - Build script executed." diff --git a/tests/srcWithManifestTestRepo/tools/2-build.ps1 b/tests/srcWithManifestTestRepo/tools/2-build.ps1 new file mode 100644 index 00000000..d2575a02 --- /dev/null +++ b/tests/srcWithManifestTestRepo/tools/2-build.ps1 @@ -0,0 +1 @@ +"2 - Build script executed." diff --git a/tests/tests/PSModuleTest.Tests.ps1 b/tests/tests/PSModuleTest.Tests.ps1 deleted file mode 100644 index 00b3cde7..00000000 --- a/tests/tests/PSModuleTest.Tests.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -Describe 'Module' { - It 'Function: Get-PSModuleTest' { - Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Set-PSModuleTest' { - Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Test-PSModuleTest' { - Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } -}