Skip to content

Commit af4954e

Browse files
committed
SignInAndCreateTenant tests working
1 parent 85ce7a5 commit af4954e

File tree

8 files changed

+157
-65
lines changed

8 files changed

+157
-65
lines changed

AuthPermissions.SupportCode/AddUsersServices/SignInAndCreateTenant.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public async Task<IStatusGeneric<AddNewUserDto>> SignUpNewTenantWithVersionAsync
167167
{
168168
_logger?.LogError(ex, "Critical error in SignOn. The timestamp of this Exception is {createTimestamp}.", _createTimestamp);
169169
status.AddErrorFormatted("ExceptionCreating".ClassMethodLocalizeKey(this, true),
170-
$"Failed to create a new tenant due to an internal error.",
170+
$"Failed to create a new tenant due to an internal error. ",
171171
$"Contact the support team and provide the string '{_createTimestamp}' to help them fix your problem.");
172172
}
173173

AuthPermissions.SupportCode/DemoShardOnlyGetDatabaseForNewTenant.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
// Copyright (c) 2023 Jon P Smith, GitHub: JonPSmith, web: http://www.thereformedprogrammer.net/
22
// Licensed under MIT license. See License.txt in the project root for license information.
33

4-
using AuthPermissions.AdminCode;
54
using AuthPermissions.AspNetCore.ShardingServices;
65
using AuthPermissions.BaseCode.CommonCode;
76
using AuthPermissions.BaseCode.DataLayer.Classes;
8-
using AuthPermissions.BaseCode.DataLayer.EfCode;
97
using AuthPermissions.BaseCode.SetupCode;
108
using LocalizeMessagesAndErrors;
119
using StatusGeneric;
1210

1311
namespace AuthPermissions.SupportCode;
1412

1513
/// <summary>
16-
/// This contains a version of the <see cref="IGetDatabaseForNewTenant"/> to handle tenants that have
14+
/// This contains a version of the <see cref="ISignUpGetShardingEntry"/> to handle tenants that have
1715
/// sharding-Only tenants (i.e. the tenant's <see cref="Tenant.HasOwnDb"/> is true).
1816
/// This means you need to create a new <see cref="ShardingEntry"/> for each new tenant
1917
/// </summary>

Test/StubClasses/StubISignUpGetShardingEntry.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// Licensed under MIT license. See License.txt in the project root for license information.
33

44
using AuthPermissions.AspNetCore.ShardingServices;
5-
using AuthPermissions.BaseCode.DataLayer.Classes;
6-
using AuthPermissions.BaseCode.DataLayer.EfCode;
75
using AuthPermissions.BaseCode.SetupCode;
86
using LocalizeMessagesAndErrors;
97
using StatusGeneric;
@@ -38,6 +36,10 @@ public Task<IStatusGeneric<string>> FindOrCreateShardingEntryAsync(
3836
bool hasOwnDb, string createTimestamp, string region, string version = null)
3937
{
4038
var status = new StatusGenericLocalizer<string>(_localizeDefault);
39+
if (_returnError)
40+
status.AddErrorString("TestError".ClassLocalizeKey(this, true), "Forced Error in ISignUpGetShardingEntry");
41+
42+
status.SetResult(hasOwnDb ? $"SignOn-{createTimestamp}" : null);
4143

4244
return Task.FromResult<IStatusGeneric<string>>(status);
4345
}

Test/Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<ProjectReference Include="..\Example5.MvcWebApp.AzureAdB2C\Example5.MvcWebApp.AzureAdB2C.csproj" />
8181
<ProjectReference Include="..\Example6.MvcWebApp.Sharding\Example6.MvcWebApp.Sharding.csproj" />
8282
<ProjectReference Include="..\Example6.SingleLevelSharding\Example6.SingleLevelSharding.csproj" />
83+
<ProjectReference Include="..\Example7.MvcWebApp.ShardingOnly\Example7.MvcWebApp.ShardingOnly.csproj" />
8384
<ProjectReference Include="..\ExamplesCommonCode\ExamplesCommonCode.csproj" />
8485
</ItemGroup>
8586

Test/UnitTests/TestSharding/TestDemoShardOnlyGetDatabaseForNewTenant.cs

Lines changed: 0 additions & 35 deletions
This file was deleted.

Test/UnitTests/TestSharding/TestGetSetShardingEntriesFileStoreCache.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,14 +453,19 @@ public async Task TestQueryTenantsSingle()
453453

454454
//ATTEMPT
455455
var list = await setup.Service.GetShardingsWithTenantNamesAsync();
456+
_output.WriteLine(list[0].ToString());
456457

