From 7dbe6212fa3e8858d084dd5d4bc9ca3092c6a638 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sat, 18 Apr 2026 00:47:26 +0300 Subject: [PATCH] Ability to initialize the site context with tenant name --- .../ISiteContext.cs | 2 +- .../SiteContextBase.cs | 30 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/OrchardCoreContrib.Testing/ISiteContext.cs b/src/OrchardCoreContrib.Testing/ISiteContext.cs index 5aba3c2..6185840 100644 --- a/src/OrchardCoreContrib.Testing/ISiteContext.cs +++ b/src/OrchardCoreContrib.Testing/ISiteContext.cs @@ -16,5 +16,5 @@ public interface ISiteContext : IDisposable string TenantName { get; } - Task InitializeAsync(); + Task InitializeAsync(string tenantName = null); } diff --git a/src/OrchardCoreContrib.Testing/SiteContextBase.cs b/src/OrchardCoreContrib.Testing/SiteContextBase.cs index 456bb37..bd5cefc 100644 --- a/src/OrchardCoreContrib.Testing/SiteContextBase.cs +++ b/src/OrchardCoreContrib.Testing/SiteContextBase.cs @@ -41,9 +41,9 @@ public SiteContextBase() public string TenantName { get; private set; } - public virtual async Task InitializeAsync() + public virtual async Task InitializeAsync(string tenantName = null) { - var tenantName = Guid.NewGuid().ToString("n"); + tenantName ??= Guid.NewGuid().ToString("n"); var response = await CreateSiteAsync(tenantName); @@ -53,8 +53,30 @@ public virtual async Task InitializeAsync() lock (Site) { - var url = new Uri(content.Trim('"')); - url = new Uri(url.Scheme + "://" + url.Authority + url.LocalPath + "/"); + Uri url = null; + + var rawUrl = content?.Trim().Trim('"'); + + if (!string.IsNullOrWhiteSpace(rawUrl)) + { + if (!Uri.TryCreate(rawUrl, UriKind.Absolute, out url)) + { + throw new InvalidOperationException($"Tenant create API returned an invalid URL: '{rawUrl}'."); + } + } + else if (response.Headers.Location is { } location) + { + url = location.IsAbsoluteUri + ? location + : new Uri(DefaultTenantClient.BaseAddress ?? new Uri("http://localhost/"), location); + } + else + { + // Fallback for API responses with empty body and no Location header. + url = new Uri(DefaultTenantClient.BaseAddress ?? new Uri("http://localhost/"), $"{tenantName}/"); + } + + url = new Uri($"{url.Scheme}://{url.Authority}{url.LocalPath.TrimEnd('/')}/"); Client = Site.CreateDefaultClient(url);