diff --git a/modules/identity/Volo.Abp.Identity.sln b/modules/identity/Volo.Abp.Identity.sln
index 0d993d8bf7..388cd0c555 100644
--- a/modules/identity/Volo.Abp.Identity.sln
+++ b/modules/identity/Volo.Abp.Identity.sln
@@ -39,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Identity.AspNetCor
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.Domain.Identity", "src\Volo.Abp.PermissionManagement.Domain.Identity\Volo.Abp.PermissionManagement.Domain.Identity.csproj", "{736F91E7-8A70-441B-89DE-0E29A348E718}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Identity.AspNetCore.Tests", "test\Volo.Abp.Identity.AspNetCore.Tests\Volo.Abp.Identity.AspNetCore.Tests.csproj", "{89C094EB-D80A-4976-9C10-7CE3EBEEE877}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -109,6 +111,10 @@ Global
{736F91E7-8A70-441B-89DE-0E29A348E718}.Debug|Any CPU.Build.0 = Debug|Any CPU
{736F91E7-8A70-441B-89DE-0E29A348E718}.Release|Any CPU.ActiveCfg = Release|Any CPU
{736F91E7-8A70-441B-89DE-0E29A348E718}.Release|Any CPU.Build.0 = Release|Any CPU
+ {89C094EB-D80A-4976-9C10-7CE3EBEEE877}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {89C094EB-D80A-4976-9C10-7CE3EBEEE877}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {89C094EB-D80A-4976-9C10-7CE3EBEEE877}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {89C094EB-D80A-4976-9C10-7CE3EBEEE877}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -130,6 +136,7 @@ Global
{588B6E38-323B-4251-AC21-5F67C815A44E} = {9FACAF96-A681-4B36-A938-A37DCA0B7EC1}
{D5EFC912-75A0-4856-9B8D-DFDD4CD66BAB} = {AADC5A0A-F100-4511-87DE-B74E55F5B69B}
{736F91E7-8A70-441B-89DE-0E29A348E718} = {AADC5A0A-F100-4511-87DE-B74E55F5B69B}
+ {89C094EB-D80A-4976-9C10-7CE3EBEEE877} = {9FACAF96-A681-4B36-A938-A37DCA0B7EC1}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {05740D37-83CF-4041-9C2A-D89F1B3DB5A4}
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj
new file mode 100644
index 0000000000..594080f283
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj
@@ -0,0 +1,25 @@
+
+
+
+ netcoreapp3.1
+ Volo.Abp.Identity.AspNetCore.Tests
+ Volo.Abp.Identity.AspNetCore.Tests
+ true
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestBase.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestBase.cs
new file mode 100644
index 0000000000..a66bb129bb
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestBase.cs
@@ -0,0 +1,9 @@
+using Volo.Abp.AspNetCore.TestBase;
+
+namespace Volo.Abp.Identity.AspNetCore
+{
+ public abstract class AbpIdentityAspNetCoreTestBase : AbpAspNetCoreIntegratedTestBase
+ {
+
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestModule.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestModule.cs
new file mode 100644
index 0000000000..79815d3941
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestModule.cs
@@ -0,0 +1,38 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Volo.Abp.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.TestBase;
+using Volo.Abp.Modularity;
+
+namespace Volo.Abp.Identity.AspNetCore
+{
+ [DependsOn(
+ typeof(AbpIdentityAspNetCoreModule),
+ typeof(AbpIdentityDomainTestModule),
+ typeof(AbpAspNetCoreTestBaseModule),
+ typeof(AbpAspNetCoreMvcModule)
+ )]
+ public class AbpIdentityAspNetCoreTestModule : AbpModule
+ {
+ public override void PreConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.PreConfigure(builder =>
+ {
+ builder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(AbpIdentityAspNetCoreTestModule).Assembly));
+ });
+ }
+
+ public override void OnApplicationInitialization(ApplicationInitializationContext context)
+ {
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ app.UseRouting();
+ app.UseAuthentication();
+ app.UseAuthorization();
+ app.UseConfiguredEndpoints();
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestStartup.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestStartup.cs
new file mode 100644
index 0000000000..d495323c98
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreTestStartup.cs
@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Volo.Abp.Identity.AspNetCore
+{
+ public class AbpIdentityAspNetCoreTestStartup
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddApplication();
+ }
+
+ public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
+ {
+ app.InitializeApplication();
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSignInManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSignInManager_Tests.cs
new file mode 100644
index 0000000000..268bfae40c
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/AbpSignInManager_Tests.cs
@@ -0,0 +1,45 @@
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Shouldly;
+using Xunit;
+
+namespace Volo.Abp.Identity.AspNetCore
+{
+ public class AbpSignInManager_Tests : AbpIdentityAspNetCoreTestBase
+ {
+ [Fact]
+ public async Task Should_SignIn_With_Correct_Credentials()
+ {
+ var result = await GetResponseAsStringAsync(
+ "api/signin-test/password?userName=admin&password=1q2w3E*"
+ );
+
+ result.ShouldBe("Succeeded");
+ }
+ [Fact]
+ public async Task Should_Not_SignIn_With_Wrong_Credentials()
+ {
+ var result = await GetResponseAsStringAsync(
+ "api/signin-test/password?userName=admin&password=WRONG_PASSWORD"
+ );
+
+ result.ShouldBe("Failed");
+ }
+
+ //TODO: Move to a better common place ----------------------------------------------------
+
+ protected virtual async Task GetResponseAsStringAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK)
+ {
+ var response = await GetResponseAsync(url, expectedStatusCode);
+ return await response.Content.ReadAsStringAsync();
+ }
+
+ protected virtual async Task GetResponseAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK)
+ {
+ var response = await Client.GetAsync(url);
+ response.StatusCode.ShouldBe(expectedStatusCode);
+ return response;
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/SignInTestController.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/SignInTestController.cs
new file mode 100644
index 0000000000..77fb7918e2
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/SignInTestController.cs
@@ -0,0 +1,31 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.Mvc;
+
+namespace Volo.Abp.Identity.AspNetCore
+{
+ [Route("api/signin-test")]
+ public class SignInTestController : AbpController
+ {
+ private readonly SignInManager _signInManager;
+
+ public SignInTestController(SignInManager signInManager)
+ {
+ _signInManager = signInManager;
+ }
+
+ [Route("password")]
+ public async Task PasswordLogin(string userName, string password)
+ {
+ var result = await _signInManager.PasswordSignInAsync(
+ userName,
+ password,
+ false,
+ false
+ );
+
+ return Content(result.ToString());
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityExtendedTestBase.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityExtendedTestBase.cs
index 4a89feaa8c..5385aaec49 100644
--- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityExtendedTestBase.cs
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityExtendedTestBase.cs
@@ -1,12 +1,14 @@
using System;
using System.Linq;
+using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Identity.EntityFrameworkCore;
using Volo.Abp.Modularity;
+using Volo.Abp.Uow;
namespace Volo.Abp.Identity
{
- public abstract class AbpIdentityExtendedTestBase : AbpIdentityTestBase
+ public abstract class AbpIdentityExtendedTestBase : AbpIdentityTestBase
where TStartupModule : IAbpModule
{
protected virtual IdentityUser GetUser(string userName)
@@ -40,5 +42,14 @@ namespace Volo.Abp.Identity
return action.Invoke(dbContext);
}
}
+
+ protected virtual async Task UsingUowAsync(Func action)
+ {
+ using (var uow = GetRequiredService().Begin())
+ {
+ await action();
+ await uow.CompleteAsync();
+ }
+ }
}
-}
\ No newline at end of file
+}