// 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;
}
}