457458
//VERIFY
458-
list.ShouldEqual(new List<(string databaseName, bool? hasOwnDb, List<string> tenantNames)>
459-
{
460-
("Default Database", false, new List<string>{"Tenant1", "Tenant3"}),
461-
("Other Database", true, new List<string>{ "Tenant2"}),
462-
("PostgreSql1", null, new List<string>())
463-
});
459+
list.Count.ShouldEqual(3);
460+
list[0].shardingName.ShouldEqual("Default Database");
461+
list[0].hasOwnDb.ShouldEqual(false);
462+
list[0].tenantNames.ShouldEqual(new List<string> { "Tenant1", "Tenant3" });
463+
list[1].shardingName.ShouldEqual("Other Database");
464+
list[1].hasOwnDb.ShouldEqual(true);
465+
list[1].tenantNames.ShouldEqual(new List<string> { "Tenant2" });
466+
list[2].shardingName.ShouldEqual("PostgreSql1");
467+
list[2].hasOwnDb.ShouldEqual(null);
468+
list[2].tenantNames.ShouldEqual(new List<string>( ));
464469
}
465470

466471
private class SetupServiceToTest

Test/UnitTests/TestSupportCode/TestIndividualUserAddUserManager.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ public TestIndividualUserAddUserManager(ITestOutputHelper output)
8181
accountContext.Database.EnsureClean();
8282
var authContext = _serviceProvider.GetRequiredService<AuthPermissionsDbContext>();
8383
authContext.Database.EnsureClean();
84-
var invoiceContext = _serviceProvider.GetRequiredService<InvoicesDbContext>();
85-
invoiceContext.Database.EnsureClean();
8684
}
8785

8886
[Theory]

Test/UnitTests/TestSupportCode/TestSignInAndCreateTenant.cs

Lines changed: 139 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
using AuthPermissions.BaseCode.DataLayer.EfCode;
99
using AuthPermissions.BaseCode.SetupCode;
1010
using AuthPermissions.BulkLoadServices.Concrete;
11+
using AuthPermissions.SupportCode;
1112
using AuthPermissions.SupportCode.AddUsersServices;
1213
using Example3.MvcWebApp.IndividualAccounts.PermissionsCode;
14+
using Example6.MvcWebApp.Sharding.PermissionsCode;
15+
using Example7.MvcWebApp.ShardingOnly.PermissionsCode;
1316
using LocalizeMessagesAndErrors.UnitTestingCode;
1417
using Microsoft.EntityFrameworkCore;
18+
using Microsoft.Extensions.Logging;
1519
using Test.StubClasses;
1620
using Test.TestHelpers;
1721
using TestSupport.EfHelpers;
@@ -24,6 +28,7 @@ namespace Test.UnitTests.TestSupportCode;
2428
public class TestSignInAndCreateTenant
2529
{
2630
private readonly ITestOutputHelper _output;
31+
private static List<LogOutput> _logs;
2732

2833
public TestSignInAndCreateTenant(ITestOutputHelper output)
2934
{
@@ -43,10 +48,14 @@ private static (SignInAndCreateTenant service, AuthUsersAdminService userAdmin)
4348
var userAdmin = new AuthUsersAdminService(context, new StubSyncAuthenticationUsersFactory(),
4449
authOptions, "en".SetupAuthPLoggingLocalizer());
4550
var tenantAdmin = new AuthTenantAdminService(context, authOptions,
46-
"en".SetupAuthPLoggingLocalizer(), new StubTenantChangeServiceFactory(), null);
51+
"en".SetupAuthPLoggingLocalizer(), new StubTenantChangeServiceFactory(), null);
52+
_logs = new List<LogOutput>();
53+
ILogger<SignInAndCreateTenant> logger = new LoggerFactory(
54+
new[] { new MyLoggerProviderActionOut(log => _logs.Add(log)) })
55+
.CreateLogger<SignInAndCreateTenant>();
4756
var service = new SignInAndCreateTenant(authOptions, tenantAdmin,
4857
new StubAddNewUserManager(userAdmin, tenantAdmin, loginReturnsError),
49-
"en".SetupAuthPLoggingLocalizer(), null,
58+
"en".SetupAuthPLoggingLocalizer(), logger,
5059
overrideNormal ?? new StubISignUpGetShardingEntry("en".SetupAuthPLoggingLocalizer(), false));
5160

5261
return (service, userAdmin);
@@ -121,13 +130,47 @@ public async Task TestAddUserAndNewTenantAsync_NoVersionSetup(bool hasOwnDb)
121130
user.UserRoles.Select(x => x.RoleName).ToArray().ShouldEqual(new []{ "Role1", "Role3" });
122131
}
123132

