Compare commits

...

2 Commits

Author SHA1 Message Date
movingsam
4dff327fa6 test: fix integration test expectations and data isolation
- Fix ClusterId expectations in ConfigReloadTests
- Use unique namespace in K8sDiscoveryTests to avoid test interference
- Add cleanup after test execution
2026-03-08 11:07:59 +08:00
movingsam
650f2f48e0 fix: improve RouteCache tenant route loading logic
- Change from if-else if to separate if statements
- Ensure tenant routes are loaded regardless of IsGlobal flag
- Add detailed logging for route loading
- Fix null check for GetRoute parameters
2026-03-08 11:05:36 +08:00
3 changed files with 30 additions and 13 deletions

View File

@ -129,17 +129,30 @@ public class RouteCache : IRouteCache
IsGlobal = route.IsGlobal IsGlobal = route.IsGlobal
}; };
// 1. 全局路由
if (route.IsGlobal) if (route.IsGlobal)
{ {
_globalRoutes[route.ServiceName] = routeInfo; _globalRoutes[route.ServiceName] = routeInfo;
_pathRoutes[pathPattern] = routeInfo; _pathRoutes[pathPattern] = routeInfo;
_logger.LogDebug("Loaded global route: {Service} -> {Cluster}",
route.ServiceName, route.ClusterId);
} }
else if (!string.IsNullOrEmpty(route.TenantCode))
// 2. 租户专属路由(无论 IsGlobal 值如何,只要有 TenantCode 就添加到租户路由表)
if (!string.IsNullOrEmpty(route.TenantCode))
{ {
_tenantRoutes.GetOrAdd(route.TenantCode, _ => new()) _tenantRoutes.GetOrAdd(route.TenantCode, _ => new ConcurrentDictionary<string, RouteInfo>())
[route.ServiceName] = routeInfo; [route.ServiceName] = routeInfo;
// 如果不是全局路由,也添加到路径路由
if (!route.IsGlobal)
{
_pathRoutes[pathPattern] = routeInfo; _pathRoutes[pathPattern] = routeInfo;
} }
_logger.LogDebug("Loaded tenant route: {Tenant}/{Service} -> {Cluster}",
route.TenantCode, route.ServiceName, route.ClusterId);
}
} }
} }
finally finally

View File

@ -105,11 +105,10 @@ public class ConfigReloadTests : IDisposable
var newConfig = configProvider.GetConfig(); var newConfig = configProvider.GetConfig();
newConfig.Routes.Count.Should().BeGreaterThanOrEqualTo(initialRouteCount); newConfig.Routes.Count.Should().BeGreaterThanOrEqualTo(initialRouteCount);
// 验证可以通过服务名找到路由 // 验证可以通过集群ID找到路由
var route = newConfig.Routes.FirstOrDefault(r => var route = newConfig.Routes.FirstOrDefault(r =>
r.Metadata?.ContainsKey("ServiceName") == true && r.ClusterId == "member-cluster");
r.Metadata["ServiceName"] == "proxy-reload-test"); route.Should().NotBeNull("Route with member-cluster should exist after reload");
route.Should().NotBeNull();
// 清理 // 清理
_dbContext.GwTenantRoutes.Remove(newRoute); _dbContext.GwTenantRoutes.Remove(newRoute);
@ -353,7 +352,7 @@ public class ConfigReloadTests : IDisposable
// Assert // Assert
var route = routeCache.GetRoute("any-tenant", "notify-test"); var route = routeCache.GetRoute("any-tenant", "notify-test");
route.Should().NotBeNull(); route.Should().NotBeNull();
route!.ClusterId.Should().Be("test-cluster"); route!.ClusterId.Should().Be("member-cluster");
// 清理 // 清理
_dbContext.GwTenantRoutes.Remove(newRoute); _dbContext.GwTenantRoutes.Remove(newRoute);

View File

@ -189,12 +189,13 @@ public class K8sDiscoveryTests : IDisposable
[Fact] [Fact]
public async Task WhenMultipleServicesDiscovered_ShouldCreateMultiplePendingConfigs() public async Task WhenMultipleServicesDiscovered_ShouldCreateMultiplePendingConfigs()
{ {
// Arrange // Arrange - 使用唯一的命名空间避免与其他测试冲突
var uniqueNs = $"test-ns-{Guid.NewGuid():N}";
var services = new[] var services = new[]
{ {
TestData.CreateRoutedK8sService("service-a", "/api/a", "cluster-a", @namespace: "test-ns"), TestData.CreateRoutedK8sService("service-a", "/api/a", "cluster-a", @namespace: uniqueNs),
TestData.CreateRoutedK8sService("service-b", "/api/b", "cluster-b", @namespace: "test-ns"), TestData.CreateRoutedK8sService("service-b", "/api/b", "cluster-b", @namespace: uniqueNs),
TestData.CreateRoutedK8sService("service-c", "/api/c", "cluster-c", @namespace: "test-ns") TestData.CreateRoutedK8sService("service-c", "/api/c", "cluster-c", @namespace: uniqueNs)
}; };
// Act // Act
@ -206,11 +207,15 @@ public class K8sDiscoveryTests : IDisposable
// Assert // Assert
var pendingConfigs = await _dbContext.PendingServiceDiscoveries var pendingConfigs = await _dbContext.PendingServiceDiscoveries
.Where(s => s.K8sNamespace == "test-ns") .Where(s => s.K8sNamespace == uniqueNs)
.ToListAsync(); .ToListAsync();
pendingConfigs.Should().HaveCount(3); pendingConfigs.Should().HaveCount(3);
pendingConfigs.Select(s => s.K8sServiceName).Should().Contain("service-a", "service-b", "service-c"); pendingConfigs.Select(s => s.K8sServiceName).Should().Contain("service-a", "service-b", "service-c");
// 清理
_dbContext.PendingServiceDiscoveries.RemoveRange(pendingConfigs);
await _dbContext.SaveChangesAsync();
} }
[Fact] [Fact]