public void Validate_MissingDescriptions_ThrowsException() { var mainArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); var mainArmTemplateFileElement = JsonElementFactory.CreateElement(mainArmTemplateFile.Content); var patchedElement = mainArmTemplateFileElement.Patch( JsonPatchOperations.Remove("/parameters/sshRSAPublicKey/metadata/description"), JsonPatchOperations.Remove("/parameters/clusterName/metadata/description"), JsonPatchOperations.Remove("/parameters/osDiskSizeGB/metadata/description"), JsonPatchOperations.Remove("/outputs/controlPlaneFQDN/metadata/description")); fileSystem.AddFile(mainArmTemplateFile.Path, patchedElement.ToJsonString()); var latestArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); var sut = this.CreateDescriptionsValidator(latestArmTemplateFile); FluentActions.Invoking(() => sut.Validate(this.fileToValidate)).Should() .Throw <InvalidModuleFileException>() .WithMessage( $@"The file ""{this.fileToValidate.Path}"" is invalid. Descriptions for the following parameters are missing: - sshRSAPublicKey - clusterName - osDiskSizeGB The file ""{this.fileToValidate.Path}"" is invalid. Descriptions for the following outputs are missing: - controlPlaneFQDN ".ReplaceLineEndings()); }
public TestValidator(IFileSystem fileSystem, ILogger logger, BicepCliProxy bicepCliProxy, MainArmTemplateFile latestMainArmTemplateFile) { this.fileSystem = fileSystem; this.logger = logger; this.bicepCliProxy = bicepCliProxy; this.latestMainArmTemplateFile = latestMainArmTemplateFile; }
public void Validate_ValidFile_Succeeds() { var latestArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); var sut = this.CreateDescriptionsValidator(latestArmTemplateFile); FluentActions.Invoking(() => sut.Validate(this.fileToValidate)).Should().NotThrow(); }
public void Validate_ModifiedMainArmTemplateFile_ThrowsException() { this.fileSystem.AddFile(this.latestMainArmTemplateFile.Path, "modified"); var fileToValidate = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); Invoking(() => this.sut.Validate(fileToValidate)).Should() .Throw <InvalidModuleException>() .WithMessage($"The file \"{fileToValidate.Path}\" is modified or outdated. Please regenerate the file to fix it.{Environment.NewLine}"); }
public static MainArmTemplateParametersFile Generate(IFileSystem fileSystem, MainArmTemplateFile mainArmTemplateFile) { var bufferWriter = new ArrayBufferWriter <byte>(); using (var writer = new Utf8JsonWriter(bufferWriter, new JsonWriterOptions { Indented = true })) { writer.WriteStartObject(); writer.WriteString("$schema", "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#"); writer.WriteString("contentVersion", "1.0.0.0"); writer.WritePropertyName("parameters"); writer.WriteStartObject(); var parameterInstances = GenerateParameterInstances(fileSystem, mainArmTemplateFile); foreach (var(parameterName, parameterValue) in parameterInstances) { writer.WritePropertyName(parameterName); writer.WriteStartObject(); if (parameterValue is not null) { writer.WritePropertyName("value"); JsonElementFactory.CreateElement(parameterValue).WriteTo(writer); } writer.WriteEndObject(); } writer.WriteEndObject(); writer.WriteEndObject(); } var path = fileSystem.Path.GetFullPath(FileName); var content = Encoding.UTF8.GetString(bufferWriter.WrittenSpan); var rootElement = JsonElementFactory.CreateElement(bufferWriter.WrittenMemory); return(new(path, content, rootElement)); }
protected override int Invoke(InvocationContext context) { var valid = true; this.Logger.LogInformation("Validating module path..."); valid &= Validate(context.Console, () => ValidateModulePath(this.FileSystem)); this.Logger.LogInformation("Validating main Bicep file..."); var bicepCliProxy = new BicepCliProxy(this.environmentProxy, this.processProxy, this.FileSystem, this.Logger, context.Console); var mainBicepFile = MainBicepFile.ReadFromFileSystem(this.FileSystem); // This also validates that the main Bicep file can be built without errors. var latestMainArmTemplateFile = MainArmTemplateFile.Generate(this.FileSystem, bicepCliProxy, mainBicepFile); var descriptionsValidator = new DescriptionsValidator(this.Logger, latestMainArmTemplateFile); valid &= Validate(context.Console, () => mainBicepFile.ValidatedBy(descriptionsValidator)); var testValidator = new TestValidator(this.FileSystem, this.Logger, bicepCliProxy, latestMainArmTemplateFile); var jsonSchemaValidator = new JsonSchemaValidator(this.Logger); var diffValidator = new DiffValidator(this.FileSystem, this.Logger, latestMainArmTemplateFile); this.Logger.LogInformation("Validating main Bicep test file..."); valid &= Validate(context.Console, () => MainBicepTestFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(testValidator)); this.Logger.LogInformation("Validating main ARM template file..."); valid &= Validate(context.Console, () => MainArmTemplateFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(diffValidator)); this.Logger.LogInformation("Validating metadata file..."); valid &= Validate(context.Console, () => MetadataFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(jsonSchemaValidator)); this.Logger.LogInformation("Validating README file..."); valid &= Validate(context.Console, () => ReadmeFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(diffValidator)); this.Logger.LogInformation("Validating version file..."); valid &= Validate(context.Console, () => VersionFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(jsonSchemaValidator, diffValidator)); return(valid ? 0 : 1); }
public DiffValidator(IFileSystem fileSystem, ILogger logger, MainArmTemplateFile latestMainArmTemplateFile) { this.fileSystem = fileSystem; this.logger = logger; this.latestMainArmTemplateFile = latestMainArmTemplateFile; }
public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile) { var builder = new StringBuilder(); builder.AppendLine($"# {metadataFile.Name}"); builder.AppendLine(); builder.AppendLine(metadataFile.Description); builder.AppendLine(); BuildParametersTable(builder, mainArmTemplateFile.Parameters); BuildOutputsTable(builder, mainArmTemplateFile.Outputs); return(new(fileSystem.Path.GetFullPath(FileName), builder.ToString())); }
public void Validate_ValidMainArmTemplateFile_Succeeds() { var fileToValidate = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); Invoking(() => this.sut.Validate(fileToValidate)).Should().NotThrow(); }
private static IEnumerable <MainArmTemplateParameterInstance> GenerateParameterInstances(IFileSystem fileSystem, MainArmTemplateFile mainArmTemplateFile) { var parameterInstances = new List <MainArmTemplateParameterInstance>(); var parametersByName = mainArmTemplateFile.Parameters.ToDictionary(x => x.Name, x => x); var existingParameterInstancesByName = new Dictionary <string, MainArmTemplateParameterInstance>(); try { var existingParametersFile = ReadFromFileSystem(fileSystem); existingParameterInstancesByName = existingParametersFile.ParameterInstances.ToDictionary(x => x.Name, x => x); foreach (var parameterInstance in existingParametersFile.ParameterInstances) { if (parametersByName.ContainsKey(parameterInstance.Name)) { parameterInstances.Add(parameterInstance); } } } catch (FileNotFoundException) { // Nothing to do. } foreach (var parameter in mainArmTemplateFile.Parameters) { if (parameter.Required && !existingParameterInstancesByName.ContainsKey(parameter.Name)) { parameterInstances.Add(CreateBlankParameterInstance(parameter)); } } return(parameterInstances); }
private DescriptionsValidator CreateDescriptionsValidator(MainArmTemplateFile latestMainArmTemplateFile) =>
protected override int Invoke(InvocationContext context) { // Read or create main Bicep file. this.Logger.LogInformation("Ensure {MainBicepFile} exists...", "main Bicep file"); var mainBicepFile = MainBicepFile.EnsureInFileSystem(this.FileSystem); // Read or create metadata file. this.Logger.LogInformation("Ensure {MetadataFile} exists...", "metadata file"); var metadataFile = MetadataFile.EnsureInFileSystem(this.FileSystem); // Generate main ARM template file. var bicepCliProxy = new BicepCliProxy(this.environmentProxy, this.processProxy, this.FileSystem, this.Logger, context.Console); var mainArmTemplateFile = this.GenerateFileAndLogInformation("main ARM template file", () => MainArmTemplateFile .Generate(this.FileSystem, bicepCliProxy, mainBicepFile) .WriteToFileSystem(FileSystem)); // Generate main ARM template parameters file. var mainArmTemplateParametersFile = this.GenerateFileAndLogInformation("main ARM template parameters file", () => MainArmTemplateParametersFile .Generate(this.FileSystem, mainArmTemplateFile) .WriteToFileSystem(this.FileSystem)); // Generate README file. this.GenerateFileAndLogInformation("README file", () => ReadmeFile .Generate(this.FileSystem, metadataFile, mainArmTemplateFile) .WriteToFileSystem(this.FileSystem)); // Generate version file. this.GenerateFileAndLogInformation("version file", () => VersionFile .Generate(this.FileSystem) .WriteToFileSystem(this.FileSystem)); return(0); }
public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile) { var builder = new StringBuilder(); builder.AppendLine($"# {metadataFile.ItemDisplayName}"); builder.AppendLine(); var path = fileSystem.Path.GetFullPath(FileName); var directoryPath = fileSystem.Path.GetDirectoryName(path); var directoryInfo = fileSystem.DirectoryInfo.FromDirectoryName(directoryPath); BuildBadgesAndButtons(builder, directoryInfo); builder.AppendLine(metadataFile.Description); builder.AppendLine(); BuildParametersTable(builder, mainArmTemplateFile.Parameters); BuildOutputsTable(builder, mainArmTemplateFile.Outputs); return(new(fileSystem.Path.GetFullPath(FileName), builder.ToString())); }
public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile) { var descriptionSection = DescriptionSectionTemplate; var examplesSection = ExamplesSectionTemplate; try { var existingFile = ReadFromFileSystem(fileSystem); UseExistingSectionIfNotEmpty(existingFile, "## Description", ref descriptionSection); UseExistingSectionIfNotEmpty(existingFile, "## Examples", ref examplesSection); } catch (FileNotFoundException) { // Do thing. } var builder = new StringBuilder(); builder.AppendLine($"# {metadataFile.Name}"); builder.AppendLine(); builder.AppendLine(metadataFile.Summary); builder.AppendLine(); builder.AppendLine(descriptionSection); BuildParametersTable(builder, mainArmTemplateFile.Parameters); BuildOutputsTable(builder, mainArmTemplateFile.Outputs); builder.AppendLine(examplesSection); var contents = builder.ToString(); var normalizedContents = Markdown.Normalize(contents); return(new(fileSystem.Path.GetFullPath(FileName), normalizedContents)); }
public void Validate(MainArmTemplateFile file) => this.Validate(file.Path, file.Content, latestMainArmTemplateFile.Content);
public DiffValidatorTests() { this.fileSystem = MockFileSystemFactory.CreateFileSystemWithValidFiles(); this.latestMainArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem); this.sut = new DiffValidator(this.fileSystem, MockLoggerFactory.CreateLogger(), this.latestMainArmTemplateFile); }
public DescriptionsValidator(ILogger logger, MainArmTemplateFile latestMainArmTemplateFile) { this.logger = logger; this.latestMainArmTemplateFile = latestMainArmTemplateFile; }
public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile) { var examplesSection = @"## Examples ### Example 1 ```bicep ``` ### Example 2 ```bicep ```".ReplaceLineEndings(); try { var existingFile = ReadFromFileSystem(fileSystem); var existingExamplesSection = TryReadSection(existingFile.Contents, 2, "Examples"); if (existingExamplesSection is not null && !existingExamplesSection.Equals("## Examples", StringComparison.Ordinal)) { // The existing examples section is not empty. examplesSection = existingExamplesSection; } } catch (FileNotFoundException) { // Do thing. } var builder = new StringBuilder(); builder.AppendLine($"# {metadataFile.Name}"); builder.AppendLine(); builder.AppendLine(metadataFile.Description); builder.AppendLine(); BuildParametersTable(builder, mainArmTemplateFile.Parameters); BuildOutputsTable(builder, mainArmTemplateFile.Outputs); builder.AppendLine(examplesSection); var contents = builder.ToString(); var normalizedContents = Markdown.Normalize(contents); return(new(fileSystem.Path.GetFullPath(FileName), normalizedContents)); }