133+
134+
[Fact]
135+
public async Task TestAddUserAndNewTenantAsync_Shared()
136+
{
137+
//SETUP
138+
var options = SqliteInMemory.CreateOptions<AuthPermissionsDbContext>();
139+
using var context = new AuthPermissionsDbContext(options);
140+
context.Database.EnsureCreated();
141+
142+
var tuple = CreateISignInAndCreateTenant(context, TenantTypes.SingleLevel, null);
143+
var authSettings = new AuthPermissionsOptions { InternalData = { EnumPermissionsType = typeof(Example3Permissions) } };
144+
var rolesSetup = new BulkLoadRolesService(context, authSettings);
145+
await rolesSetup.AddRolesToDatabaseAsync(Example3AppAuthSetupData.RolesDefinition);
146+
147+
var userData = new AddNewUserDto { Email = "[email protected]" };
148+
var tenantData = new AddNewTenantDto
149+
{
150+
TenantName = "New Tenant",
151+
Region = "South",
152+
Version = "Free"
153+
};
154+
context.ChangeTracker.Clear();
155+
156+
//ATTEMPT
157+
var status = await tuple.service.SignUpNewTenantWithVersionAsync(userData, tenantData, Example3CreateTenantVersions.TenantSetupData);
158+
159+
//VERIFY
160+
context.ChangeTracker.Clear();
161+
var log = _logs.LastOrDefault();
162+
if (log != null)
163+
_output.WriteLine(log.DecodeMessage());
164+
status.IsValid.ShouldBeTrue(status.GetAllErrors());
165+
var tenant = context.Tenants.Single();
166+
tenant.TenantFullName.ShouldEqual(tenantData.TenantName);
167+
tenant.DatabaseInfoName.ShouldBeNull();
168+
}
169+
124170
[Theory]
125-
[InlineData(true, null, "OwnDb")]
126-
[InlineData(false, null, "SharedDb")]
127-
[InlineData(true, false, "OwnDb")] //The AddNewTenantDto.HasOwnDb is overridden by the version setup data
128-
[InlineData(false, true, "SharedDb")] //The AddNewTenantDto.HasOwnDb is overridden by the version setup data
129-
public async Task TestAddUserAndNewTenantAsync_Sharding(bool? setupHasOwnDb, bool? dtoHasOwnDb,
130-
string databaseInfoName)
171+
[InlineData(true)]
172+
[InlineData(false)]
173+
public async Task TestAddUserAndNewTenantAsync_ShardingHybrid(bool hasOwnDb)
131174
{
132175
//SETUP
133176
var options = SqliteInMemory.CreateOptions<AuthPermissionsDbContext>();
@@ -143,25 +186,68 @@ public async Task TestAddUserAndNewTenantAsync_Sharding(bool? setupHasOwnDb, boo
143186
var tenantData = new AddNewTenantDto
144187
{
145188
TenantName = "New Tenant",
146-
Version = "Free",
147-
HasOwnDb = dtoHasOwnDb,
189+
Region = "South",
190+
HasOwnDb = hasOwnDb,
148191
};
149-
Example3CreateTenantVersions.TenantSetupData.HasOwnDbForEachVersion = new Dictionary<string, bool?>()
192+
context.ChangeTracker.Clear();
193+
194+
//ATTEMPT
195+
var status = await tuple.service.SignUpNewTenantAsync(userData, tenantData);
196+
197+
//VERIFY
198+
context.ChangeTracker.Clear();
199+
var log = _logs.LastOrDefault();
200+
if (log != null)
201+
_output.WriteLine(log.DecodeMessage());
202+
status.IsValid.ShouldBeTrue(status.GetAllErrors());
203+
var tenant = context.Tenants.Single();
204+
_output.WriteLine(tenant.DatabaseInfoName);
205+
tenant.TenantFullName.ShouldEqual(tenantData.TenantName);
206+
if (hasOwnDb)
207+
tenant.DatabaseInfoName.ShouldStartWith("SignOn-");
208+
else
209+
tenant.DatabaseInfoName.ShouldEqual("Default Database");
210+
}
211+
212+
[Fact]
213+
public async Task TestAddUserAndNewTenantAsync_ShardingOnly()
214+
{
215+
//SETUP
216+
var options = SqliteInMemory.CreateOptions<AuthPermissionsDbContext>();
217+
using var context = new AuthPermissionsDbContext(options);
218+
context.Database.EnsureCreated();
219+
220+
var getSetShardings = new StubGetSetShardingEntries(this);
221+
222+
var tuple = CreateISignInAndCreateTenant(context, TenantTypes.SingleLevel | TenantTypes.AddSharding
223+
, new DemoShardOnlyGetDatabaseForNewTenant(getSetShardings, "en".SetupAuthPLoggingLocalizer()));
224+
var authSettings = new AuthPermissionsOptions { InternalData = { EnumPermissionsType = typeof(Example3Permissions) } };
225+
var rolesSetup = new BulkLoadRolesService(context, authSettings);
226+
await rolesSetup.AddRolesToDatabaseAsync(Example3AppAuthSetupData.RolesDefinition);
227+
228+
var userData = new AddNewUserDto { Email = "[email protected]" };
229+
var tenantData = new AddNewTenantDto
150230
{
151-
{ "Free", setupHasOwnDb },
231+
TenantName = "New Tenant",
232+
Region = "South",
233+
Version = "Free",
234+
HasOwnDb = true,
152235
};
153-
154236
context.ChangeTracker.Clear();
155237

156238
//ATTEMPT
157-
var status = await tuple.service.SignUpNewTenantWithVersionAsync(userData, tenantData, Example3CreateTenantVersions.TenantSetupData);
239+
var status = await tuple.service.SignUpNewTenantWithVersionAsync(userData, tenantData, Example7CreateTenantVersions.TenantSetupData);
158240

159241
//VERIFY
160242
context.ChangeTracker.Clear();
243+
var log = _logs.LastOrDefault();
244+
if (log != null)
245+
_output.WriteLine(log.DecodeMessage());
161246
status.IsValid.ShouldBeTrue(status.GetAllErrors());
162247
var tenant = context.Tenants.Single();
248+
_output.WriteLine(tenant.DatabaseInfoName);
163249
tenant.TenantFullName.ShouldEqual(tenantData.TenantName);
164-
tenant.DatabaseInfoName.ShouldEqual(databaseInfoName);
250+
tenant.DatabaseInfoName.ShouldStartWith("SignOn-");
165251
}
166252

167253
[Fact]
@@ -225,7 +311,7 @@ public async Task TestAddUserAndNewTenantAsync_Sharding_UndoTenant()
225311

226312
//VERIFY
227313
context.ChangeTracker.Clear();
228-
status.IsValid.ShouldBeFalse(status.GetAllErrors());
314+
status.IsValid.ShouldBeFalse();
229315
context.Tenants.Count().ShouldEqual(0);
230316
}
231317

