RedisCfgTests.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Apq.Cfg.Redis;
  2. namespace Apq.Cfg.Tests;
  3. /// <summary>
  4. /// Redis 配置源测试
  5. /// 注意:这些测试需要配置 Redis 连接字符串才能运行
  6. /// </summary>
  7. public class RedisCfgTests : IAsyncLifetime
  8. {
  9. private ICfgRoot? _cfg;
  10. private readonly string _keyPrefix;
  11. public RedisCfgTests()
  12. {
  13. _keyPrefix = $"apqcfgtest:{Guid.NewGuid():N}:";
  14. }
  15. public Task InitializeAsync()
  16. {
  17. if (!TestSettings.IsRedisConfigured)
  18. {
  19. return Task.CompletedTask;
  20. }
  21. _cfg = new CfgBuilder()
  22. .AddRedis(options =>
  23. {
  24. options.ConnectionString = TestSettings.RedisConnectionString;
  25. options.KeyPrefix = _keyPrefix;
  26. }, level: 0, isPrimaryWriter: true)
  27. .Build();
  28. return Task.CompletedTask;
  29. }
  30. public async Task DisposeAsync()
  31. {
  32. if (_cfg != null)
  33. {
  34. // 清理测试数据
  35. try
  36. {
  37. _cfg.Remove("TestKey");
  38. _cfg.Remove("Settings:Value1");
  39. _cfg.Remove("Settings:Value2");
  40. await _cfg.SaveAsync();
  41. }
  42. catch
  43. {
  44. // 忽略清理错误
  45. }
  46. await _cfg.DisposeAsync();
  47. }
  48. }
  49. [SkippableFact]
  50. public async Task SetAndGet_SimpleValue_Works()
  51. {
  52. Skip.If(!TestSettings.IsRedisConfigured, "Redis 连接字符串未配置,跳过测试");
  53. // Arrange & Act
  54. _cfg!.Set("TestKey", "TestValue");
  55. await _cfg.SaveAsync();
  56. // 重新创建配置实例来验证持久化
  57. await using var cfg2 = new CfgBuilder()
  58. .AddRedis(options =>
  59. {
  60. options.ConnectionString = TestSettings.RedisConnectionString;
  61. options.KeyPrefix = _keyPrefix;
  62. }, level: 0)
  63. .Build();
  64. // Assert
  65. Assert.Equal("TestValue", cfg2.Get("TestKey"));
  66. }
  67. [SkippableFact]
  68. public async Task SetAndGet_NestedKey_Works()
  69. {
  70. Skip.If(!TestSettings.IsRedisConfigured, "Redis 连接字符串未配置,跳过测试");
  71. // Arrange & Act
  72. _cfg!.Set("Settings:Value1", "Value1");
  73. _cfg.Set("Settings:Value2", "Value2");
  74. await _cfg.SaveAsync();
  75. // Assert
  76. await using var cfg2 = new CfgBuilder()
  77. .AddRedis(options =>
  78. {
  79. options.ConnectionString = TestSettings.RedisConnectionString;
  80. options.KeyPrefix = _keyPrefix;
  81. }, level: 0)
  82. .Build();
  83. Assert.Equal("Value1", cfg2.Get("Settings:Value1"));
  84. Assert.Equal("Value2", cfg2.Get("Settings:Value2"));
  85. }
  86. [SkippableFact]
  87. public async Task Remove_Key_Works()
  88. {
  89. Skip.If(!TestSettings.IsRedisConfigured, "Redis 连接字符串未配置,跳过测试");
  90. // Arrange
  91. _cfg!.Set("ToRemove", "Value");
  92. await _cfg.SaveAsync();
  93. // Act
  94. _cfg.Remove("ToRemove");
  95. await _cfg.SaveAsync();
  96. // Assert
  97. await using var cfg2 = new CfgBuilder()
  98. .AddRedis(options =>
  99. {
  100. options.ConnectionString = TestSettings.RedisConnectionString;
  101. options.KeyPrefix = _keyPrefix;
  102. }, level: 0)
  103. .Build();
  104. Assert.False(cfg2.Exists("ToRemove"));
  105. }
  106. [SkippableFact]
  107. public async Task Exists_Key_ReturnsCorrectResult()
  108. {
  109. Skip.If(!TestSettings.IsRedisConfigured, "Redis 连接字符串未配置,跳过测试");
  110. // Arrange
  111. _cfg!.Set("ExistsKey", "Value");
  112. await _cfg.SaveAsync();
  113. // Assert
  114. Assert.True(_cfg.Exists("ExistsKey"));
  115. Assert.False(_cfg.Exists("NotExistsKey"));
  116. }
  117. [SkippableFact]
  118. public void Redis_OverridesJson_WhenHigherLevel()
  119. {
  120. Skip.If(!TestSettings.IsRedisConfigured, "Redis 连接字符串未配置,跳过测试");
  121. // Arrange
  122. var tempDir = Path.Combine(Path.GetTempPath(), $"ApqCfgTests_{Guid.NewGuid():N}");
  123. Directory.CreateDirectory(tempDir);
  124. try
  125. {
  126. var jsonPath = Path.Combine(tempDir, "config.json");
  127. File.WriteAllText(jsonPath, """{"Setting": "JsonValue"}""");
  128. // 先设置 Redis 值
  129. _cfg!.Set("Setting", "RedisValue");
  130. _cfg.SaveAsync().Wait();
  131. using var cfg = new CfgBuilder()
  132. .AddJson(jsonPath, level: 0, writeable: false)
  133. .AddRedis(options =>
  134. {
  135. options.ConnectionString = TestSettings.RedisConnectionString;
  136. options.KeyPrefix = _keyPrefix;
  137. }, level: 1)
  138. .Build();
  139. // Assert
  140. Assert.Equal("RedisValue", cfg.Get("Setting"));
  141. }
  142. finally
  143. {
  144. Directory.Delete(tempDir, true);
  145. }
  146. }
  147. }