using BuildFlow.Infrastructure.Messaging; using FluentAssertions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using RabbitMQ.Client; using Xunit; namespace BuildFlow.Rag.Tests; /// RabbitMQ 连接注册的凭据 fail-closed 行为测试。 public sealed class RabbitMqExtensionsTests { [Theory] [InlineData(null)] [InlineData("")] [InlineData("REPLACE_IN_SECRETS")] public void MissingOrPlaceholderPasswordIsRejected(string? password) { var configuration = BuildConfiguration(password); var services = new ServiceCollection(); services.AddRabbitMq(configuration); var act = () => services.BuildServiceProvider().GetRequiredService(); act.Should() .Throw() .WithMessage("*RabbitMq:Password*"); } [Fact] public void ConfiguredPasswordIsUsedWithoutFallback() { var configuration = BuildConfiguration("configured-secret"); var services = new ServiceCollection(); services.AddRabbitMq(configuration); var factory = services.BuildServiceProvider().GetRequiredService(); factory.Password.Should().Be("configured-secret"); } private static IConfiguration BuildConfiguration(string? password) => new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["RabbitMq:Host"] = "rabbitmq.test", ["RabbitMq:Port"] = "5672", ["RabbitMq:Username"] = "buildflow", ["RabbitMq:Password"] = password, }) .Build(); }