@@ -266,4 +352,41 @@ public async Task TestAddUserAndNewTenantAsync_Sharding_UndoOnBadUser()
266352
status.IsValid.ShouldBeFalse();
267353
context.Tenants.Count().ShouldEqual(0);
268354
}
355+
356+
//----------------------------------------------------------
357+
//Test the two demo version of the ISignUpGetShardingEntry
358+
359+
[Fact]
360+
public async Task DemoGetDatabaseForNewTenant()
361+
{
362+
//SETUP
363+
var getSetSharding = new StubGetSetShardingEntries(this);
364+
var service = new DemoGetDatabaseForNewTenant(getSetSharding, "en".SetupAuthPLoggingLocalizer());
365+
366+
//ATTEMPT
367+
var status = await service.FindOrCreateShardingEntryAsync(true, "timestamp", "SouthDb");
368+
369+
//VERIFY
370+
status.IsValid.ShouldBeTrue(status.GetAllErrors());
371+
status.Result.ShouldEqual("PostgreSql1");
372+
}
373+
374+
[Fact]
375+
public async Task DemoShardOnlyGetDatabaseForNewTenant()
376+
{
377+
//SETUP
378+
var getSetSharding = new StubGetSetShardingEntries(this);
379+
var service = new DemoShardOnlyGetDatabaseForNewTenant(getSetSharding, "en".SetupAuthPLoggingLocalizer());
380+
381+
//ATTEMPT
382+
var status = await service.FindOrCreateShardingEntryAsync(true, "timestamp", "SouthDb");
383+
384+
//VERIFY
385+
status.IsValid.ShouldBeTrue(status.GetAllErrors());
386+
getSetSharding.CalledMethodName.ShouldEqual("AddNewShardingEntry");
387+
getSetSharding.SharingEntryAddUpDel.Name.ShouldEqual("SignOn-timestamp");
388+
getSetSharding.SharingEntryAddUpDel.ConnectionName.ShouldEqual("SouthDb");
389+
getSetSharding.SharingEntryAddUpDel.DatabaseName.ShouldEqual("Db-timestamp");
390+
getSetSharding.SharingEntryAddUpDel.DatabaseType.ShouldEqual("SqlServer");
391+
}
269392
}

0 commit comments

Comments
 (0)