// Copyright © WireMock.Net using System.Collections.Generic; using Docker.DotNet.Models; using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; using Stef.Validation; using WireMock.Net.Testcontainers.Utils; namespace WireMock.Net.Testcontainers; /// [PublicAPI] public sealed class WireMockConfiguration : ContainerConfiguration { #pragma warning disable CS1591 public string? Username { get; } public string? Password { get; } public string? StaticMappingsPath { get; private set; } public bool WatchStaticMappings { get; private set; } public bool WatchStaticMappingsInSubdirectories { get; private set; } public bool HasBasicAuthentication => !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password); public List AdditionalUrls { get; private set; } = []; public Dictionary ProtoDefinitions { get; set; } = new(); public WireMockConfiguration(string? username = null, string? password = null) { Username = username; Password = password; } #pragma warning restore CS1591 /// /// Initializes a new instance of the class. /// /// The Docker resource configuration. public WireMockConfiguration(IResourceConfiguration resourceConfiguration) : base(resourceConfiguration) { // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// /// Initializes a new instance of the class. /// /// The Docker resource configuration. public WireMockConfiguration(IContainerConfiguration resourceConfiguration) : base(resourceConfiguration) { // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// /// Initializes a new instance of the class. /// /// The Docker resource configuration. public WireMockConfiguration(WireMockConfiguration resourceConfiguration) : this(new WireMockConfiguration(), resourceConfiguration) { // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// /// Initializes a new instance of the class. /// /// The old Docker resource configuration. /// The new Docker resource configuration. public WireMockConfiguration(WireMockConfiguration oldValue, WireMockConfiguration newValue) : base(oldValue, newValue) { Username = BuildConfiguration.Combine(oldValue.Username, newValue.Username); Password = BuildConfiguration.Combine(oldValue.Password, newValue.Password); StaticMappingsPath = BuildConfiguration.Combine(oldValue.StaticMappingsPath, newValue.StaticMappingsPath); WatchStaticMappings = BuildConfiguration.Combine(oldValue.WatchStaticMappings, newValue.WatchStaticMappings); WatchStaticMappingsInSubdirectories = BuildConfiguration.Combine(oldValue.WatchStaticMappingsInSubdirectories, newValue.WatchStaticMappingsInSubdirectories); AdditionalUrls = CombineUtils.Combine(oldValue.AdditionalUrls, newValue.AdditionalUrls); ProtoDefinitions = CombineUtils.Combine(oldValue.ProtoDefinitions, newValue.ProtoDefinitions); } /// /// Set the StaticMappingsPath. /// /// The path which contains the StaticMappings. /// public WireMockConfiguration WithStaticMappingsPath(string path) { StaticMappingsPath = path; return this; } /// /// Watch the static mappings. /// /// Also look in SubDirectories. /// public WireMockConfiguration WithWatchStaticMappings(bool includeSubDirectories) { WatchStaticMappings = true; WatchStaticMappingsInSubdirectories = includeSubDirectories; return this; } /// /// An additional Url on which WireMock listens. /// /// The url to add. /// public WireMockConfiguration WithAdditionalUrl(string url) { AdditionalUrls.Add(Guard.NotNullOrWhiteSpace(url)); return this; } /// /// Add a Grpc ProtoDefinition at server-level. /// /// Unique identifier for the ProtoDefinition. /// The ProtoDefinition as text. /// public WireMockConfiguration AddProtoDefinition(string id, params string[] protoDefinition) { Guard.NotNullOrWhiteSpace(id); Guard.NotNullOrEmpty(protoDefinition); ProtoDefinitions[id] = protoDefinition; return this; } }