diff --git a/docs/uri-cleanup-plan.md b/docs/uri-cleanup-plan.md
index 4ed09b9cbc4..1599794561a 100644
--- a/docs/uri-cleanup-plan.md
+++ b/docs/uri-cleanup-plan.md
@@ -129,12 +129,13 @@ Leave these categories alone unless a PR explicitly targets their owning behavio
- `[x]` Initial Core unit-test slices use `TestCompiler`, including params emission and linter/extension scenarios.
- `[x]` All linter rule tests use `TestCompiler`, `TestFileData`, and test-owned configuration APIs.
- `[x]` `TestConfigurations` and `TestConfigurationBuilder` own shared test configuration presets and mutations.
-- `[x]` Public `Test*` toolkit types live in the `Bicep.Testing` root namespace; `FakeEnvironment` lives under `Bicep.Testing.Fakes` and the `Utils` namespace is removed.
+- `[x]` Compiler and service toolkit types live in the `Bicep.Testing` root namespace; virtual-file types live under `Bicep.Testing.IO`, `FakeEnvironment` lives under `Bicep.Testing.Fakes`, and the `Utils` namespace is removed.
- `[x]` Simple Core unit-test callers use `TestCompiler` directly.
- `[x]` No synchronous `CompilationHelper.Compile(...)` call sites remain in `Bicep.Core.UnitTests`.
- `[x]` `Bicep.Decompiler.UnitTests` references `Bicep.Testing` instead of `Bicep.Core.UnitTests`.
- `[x]` `Bicep.Local.Extension.UnitTests` and `Bicep.RegistryModuleTool.TestFixtures` no longer reference `Bicep.Core.UnitTests`.
-- `[x]` Reusable JToken assertions have one canonical implementation in `Bicep.Testing.Assertions.Json`; Core retains only baseline-update behavior.
+- `[x]` `Bicep.RpcClient.Tests` references `Bicep.Testing` instead of `Bicep.Core.UnitTests`.
+- `[x]` Embedded baseline data, materialization, updates, and fluent text/JSON assertions have one canonical implementation in `Bicep.Testing.Baselines`.
- `[ ]` Replace all `CompilationHelper` call sites with `TestCompiler` and delete `CompilationHelper` and its result types.
- `[ ]` Replace `ServiceBuilder`, `ServiceBuilderExtensions`, and related Core-unit-test DI extensions with `TestCompiler`, `TestServices`, or focused fixtures, then delete them.
- `[ ]` Consolidate reusable assertions, feature fixtures, mocks, and data builders in `Bicep.Testing`; rewrite or remove obsolete helpers instead of moving them wholesale.
@@ -239,7 +240,7 @@ Deletion targets include:
Do not move the whole assertions directory unchanged. Classify each assertion by its subject and consumers:
- Merge duplicate implementations already present in `Bicep.Testing`, such as diagnostic assertion infrastructure.
-- Keep focused reusable assertions in `Bicep.Testing.Assertions`; do not move baseline-management or Core-specific assertion APIs with them.
+- Keep focused reusable assertions in `Bicep.Testing.Assertions`; keep embedded baseline management and baseline-specific assertions together in `Bicep.Testing.Baselines`.
- Use `TestPrinter.Print(...)` only for printing and `BeValidBicepText()` for string syntax validation; keep source annotation rendering separate.
- Expand `TestCompilationResultAssertions` to replace legacy compilation-result assertions, including template/parameters emission and diagnostic filtering where still useful.
- Move broadly reusable assertions such as diagnostics, syntax, JSON tokens, strings, code fixes, and configuration assertions when non-Core projects consume them.
@@ -251,7 +252,7 @@ Do not move the whole assertions directory unchanged. Classify each assertion by
Treat each family separately:
-- Keep the public `Test*` toolkit types in the `Bicep.Testing` root namespace. Keep `Fake*`, `Mock*`, and `Dummy*` implementations in their corresponding domain namespaces; for example, use `Bicep.Testing.Fakes.FakeEnvironment` rather than `TestEnvironment`.
+- Keep compiler and service toolkit types in the `Bicep.Testing` root namespace. Keep virtual-file types under `Bicep.Testing.IO`, and `Fake*`, `Mock*`, and `Dummy*` implementations in their corresponding domain namespaces; for example, use `Bicep.Testing.Fakes.FakeEnvironment` rather than `TestEnvironment`.
- Do not recreate a catch-all `Bicep.Testing.Utils` namespace.
- Move feature overrides and their provider factory to `Bicep.Testing` if they remain the shared way to configure compiler features. This should allow `TestCompiler.WithFeatureOverrides(...)` to become non-generic.
- Delete the Core `StrictMock` duplicate and use `Bicep.Testing.Mocks.StrictMock`.
@@ -303,6 +304,7 @@ Completed:
- `[x]` `Bicep.Decompiler.UnitTests`: migrated to `TestCompiler`, `TestPrinter`, and focused string/JSON assertions; all 52 tests passed.
- `[x]` `Bicep.Local.Extension.UnitTests`: migrated to `Bicep.Testing.Mocks.StrictMock` and focused JSON assertions; all 99 tests passed.
- `[x]` `Bicep.RegistryModuleTool.TestFixtures`: replaced default Core feature overrides with a focused assembly-version decorator; all 18 consuming integration tests passed.
+- `[x]` `Bicep.RpcClient.Tests`: migrated result-file handling and its public API baseline to focused `Bicep.Testing` APIs; the full 91-test suite completed with 90 passed and 1 skipped.
Validation: the full solution builds after all three project-reference removals and assertion consolidation.
@@ -316,7 +318,6 @@ Current project-reference cleanup candidates:
- `src/Bicep.LangServer.IntegrationTests/Bicep.LangServer.IntegrationTests.csproj`
- `src/Bicep.Local.Deploy.IntegrationTests/Bicep.Local.Deploy.IntegrationTests.csproj`
- `src/Bicep.McpServer.UnitTests/Bicep.McpServer.UnitTests.csproj`
-- `src/Bicep.RpcClient.Tests/Bicep.RpcClient.Tests.csproj`
- `src/Bicep.Wasm.UnitTests/Bicep.Wasm.UnitTests.csproj`
Likely import cleanup areas:
diff --git a/src/Bicep.Cli.IntegrationTests/Bicep.Cli.IntegrationTests.csproj b/src/Bicep.Cli.IntegrationTests/Bicep.Cli.IntegrationTests.csproj
index 4f0a9a71858..94777c5dbdd 100644
--- a/src/Bicep.Cli.IntegrationTests/Bicep.Cli.IntegrationTests.csproj
+++ b/src/Bicep.Cli.IntegrationTests/Bicep.Cli.IntegrationTests.csproj
@@ -20,6 +20,7 @@
+
diff --git a/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs b/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs
index 39bd0bd1d2a..bcbbccc0d28 100644
--- a/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs
@@ -94,7 +94,7 @@ public async Task Build_Valid_SingleFile_WithTemplateSpecReference_ShouldSucceed
var actual = JToken.Parse(compiledFileContent);
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.Compiled!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiled),
@@ -137,7 +137,7 @@ public async Task Build_Valid_SingleFile_WithTemplateSpecReference_ToStdOut_Shou
var actual = JToken.Parse(output);
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.Compiled!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiled),
@@ -183,7 +183,7 @@ public async Task Build_Valid_SingleFile_After_Restore_Should_Succeed(DataSet da
File.Exists(compiledFilePath).Should().BeTrue();
var actual = JToken.Parse(output);
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.Compiled!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiled),
@@ -444,7 +444,7 @@ public async Task Build_WithOutDir_ShouldSucceed(string[] args)
]
}
""");
- errorJToken.Should().EqualWithJsonDiffOutput(
+ errorJToken.Should().MatchJsonBaseline(
TestContext,
expectedErrorJToken,
"",
@@ -650,7 +650,7 @@ public async Task Build_WithValidBicepConfig_ShouldProduceOutputFileAndExpectedE
selectedPath?.Value().Should().Contain("file://");
selectedPath?.Value().Should().Contain("main.bicep");
selectedPath?.Replace("main.bicep");
- errorJToken.Should().EqualWithJsonDiffOutput(
+ errorJToken.Should().MatchJsonBaseline(
TestContext,
expectedErrorJToken,
"",
diff --git a/src/Bicep.Cli.IntegrationTests/BuildParamsCommandTests.cs b/src/Bicep.Cli.IntegrationTests/BuildParamsCommandTests.cs
index 4963a4085b8..de5b8ead260 100644
--- a/src/Bicep.Cli.IntegrationTests/BuildParamsCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/BuildParamsCommandTests.cs
@@ -12,8 +12,9 @@
using Bicep.Core.Samples;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Utils;
+using Bicep.Testing.IO;
using FluentAssertions;
using FluentAssertions.Execution;
using Microsoft.CodeAnalysis.Sarif;
@@ -34,10 +35,8 @@ public class BuildParamsCommandTests : TestBase
[TestMethod]
public async Task Build_params_with_extends_and_base_merging_succeeds_without_bicepconfig()
{
- var baseParamsFile = FileHelper.SaveResultFile(
- TestContext,
- "base.bicepparam",
- """
+ var files = MockFileSystemTestFileSet.Create(
+ ("base.bicepparam", """
using none
param objParam = {
@@ -51,12 +50,8 @@ public async Task Build_params_with_extends_and_base_merging_succeeds_without_bi
param strParam = 'strParamFromBase'
param intParam = 10
- """);
-
- var mainParamsFile = FileHelper.SaveResultFile(
- TestContext,
- "main.bicepparam",
- """
+ """),
+ ("main.bicepparam", """
using './main.bicep'
extends './base.bicepparam'
@@ -72,22 +67,16 @@ public async Task Build_params_with_extends_and_base_merging_succeeds_without_bi
param strParam = base.strParam
param intParam = base.intParam + 5
- """,
- Path.GetDirectoryName(baseParamsFile));
-
- FileHelper.SaveResultFile(
- TestContext,
- "main.bicep",
- """
+ """),
+ ("main.bicep", """
param objParam object
param strParam string
param intParam int
- """,
- Path.GetDirectoryName(baseParamsFile));
+ """));
var settings = CreateDefaultSettings();
- var result = await Bicep(settings, "build-params", mainParamsFile, "--stdout");
+ var result = await Bicep(settings, files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Succeed();
result.Stderr.Should().NotContain("experimental Bicep features");
@@ -1356,7 +1345,7 @@ param objParam object
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.ValidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task Build_Valid_Params_File_Should_Succeed(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -1371,12 +1360,12 @@ public async Task Build_Valid_Params_File_Should_Succeed(BaselineData_Bicepparam
}
data.Compiled.Should().NotBeNull();
- data.Compiled!.ShouldHaveExpectedJsonValue();
+ data.Compiled!.Read().Should().MatchJsonBaseline(data.Compiled);
}
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.ValidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task Build_Valid_Params_File_To_Outdir_Should_Succeed(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -1391,13 +1380,13 @@ public async Task Build_Valid_Params_File_To_Outdir_Should_Succeed(BaselineData_
}
data.Compiled.Should().NotBeNull();
- data.Compiled!.ReadFromOutputFolder().Should().OnlyContainLFNewline();
- data.Compiled!.ShouldHaveExpectedJsonValue();
+ data.Compiled!.Read().Should().OnlyContainLFNewline();
+ data.Compiled.Read().Should().MatchJsonBaseline(data.Compiled);
}
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.ValidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task Build_Valid_Params_File_ToStdOut_Should_Succeed(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -1415,13 +1404,11 @@ public async Task Build_Valid_Params_File_ToStdOut_Should_Succeed(BaselineData_B
parametersStdout.parametersJson.Should().OnlyContainLFNewline();
data.Compiled.Should().NotBeNull();
- data.Compiled!.WriteToOutputFolder(parametersStdout.parametersJson);
- data.Compiled.ShouldHaveExpectedJsonValue();
+ parametersStdout.parametersJson.Should().MatchJsonBaseline(data.Compiled!);
}
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.InvalidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
public async Task Build_Invalid_Single_Params_File_ShouldFail_WithExpectedErrorMessage(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -1447,53 +1434,43 @@ public async Task Build_Invalid_Single_Params_File_ShouldFail_WithExpectedErrorM
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/.*/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestEmbeddedFileData(@"Files/BuildParamsCommandTests/.*/main\.bicepparam")]
+ [TestCategory(TestCategories.Baseline)]
public async Task Build_params_to_stdout_with_non_bicep_references_should_succeed(EmbeddedFile paramFile)
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
- var outputFile = baselineFolder.GetFileOrEnsureCheckedIn("output.json");
+ var baselineFiles = TestContext.MaterializeBaseline(paramFile);
+ var outputFile = baselineFiles.GetFile("output.json");
- var result = await Bicep(await CreateDefaultSettingsWithDefaultMockRegistry(), "build-params", baselineFolder.EntryFile.OutputFilePath, "--stdout");
+ var result = await Bicep(await CreateDefaultSettingsWithDefaultMockRegistry(), "build-params", baselineFiles.EntryFile.OutputFilePath, "--stdout");
result.Should().Succeed();
var parametersStdout = result.Stdout.FromJson();
// Force consistency for escaped newlines.
parametersStdout = parametersStdout with { templateJson = parametersStdout?.templateJson?.ReplaceLineEndings("\n") };
- outputFile.WriteJsonToOutputFolder(parametersStdout);
- outputFile.ShouldHaveExpectedJsonValue();
+ JsonConvert.SerializeObject(parametersStdout, Formatting.Indented).Should().MatchJsonBaseline(outputFile);
}
[TestMethod]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
public async Task Build_params_to_stdout_with_empty_bicepconfig_should_succeed()
{
- var mainBicepParamPath = FileHelper.SaveResultFile(
- TestContext,
- "main.bicepparam",
- """
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicepparam", """
using 'br:mockregistry.io/parameters/basic:v1'
extends 'shared.bicepparam'
param intParam = 123
param boolParam = false
param arrayParam = []
param objectParam = {}
- """);
-
- _ = FileHelper.SaveResultFile(
- TestContext,
- "shared.bicepparam", """
+ """),
+ ("shared.bicepparam", """
using none
param stringParam = 'foo'
- """,
- Path.GetDirectoryName(mainBicepParamPath));
-
- _ = FileHelper.SaveResultFile(
- TestContext,
- "bicepconfig.json", "{}",
- Path.GetDirectoryName(mainBicepParamPath));
+ """),
+ ("bicepconfig.json", "{}"));
+ var cacheRoot = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
+ var settings = await CreateDefaultSettingsWithDefaultMockRegistry(cacheRoot);
- var result = await Bicep(await CreateDefaultSettingsWithDefaultMockRegistry(), "build-params", mainBicepParamPath, "--stdout");
+ var result = await Bicep(settings, files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Succeed();
result.Stderr.Should().NotContain("experimental Bicep features");
@@ -1504,73 +1481,72 @@ public async Task Build_params_to_stdout_with_empty_bicepconfig_should_succeed()
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/.*/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
- public async Task Build_params_returns_intuitive_error_if_invoked_with_bicep_file_param(EmbeddedFile paramFile)
+ public async Task Build_params_returns_intuitive_error_if_invoked_with_bicep_file_param()
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
- var bicepFile = Path.Combine(baselineFolder.OutputFolderPath, "main.bicep");
- File.WriteAllText(bicepFile, "");
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicepparam", """
+ using 'br:mockregistry.io/parameters/basic:v1'
- var result = await Bicep(await CreateDefaultSettingsWithDefaultMockRegistry(), "build-params", baselineFolder.EntryFile.OutputFilePath, "--bicep-file", bicepFile, "--stdout");
+ param stringParam = 'foo'
+ param intParam = 123
+ param boolParam = false
+ param objectParam = { abc: 'def' }
+ param arrayParam = ['abc', 'def']
+ """),
+ ("main.bicep", ""));
+ var cacheRoot = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
+ var settings = await CreateDefaultSettingsWithDefaultMockRegistry(cacheRoot);
+
+ var result = await Bicep(settings, files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--bicep-file", files.GetUri("main.bicep").GetFilePath(), "--stdout");
result.Should().Fail().And.HaveStderrMatch($"Bicep file * provided with --bicep-file can only be used if the Bicep parameters \"using\" declaration refers to a Bicep file on disk.*");
}
[TestMethod]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
public async Task Build_params_works_with_using_none()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
-
- var bicepFile = FileHelper.SaveResultFile(TestContext, "main.bicep", @"
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", @"
param unusedParam int
- ", outputPath);
-
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", @"
+ "),
+ ("main.bicepparam", @"
using none
param unusedParam = 3
- ", outputPath);
+ "));
- var (output, error, result) = await Bicep(["build-params", inputFile, "--bicep-file", bicepFile]);
+ var result = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--bicep-file", files.GetUri("main.bicep").GetFilePath());
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
-
- File.Exists(expectedOutputFile).Should().BeTrue();
- output.Should().BeEmpty();
- error.Should().BeEmpty();
- result.Should().Be(0);
+ result.Should().Succeed().And.NotHaveStdout().And.NotHaveStderr();
+ files.FileExplorer.GetFile(files.GetUri("main.json")).Exists().Should().BeTrue();
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/Registry/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestEmbeddedFileData(@"Files/BuildParamsCommandTests/Registry/main\.bicepparam")]
+ [TestCategory(TestCategories.Baseline)]
public async Task Build_params_to_stdout_with_registry_should_succeed_after_restore(EmbeddedFile paramFile)
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
- var outputFile = baselineFolder.GetFileOrEnsureCheckedIn("output.json");
+ var baselineFiles = TestContext.MaterializeBaseline(paramFile);
+ var outputFile = baselineFiles.GetFile("output.json");
var settings = await CreateDefaultSettingsWithDefaultMockRegistry();
- var result = await Bicep(settings, "restore", baselineFolder.EntryFile.OutputFilePath);
+ var result = await Bicep(settings, "restore", baselineFiles.EntryFile.OutputFilePath);
result.Should().Succeed().And.NotHaveStdout().And.NotHaveStderr();
- result = await Bicep(settings, "build-params", baselineFolder.EntryFile.OutputFilePath, "--no-restore", "--stdout");
+ result = await Bicep(settings, "build-params", baselineFiles.EntryFile.OutputFilePath, "--no-restore", "--stdout");
result.Should().Succeed().And.NotHaveStderr();
var parametersStdout = result.Stdout.FromJson();
// Force consistency for escaped newlines.
parametersStdout = parametersStdout with { templateJson = parametersStdout?.templateJson?.ReplaceLineEndings("\n") };
- outputFile.WriteJsonToOutputFolder(parametersStdout);
- outputFile.ShouldHaveExpectedJsonValue();
+ JsonConvert.SerializeObject(parametersStdout, Formatting.Indented).Should().MatchJsonBaseline(outputFile);
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/Registry/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
- public async Task Build_bicepparam_should_fail_with_error_diagnostics_for_registry_failure(EmbeddedFile paramFile)
+ public async Task Build_bicepparam_should_fail_with_error_diagnostics_for_registry_failure()
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
+ var files = MockFileSystemTestFileSet.Create(("main.bicepparam", "using 'br:mockregistry.io/parameters/basic:v1'"));
+ var cacheRoot = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
var client = StrictMock.Of();
client
@@ -1584,8 +1560,8 @@ public async Task Build_bicepparam_should_fail_with_error_diagnostics_for_regist
var templateSpecRepositoryFactory = StrictMock.Of();
- var settings = new InvocationSettings(new(TestContext, RegistryEnabled: true), clientFactory.Object, templateSpecRepositoryFactory.Object);
- var result = await Bicep(settings, "build-params", baselineFolder.EntryFile.OutputFilePath, "--stdout");
+ var settings = new InvocationSettings(new(CacheRootDirectory: cacheRoot, RegistryEnabled: true), clientFactory.Object, templateSpecRepositoryFactory.Object);
+ var result = await Bicep(settings, files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Fail().And.NotHaveStdout();
result.Stderr.Should().Contain("main.bicepparam(1,7) : Error BCP192: Unable to restore the artifact with reference \"br:mockregistry.io/parameters/basic:v1\": Mock registry request failure.");
@@ -1731,18 +1707,16 @@ param intParam int
[TestMethod]
public async Task Build_params_with_multiple_object_spreads_succeeds()
{
- var rootDir = FileHelper.GetUniqueTestOutputPath(TestContext);
-
- var basePath = FileHelper.SaveResultFile(TestContext, "base.bicepparam", """
+ var files = MockFileSystemTestFileSet.Create(
+ ("base.bicepparam", """
using none
param obj = {
a: 1
arr: [1,2]
}
- """, rootDir);
-
- var mainPath = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
+ """),
+ ("main.bicepparam", """
using './main.bicep'
extends './base.bicepparam'
@@ -1753,13 +1727,12 @@ public async Task Build_params_with_multiple_object_spreads_succeeds()
...base.obj
post: 'post'
}
- """, rootDir);
-
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
+ """),
+ ("main.bicep", """
param obj object
- """, rootDir);
+ """));
- var result = await Bicep(CreateDefaultSettings(), "build-params", mainPath, "--stdout");
+ var result = await Bicep(CreateDefaultSettings(), files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Succeed();
var json = result.Stdout.FromJson().parametersJson.FromJson();
json.Should().HaveValueAtPath("parameters.obj.value.a", 1);
@@ -1772,30 +1745,28 @@ param obj object
[TestMethod]
public async Task Build_params_with_array_spread_positions_succeeds()
{
- var rootDir = FileHelper.GetUniqueTestOutputPath(TestContext);
- var basePath = FileHelper.SaveResultFile(TestContext, "base.bicepparam", """
+ var files = MockFileSystemTestFileSet.Create(
+ ("base.bicepparam", """
using none
param arr = [1,2,3]
- """, rootDir);
-
- var mainPath = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
+ """),
+ ("main.bicepparam", """
using './main.bicep'
extends './base.bicepparam'
param arrStart = [0, ...base.arr]
param arrMiddle = [0, ...base.arr, 4]
param arrEnd = [...base.arr, 4]
- """, rootDir);
-
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
+ """),
+ ("main.bicep", """
param arrStart array
param arrMiddle array
param arrEnd array
param arr array
- """, rootDir);
+ """));
- var result = await Bicep(CreateDefaultSettings(), "build-params", mainPath, "--stdout");
+ var result = await Bicep(CreateDefaultSettings(), files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Succeed();
var json = result.Stdout.FromJson().parametersJson.FromJson();
json.Should().HaveValueAtPath("parameters.arrStart.value", JToken.Parse("[0,1,2,3]"));
@@ -1806,27 +1777,25 @@ param arr array
[TestMethod]
public async Task Build_params_child_variable_referencing_base_param_succeeds()
{
- var rootDir = FileHelper.GetUniqueTestOutputPath(TestContext);
- var basePath = FileHelper.SaveResultFile(TestContext, "base.bicepparam", """
+ var files = MockFileSystemTestFileSet.Create(
+ ("base.bicepparam", """
using none
param greeting = 'hello'
- """, rootDir);
-
- var mainPath = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
+ """),
+ ("main.bicepparam", """
using './main.bicep'
extends './base.bicepparam'
var full = '${base.greeting}-world'
param final = full
- """, rootDir);
-
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
+ """),
+ ("main.bicep", """
param greeting string
param final string
- """, rootDir);
+ """));
- var result = await Bicep(CreateDefaultSettings(), "build-params", mainPath, "--stdout");
+ var result = await Bicep(CreateDefaultSettings(), files, "build-params", files.GetUri("main.bicepparam").GetFilePath(), "--stdout");
result.Should().Succeed();
var json = result.Stdout.FromJson().parametersJson.FromJson();
json.Should().HaveValueAtPath("parameters.final.value", "hello-world");
@@ -1835,26 +1804,24 @@ param final string
[TestMethod]
public async Task Build_params_spread_non_object_should_fail()
{
- var rootDir = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "base.bicepparam", """
+ var files = MockFileSystemTestFileSet.Create(
+ ("base.bicepparam", """
using none
param strParam = 'text'
- """, rootDir);
-
- var childPath = FileHelper.SaveResultFile(TestContext, "child.bicepparam", """
+ """),
+ ("child.bicepparam", """
using './main.bicep'
extends './base.bicepparam'
param objParam = { ...base.strParam }
- """, rootDir);
-
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
+ """),
+ ("main.bicep", """
param strParam string
param objParam object
- """, rootDir);
+ """));
- var result = await Bicep(CreateDefaultSettings(), "build-params", childPath, "--stdout");
+ var result = await Bicep(CreateDefaultSettings(), files, "build-params", files.GetUri("child.bicepparam").GetFilePath(), "--stdout");
result.Should().Fail();
result.Stderr.Should().Contain("Error BCP402: The spread operator \"...\" can only be used in this context for an expression assignable to type \"object\".");
}
@@ -1862,19 +1829,18 @@ param objParam object
[TestMethod]
public async Task Build_params_self_extends_should_fail()
{
- var rootDir = FileHelper.GetUniqueTestOutputPath(TestContext);
- var path = FileHelper.SaveResultFile(TestContext, "self.bicepparam", """
+ var files = MockFileSystemTestFileSet.Create(
+ ("self.bicepparam", """
using './main.bicep'
extends './self.bicepparam'
param p = 1
- """, rootDir);
-
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
+ """),
+ ("main.bicep", """
param p int
- """, rootDir);
+ """));
- var result = await Bicep(CreateDefaultSettings(), "build-params", path, "--stdout");
+ var result = await Bicep(CreateDefaultSettings(), files, "build-params", files.GetUri("self.bicepparam").GetFilePath(), "--stdout");
result.Should().Fail();
result.Stderr.Should().Contain("Error BCP278: This parameters file references itself, which is not allowed.");
}
@@ -1950,29 +1916,28 @@ param tag string
[TestMethod]
public async Task BuildParams_Extends_Multiple_InvalidType_ThrowsMultipleErrors()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "main.bicep", @"
- param myString string
- param myInt int
- param myBool bool
- ", outputPath);
- FileHelper.SaveResultFile(TestContext, "base.bicepparam", @"
- using none
- param myInt = '42'
- param myString = {}
- param myBool = []
- ", outputPath);
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", @"
- using './main.bicep'
- extends 'base.bicepparam'
- ", outputPath);
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", """
+ param myString string
+ param myInt int
+ param myBool bool
+ """),
+ ("base.bicepparam", """
+ using none
+ param myInt = '42'
+ param myString = {}
+ param myBool = []
+ """),
+ ("main.bicepparam", """
+ using './main.bicep'
+ extends 'base.bicepparam'
+ """));
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
- File.Exists(expectedOutputFile).Should().BeFalse();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
- var (output, error, result) = await Bicep(["build-params", inputFile]);
+ var (output, error, result) = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath());
- File.Exists(expectedOutputFile).Should().BeFalse();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
output.Should().BeEmpty();
error.Should().Contain("Error BCP033: Expected a value of type \"int\" but the provided value is of type \"'42'\".");
@@ -1984,41 +1949,38 @@ param myBool bool
[TestMethod]
public async Task BuildParams_ResourceInputType_WithValidObject_Succeeds()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
- @description('Parameter with resourceInput type')
- param storageConfig resourceInput<'Microsoft.Storage/storageAccounts@2022-09-01'>.properties.encryption
-
- output test string = 'success'
- """, outputPath);
-
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
- using './main.bicep'
-
- param storageConfig = {
- services: {
- blob: {
- enabled: true
- }
- file: {
- enabled: true
- }
- }
- keySource: 'Microsoft.Storage'
- }
- """, outputPath);
-
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
- File.Exists(expectedOutputFile).Should().BeFalse();
-
- var (output, error, result) = await Bicep(["build-params", inputFile]);
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", """
+ @description('Parameter with resourceInput type')
+ param storageConfig resourceInput<'Microsoft.Storage/storageAccounts@2022-09-01'>.properties.encryption
+
+ output test string = 'success'
+ """),
+ ("main.bicepparam", """
+ using './main.bicep'
+
+ param storageConfig = {
+ services: {
+ blob: {
+ enabled: true
+ }
+ file: {
+ enabled: true
+ }
+ }
+ keySource: 'Microsoft.Storage'
+ }
+ """));
+
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
+
+ var (output, error, result) = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Be(0);
error.Should().NotContain("Error");
- File.Exists(expectedOutputFile).Should().BeTrue();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeTrue();
- var parametersFile = File.ReadAllText(expectedOutputFile);
- var parametersObject = JObject.Parse(parametersFile);
+ var parametersObject = JObject.Parse(files.GetFileText("main.json"));
((JToken)parametersObject).Should().NotBeNull();
var storageConfigValue = parametersObject["parameters"]?["storageConfig"]?["value"];
storageConfigValue.Should().NotBeNull();
@@ -2027,75 +1989,70 @@ param storageConfig resourceInput<'Microsoft.Storage/storageAccounts@2022-09-01'
[TestMethod]
public async Task BuildParams_ResourceInputType_NestedProperty_Succeeds()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
- @description('Parameter with nested resourceInput type')
- param encryptionServices resourceInput<'Microsoft.Storage/storageAccounts@2022-09-01'>.properties.encryption.services
-
- output test string = 'success'
- """, outputPath);
-
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
- using './main.bicep'
-
- param encryptionServices = {
- blob: {
- enabled: true
- keyType: 'Account'
- }
- file: {
- enabled: false
- }
- }
- """, outputPath);
-
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
- File.Exists(expectedOutputFile).Should().BeFalse();
-
- var (output, error, result) = await Bicep(["build-params", inputFile]);
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", """
+ @description('Parameter with nested resourceInput type')
+ param encryptionServices resourceInput<'Microsoft.Storage/storageAccounts@2022-09-01'>.properties.encryption.services
+
+ output test string = 'success'
+ """),
+ ("main.bicepparam", """
+ using './main.bicep'
+
+ param encryptionServices = {
+ blob: {
+ enabled: true
+ keyType: 'Account'
+ }
+ file: {
+ enabled: false
+ }
+ }
+ """));
+
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
+
+ var (output, error, result) = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Be(0);
error.Should().NotContain("Error");
- File.Exists(expectedOutputFile).Should().BeTrue();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeTrue();
}
[TestMethod]
public async Task BuildParams_ResourceInputType_ArrayOfResources_Succeeds()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
- @description('Parameter with array of resourceInput type')
- param subnets resourceInput<'Microsoft.Network/virtualNetworks/subnets@2023-09-01'>.properties[]
-
- output test string = 'success'
- """, outputPath);
-
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
- using './main.bicep'
-
- param subnets = [
- {
- addressPrefix: '10.0.1.0/24'
- privateEndpointNetworkPolicies: 'Disabled'
- }
- {
- addressPrefix: '10.0.2.0/24'
- delegations: []
- }
- ]
- """, outputPath);
-
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
- File.Exists(expectedOutputFile).Should().BeFalse();
-
- var (output, error, result) = await Bicep(["build-params", inputFile]);
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", """
+ @description('Parameter with array of resourceInput type')
+ param subnets resourceInput<'Microsoft.Network/virtualNetworks/subnets@2023-09-01'>.properties[]
+
+ output test string = 'success'
+ """),
+ ("main.bicepparam", """
+ using './main.bicep'
+
+ param subnets = [
+ {
+ addressPrefix: '10.0.1.0/24'
+ privateEndpointNetworkPolicies: 'Disabled'
+ }
+ {
+ addressPrefix: '10.0.2.0/24'
+ delegations: []
+ }
+ ]
+ """));
+
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
+
+ var (output, error, result) = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Be(0);
error.Should().NotContain("Error");
- File.Exists(expectedOutputFile).Should().BeTrue();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeTrue();
- var parametersFile = File.ReadAllText(expectedOutputFile);
- var parametersObject = JObject.Parse(parametersFile);
+ var parametersObject = JObject.Parse(files.GetFileText("main.json"));
var subnetsArray = parametersObject["parameters"]?["subnets"]?["value"] as JArray;
subnetsArray.Should().NotBeNull();
subnetsArray!.Count.Should().Be(2);
@@ -2104,43 +2061,40 @@ param subnets resourceInput<'Microsoft.Network/virtualNetworks/subnets@2023-09-0
[TestMethod]
public async Task BuildParams_ResourceInputType_ComplexNestedObject_Succeeds()
{
- var outputPath = FileHelper.GetUniqueTestOutputPath(TestContext);
- FileHelper.SaveResultFile(TestContext, "main.bicep", """
- @description('Parameter with complex resourceInput type')
- param organizationProfile resourceInput<'Microsoft.DevOpsInfrastructure/pools@2024-10-19'>.properties.organizationProfile
-
- output test string = 'success'
- """, outputPath);
-
- var inputFile = FileHelper.SaveResultFile(TestContext, "main.bicepparam", """
- using './main.bicep'
-
- param organizationProfile = {
- kind: 'AzureDevOps'
- organizations: [
- {
- url: 'https://dev.azure.com/my-org'
- projects: []
- parallelism: 1
- }
- ]
- permissionProfile: {
- kind: 'CreatorOnly'
- }
- }
- """, outputPath);
-
- var expectedOutputFile = FileHelper.GetResultFilePath(TestContext, "main.json", outputPath);
- File.Exists(expectedOutputFile).Should().BeFalse();
-
- var (output, error, result) = await Bicep(["build-params", inputFile]);
+ var files = MockFileSystemTestFileSet.Create(
+ ("main.bicep", """
+ @description('Parameter with complex resourceInput type')
+ param organizationProfile resourceInput<'Microsoft.DevOpsInfrastructure/pools@2024-10-19'>.properties.organizationProfile
+
+ output test string = 'success'
+ """),
+ ("main.bicepparam", """
+ using './main.bicep'
+
+ param organizationProfile = {
+ kind: 'AzureDevOps'
+ organizations: [
+ {
+ url: 'https://dev.azure.com/my-org'
+ projects: []
+ parallelism: 1
+ }
+ ]
+ permissionProfile: {
+ kind: 'CreatorOnly'
+ }
+ }
+ """));
+
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeFalse();
+
+ var (output, error, result) = await Bicep(files, "build-params", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Be(0);
error.Should().NotContain("Error");
- File.Exists(expectedOutputFile).Should().BeTrue();
+ files.FileSystem.File.Exists(files.GetUri("main.json").GetFilePath()).Should().BeTrue();
- var parametersFile = File.ReadAllText(expectedOutputFile);
- var parametersObject = JObject.Parse(parametersFile);
+ var parametersObject = JObject.Parse(files.GetFileText("main.json"));
var kindValue = parametersObject["parameters"]?["organizationProfile"]?["value"]?["kind"]?.ToString();
kindValue.Should().Be("AzureDevOps");
}
diff --git a/src/Bicep.Cli.IntegrationTests/Commands/LocalDeployCommandTests.cs b/src/Bicep.Cli.IntegrationTests/Commands/LocalDeployCommandTests.cs
index 35b8c58d85b..2d853ccad9c 100644
--- a/src/Bicep.Cli.IntegrationTests/Commands/LocalDeployCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/Commands/LocalDeployCommandTests.cs
@@ -17,7 +17,6 @@
using Bicep.Core.Registry.Oci;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
using Bicep.Core.UnitTests.Features;
using Bicep.Core.UnitTests.Mock;
using Bicep.Core.UnitTests.Utils;
@@ -25,6 +24,7 @@
using Bicep.Local.Deploy;
using Bicep.Local.Deploy.Azure;
using Bicep.Local.Deploy.Extensibility;
+using Bicep.Testing.IO;
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -38,6 +38,17 @@ namespace Bicep.Cli.IntegrationTests.Commands;
[TestClass]
public class LocalDeployCommandTests : TestBase
{
+ private async Task<(MockFileSystemTestFileSet Files, InvocationSettings Settings)> CreateTestSettings(EmbeddedFile paramFile)
+ {
+ var files = new MockFileSystemTestFileSet().AddEmbeddedFiles(paramFile);
+ var cacheDirectory = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
+ var features = new FeatureProviderOverrides(CacheRootDirectory: cacheDirectory, LocalDeployEnabled: true);
+ var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), features, files.FileSystem);
+ var clientFactory = services.Build().Construct();
+
+ return (files, new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: features));
+ }
+
private static ExtensionPackage GetMockLocalDeployPackage(BinaryData? tgzData = null)
{
tgzData ??= ExtensionResourceTypeHelper.GetHttpExtensionTypesTgz();
@@ -140,18 +151,14 @@ private ILocalExtension GetFailingExtensionMock()
public async Task Local_deploy_should_succeed()
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/weather/main.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
-
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
+ var (files, settings) = await CreateTestSettings(paramFile);
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, GetExtensionMock()),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath());
result.Should().NotHaveStderr().And.Succeed();
@@ -189,18 +196,14 @@ public async Task Local_deploy_should_succeed()
public async Task Local_deploy_should_report_failures()
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/weather/main.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
-
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
+ var (files, settings) = await CreateTestSettings(paramFile);
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, GetFailingExtensionMock()),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath());
result.Should().NotHaveStderr().And.Fail();
@@ -220,18 +223,16 @@ public async Task Local_deploy_should_report_failures()
public async Task Local_deploy_should_succeed_with_json_output()
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/weather/main.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
-
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
+ var (files, settings) = await CreateTestSettings(paramFile);
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, GetExtensionMock()),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath, "--format", "json"]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath(),
+ "--format",
+ "json");
result.Should().NotHaveStderr().And.Succeed();
@@ -264,7 +265,7 @@ public async Task Local_deploy_should_succeed_with_json_output()
public async Task Local_deploy_with_azure_should_succeed(bool async)
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/azure/main.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
+ var (files, settings) = await CreateTestSettings(paramFile);
var extensionMock = StrictMock.Of();
extensionMock.Setup(x => x.CreateOrUpdate(It.IsAny(), It.IsAny()))
@@ -321,16 +322,12 @@ public async Task Local_deploy_with_azure_should_succeed(bool async)
[], []);
});
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
-
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, extensionMock.Object, deploymentProviderMock.Object),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath());
result.Should().NotHaveStderr().And.Succeed();
@@ -354,18 +351,14 @@ public async Task Local_deploy_with_azure_should_succeed(bool async)
public async Task Local_deploy_should_report_nested_operations()
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/weather/nested.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
-
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
+ var (files, settings) = await CreateTestSettings(paramFile);
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, GetExtensionMock()),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath());
result.Should().NotHaveStderr().And.Succeed();
@@ -385,18 +378,14 @@ public async Task Local_deploy_should_report_nested_operations()
public async Task Local_deploy_should_report_nested_operation_failures()
{
var paramFile = new EmbeddedFile(typeof(LocalDeployCommandTests).Assembly, "Files/LocalDeployCommandTests/weather/nested.bicepparam");
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
-
- var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(LocalDeployEnabled: true));
- var clientFactory = services.Build().Construct();
-
- var cacheDirectory = FileHelper.GetCacheRootDirectory(TestContext).EnsureExists();
+ var (files, settings) = await CreateTestSettings(paramFile);
var result = await Bicep(
- new InvocationSettings(ClientFactory: clientFactory, FeatureOverrides: new(CacheRootDirectory: cacheDirectory)),
+ settings,
+ files,
services => RegisterExtensionMocks(services, GetFailingExtensionMock()),
- TestContext.CancellationTokenSource.Token,
- ["local-deploy", baselineFolder.EntryFile.OutputFilePath]);
+ "local-deploy",
+ files.GetUri(paramFile.FileName).GetFilePath());
result.Should().NotHaveStderr().And.Fail();
diff --git a/src/Bicep.Cli.IntegrationTests/FormatCommandTests.cs b/src/Bicep.Cli.IntegrationTests/FormatCommandTests.cs
index 41d71d28c30..e0d178d5765 100644
--- a/src/Bicep.Cli.IntegrationTests/FormatCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/FormatCommandTests.cs
@@ -127,12 +127,12 @@ public async Task Format_SampleBicepParam_MatchesFormattedSample(BaselineData_Bi
{
var data = baselineData.GetData(TestContext);
- data.Formatted.WriteToOutputFolder(data.Parameters.EmbeddedFile.Contents);
+ data.Formatted.Write(data.Parameters.EmbeddedFile.Contents);
var result = await Bicep("format", data.Formatted.OutputFilePath);
AssertSuccess(result);
- data.Formatted.ShouldHaveExpectedValue();
+ data.Formatted.Read().Should().MatchTextBaseline(data.Formatted);
}
[DataTestMethod]
diff --git a/src/Bicep.Cli.IntegrationTests/GlobalUsings.cs b/src/Bicep.Cli.IntegrationTests/GlobalUsings.cs
index f09b85cb868..7bbb4d099a7 100644
--- a/src/Bicep.Cli.IntegrationTests/GlobalUsings.cs
+++ b/src/Bicep.Cli.IntegrationTests/GlobalUsings.cs
@@ -1,4 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
+global using Bicep.Testing;
global using Bicep.Testing.Assertions.Json;
+global using Bicep.Testing.Baselines;
+global using Bicep.Testing.IO;
diff --git a/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs b/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs
index 678b61afaa2..610985693be 100644
--- a/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs
@@ -13,7 +13,7 @@
using Bicep.Core.Samples;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Features;
using Bicep.Core.UnitTests.Mock;
using Bicep.Core.UnitTests.Registry;
@@ -21,6 +21,7 @@
using Bicep.IO.Abstraction;
using Bicep.IO.FileSystem;
using Bicep.Testing;
+using Bicep.Testing.IO;
using FluentAssertions;
using FluentAssertions.Execution;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -143,19 +144,17 @@ await RegistryHelper.PublishModuleToRegistryAsync(
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/Registry/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
- public async Task Restore_should_succeed_for_bicepparam_file_with_registry_reference(EmbeddedFile paramFile)
+ public async Task Restore_should_succeed_for_bicepparam_file_with_registry_reference()
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
+ var files = MockFileSystemTestFileSet.Create(("main.bicepparam", "using 'br:mockregistry.io/parameters/basic:v1'"));
+ var cacheRoot = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
+ var settings = await CreateDefaultSettingsWithDefaultMockRegistry(cacheRoot);
- var settings = await CreateDefaultSettingsWithDefaultMockRegistry();
-
- var result = await Bicep(settings, "restore", baselineFolder.EntryFile.OutputFilePath);
+ var result = await Bicep(settings, files, "restore", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Succeed().And.NotHaveStdout().And.NotHaveStderr();
// ensure something got restored
- CachedModules.GetCachedModules(BicepTestConstants.FileSystem, settings.FeatureOverrides!.CacheRootDirectory!).Should().HaveCountGreaterThan(0)
+ CachedModules.GetCachedModules(files.FileSystem, cacheRoot).Should().HaveCountGreaterThan(0)
.And.AllSatisfy(m => m.Should().NotHaveSource());
}
@@ -630,11 +629,10 @@ public async Task Restore_RequestFailedException_ShouldFail()
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/BuildParamsCommandTests/Registry/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
- public async Task Restore_bicepparam_should_fail_with_error_diagnostics_for_registry_failure(EmbeddedFile paramFile)
+ public async Task Restore_bicepparam_should_fail_with_error_diagnostics_for_registry_failure()
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
+ var files = MockFileSystemTestFileSet.Create(("main.bicepparam", "using 'br:mockregistry.io/parameters/basic:v1'"));
+ var cacheRoot = files.FileExplorer.GetDirectory(files.GetUri("cache")).EnsureExists();
var client = StrictMock.Of();
client
@@ -648,8 +646,8 @@ public async Task Restore_bicepparam_should_fail_with_error_diagnostics_for_regi
var templateSpecRepositoryFactory = StrictMock.Of();
- var settings = new InvocationSettings(new(TestContext, RegistryEnabled: true), clientFactory.Object, templateSpecRepositoryFactory.Object);
- var result = await Bicep(settings, "restore", baselineFolder.EntryFile.OutputFilePath);
+ var settings = new InvocationSettings(new(CacheRootDirectory: cacheRoot, RegistryEnabled: true), clientFactory.Object, templateSpecRepositoryFactory.Object);
+ var result = await Bicep(settings, files, "restore", files.GetUri("main.bicepparam").GetFilePath());
result.Should().Fail().And.NotHaveStdout();
result.Stderr.Should().Contain("main.bicepparam(1,7) : Error BCP192: Unable to restore the artifact with reference \"br:mockregistry.io/parameters/basic:v1\": Mock registry request failure.");
diff --git a/src/Bicep.Cli.IntegrationTests/SnapshotCommandTests.cs b/src/Bicep.Cli.IntegrationTests/SnapshotCommandTests.cs
index 74b4920e767..a1fc6bc1104 100644
--- a/src/Bicep.Cli.IntegrationTests/SnapshotCommandTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/SnapshotCommandTests.cs
@@ -15,7 +15,7 @@
using Bicep.Core.Samples;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Mock;
using Bicep.Core.UnitTests.Utils;
using Bicep.IO.FileSystem;
@@ -123,8 +123,8 @@ public async Task Snapshot_with_overwrite_should_generate_a_valid_snapshot_file(
}
[TestMethod]
- [EmbeddedFilesTestData(@"Files/SnapshotCommandTests/.*/main\.bicepparam")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestEmbeddedFileData(@"Files/SnapshotCommandTests/.*/main\.bicepparam")]
+ [TestCategory(TestCategories.Baseline)]
public async Task Snapshot_generates_correct_format(EmbeddedFile paramFile)
{
var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ExtensionResourceTypeHelper.GetHttpExtensionTypesTgz(), new(), artifactTarget: "example.azurecr.io/extensions/snapshot:1.2.3");
@@ -133,15 +133,15 @@ public async Task Snapshot_generates_correct_format(EmbeddedFile paramFile)
var subscriptionId = new Guid().ToString();
var resourceGroupName = "myRg";
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, paramFile);
- var snapshotFile = baselineFolder.GetFileOrEnsureCheckedIn("main.snapshot.json");
+ var baselineFiles = TestContext.MaterializeBaseline(paramFile);
+ var snapshotFile = baselineFiles.GetFile("main.snapshot.json");
var result = await Bicep(
services => services.WithContainerRegistryClientFactory(clientFactory),
- "snapshot", baselineFolder.EntryFile.OutputFilePath, "--mode", "overwrite", "--subscription-id", subscriptionId, "--resource-group", resourceGroupName);
+ "snapshot", baselineFiles.EntryFile.OutputFilePath, "--mode", "overwrite", "--subscription-id", subscriptionId, "--resource-group", resourceGroupName);
result.Should().Succeed();
- snapshotFile.ShouldHaveExpectedJsonValue();
+ snapshotFile.Read().Should().MatchJsonBaseline(snapshotFile);
}
[TestMethod]
@@ -251,7 +251,7 @@ public async Task Snapshot_speculatively_evaluates_references()
"main.bicep",
"""
module mod 'mod.bicep' = {}
-
+
module mod2 'mod2.bicep' = {
params: {
vnetName: mod.outputs.static
@@ -271,7 +271,7 @@ public async Task Snapshot_speculatively_evaluates_references()
"mod2.bicep",
"""
param vnetName string
-
+
resource vnet 'Microsoft.Network/virtualNetworks@2024-07-01' = {
name: vnetName
}
diff --git a/src/Bicep.Cli.IntegrationTests/TestBase.cs b/src/Bicep.Cli.IntegrationTests/TestBase.cs
index 4bf093fa0ce..6478b00b733 100644
--- a/src/Bicep.Cli.IntegrationTests/TestBase.cs
+++ b/src/Bicep.Cli.IntegrationTests/TestBase.cs
@@ -15,7 +15,9 @@
using Bicep.Core.UnitTests.Mock;
using Bicep.Core.UnitTests.Utils;
using Bicep.Core.Utils;
+using Bicep.IO.Abstraction;
using Bicep.Testing;
+using Bicep.Testing.IO;
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -83,6 +85,25 @@ this with
protected static Task Bicep(InvocationSettings settings, Action? registerAction, CancellationToken cancellationToken, params string?[] args /*null args are ignored*/)
=> BicepInternal(settings, registerAction, null, cancellationToken, args);
+ protected Task Bicep(InvocationSettings settings, MockFileSystemTestFileSet files, params string[] args)
+ => Bicep(settings, files, _ => { }, args);
+
+ protected Task Bicep(InvocationSettings settings, MockFileSystemTestFileSet files, Action registerAction, params string[] args)
+ => Bicep(
+ settings,
+ services =>
+ {
+ services
+ .WithFileSystem(files.FileSystem)
+ .WithFileExplorer(files.FileExplorer);
+ registerAction(services);
+ },
+ TestContext.CancellationTokenSource.Token,
+ args);
+
+ protected Task Bicep(MockFileSystemTestFileSet files, params string[] args)
+ => Bicep(InvocationSettings.Default, files, args);
+
protected static Task Bicep(params string[] args) => Bicep(InvocationSettings.Default, args);
protected static Task Bicep(Action registerAction, params string[] args)
@@ -146,6 +167,14 @@ protected static async Task> GetAllParamDiagnostics(ServiceB
protected async Task CreateDefaultSettingsWithDefaultMockRegistry()
=> CreateDefaultSettings().WithArtifactManager(await CreateDefaultExternalArtifactManager(), TestContext);
+ protected async Task CreateDefaultSettingsWithDefaultMockRegistry(IDirectoryHandle cacheRootDirectory)
+ {
+ var featureOverrides = new FeatureProviderOverrides(CacheRootDirectory: cacheRootDirectory);
+
+ return new InvocationSettings(FeatureOverrides: featureOverrides)
+ .WithArtifactManager(await MockRegistry.CreateDefaultExternalArtifactManager(featureOverrides), TestContext);
+ }
+
protected InvocationSettings CreateDefaultSettings(Func? featureOverrides = null) =>
new()
{
diff --git a/src/Bicep.Cli.IntegrationTests/UseRecentModuleVersionsIntegrationTests.cs b/src/Bicep.Cli.IntegrationTests/UseRecentModuleVersionsIntegrationTests.cs
index 88d03aac984..c01e6bd2243 100644
--- a/src/Bicep.Cli.IntegrationTests/UseRecentModuleVersionsIntegrationTests.cs
+++ b/src/Bicep.Cli.IntegrationTests/UseRecentModuleVersionsIntegrationTests.cs
@@ -19,7 +19,7 @@
using Bicep.Core.Samples;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Mock.Registry;
using Bicep.Core.UnitTests.Mock.Registry.Catalog;
using Bicep.Core.UnitTests.Registry;
diff --git a/src/Bicep.Core.IntegrationTests/Emit/TemplateEmitterTests.cs b/src/Bicep.Core.IntegrationTests/Emit/TemplateEmitterTests.cs
index 99e59b404de..56f4d27e9f5 100644
--- a/src/Bicep.Core.IntegrationTests/Emit/TemplateEmitterTests.cs
+++ b/src/Bicep.Core.IntegrationTests/Emit/TemplateEmitterTests.cs
@@ -11,9 +11,10 @@
using Bicep.Core.Semantics;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Features;
using Bicep.Core.UnitTests.Utils;
+using Bicep.IO.Abstraction;
using Bicep.Testing;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -72,12 +73,12 @@ private async Task GetCompilation(BaselineData_Bicepparam baseline,
.Build()
.GetCompiler();
- return await compiler.CreateCompilation(baseline.GetData(TestContext).Parameters.OutputFileUri.ToIOUri());
+ return await compiler.CreateCompilation(IOUri.FromFilePath(baseline.GetData(TestContext).Parameters.OutputFilePath));
}
[DataTestMethod]
[DynamicData(nameof(GetValidDataSets), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task ValidBicep_TemplateEmiterShouldProduceExpectedTemplate(DataSet dataSet)
{
var compiledFilePath = FileHelper.GetResultFilePath(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainCompiled));
@@ -91,7 +92,7 @@ public async Task ValidBicep_TemplateEmiterShouldProduceExpectedTemplate(DataSet
var outputFile = File.ReadAllText(compiledFilePath);
var actual = JToken.Parse(outputFile);
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.Compiled!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiled),
@@ -103,7 +104,7 @@ public async Task ValidBicep_TemplateEmiterShouldProduceExpectedTemplate(DataSet
[DataTestMethod]
[DynamicData(nameof(GetValidDataSets), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task ValidBicep_EmitTemplate_should_produce_expected_symbolicname_template(DataSet dataSet)
{
var compiledFilePath = FileHelper.GetResultFilePath(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainCompiledWithSymbolicNames));
@@ -117,7 +118,7 @@ public async Task ValidBicep_EmitTemplate_should_produce_expected_symbolicname_t
var outputFile = File.ReadAllText(compiledFilePath);
var actual = JToken.Parse(outputFile);
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.CompiledWithSymbolicNames!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiledWithSymbolicNames),
@@ -128,13 +129,13 @@ public async Task ValidBicep_EmitTemplate_should_produce_expected_symbolicname_t
}
[DataTestMethod]
- [EmbeddedFilesTestData(@"Files/SourceMapping/.*/main.bicep")]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestEmbeddedFileData(@"Files/SourceMapping/.*/main.bicep")]
+ [TestCategory(TestCategories.Baseline)]
public async Task Source_map_generation_should_work(EmbeddedFile file)
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, file);
- var bicepFile = baselineFolder.EntryFile;
- var sourceMapFile = baselineFolder.GetFileOrEnsureCheckedIn("sourcemap.json");
+ var baselineFiles = TestContext.MaterializeBaseline(file);
+ var bicepFile = baselineFiles.EntryFile;
+ var sourceMapFile = baselineFiles.GetFile("sourcemap.json");
var features = new FeatureProviderOverrides(TestContext, SourceMappingEnabled: true);
var compiler = ServiceBuilder.Create(s => s.WithFeatureOverrides(features)).GetCompiler();
@@ -150,13 +151,12 @@ public async Task Source_map_generation_should_work(EmbeddedFile file)
// Here we simply verify that the format of the baseline file looks correct.
var sourceMapJson = JToken.FromObject(emitResult.SourceMap!);
- sourceMapFile.WriteToOutputFolder(sourceMapJson.ToString());
- sourceMapFile.ShouldHaveExpectedJsonValue();
+ sourceMapJson.Should().MatchJsonBaseline(sourceMapFile);
}
[DataTestMethod]
[DynamicData(nameof(GetValidDataSets), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task SourceMap_maps_json_to_bicep_lines(DataSet dataSet)
{
var features = new FeatureProviderOverrides(TestContext, SourceMappingEnabled: true);
@@ -178,7 +178,7 @@ public async Task SourceMap_maps_json_to_bicep_lines(DataSet dataSet)
File.WriteAllText(sourceTextWithSourceMapFileName, sourceTextWithSourceMap.ToString());
// Here we validate visually that the in-memory source map can be used to map JSON -> Bicep lines
- sourceTextWithSourceMap.Should().EqualWithLineByLineDiffOutput(
+ sourceTextWithSourceMap.Should().MatchTextBaseline(
TestContext,
dataSet.SourceMap!,
expectedPath: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainSourceMap),
@@ -205,7 +205,7 @@ public void TemplateEmitter_output_should_not_include_UTF8_BOM()
[DataTestMethod]
[DynamicData(nameof(GetValidDataSets), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task ValidBicepTextWriter_TemplateEmiterShouldProduceExpectedTemplate(DataSet dataSet)
{
var compilation = await GetCompilation(dataSet, new(TestContext));
@@ -220,7 +220,7 @@ public async Task ValidBicepTextWriter_TemplateEmiterShouldProduceExpectedTempla
var actual = JToken.ReadFrom(new JsonTextReader(new StreamReader(new MemoryStream(memoryStream.ToArray()))));
var compiledFilePath = FileHelper.SaveResultFile(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainCompiled), actual.ToString(Formatting.Indented));
- actual.Should().EqualWithJsonDiffOutput(
+ actual.Should().MatchJsonBaseline(
TestContext,
JToken.Parse(dataSet.Compiled!),
expectedLocation: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainCompiled),
@@ -242,7 +242,7 @@ public async Task InvalidBicep_TemplateEmiterShouldNotProduceAnyTemplate(DataSet
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.ValidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task Valid_bicepparam_TemplateEmiter_should_produce_expected_template(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -255,12 +255,12 @@ public async Task Valid_bicepparam_TemplateEmiter_should_produce_expected_templa
result.Diagnostics.Should().NotHaveErrors();
result.Status.Should().Be(EmitStatus.Succeeded);
- data.Compiled.ShouldHaveExpectedJsonValue();
+ data.Compiled.Read().Should().MatchJsonBaseline(data.Compiled);
}
[DataTestMethod]
[BaselineData_Bicepparam.TestData(Filter = BaselineData_Bicepparam.TestDataFilterType.InvalidOnly)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public async Task Invalid_bicepparam_TemplateEmiter_should_not_produce_a_template(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
diff --git a/src/Bicep.Core.IntegrationTests/ExamplesTests.cs b/src/Bicep.Core.IntegrationTests/ExamplesTests.cs
index 49822d71d35..9c9c6b36eab 100644
--- a/src/Bicep.Core.IntegrationTests/ExamplesTests.cs
+++ b/src/Bicep.Core.IntegrationTests/ExamplesTests.cs
@@ -8,9 +8,10 @@
using Bicep.Core.PrettyPrintV2;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Features;
using Bicep.Core.UnitTests.Utils;
+using Bicep.IO.Abstraction;
using FluentAssertions;
using FluentAssertions.Execution;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -29,12 +30,12 @@ public static async Task RunExampleTest(TestContext testContext, EmbeddedFile em
{
features ??= new(testContext);
FileHelper.GetCacheRootDirectory(testContext).EnsureExists();
- var baselineFolder = BaselineFolder.BuildOutputFolder(testContext, embeddedBicep);
- var bicepFile = baselineFolder.EntryFile;
- var jsonFile = baselineFolder.GetFileOrEnsureCheckedIn(Path.ChangeExtension(embeddedBicep.FileName, jsonFileExtension));
+ var baselineFiles = testContext.MaterializeBaseline(embeddedBicep);
+ var bicepFile = baselineFiles.EntryFile;
+ var jsonFile = baselineFiles.GetFile(Path.ChangeExtension(embeddedBicep.FileName, jsonFileExtension));
var compiler = Services.WithFeatureOverrides(features).Build().GetCompiler();
- var compilation = await compiler.CreateCompilation(bicepFile.OutputFileUri.ToIOUri());
+ var compilation = await compiler.CreateCompilation(IOUri.FromFilePath(bicepFile.OutputFilePath));
var model = compilation.GetEntrypointSemanticModel();
var emitter = new TemplateEmitter(model);
@@ -60,8 +61,7 @@ public static async Task RunExampleTest(TestContext testContext, EmbeddedFile em
if (result.Status == EmitStatus.Succeeded)
{
- jsonFile.WriteToOutputFolder(stringWriter.ToString());
- jsonFile.ShouldHaveExpectedJsonValue();
+ stringWriter.ToString().Should().MatchJsonBaseline(jsonFile);
// validate that the template is parseable by the deployment engine
UnitTests.Utils.TemplateHelper.TemplateShouldBeValid(stringWriter.ToString(), model.Features);
@@ -71,31 +71,30 @@ public static async Task RunExampleTest(TestContext testContext, EmbeddedFile em
[DataTestMethod]
[DynamicData(nameof(GetAllExampleData), DynamicDataSourceType.Method)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public Task ExampleIsValid(EmbeddedFile embeddedBicep)
=> RunExampleTest(TestContext, embeddedBicep, new(TestContext), ".json");
[DataTestMethod]
[DynamicData(nameof(GetAllExampleData), DynamicDataSourceType.Method)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public Task ExampleIsValid_using_experimental_symbolic_names(EmbeddedFile embeddedBicep)
=> RunExampleTest(TestContext, embeddedBicep, new(TestContext, SymbolicNameCodegenEnabled: true), ".symbolicnames.json");
[DataTestMethod]
[DynamicData(nameof(GetAllExampleData), DynamicDataSourceType.Method)]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public void Example_uses_consistent_formatting(EmbeddedFile embeddedBicep)
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, embeddedBicep);
- var bicepFile = baselineFolder.EntryFile;
+ var baselineFiles = TestContext.MaterializeBaseline(embeddedBicep);
+ var bicepFile = baselineFiles.EntryFile;
var program = ParserHelper.Parse(embeddedBicep.Contents, out var lexingErrorLookup, out var parsingErrorLookup);
var context = PrettyPrinterV2Context.Create(PrettyPrinterV2Options.Default, lexingErrorLookup, parsingErrorLookup);
var formattedContents = PrettyPrinterV2.Print(program, context);
formattedContents.Should().NotBeNull();
- bicepFile.WriteToOutputFolder(formattedContents);
- bicepFile.ShouldHaveExpectedValue();
+ formattedContents.Should().MatchTextBaseline(bicepFile);
}
[TestMethod]
diff --git a/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs b/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs
index ff6eeecba55..92b5aefd19b 100644
--- a/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs
+++ b/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs
@@ -8,7 +8,8 @@
using Bicep.Core.Registry.Extensions;
using Bicep.Core.UnitTests;
using Bicep.Core.UnitTests.Assertions;
-using Bicep.Core.UnitTests.Baselines;
+using Bicep.Testing.Baselines;
+using FluentAssertions;
using Bicep.Core.UnitTests.Extensions;
using Bicep.Core.UnitTests.Features;
using Bicep.Core.UnitTests.Utils;
@@ -30,21 +31,20 @@ public class ExtensionRegistryTests : TestBase
private readonly TestCompiler compiler = TestCompiler.ForMockFileSystemCompilation();
[TestMethod]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
- [EmbeddedFilesTestData(@"Files/ExtensionRegistryTests/http/types/index.json")]
+ [TestCategory(TestCategories.Baseline)]
+ [TestEmbeddedFileData(@"Files/ExtensionRegistryTests/http/types/index.json")]
public void Http_extension_can_be_generated(EmbeddedFile indexJson)
{
- var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, indexJson);
+ var baselineFiles = TestContext.MaterializeBaseline(indexJson);
var httpTypes = ExtensionResourceTypeHelper.GetHttpExtensionTypes();
using (new AssertionScope())
{
foreach (var (relativePath, contents) in httpTypes)
{
- var jsonFile = baselineFolder.GetFileOrEnsureCheckedIn(PathHelper.ResolvePath(relativePath, Path.GetDirectoryName(indexJson.FileName)));
+ var jsonFile = baselineFiles.GetFile(PathHelper.ResolvePath(relativePath, Path.GetDirectoryName(indexJson.FileName)));
- jsonFile.WriteToOutputFolder(contents);
- jsonFile.ShouldHaveExpectedJsonValue();
+ contents.Should().MatchJsonBaseline(jsonFile);
}
}
}
diff --git a/src/Bicep.Core.IntegrationTests/GlobalUsings.cs b/src/Bicep.Core.IntegrationTests/GlobalUsings.cs
index f09b85cb868..7bbb4d099a7 100644
--- a/src/Bicep.Core.IntegrationTests/GlobalUsings.cs
+++ b/src/Bicep.Core.IntegrationTests/GlobalUsings.cs
@@ -1,4 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
+global using Bicep.Testing;
global using Bicep.Testing.Assertions.Json;
+global using Bicep.Testing.Baselines;
+global using Bicep.Testing.IO;
diff --git a/src/Bicep.Core.IntegrationTests/LexerTests.cs b/src/Bicep.Core.IntegrationTests/LexerTests.cs
index 314dc6d99df..ae1c88d3699 100644
--- a/src/Bicep.Core.IntegrationTests/LexerTests.cs
+++ b/src/Bicep.Core.IntegrationTests/LexerTests.cs
@@ -9,6 +9,7 @@
using Bicep.Core.Syntax;
using Bicep.Core.Text;
using Bicep.Core.UnitTests.Assertions;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Utils;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -92,7 +93,7 @@ void VisitTrivia(IEnumerable trivia)
[DataTestMethod]
[DynamicData(nameof(GetData), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public void LexerShouldProduceExpectedTokens(DataSet dataSet)
{
var lexer = new Lexer(new SlidingTextWindow(dataSet.Bicep), ToListDiagnosticWriter.Create());
@@ -106,7 +107,7 @@ string getLoggingString(Token token)
var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, lexer.GetTokens(), getLoggingString);
var resultsFile = FileHelper.SaveResultFile(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainTokens), sourceTextWithDiags);
- sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput(
+ sourceTextWithDiags.Should().MatchTextBaseline(
TestContext,
dataSet.Tokens,
expectedPath: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainTokens),
@@ -118,7 +119,7 @@ string getLoggingString(Token token)
[DataTestMethod]
[BaselineData_Bicepparam.TestData()]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public void ParamsFile_LexerShouldProduceExpectedTokens(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -133,8 +134,7 @@ string getLoggingString(Token token)
var sourceTextWithDiags = OutputHelper.AddDiagsToSourceText(data.Parameters.EmbeddedFile.Contents, "\n", lexer.GetTokens(), getLoggingString);
- data.Tokens.WriteToOutputFolder(sourceTextWithDiags);
- data.Tokens.ShouldHaveExpectedValue();
+ sourceTextWithDiags.Should().MatchTextBaseline(data.Tokens);
lexer.GetTokens().Count(token => token.Type == TokenType.EndOfFile).Should().Be(1, "because there should only be 1 EOF token");
lexer.GetTokens().Last().Type.Should().Be(TokenType.EndOfFile, "because the last token should always be EOF.");
diff --git a/src/Bicep.Core.IntegrationTests/ParserTests.cs b/src/Bicep.Core.IntegrationTests/ParserTests.cs
index ac76876502d..3ce24503c7d 100644
--- a/src/Bicep.Core.IntegrationTests/ParserTests.cs
+++ b/src/Bicep.Core.IntegrationTests/ParserTests.cs
@@ -8,6 +8,7 @@
using Bicep.Core.Syntax;
using Bicep.Core.Text;
using Bicep.Core.UnitTests.Assertions;
+using Bicep.Testing.Baselines;
using Bicep.Core.UnitTests.Syntax;
using Bicep.Core.UnitTests.Utils;
using FluentAssertions;
@@ -52,7 +53,7 @@ public void Oneliners_ShouldRoundTripSuccessfully(string contents)
[DataTestMethod]
[DynamicData(nameof(GetData), DynamicDataSourceType.Method, DynamicDataDisplayNameDeclaringType = typeof(DataSet), DynamicDataDisplayName = nameof(DataSet.GetDisplayName))]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public void Parser_should_produce_expected_syntax(DataSet dataSet)
{
var program = ParserHelper.Parse(dataSet.Bicep);
@@ -64,7 +65,7 @@ public void Parser_should_produce_expected_syntax(DataSet dataSet)
var sourceTextWithDiags = DataSet.AddDiagsToSourceText(dataSet, syntaxList, getSpan, syntax => GetSyntaxLoggingString(syntaxByParent, syntax));
var resultsFile = FileHelper.SaveResultFile(this.TestContext, Path.Combine(dataSet.Name, DataSet.TestFileMainSyntax), sourceTextWithDiags);
- sourceTextWithDiags.Should().EqualWithLineByLineDiffOutput(
+ sourceTextWithDiags.Should().MatchTextBaseline(
TestContext,
dataSet.Syntax,
expectedPath: DataSet.GetBaselineUpdatePath(dataSet, DataSet.TestFileMainSyntax),
@@ -73,7 +74,7 @@ public void Parser_should_produce_expected_syntax(DataSet dataSet)
[DataTestMethod]
[BaselineData_Bicepparam.TestData()]
- [TestCategory(BaselineHelper.BaselineTestCategory)]
+ [TestCategory(TestCategories.Baseline)]
public void Params_Parser_should_produce_expected_syntax(BaselineData_Bicepparam baselineData)
{
var data = baselineData.GetData(TestContext);
@@ -85,8 +86,7 @@ public void Params_Parser_should_produce_expected_syntax(BaselineData_Bicepparam
var sourceTextWithDiags = OutputHelper.AddDiagsToSourceText(data.Parameters.EmbeddedFile.Contents, "\n", syntaxList, getSpan, syntax => GetSyntaxLoggingString(syntaxByParent, syntax));
- data.Syntax.WriteToOutputFolder(sourceTextWithDiags);
- data.Syntax.ShouldHaveExpectedValue();
+ sourceTextWithDiags.Should().MatchTextBaseline(data.Syntax);
}
private static IEnumerable