using Microsoft.Extensions.Configuration;

namespace OptionStudy.UnitApp
{

    /// <summary>
    /// 5.1.6 根据环境动态加载配置文件
    /// </summary>
    public class DynamicLoadConfigFileTest : IDisposable
    {

        private readonly ITestOutputHelper? testOutput;
        public DynamicLoadConfigFileTest(ITestOutputHelperAccessor helperAccessor)
        {
            testOutput = helperAccessor.Output;
        }

        /// <summary>
        /// 动态加载json配置文件
        /// </summary>
        [Theory]
        [InlineData("product")]
        [InlineData("development")]
        [InlineData("custom")]
        public void LoadJsonFile_ByPara_Test(string env)
        {
            var config = new ConfigurationBuilder()
                .AddJsonFile($"Configs/appsettings.{env}.json", true, true)
                .Build();

            var appOption = config.Get<AppOption>();

            //断言
            Assert.NotNull(appOption);
            Assert.Equal($"{env}AppNmae", appOption.AppName);
            Assert.Equal("0.0.0.1", appOption.AppVersion);

            //子配置节:父配置对象的属性名必须和配置KEY保持一致,否则不能自动绑定。
            Assert.NotNull(appOption.EMail);
            Assert.Equal($"{env}@163.com", appOption.EMail.ReceiveAddress);
            Assert.Equal($"{env}", appOption.EMail.Recipient);

            testOutput?.WriteLine("根据参数名,动态加载json配置文件!");
        }

        /// <summary>
        /// 根据环境变量动态加载json配置文件
        /// 环境变量类别:系统环境变量、用户环境变量、进程环境变量
        /// 环境变量使用:
        ///   1、对操作系统设置
        ///   2、项目启动文件:项目/Properties/launchSettings.json
        ///   3、编程实现: System.Environment.SetEnvironmentVariable("环境变量名","值",环境变量类型)
        ///   4、使用cmd命令行参数运行程序:
        ///   <code>
        ///     set 环境变量名=环境变量值 
        ///     dotnet xx.dll 
        ///     # 或者
        ///     xx.exe
        ///   </code>
        /// </summary>
        [Theory]
        [InlineData("product")]
        [InlineData("development")]
        [InlineData("custom")]
        public void LoadJsonFileByEnv_Test(string env)
        {
            //设置进程系统变量为参数值
            var envName = "DOTNET_XUNIT_TEST";
            //设置进程环境变量
            System.Environment.SetEnvironmentVariable(envName, env, EnvironmentVariableTarget.Process);
            //获取变量值
            var envValue = System.Environment.GetEnvironmentVariable(envName, EnvironmentVariableTarget.Process);
            var config = new ConfigurationBuilder()
                 .AddJsonFile($"Configs/appsettings.json", false, true)
                .AddJsonFile($"Configs/appsettings.{envValue}.json", true, true)
                .Build();

            var appOption = config.Get<AppOption>();

            //断言
            Assert.NotNull(appOption);
            Assert.Equal($"{envValue}AppNmae", appOption.AppName);
            Assert.Equal("0.0.0.1", appOption.AppVersion);

            //子配置节:父配置对象的属性名必须和配置KEY保持一致,否则不能自动绑定。
            Assert.NotNull(appOption.EMail);
            Assert.Equal($"{envValue}@163.com", appOption.EMail.ReceiveAddress);
            Assert.Equal($"{envValue}", appOption.EMail.Recipient);

            testOutput?.WriteLine("根据环境变量值,动态加载json配置文件!");
        }

        public void Dispose()
        {

        }
    }
}