Browse Source

Merge branch 'dev' into berkan/cli-leptonx

pull/13306/head
Engincan VESKE 4 years ago
parent
commit
3150baeef1
  1. 2
      docs/en/Distributed-Event-Bus.md
  2. 8
      docs/en/Object-To-Object-Mapping.md
  3. 8
      docs/en/Tutorials/Todo/Index.md
  4. 8
      docs/zh-Hans/Object-To-Object-Mapping.md
  5. 1
      framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs
  6. 6
      framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs
  7. 15
      framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUiModalExtensions.cs
  8. 2
      framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs
  9. 6
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs
  10. 2
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json
  11. 6
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs
  12. 11
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/CommentDate.cshtml
  13. 25
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/CommentDateViewComponent.cs
  14. 6
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/DecisionCommentDate.cshtml
  15. 32
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/DecisionCommentDateViewComponent.cs
  16. 0
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/_ViewImports.cshtml
  17. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml
  18. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml
  19. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js
  20. 20
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js
  21. 14
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml
  22. 54
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/addWidgetModal.js
  23. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml
  24. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml
  25. 25
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js
  26. 20
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js
  27. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/CmsKitContentWidgetOptions.cs
  28. 1
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml
  29. 27
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentAdminAppService_Tests.cs
  30. 12
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs
  31. 14
      modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs
  32. 8
      modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs
  33. 14
      modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs
  34. 26
      modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs
  35. 66
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs
  36. 128
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs
  37. 2
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs
  38. 324
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore_Tests.cs
  39. 156
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs
  40. 35
      modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/TokenCleanupService_Tests.cs
  41. 4
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj
  42. 6
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictApplicationRepository_Tests.cs
  43. 6
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictAuthorizationRepository_Tests.cs
  44. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs
  45. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs
  46. 6
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictScopeRepository_Tests.cs
  47. 6
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictTokenRepository_Tests.cs
  48. 27
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestModule.cs
  49. 4
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj
  50. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoDbFixture.cs
  51. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoTestCollection.cs
  52. 9
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictApplicationRepository_Tests.cs
  53. 9
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictAuthorizationRepository_Tests.cs
  54. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestBase.cs
  55. 57
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestModule.cs
  56. 9
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictScopeRepository_Tests.cs
  57. 9
      modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictTokenRepository_Tests.cs
  58. 16
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/AbpOpenIddictTestData.cs
  59. 25
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs
  60. 65
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictApplicationRepository_Tests.cs
  61. 72
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs
  62. 143
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs
  63. 71
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictScopeRepository_Tests.cs
  64. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBase.cs
  65. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBaseModule.cs
  66. 104
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs
  67. 0
      modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/Security/FakeCurrentPrincipalAccessor.cs
  68. 22
      npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts
  69. 16
      npm/ng-packs/packages/core/src/lib/services/environment.service.ts
  70. 14
      npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts
  71. 4
      npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts
  72. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MyProjectNameMongoDbContext.cs

2
docs/en/Distributed-Event-Bus.md

@ -228,7 +228,7 @@ namespace AbpDemo
```` ````
* `MyHandler` implements the `IDistributedEventHandler<EntityUpdatedEto<ProductEto>>`. * `MyHandler` implements the `IDistributedEventHandler<EntityUpdatedEto<ProductEto>>`.
* It is required to register your handler class to the [dependency injection](Dependency-Injection.md) system. Implementing `ITransient` like in this example is an easy way. * It is required to register your handler class to the [dependency injection](Dependency-Injection.md) system. Implementing `ITransientDependency` like in this example is an easy way.
### Configuration ### Configuration

8
docs/en/Object-To-Object-Mapping.md

@ -12,7 +12,7 @@ public class UserAppService : ApplicationService
_userRepository = userRepository; _userRepository = userRepository;
} }
public void CreateUser(CreateUserInput input) public async Task CreateUser(CreateUserInput input)
{ {
//Manually creating a User object from the CreateUserInput object //Manually creating a User object from the CreateUserInput object
var user = new User var user = new User
@ -23,7 +23,7 @@ public class UserAppService : ApplicationService
Password = input.Password Password = input.Password
}; };
_userRepository.Insert(user); await _userRepository.InsertAsync(user);
} }
} }
``` ```
@ -46,12 +46,12 @@ public class UserAppService : ApplicationService
_userRepository = userRepository; _userRepository = userRepository;
} }
public void CreateUser(CreateUserInput input) public async Task CreateUser(CreateUserInput input)
{ {
//Automatically creating a new User object using the CreateUserInput object //Automatically creating a new User object using the CreateUserInput object
var user = ObjectMapper.Map<CreateUserInput, User>(input); var user = ObjectMapper.Map<CreateUserInput, User>(input);
_userRepository.Insert(user); await _userRepository.InsertAsync(user);
} }
} }
```` ````

8
docs/en/Tutorials/Todo/Index.md

@ -25,15 +25,17 @@ You can find the source code of the completed application [here](https://github.
{{end}} {{end}}
## Creating a New Solution ## Install ABP CLI Tool
We will use the [ABP CLI](../../CLI.md) to create new solutions with the ABP Framework. You can run the following command in a command-line terminal to install it: We will use the [ABP CLI](../../CLI.md) to create new ABP solutions. You can run the following command on a terminal window to install this dotnet tool:
````bash ````bash
dotnet tool install -g Volo.Abp.Cli dotnet tool install -g Volo.Abp.Cli
```` ````
Then create an empty folder, open a command-line terminal and execute the following command in the terminal: ## Create Your ABP Solution
Create an empty folder, open a command-line terminal and execute the following command in the terminal:
````bash ````bash
abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}}

8
docs/zh-Hans/Object-To-Object-Mapping.md

@ -12,7 +12,7 @@ public class UserAppService : ApplicationService
_userRepository = userRepository; _userRepository = userRepository;
} }
public void CreateUser(CreateUserInput input) public async Task CreateUser(CreateUserInput input)
{ {
//Manually creating a User object from the CreateUserInput object //Manually creating a User object from the CreateUserInput object
var user = new User var user = new User
@ -23,7 +23,7 @@ public class UserAppService : ApplicationService
Password = input.Password Password = input.Password
}; };
_userRepository.Insert(user); await _userRepository.InsertAsync(user);
} }
} }
``` ```
@ -46,12 +46,12 @@ public class UserAppService : ApplicationService
_userRepository = userRepository; _userRepository = userRepository;
} }
public void CreateUser(CreateUserInput input) public async Task CreateUser(CreateUserInput input)
{ {
//Automatically creating a new User object using the CreateUserInput object //Automatically creating a new User object using the CreateUserInput object
var user = ObjectMapper.Map<CreateUserInput, User>(input); var user = ObjectMapper.Map<CreateUserInput, User>(input);
_userRepository.Insert(user); await _userRepository.InsertAsync(user);
} }
} }
```` ````

1
framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs

@ -7,7 +7,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
[Serializable] [Serializable]
public class ApplicationLocalizationConfigurationDto public class ApplicationLocalizationConfigurationDto
{ {
//TODO: Rename to Texts?
public Dictionary<string, Dictionary<string, string>> Values { get; set; } public Dictionary<string, Dictionary<string, string>> Values { get; set; }
public List<LanguageInfo> Languages { get; set; } public List<LanguageInfo> Languages { get; set; }

6
framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs

@ -30,7 +30,7 @@ public class PermissionDefinition : IHasSimpleStateCheckers<PermissionDefinition
/// A list of allowed providers to get/set value of this permission. /// A list of allowed providers to get/set value of this permission.
/// An empty list indicates that all providers are allowed. /// An empty list indicates that all providers are allowed.
/// </summary> /// </summary>
public List<string> Providers { get; } //TODO: Rename to AllowedProviders? public List<string> Providers { get; }
public List<ISimpleStateChecker<PermissionDefinition>> StateCheckers { get; } public List<ISimpleStateChecker<PermissionDefinition>> StateCheckers { get; }
@ -122,14 +122,14 @@ public class PermissionDefinition : IHasSimpleStateCheckers<PermissionDefinition
} }
/// <summary> /// <summary>
/// Set the <see cref="StateProviders"/> property. /// Adds one or more providers to the <see cref="Providers"/> list.
/// This is a shortcut for nested calls on this object. /// This is a shortcut for nested calls on this object.
/// </summary> /// </summary>
public virtual PermissionDefinition WithProviders(params string[] providers) public virtual PermissionDefinition WithProviders(params string[] providers)
{ {
if (!providers.IsNullOrEmpty()) if (!providers.IsNullOrEmpty())
{ {
Providers.AddRange(providers); Providers.AddIfNotContains(providers);
} }
return this; return this;

15
framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUiModalExtensions.cs

@ -0,0 +1,15 @@
using System.Threading.Tasks;
using Blazorise;
namespace Volo.Abp.BlazoriseUI;
public static class AbpBlazoriseUiModalExtensions
{
public static Task CancelClosingModalWhenFocusLost(this Modal modal, ModalClosingEventArgs eventArgs)
{
// cancel close if clicked outside of modal area
eventArgs.Cancel = eventArgs.CloseReason == CloseReason.FocusLostClosing;
return Task.CompletedTask;
}
}

2
framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs

@ -1,7 +1,5 @@
namespace Volo.Abp.Data; namespace Volo.Abp.Data;
//TODO: Move to Volo.Abp.Data.ObjectExtending namespace at 4.0?
public interface IHasExtraProperties public interface IHasExtraProperties
{ {
ExtraPropertyDictionary ExtraProperties { get; } ExtraPropertyDictionary ExtraProperties { get; }

6
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs

@ -39,7 +39,7 @@ public class SettingDefinition
/// A list of allowed providers to get/set value of this setting. /// A list of allowed providers to get/set value of this setting.
/// An empty list indicates that all providers are allowed. /// An empty list indicates that all providers are allowed.
/// </summary> /// </summary>
public List<string> Providers { get; } //TODO: Rename to AllowedProviders public List<string> Providers { get; }
/// <summary> /// <summary>
/// Is this setting inherited from parent scopes. /// Is this setting inherited from parent scopes.
@ -91,14 +91,14 @@ public class SettingDefinition
} }
/// <summary> /// <summary>
/// Sets a property in the <see cref="Properties"/> dictionary. /// Adds one or more providers to the <see cref="Providers"/> list.
/// This is a shortcut for nested calls on this object. /// This is a shortcut for nested calls on this object.
/// </summary> /// </summary>
public virtual SettingDefinition WithProviders(params string[] providers) public virtual SettingDefinition WithProviders(params string[] providers)
{ {
if (!providers.IsNullOrEmpty()) if (!providers.IsNullOrEmpty())
{ {
Providers.AddRange(providers); Providers.AddIfNotContains(providers);
} }
return this; return this;

2
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json

@ -24,6 +24,8 @@
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "This field must be a string or array type with a minimum length of '{0}'.", "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "This field must be a string or array type with a minimum length of '{0}'.",
"ThisFieldIsNotAValidPhoneNumber.": "This field is not a valid phone number.", "ThisFieldIsNotAValidPhoneNumber.": "This field is not a valid phone number.",
"ThisFieldMustBeBetween{0}And{1}": "This field must be between {0} and {1}.", "ThisFieldMustBeBetween{0}And{1}": "This field must be between {0} and {1}.",
"ThisFieldMustBeGreaterThanOrEqual{0}":"This field must be greater than or equal to {0}.",
"ThisFieldMustBeLessOrEqual{0}":"This field must be less than or equal to {0}.",
"ThisFieldMustMatchTheRegularExpression{0}": "This field must match the regular expression '{0}'.", "ThisFieldMustMatchTheRegularExpression{0}": "This field must match the regular expression '{0}'.",
"ThisFieldIsRequired.": "This field is required.", "ThisFieldIsRequired.": "This field is required.",
"ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "This field must be a string with a maximum length of {0}.", "ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "This field must be a string with a maximum length of {0}.",

6
modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs

@ -46,6 +46,7 @@ using Volo.CmsKit.Comments;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Reactions; using Volo.CmsKit.Reactions;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;
using Volo.CmsKit.Contents;
namespace Volo.CmsKit; namespace Volo.CmsKit;
@ -152,6 +153,11 @@ public class CmsKitWebUnifiedModule : AbpModule
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.IsEnabled = MultiTenancyConsts.IsEnabled;
}); });
Configure<CmsKitContentWidgetOptions>(options =>
{
options.AddWidget("ExComment", "CommentDate", "DecisionCommentDate");
});
} }
private void ConfigureCmsKit(ServiceConfigurationContext context) private void ConfigureCmsKit(ServiceConfigurationContext context)

11
modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/CommentDate.cshtml

@ -0,0 +1,11 @@
@model Volo.CmsKit.ViewComponents.CommentDateViewComponent
<p>Welcome Comment Date Component</p>
@if (Model.IsShow)
{
<p> @DateTime.Today.ToLongDateString()</p>
}
else
{
<p>Without date</p>
}

25
modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/CommentDateViewComponent.cs

@ -0,0 +1,25 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Widgets;
namespace Volo.CmsKit.ViewComponents;
[Widget(
AutoInitialize = true
)]
[ViewComponent(Name = "CommentDate")]
public class CommentDateViewComponent : AbpViewComponent
{
public bool IsShow { get; set; }
public CommentDateViewComponent()
{
}
public virtual async Task<IViewComponentResult> InvokeAsync(string isShow)
{
return View("~/ViewComponents/CommentDate.cshtml", new CommentDateViewComponent() { IsShow = bool.Parse(isShow) });
}
}

6
modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/DecisionCommentDate.cshtml

@ -0,0 +1,6 @@
@using Volo.CmsKit.ViewComponents
@model DecisionCommentDateViewModel
<div class="form-check mb-3">
<abp-input asp-for="IsShow" />
</div>

32
modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/DecisionCommentDateViewComponent.cs

@ -0,0 +1,32 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Widgets;
using Volo.Abp.Localization;
namespace Volo.CmsKit.ViewComponents;
[Widget(
AutoInitialize = true
)]
[ViewComponent(Name = "DecisionCommentDate")]
public class DecisionCommentDateViewComponent : AbpViewComponent
{
public DecisionCommentDateViewComponent()
{
}
public virtual async Task<IViewComponentResult> InvokeAsync()
{
return View("~/ViewComponents/DecisionCommentDate.cshtml", new DecisionCommentDateViewModel());
}
}
public class DecisionCommentDateViewModel
{
[DisplayName("Show date in the component")]
public bool IsShow { get; set; } = true;
}

0
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/_ViewImports.cshtml → modules/cms-kit/host/Volo.CmsKit.Web.Unified/_ViewImports.cshtml

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml

@ -98,3 +98,4 @@
} }
</abp-card-footer> </abp-card-footer>
</abp-card> </abp-card>
<input hidden id="GeneratedWidgetText" />

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml

@ -95,3 +95,4 @@
<abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-blog-post-update" /> <abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-blog-post-update" />
</abp-card-footer> </abp-card-footer>
</abp-card> </abp-card>
<input hidden id="GeneratedWidgetText" />

21
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js

@ -7,7 +7,7 @@ $(function () {
Published: 1, Published: 1,
SendToReview: 2 SendToReview: 2
}; };
var $selectBlog = $('#BlogSelectionSelect'); var $selectBlog = $('#BlogSelectionSelect');
var $formCreate = $('#form-blog-post-create'); var $formCreate = $('#form-blog-post-create');
var $title = $('#ViewModel_Title'); var $title = $('#ViewModel_Title');
@ -250,21 +250,17 @@ $(function () {
var fileUploadUri = "/api/cms-kit-admin/media/blogpost"; var fileUploadUri = "/api/cms-kit-admin/media/blogpost";
var fileUriPrefix = "/api/cms-kit/media/"; var fileUriPrefix = "/api/cms-kit/media/";
initAllEditors(); initEditor();
function initAllEditors() { var editor;
$('.content-editor').each(function (i, item) {
initEditor(item);
});
}
function initEditor(element) { function initEditor() {
var $editorContainer = $(element); var $editorContainer = $("#ContentEditor");
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
var editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
usageStatistics: false, usageStatistics: false,
useCommandShortcut: true, useCommandShortcut: true,
@ -333,6 +329,11 @@ $(function () {
}); });
} }
$('#GeneratedWidgetText').on('change', function () {
var txt = $('#GeneratedWidgetText').val();
editor.insertText(txt);
});
function createAddWidgetButton() { function createAddWidgetButton() {
const button = document.createElement('button'); const button = document.createElement('button');

20
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js

@ -161,21 +161,16 @@ $(function () {
var fileUploadUri = "/api/cms-kit-admin/media/blogpost"; var fileUploadUri = "/api/cms-kit-admin/media/blogpost";
var fileUriPrefix = "/api/cms-kit/media/"; var fileUriPrefix = "/api/cms-kit/media/";
initAllEditors(); initEditor();
function initAllEditors() { var editor;
$('.content-editor').each(function (i, item) { function initEditor() {
initEditor(item); var $editorContainer = $("#ContentEditor");
});
}
function initEditor(element) {
var $editorContainer = $(element);
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
var editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
usageStatistics: false, usageStatistics: false,
useCommandShortcut: true, useCommandShortcut: true,
@ -255,6 +250,11 @@ $(function () {
); );
}); });
$('#GeneratedWidgetText').on('change', function () {
var txt = $('#GeneratedWidgetText').val();
editor.insertText(txt);
});
function createAddWidgetButton() { function createAddWidgetButton() {
const button = document.createElement('button'); const button = document.createElement('button');

14
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml

@ -1,5 +1,6 @@
@page @page
@using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Localization @using Volo.CmsKit.Localization
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Contents; @using Volo.CmsKit.Admin.Web.Pages.CmsKit.Contents;
@ -20,15 +21,17 @@
<div class="container"> <div class="container">
@if (Model.Widgets.Count() > 1) @if (Model.Widgets.Count() > 1)
{ {
<abp-select asp-for="ViewModel.Widget" /> <abp-select asp-for="ViewModel.Widget" />
foreach (var item in Model.ViewModel.Details) foreach (var item in Model.ViewModel.Details)
{ {
<div hidden id="editor-@item.Name">@await Component.InvokeAsync(@item.EditorComponentName)</div> <div hidden id="editor-@item.Name">
<form data-check-form-on-close="false">
@await Component.InvokeAsync(@item.EditorComponentName)
</form>
</div>
} }
<div class="mb-3" id="PropertySideId">
</div>
<button class="btn btn-primary float-end" type="submit" id="save-changes">@L["Add"]</button>
} }
else else
{ {
@ -36,4 +39,7 @@
} }
</div> </div>
</abp-modal-body> </abp-modal-body>
<abp-modal-footer>
<button class="btn btn-primary float-end save-changes" type="submit">@L["Add"]</button>
</abp-modal-footer>
</abp-modal> </abp-modal>

54
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/addWidgetModal.js

@ -3,6 +3,8 @@ $(function () {
abp.modals.addWidgetModal = function () { abp.modals.addWidgetModal = function () {
var initModal = function () { var initModal = function () {
var activeEditor;
var activeForm;
let widgetName, widgetType; let widgetName, widgetType;
$("#ViewModel_Widget").change(function () { $("#ViewModel_Widget").change(function () {
@ -11,54 +13,28 @@ $(function () {
$('.widget-detail').attr('hidden', 'true'); $('.widget-detail').attr('hidden', 'true');
$('#editor-' + widgetName).removeAttr('hidden'); activeEditor = $('#editor-' + widgetName);
}); activeEditor.removeAttr('hidden');
$("#save-changes").click(function () {
var widgetKey = $("#WidgetCode").val();
if (widgetKey != undefined) {
let html = " <input hidden class=\"properties form-control\" value=\"" + widgetKey + "\" id=\"Code\" type=\"text\" />"
$("#PropertySideId").append(html);
}
var keys = []; activeForm = $('#editor-' + widgetName + ' form');
var values = []; });
$(".properties").each(function () {
if (($.trim($(this).val()).length > 0)) {
keys.push(this.id);
values.push($(this).val());
}
});
var contentEditorText = $("#ContentEditor")[0].innerText $(".save-changes").click(function () {
.replace('WritePreview', '')
.replace('MarkdownWYSIWYG', '')
.replace('W', '');
let updatedText = ''; let properties = activeForm.serializeFormToObject();
if (widgetType != undefined) {
updatedText = "[Widget Type=\"" + widgetType + "\" "; let widgetText = "[Widget Type=\"" + widgetType + "\" ";
for (var i = 0; i < keys.length; i++) { for (var propertyName in properties) {
updatedText += keys[i] + "=\"" + values[i]; if (!propertyName.includes(']') && !propertyName.includes('[')) {
updatedText += i == (keys.length - 1) ? "\"" : "\" "; widgetText += propertyName + "=\"" + properties[propertyName] + "\" ";
} }
updatedText += "]";
} }
if (contentEditorText == '\n\n\n') { widgetText = widgetText.trim() + "]";
//TODO fails event
var fixedData = "<div>" + updatedText + "</div>";
var innerHtml = $("#ContentEditor")[0].innerHTML;
var replacedInnerHtml = innerHtml.replace('<div><br></div>', fixedData);
$("#ContentEditor")[0].innerHTML = replacedInnerHtml;
}
else {
$('.ProseMirror div').contents()[0].data = contentEditorText + updatedText;
}
$('#GeneratedWidgetText').val(widgetText);
$("#GeneratedWidgetText").trigger("change");
$('#addWidgetModal').modal('hide'); $('#addWidgetModal').modal('hide');
}); });
}; };

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml

@ -76,3 +76,4 @@
<abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-page-create" /> <abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-page-create" />
</abp-card-footer> </abp-card-footer>
</abp-card> </abp-card>
<input hidden id="GeneratedWidgetText" />

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml

@ -83,3 +83,4 @@
<abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-page-update" /> <abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-page-update" />
</abp-card-footer> </abp-card-footer>
</abp-card> </abp-card>
<input hidden id="GeneratedWidgetText" />

25
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js

@ -89,21 +89,16 @@ $(function () {
var fileUploadUri = "/api/cms-kit-admin/media/page"; var fileUploadUri = "/api/cms-kit-admin/media/page";
var fileUriPrefix = "/api/cms-kit/media/"; var fileUriPrefix = "/api/cms-kit/media/";
initAllEditors(); initEditor();
function initAllEditors() { var editor;
$('.content-editor').each(function (i, item) { function initEditor() {
initEditor(item); var $editorContainer = $("#ContentEditor");
});
}
function initEditor(element) {
var $editorContainer = $(element);
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
var editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
usageStatistics: false, usageStatistics: false,
useCommandShortcut: true, useCommandShortcut: true,
@ -138,7 +133,7 @@ $(function () {
} }
}); });
} }
function uploadFile(blob, callback, source) { function uploadFile(blob, callback, source) {
var UPPY_OPTIONS = { var UPPY_OPTIONS = {
endpoint: fileUploadUri, endpoint: fileUploadUri,
@ -171,8 +166,12 @@ $(function () {
}); });
} }
$('#GeneratedWidgetText').on('change',function () {
var txt = $('#GeneratedWidgetText').val();
editor.insertText(txt);
});
function createAddWidgetButton() { function createAddWidgetButton() {
//TODO add auth
const button = document.createElement('button'); const button = document.createElement('button');
button.className = 'toastui-editor-toolbar-icons last dropdown'; button.className = 'toastui-editor-toolbar-icons last dropdown';

20
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js

@ -59,21 +59,16 @@ $(function () {
var fileUploadUri = "/api/cms-kit-admin/media/page"; var fileUploadUri = "/api/cms-kit-admin/media/page";
var fileUriPrefix = "/api/cms-kit/media/"; var fileUriPrefix = "/api/cms-kit/media/";
initAllEditors(); initEditor();
function initAllEditors() { var editor;
$('.content-editor').each(function (i, item) { function initEditor() {
initEditor(item); var $editorContainer = $("#ContentEditor");
});
}
function initEditor(element) {
var $editorContainer = $(element);
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
var editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
usageStatistics: false, usageStatistics: false,
useCommandShortcut: true, useCommandShortcut: true,
@ -141,6 +136,11 @@ $(function () {
}); });
} }
$('#GeneratedWidgetText').on('change', function () {
var txt = $('#GeneratedWidgetText').val();
editor.insertText(txt);
});
function createAddWidgetButton() { function createAddWidgetButton() {
const button = document.createElement('button'); const button = document.createElement('button');

2
modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/CmsKitContentWidgetOptions.cs

@ -11,7 +11,7 @@ public class CmsKitContentWidgetOptions
WidgetConfigs = new(); WidgetConfigs = new();
} }
public void AddWidget(string widgetKey, string widgetName, string editorWidgetName = null) public void AddWidget(string widgetKey, string widgetName, string editorWidgetName)
{ {
var config = new ContentWidgetConfig(widgetName, editorWidgetName); var config = new ContentWidgetConfig(widgetName, editorWidgetName);
WidgetConfigs.Add(widgetKey, config); WidgetConfigs.Add(widgetKey, config);

1
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml

@ -40,6 +40,7 @@
{ {
@await Component.InvokeAsync(contentFragment.GetProperty<string>("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) @await Component.InvokeAsync(contentFragment.GetProperty<string>("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject())
} }
} }
</abp-card-body> </abp-card-body>
</abp-card> </abp-card>

27
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentAdminAppService_Tests.cs

@ -0,0 +1,27 @@
using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.CmsKit.Admin.Contents;
using Xunit;
namespace Volo.CmsKit.Contents;
public class ContentAdminAppService_Tests : CmsKitApplicationTestBase
{
private readonly IContentAdminAppService _contentAdminAppService;
public ContentAdminAppService_Tests()
{
_contentAdminAppService = GetRequiredService<IContentAdminAppService>();
}
[Fact]
public async Task ShouldGet_PagedListAsync()
{
var widgets = await _contentAdminAppService.GetWidgetsAsync();
widgets.Items.Count.ShouldBe(0);
widgets.Items.Any().ShouldBeFalse();
}
}

12
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs

@ -20,8 +20,8 @@ public class ContentParser_Test : CmsKitDomainTestBase
[Fact] [Fact]
public async Task ParseAsync_ShouldWorkWithDifferentWidgetTypes() public async Task ParseAsync_ShouldWorkWithDifferentWidgetTypes()
{ {
_options.Value.AddWidget(testData.PollName, testData.WidgetName); _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
_options.Value.AddWidget("ImageGallery", "ImageGallery"); _options.Value.AddWidget("ImageGallery", "ImageGallery", string.Empty);
contentParser = new ContentParser(_options); contentParser = new ContentParser(_options);
var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
@ -54,7 +54,7 @@ public class ContentParser_Test : CmsKitDomainTestBase
[Fact] [Fact]
public async Task ParseAsync_ShouldWorkWithWrongConfigOptions() public async Task ParseAsync_ShouldWorkWithWrongConfigOptions()
{ {
_options.Value.AddWidget(testData.WidgetName, testData.PollName); _options.Value.AddWidget(testData.WidgetName, testData.PollName, string.Empty);
contentParser = new ContentParser(_options); contentParser = new ContentParser(_options);
var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
@ -70,7 +70,7 @@ public class ContentParser_Test : CmsKitDomainTestBase
[Fact] [Fact]
public async Task ParseAsync_ShouldWorkWithWrongWidgetType() public async Task ParseAsync_ShouldWorkWithWrongWidgetType()
{ {
_options.Value.AddWidget(testData.PollName, testData.WidgetName); _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
contentParser = new ContentParser(_options); contentParser = new ContentParser(_options);
var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
@ -86,7 +86,7 @@ public class ContentParser_Test : CmsKitDomainTestBase
[Fact] [Fact]
public async Task ParseAsync_ShouldWorkWithWrongPollName() public async Task ParseAsync_ShouldWorkWithWrongPollName()
{ {
_options.Value.AddWidget(testData.PollName, testData.WidgetName); _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
contentParser = new ContentParser(_options); contentParser = new ContentParser(_options);
var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. var content = @"**ABP Framework** is completely open source and developed in a community-driven manner.
@ -103,7 +103,7 @@ public class ContentParser_Test : CmsKitDomainTestBase
[MemberData(nameof(ExampleData))] [MemberData(nameof(ExampleData))]
public async Task ParseAsync_ShouldWorkProperlyWithCorrectInputs(string content, int expectedLine) public async Task ParseAsync_ShouldWorkProperlyWithCorrectInputs(string content, int expectedLine)
{ {
_options.Value.AddWidget(testData.PollName, testData.WidgetName); _options.Value.AddWidget(testData.PollName, testData.WidgetName, string.Empty);
contentParser = new ContentParser(_options); contentParser = new ContentParser(_options);
var widgets = await contentParser.ParseAsync(content); var widgets = await contentParser.ParseAsync(content);

14
modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs

@ -23,9 +23,10 @@ public class EfCoreOpenIddictScopeRepository : EfCoreRepository<IOpenIddictDbCon
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return await (await GetDbSetAsync()) return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) .WhereIf(!filter.IsNullOrWhiteSpace(), x =>
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) x.Name.Contains(filter) ||
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) x.DisplayName.Contains(filter) ||
x.Description.Contains(filter))
.OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting)
.PageBy(skipCount, maxResultCount) .PageBy(skipCount, maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
@ -34,9 +35,10 @@ public class EfCoreOpenIddictScopeRepository : EfCoreRepository<IOpenIddictDbCon
public async Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default) public async Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default)
{ {
return await (await GetDbSetAsync()) return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) .WhereIf(!filter.IsNullOrWhiteSpace(), x =>
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) x.Name.Contains(filter) ||
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) x.DisplayName.Contains(filter) ||
x.Description.Contains(filter))
.LongCountAsync(GetCancellationToken(cancellationToken)); .LongCountAsync(GetCancellationToken(cancellationToken));
} }

8
modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MongoDB.Driver; using MongoDB.Driver;
@ -67,12 +68,15 @@ public class MongoOpenIddictAuthorizationRepository : MongoDbRepository<OpenIddi
public virtual async Task<List<OpenIddictAuthorization>> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default) public virtual async Task<List<OpenIddictAuthorization>> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default)
{ {
var tokenQueryable = await GetMongoQueryableAsync<OpenIddictToken>(GetCancellationToken(cancellationToken)); var tokenQueryable = await GetMongoQueryableAsync<OpenIddictToken>(GetCancellationToken(cancellationToken));
return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)))
var authorizations = await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)))
.Where(x => x.CreationDate < date) .Where(x => x.CreationDate < date)
.Where(x => x.Status != OpenIddictConstants.Statuses.Valid || .Where(x => x.Status != OpenIddictConstants.Statuses.Valid ||
(x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc && tokenQueryable.Any(t => t.AuthorizationId == x.Id))) (x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc))
.OrderBy(x => x.Id) .OrderBy(x => x.Id)
.Take(count) .Take(count)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
return authorizations.Where(x => tokenQueryable.Any(t => t.AuthorizationId == x.Id)).ToList();
} }
} }

14
modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs

@ -22,9 +22,10 @@ public class MongoOpenIddictScopeRepository : MongoDbRepository<OpenIddictMongoD
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return await (await GetMongoQueryableAsync(cancellationToken)) return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) .WhereIf(!filter.IsNullOrWhiteSpace(), x =>
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) x.Name.Contains(filter) ||
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) x.DisplayName.Contains(filter) ||
x.Description.Contains(filter))
.OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting)
.PageBy(skipCount, maxResultCount) .PageBy(skipCount, maxResultCount)
.As<IMongoQueryable<OpenIddictScope>>() .As<IMongoQueryable<OpenIddictScope>>()
@ -34,9 +35,10 @@ public class MongoOpenIddictScopeRepository : MongoDbRepository<OpenIddictMongoD
public async Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default) public async Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default)
{ {
return await (await GetMongoQueryableAsync(cancellationToken)) return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) .WhereIf(!filter.IsNullOrWhiteSpace(), x =>
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) x.Name.Contains(filter) ||
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) x.DisplayName.Contains(filter) ||
x.Description.Contains(filter))
.As<IMongoQueryable<OpenIddictScope>>() .As<IMongoQueryable<OpenIddictScope>>()
.LongCountAsync(GetCancellationToken(cancellationToken)); .LongCountAsync(GetCancellationToken(cancellationToken));
} }

26
modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs

@ -33,7 +33,7 @@ public class MongoOpenIddictTokenRepository : MongoDbRepository<OpenIddictMongoD
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var tokens = await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) var tokens = await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)))
.Where(x => x.ApplicationId == authorizationId) .Where(x => x.AuthorizationId == authorizationId)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
await DeleteManyAsync(tokens, autoSave, GetCancellationToken(cancellationToken)); await DeleteManyAsync(tokens, autoSave, GetCancellationToken(cancellationToken));
@ -102,16 +102,18 @@ public class MongoOpenIddictTokenRepository : MongoDbRepository<OpenIddictMongoD
public async Task<List<OpenIddictToken>> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default) public async Task<List<OpenIddictToken>> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default)
{ {
return await (from token in await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)) var authorizationIds = await (await GetMongoQueryableAsync<OpenIddictAuthorization>(cancellationToken))
join authorization in (await GetMongoQueryableAsync<OpenIddictAuthorization>(cancellationToken)) .Where(x => x.Status != OpenIddictConstants.Statuses.Valid)
on token.AuthorizationId equals authorization.Id into ta .Select(x => x.Id)
from a in ta .ToListAsync(GetCancellationToken(cancellationToken));
where token.CreationDate < date
where (token.Status != OpenIddictConstants.Statuses.Inactive && return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)))
token.Status != OpenIddictConstants.Statuses.Valid) || .Where(x => x.CreationDate < date)
(a != null && a.Status != OpenIddictConstants.Statuses.Valid) || .Where(x => (x.Status != OpenIddictConstants.Statuses.Inactive &&
token.ExpirationDate < DateTime.UtcNow x.Status != OpenIddictConstants.Statuses.Valid) ||
orderby token.Id authorizationIds.Contains(x.Id) ||
select token).Take(count).ToListAsync(GetCancellationToken(cancellationToken)); x.ExpirationDate < DateTime.UtcNow)
.OrderBy(x => x.Id)
.Take(count).ToListAsync(GetCancellationToken(cancellationToken));
} }
} }

66
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs

@ -15,10 +15,12 @@ namespace Volo.Abp.OpenIddict.Applications;
public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
{ {
private readonly IOpenIddictApplicationStore<OpenIddictApplicationModel> _applicationStore; private readonly IOpenIddictApplicationStore<OpenIddictApplicationModel> _applicationStore;
private readonly AbpOpenIddictTestData _testData;
public AbpOpenIddictApplicationStore_Tests() public AbpOpenIddictApplicationStore_Tests()
{ {
_applicationStore = ServiceProvider.GetRequiredService<IOpenIddictApplicationStore<OpenIddictApplicationModel>>(); _applicationStore = ServiceProvider.GetRequiredService<IOpenIddictApplicationStore<OpenIddictApplicationModel>>();
_testData = ServiceProvider.GetRequiredService<AbpOpenIddictTestData>();
} }
[Fact] [Fact]
@ -32,10 +34,10 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task FindByIdAsync_Should_Return_Application_If_Found() public async Task FindByIdAsync_Should_Return_Application_If_Found()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
application.ShouldNotBeNull(); application.ShouldNotBeNull();
application.ClientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); application.ClientId.ShouldBe(_testData.App1ClientId);
application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit);
application.DisplayName.ShouldBe("Test Application"); application.DisplayName.ShouldBe("Test Application");
} }
@ -51,10 +53,10 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task FindByClientIdAsync_Should_Return_Application_If_Found() public async Task FindByClientIdAsync_Should_Return_Application_If_Found()
{ {
var application = await _applicationStore.FindByClientIdAsync(AbpOpenIddictTestData.App1ClientId, CancellationToken.None); var application = await _applicationStore.FindByClientIdAsync(_testData.App1ClientId, CancellationToken.None);
application.ShouldNotBeNull(); application.ShouldNotBeNull();
application.ClientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); application.ClientId.ShouldBe(_testData.App1ClientId);
application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit);
application.DisplayName.ShouldBe("Test Application"); application.DisplayName.ShouldBe("Test Application");
} }
@ -91,12 +93,12 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task DeleteAsync() public async Task DeleteAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
application.ShouldNotBeNull(); application.ShouldNotBeNull();
await _applicationStore.DeleteAsync(application, CancellationToken.None); await _applicationStore.DeleteAsync(application, CancellationToken.None);
application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
application.ShouldBeNull(); application.ShouldBeNull();
} }
@ -131,16 +133,16 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetClientIdAsync() public async Task GetClientIdAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var clientId = await _applicationStore.GetClientIdAsync(application, CancellationToken.None); var clientId = await _applicationStore.GetClientIdAsync(application, CancellationToken.None);
clientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); clientId.ShouldBe(_testData.App1ClientId);
} }
[Fact] [Fact]
public async Task GetClientSecretAsync() public async Task GetClientSecretAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var secret = await _applicationStore.GetClientIdAsync(application, CancellationToken.None); var secret = await _applicationStore.GetClientIdAsync(application, CancellationToken.None);
secret.ShouldBe("Client1"); secret.ShouldBe("Client1");
@ -149,7 +151,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetClientTypeAsync() public async Task GetClientTypeAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var clientType = await _applicationStore.GetClientTypeAsync(application, CancellationToken.None); var clientType = await _applicationStore.GetClientTypeAsync(application, CancellationToken.None);
clientType.ShouldBe(OpenIddictConstants.ClientTypes.Public); clientType.ShouldBe(OpenIddictConstants.ClientTypes.Public);
@ -158,7 +160,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetConsentTypeAsync() public async Task GetConsentTypeAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var consentType = await _applicationStore.GetConsentTypeAsync(application, CancellationToken.None); var consentType = await _applicationStore.GetConsentTypeAsync(application, CancellationToken.None);
consentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); consentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit);
@ -167,7 +169,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetDisplayNameAsync() public async Task GetDisplayNameAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var displayName = await _applicationStore.GetDisplayNameAsync(application, CancellationToken.None); var displayName = await _applicationStore.GetDisplayNameAsync(application, CancellationToken.None);
displayName.ShouldBe("Test Application"); displayName.ShouldBe("Test Application");
@ -176,16 +178,16 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetIdAsync() public async Task GetIdAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var id = await _applicationStore.GetIdAsync(application, CancellationToken.None); var id = await _applicationStore.GetIdAsync(application, CancellationToken.None);
id.ShouldBe(AbpOpenIddictTestData.App1Id.ToString()); id.ShouldBe(_testData.App1Id.ToString());
} }
[Fact] [Fact]
public async Task GetPermissionsAsync() public async Task GetPermissionsAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var permissions = await _applicationStore.GetPermissionsAsync(application, CancellationToken.None); var permissions = await _applicationStore.GetPermissionsAsync(application, CancellationToken.None);
permissions.Length.ShouldBeGreaterThan(0); permissions.Length.ShouldBeGreaterThan(0);
@ -194,7 +196,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetPostLogoutRedirectUrisAsync() public async Task GetPostLogoutRedirectUrisAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var postLogoutRedirectUris = await _applicationStore.GetPostLogoutRedirectUrisAsync(application, CancellationToken.None); var postLogoutRedirectUris = await _applicationStore.GetPostLogoutRedirectUrisAsync(application, CancellationToken.None);
postLogoutRedirectUris.Length.ShouldBe(1); postLogoutRedirectUris.Length.ShouldBe(1);
@ -204,7 +206,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetRedirectUrisAsync() public async Task GetRedirectUrisAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var redirectUris = await _applicationStore.GetRedirectUrisAsync(application, CancellationToken.None); var redirectUris = await _applicationStore.GetRedirectUrisAsync(application, CancellationToken.None);
redirectUris.Length.ShouldBe(1); redirectUris.Length.ShouldBe(1);
@ -214,7 +216,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetPropertiesAsync() public async Task GetPropertiesAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var properties = await _applicationStore.GetPropertiesAsync(application, CancellationToken.None); var properties = await _applicationStore.GetPropertiesAsync(application, CancellationToken.None);
properties.Count.ShouldBe(0); properties.Count.ShouldBe(0);
@ -223,7 +225,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task GetRequirementsAsync() public async Task GetRequirementsAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
var requirements = await _applicationStore.GetRequirementsAsync(application, CancellationToken.None); var requirements = await _applicationStore.GetRequirementsAsync(application, CancellationToken.None);
requirements.Length.ShouldBe(0); requirements.Length.ShouldBe(0);
@ -254,7 +256,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
public async Task SetClientIdAsync() public async Task SetClientIdAsync()
{ {
var clientId = Guid.NewGuid().ToString(); var clientId = Guid.NewGuid().ToString();
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetClientIdAsync(application, clientId, CancellationToken.None); await _applicationStore.SetClientIdAsync(application, clientId, CancellationToken.None);
application.ClientId.ShouldBe(clientId); application.ClientId.ShouldBe(clientId);
@ -264,7 +266,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
public async Task SetClientSecretAsync() public async Task SetClientSecretAsync()
{ {
var clientSecret = Guid.NewGuid().ToString(); var clientSecret = Guid.NewGuid().ToString();
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetClientSecretAsync(application, clientSecret, CancellationToken.None); await _applicationStore.SetClientSecretAsync(application, clientSecret, CancellationToken.None);
application.ClientSecret.ShouldBe(clientSecret); application.ClientSecret.ShouldBe(clientSecret);
@ -273,7 +275,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetClientTypeAsync() public async Task SetClientTypeAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetClientTypeAsync(application, OpenIddictConstants.ClientTypes.Confidential, CancellationToken.None); await _applicationStore.SetClientTypeAsync(application, OpenIddictConstants.ClientTypes.Confidential, CancellationToken.None);
application.Type.ShouldBe(OpenIddictConstants.ClientTypes.Confidential); application.Type.ShouldBe(OpenIddictConstants.ClientTypes.Confidential);
@ -282,7 +284,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetConsentTypeAsync() public async Task SetConsentTypeAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetConsentTypeAsync(application, OpenIddictConstants.ConsentTypes.Systematic, CancellationToken.None); await _applicationStore.SetConsentTypeAsync(application, OpenIddictConstants.ConsentTypes.Systematic, CancellationToken.None);
application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Systematic); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Systematic);
@ -292,7 +294,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
public async Task SetDisplayNameAsync() public async Task SetDisplayNameAsync()
{ {
var displayName = Guid.NewGuid().ToString(); var displayName = Guid.NewGuid().ToString();
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetDisplayNameAsync(application, displayName, CancellationToken.None); await _applicationStore.SetDisplayNameAsync(application, displayName, CancellationToken.None);
application.DisplayName.ShouldBe(displayName); application.DisplayName.ShouldBe(displayName);
@ -305,7 +307,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
displayNames = displayNames.Add(CultureInfo.GetCultureInfo("en"), "Test Application"); displayNames = displayNames.Add(CultureInfo.GetCultureInfo("en"), "Test Application");
displayNames = displayNames.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试应用程序"); displayNames = displayNames.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试应用程序");
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetDisplayNamesAsync(application, displayNames, CancellationToken.None); await _applicationStore.SetDisplayNamesAsync(application, displayNames, CancellationToken.None);
application.DisplayNames.ShouldContain("Test Application"); application.DisplayNames.ShouldContain("Test Application");
@ -315,7 +317,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetPermissionsAsync() public async Task SetPermissionsAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetPermissionsAsync(application, ImmutableArray.Create(OpenIddictConstants.Permissions.Endpoints.Authorization), CancellationToken.None); await _applicationStore.SetPermissionsAsync(application, ImmutableArray.Create(OpenIddictConstants.Permissions.Endpoints.Authorization), CancellationToken.None);
application.Permissions.ShouldBe("[\""+OpenIddictConstants.Permissions.Endpoints.Authorization+"\"]"); application.Permissions.ShouldBe("[\""+OpenIddictConstants.Permissions.Endpoints.Authorization+"\"]");
@ -324,7 +326,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetPostLogoutRedirectUrisAsync() public async Task SetPostLogoutRedirectUrisAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetPostLogoutRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None); await _applicationStore.SetPostLogoutRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None);
application.PostLogoutRedirectUris.ShouldBe("[\"https://abp.io\"]"); application.PostLogoutRedirectUris.ShouldBe("[\"https://abp.io\"]");
@ -333,7 +335,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetPropertiesAsync() public async Task SetPropertiesAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetPropertiesAsync(application, ImmutableDictionary.Create<string, JsonElement>(), CancellationToken.None); await _applicationStore.SetPropertiesAsync(application, ImmutableDictionary.Create<string, JsonElement>(), CancellationToken.None);
application.Properties.ShouldBeNull(); application.Properties.ShouldBeNull();
@ -342,7 +344,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetRedirectUrisAsync() public async Task SetRedirectUrisAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None); await _applicationStore.SetRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None);
application.RedirectUris.ShouldBe("[\"https://abp.io\"]"); application.RedirectUris.ShouldBe("[\"https://abp.io\"]");
@ -351,7 +353,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task SetRequirementsAsync() public async Task SetRequirementsAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
await _applicationStore.SetRequirementsAsync(application, ImmutableArray.Create(OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange), CancellationToken.None); await _applicationStore.SetRequirementsAsync(application, ImmutableArray.Create(OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange), CancellationToken.None);
application.Requirements.ShouldBe("[\""+OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange+"\"]"); application.Requirements.ShouldBe("[\""+OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange+"\"]");
@ -360,7 +362,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
[Fact] [Fact]
public async Task UpdateAsync() public async Task UpdateAsync()
{ {
var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
application.ClientId = "new_client_id"; application.ClientId = "new_client_id";
application.Type = OpenIddictConstants.ClientTypes.Public; application.Type = OpenIddictConstants.ClientTypes.Public;
application.RedirectUris = "https://new_logout_uri"; application.RedirectUris = "https://new_logout_uri";
@ -368,7 +370,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase
application.DisplayName = "new_display_name"; application.DisplayName = "new_display_name";
await _applicationStore.UpdateAsync(application, CancellationToken.None); await _applicationStore.UpdateAsync(application, CancellationToken.None);
application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None);
application.ShouldNotBeNull(); application.ShouldNotBeNull();
application.ClientId.ShouldBe("new_client_id"); application.ClientId.ShouldBe("new_client_id");

128
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs

@ -0,0 +1,128 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using OpenIddict.Abstractions;
using Shouldly;
using Xunit;
namespace Volo.Abp.OpenIddict.Authorizations;
public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase
{
private readonly IOpenIddictAuthorizationStore<OpenIddictAuthorizationModel> _authorizationStore;
private readonly AbpOpenIddictTestData _testData;
public AbpOpenIddictAuthorizationStore_Tests()
{
_authorizationStore = ServiceProvider.GetRequiredService<IOpenIddictAuthorizationStore<OpenIddictAuthorizationModel>>();
_testData = ServiceProvider.GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task CountAsync()
{
var count = await _authorizationStore.CountAsync(CancellationToken.None);
count.ShouldBe(2);
}
[Fact]
public async Task CreateAsync()
{
var id = Guid.NewGuid();
await _authorizationStore.CreateAsync(new OpenIddictAuthorizationModel {
Id = id,
ApplicationId = _testData.App1Id,
Status = "TestStatus3",
Subject = "TestSubject3",
Type = OpenIddictConstants.AuthorizationTypes.Permanent
}, CancellationToken.None);
var authorization = await _authorizationStore.FindByIdAsync(id.ToString(), CancellationToken.None);
authorization.ShouldNotBeNull();
authorization.Status.ShouldBe("TestStatus3");
authorization.Subject.ShouldBe("TestSubject3");
authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent);
}
[Fact]
public async Task DeleteAsync()
{
var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None);
await _authorizationStore.DeleteAsync(authorization, CancellationToken.None);
authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None);
authorization.ShouldBeNull();
}
[Fact]
public async Task FindByIdAsync_Should_Return_Null_If_Not_Found()
{
var authorization = await _authorizationStore.FindByIdAsync(new Guid().ToString(), CancellationToken.None);
authorization.ShouldBeNull();
}
[Fact]
public async Task FindByIdAsync_Should_Return_Authorization_If_Not_Found()
{
var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None);
authorization.ShouldNotBeNull();
authorization.Status.ShouldBe("TestStatus1");
authorization.Subject.ShouldBe("TestSubject1");
authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent);
}
[Fact]
public async Task FindByApplicationIdAsync_Should_Return_Empty_If_Not_Found()
{
var authorizations = await _authorizationStore.FindByApplicationIdAsync(new Guid().ToString(), CancellationToken.None).ToListAsync();
authorizations.Count.ShouldBe(0);
}
[Fact]
public async Task FindByApplicationIdAsync_Should_Return_Authorizations_If_Found()
{
var authorizations = await _authorizationStore.FindByApplicationIdAsync(_testData.App1Id.ToString(), CancellationToken.None).ToListAsync();
authorizations.Count.ShouldBe(1);
}
[Fact]
public async Task FindBySubjectAsync_Should_Return_Empty_If_Not_Found()
{
var authorizations = await _authorizationStore.FindBySubjectAsync(new Guid().ToString(), CancellationToken.None).ToListAsync();
authorizations.Count.ShouldBe(0);
}
[Fact]
public async Task FindBySubjectAsync_Should_Return_Authorizations_If_Found()
{
var authorizations = await _authorizationStore.FindBySubjectAsync("TestSubject1", CancellationToken.None).ToListAsync();
authorizations.Count.ShouldBe(1);
}
[Fact]
public async Task UpdateAsync()
{
var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None);
authorization.Status = "New status";
authorization.Subject = "New subject";
authorization.Type = OpenIddictConstants.AuthorizationTypes.AdHoc;
authorization.ApplicationId = _testData.App2Id;
await _authorizationStore.UpdateAsync(authorization, CancellationToken.None);
authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None);
authorization.Status.ShouldBe("New status");
authorization.Subject.ShouldBe("New subject");
authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.AdHoc);
authorization.ApplicationId.ShouldBe(_testData.App2Id);
}
}

2
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs

@ -12,5 +12,5 @@ namespace Volo.Abp.OpenIddict;
)] )]
public class OpenIddictDomainTestModule : AbpModule public class OpenIddictDomainTestModule : AbpModule
{ {
} }

324
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore_Tests.cs

@ -0,0 +1,324 @@
using System;
using System.Collections.Immutable;
using System.Globalization;
using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using OpenIddict.Abstractions;
using Shouldly;
using Xunit;
namespace Volo.Abp.OpenIddict.Scopes;
public class AbpOpenIddictScopeStore_Tests : OpenIddictDomainTestBase
{
private readonly IOpenIddictScopeStore<OpenIddictScopeModel> _scopeStore;
private readonly AbpOpenIddictTestData _testData;
public AbpOpenIddictScopeStore_Tests()
{
_scopeStore = ServiceProvider.GetRequiredService<IOpenIddictScopeStore<OpenIddictScopeModel>>();
_testData = ServiceProvider.GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task CountAsync()
{
var count = await _scopeStore.CountAsync(CancellationToken.None);
count.ShouldBe(2);
}
[Fact]
public async Task CreateAsync()
{
await _scopeStore.CreateAsync(
new OpenIddictScopeModel {
Name = "scope3", Description = "scope3 description", DisplayName = "scope3 display name"
}, CancellationToken.None);
var scope = await _scopeStore.FindByNameAsync("scope3", CancellationToken.None);
scope.ShouldNotBeNull();
scope.Name.ShouldBe("scope3");
scope.Description.ShouldBe("scope3 description");
scope.DisplayName.ShouldBe("scope3 display name");
scope.Descriptions.ShouldBeNull();
scope.DisplayNames.ShouldBeNull();
scope.Resources.ShouldBeNull();
}
[Fact]
public async Task DeleteAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.DeleteAsync(scope, CancellationToken.None);
scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
scope.ShouldBeNull();
}
[Fact]
public async Task FindByIdAsync_Should_Return_Null_If_Not_Found()
{
var nonExistingId = Guid.NewGuid().ToString();
var scope = await _scopeStore.FindByIdAsync(nonExistingId, CancellationToken.None);
scope.ShouldBeNull();
}
[Fact]
public async Task FindByIdAsync_Should_Return_Scope_If_Found()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
scope.ShouldNotBeNull();
scope.Name.ShouldBe(_testData.Scope1Name);
scope.DisplayName.ShouldBe("Test Scope 1");
scope.Description.ShouldBe("Test Scope 1");
scope.DisplayNames.ShouldContain("测试范围1");
scope.DisplayNames.ShouldContain("Test Kapsamı 1");
scope.Resources.ShouldBe("[\"TestScope1Resource\"]");
}
[Fact]
public async Task FindByNameAsync_Should_Return_Null_If_Not_Found()
{
var nonExistingName = Guid.NewGuid().ToString();
var scope = await _scopeStore.FindByNameAsync(nonExistingName, CancellationToken.None);
scope.ShouldBeNull();
}
[Fact]
public async Task FindByNameAsync_Should_Return_Application_If_Found()
{
var scope = await _scopeStore.FindByNameAsync(_testData.Scope1Name, CancellationToken.None);
scope.ShouldNotBeNull();
scope.Name.ShouldBe(_testData.Scope1Name);
scope.DisplayName.ShouldBe("Test Scope 1");
scope.Description.ShouldBe("Test Scope 1");
scope.DisplayNames.ShouldContain("测试范围1");
scope.DisplayNames.ShouldContain("Test Kapsamı 1");
scope.Resources.ShouldBe("[\"TestScope1Resource\"]");
}
[Fact]
public async Task FindByNamesAsync_Should_Return_Empty_If_Not_Found()
{
var scopes = await _scopeStore
.FindByNamesAsync(ImmutableArray.Create("non-existing-name"), CancellationToken.None).ToListAsync();
scopes.Count.ShouldBe(0);
}
[Fact]
public async Task FindByNamesAsync_Should_Return_Scopes_If_Found()
{
var scopes = await _scopeStore
.FindByNamesAsync(ImmutableArray.Create("Scope1", "Scope2", "Scope3"), CancellationToken.None)
.ToListAsync();
scopes.Count.ShouldBe(2);
}
[Fact]
public async Task FindByResourceAsync_Should_Return_Empty_If_Not_Found()
{
var scopes = await _scopeStore.FindByResourceAsync("non-existing-resource", CancellationToken.None)
.ToListAsync();
scopes.Count.ShouldBe(0);
}
[Fact]
public async Task FindByResourceAsync_Should_Return_Scopes_If_Found()
{
var scopes = await _scopeStore.FindByResourceAsync("TestScope1Resource", CancellationToken.None).ToListAsync();
scopes.Count.ShouldBe(1);
}
[Fact]
public async Task GetDescriptionAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var description = await _scopeStore.GetDescriptionAsync(scope, CancellationToken.None);
description.ShouldBe("Test Scope 1");
}
[Fact]
public async Task GetDescriptionsAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var descriptions = await _scopeStore.GetDescriptionsAsync(scope, CancellationToken.None);
descriptions.Count.ShouldBe(0);
}
[Fact]
public async Task GetDisplayNameAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var displayName = await _scopeStore.GetDisplayNameAsync(scope, CancellationToken.None);
displayName.ShouldBe("Test Scope 1");
}
[Fact]
public async Task GetDisplayNamesAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var displayNames = await _scopeStore.GetDisplayNamesAsync(scope, CancellationToken.None);
displayNames.Count.ShouldBe(2);
}
[Fact]
public async Task GetIdAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var id = await _scopeStore.GetIdAsync(scope, CancellationToken.None);
id.ShouldBe(_testData.Scope1Id.ToString());
}
[Fact]
public async Task GetNameAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var name = await _scopeStore.GetNameAsync(scope, CancellationToken.None);
name.ShouldBe("Scope1");
}
[Fact]
public async Task GetPropertiesAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var properties = await _scopeStore.GetPropertiesAsync(scope, CancellationToken.None);
properties.Count.ShouldBe(0);
}
[Fact]
public async Task GetResourcesAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
var resources = await _scopeStore.GetResourcesAsync(scope, CancellationToken.None);
resources.Length.ShouldBe(1);
resources.First().ShouldBe("TestScope1Resource");
}
[Fact]
public async Task InstantiateAsync()
{
var scope = await _scopeStore.InstantiateAsync(CancellationToken.None);
scope.ShouldNotBeNull();
}
[Fact]
public async Task ListAsync_Should_Return_Empty_If_Not_Found()
{
var scopes = await _scopeStore.ListAsync(2, 2, CancellationToken.None).ToListAsync();
scopes.Count.ShouldBe(0);
}
[Fact]
public async Task ListAsync_Should_Return_Applications_If_Found()
{
var scopes = await _scopeStore.ListAsync(2, 0, CancellationToken.None).ToListAsync();
scopes.Count.ShouldBe(2);
}
[Fact]
public async Task SetDescriptionAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetDescriptionAsync(scope, "New Test Scope 1 Description", CancellationToken.None);
scope.Description.ShouldBe("New Test Scope 1 Description");
}
[Fact]
public async Task SetDescriptionsAsync()
{
var descriptions = ImmutableDictionary.Create<CultureInfo, string>();
descriptions = descriptions.Add(CultureInfo.GetCultureInfo("en"), "Test Scope");
descriptions = descriptions.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试范围");
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetDescriptionsAsync(scope, descriptions, CancellationToken.None);
scope.Descriptions.ShouldContain("Test Scope");
scope.Descriptions.ShouldContain("测试范围");
}
[Fact]
public async Task SetDisplayNameAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetDisplayNameAsync(scope, "New Test Scope 1 Display Name", CancellationToken.None);
scope.DisplayName.ShouldBe("New Test Scope 1 Display Name");
}
[Fact]
public async Task SetDisplayNamesAsync()
{
var displayNames = ImmutableDictionary.Create<CultureInfo, string>();
displayNames = displayNames.Add(CultureInfo.GetCultureInfo("en"), "Test Scope");
displayNames = displayNames.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试范围");
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetDisplayNamesAsync(scope, displayNames, CancellationToken.None);
scope.DisplayNames.ShouldContain("Test Scope");
scope.DisplayNames.ShouldContain("测试范围");
}
[Fact]
public async Task SetNameAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetNameAsync(scope, "New Test Scope 1 Name", CancellationToken.None);
scope.Name.ShouldBe("New Test Scope 1 Name");
}
[Fact]
public async Task SetPropertiesAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetPropertiesAsync(scope, ImmutableDictionary.Create<string, JsonElement>(),
CancellationToken.None);
scope.Properties.ShouldBeNull();
}
[Fact]
public async Task SetResourcesAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
await _scopeStore.SetResourcesAsync(scope, ImmutableArray.Create("TestScope1Resource", "TestScope1Resource2"),
CancellationToken.None);
scope.Resources.ShouldContain("TestScope1Resource");
scope.Resources.ShouldContain("TestScope1Resource2");
}
[Fact]
public async Task UpdateAsync()
{
var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
scope.Name = "New Test Scope 1 Name";
scope.DisplayName = "New Test Scope 1 Display Name";
scope.Resources = "New Test Scope 1 Resource";
scope.Properties = "New Test Scope 1 Properties";
scope.Description = "New Test Scope 1 Description";
scope.Descriptions = "New Test Scope 1 Descriptions";
scope.DisplayNames = "New Test Scope 1 Display Names";
await _scopeStore.UpdateAsync(scope, CancellationToken.None);
scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None);
scope.Name.ShouldBe("New Test Scope 1 Name");
scope.DisplayName.ShouldBe("New Test Scope 1 Display Name");
scope.Resources.ShouldBe("New Test Scope 1 Resource");
scope.Properties.ShouldBe("New Test Scope 1 Properties");
scope.Description.ShouldBe("New Test Scope 1 Description");
scope.Descriptions.ShouldBe("New Test Scope 1 Descriptions");
scope.DisplayNames.ShouldBe("New Test Scope 1 Display Names");
}
}

156
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs

@ -0,0 +1,156 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using OpenIddict.Abstractions;
using Shouldly;
using Xunit;
namespace Volo.Abp.OpenIddict.Tokens;
public class AbpOpenIddictTokenStore_Tests : OpenIddictDomainTestBase
{
private readonly IOpenIddictTokenStore<OpenIddictTokenModel> _tokenStore;
private readonly AbpOpenIddictTestData _testData;
public AbpOpenIddictTokenStore_Tests()
{
_tokenStore = ServiceProvider.GetRequiredService<IOpenIddictTokenStore<OpenIddictTokenModel>>();
_testData = ServiceProvider.GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task CountAsync()
{
var count = await _tokenStore.CountAsync(CancellationToken.None);
count.ShouldBe(2);
}
[Fact]
public async Task CreateAsync()
{
await _tokenStore.CreateAsync(new OpenIddictTokenModel
{
ApplicationId = _testData.App1Id,
Payload = "TestPayload3",
Subject = "TestSubject3",
Type = "TestType3",
Status = OpenIddictConstants.Statuses.Inactive,
}, CancellationToken.None);
var tokens = await _tokenStore.FindBySubjectAsync("TestSubject3", CancellationToken.None).ToListAsync();
tokens.Count.ShouldBe(1);
var token = tokens.First();
token.ApplicationId.ShouldBe(_testData.App1Id);
token.Payload.ShouldBe("TestPayload3");
token.Subject.ShouldBe("TestSubject3");
token.Type.ShouldBe("TestType3");
token.Status.ShouldBe(OpenIddictConstants.Statuses.Inactive);
}
[Fact]
public async Task DeleteAsync()
{
var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
await _tokenStore.DeleteAsync(token, CancellationToken.None);
token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
token.ShouldBeNull();
}
[Fact]
public async Task FindAsync_Should_Return_Empty_If_Not_Found()
{
var tokens = await _tokenStore.FindAsync("non_existing_subject", _testData.App1Id.ToString(), "non_existing_status", "non_existing_type", CancellationToken.None).ToListAsync();
tokens.Count.ShouldBe(0);
}
[Fact]
public async Task FindAsync_Should_Return_Tokens_If_Found()
{
var tokens = await _tokenStore.FindAsync("TestSubject1", _testData.App1Id.ToString(),OpenIddictConstants.Statuses.Redeemed, "TestType1", CancellationToken.None).ToListAsync();
tokens.Count.ShouldBe(1);
}
[Fact]
public async Task FindByApplicationIdAsync_Should_Return_Empty_If_Not_Found()
{
var tokens = await _tokenStore.FindByApplicationIdAsync(Guid.NewGuid().ToString(), CancellationToken.None).ToListAsync();
tokens.Count.ShouldBe(0);
}
[Fact]
public async Task FindByApplicationIdAsync_Should_Return_Tokens_If_Found()
{
var tokens = await _tokenStore.FindByApplicationIdAsync(_testData.App1Id.ToString(), CancellationToken.None).ToListAsync();
tokens.Count.ShouldBe(1);
}
[Fact]
public async Task FindByIdAsync_Should_Return_Null_If_Not_Found()
{
var nonExistingId = Guid.NewGuid().ToString();
var token = await _tokenStore.FindByIdAsync(nonExistingId, CancellationToken.None);
token.ShouldBeNull();
}
[Fact]
public async Task FindByIdAsync_Should_Return_Token_If_Found()
{
var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
token.ShouldNotBeNull();
token.ApplicationId.ShouldBe(_testData.App1Id);
token.Payload.ShouldBe("TestPayload1");
token.Subject.ShouldBe("TestSubject1");
token.Type.ShouldBe("TestType1");
token.Status.ShouldBe(OpenIddictConstants.Statuses.Redeemed);
token.ExpirationDate.ShouldNotBeNull();
}
[Fact]
public async Task FindByReferenceIdAsync_Should_Return_Null_If_Not_Found()
{
var token = await _tokenStore.FindByReferenceIdAsync(Guid.NewGuid().ToString(), CancellationToken.None);
token.ShouldBeNull();
}
[Fact]
public async Task FindByReferenceIdAsync_Should_Return_Token_If_Found()
{
var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
token = await _tokenStore.FindByReferenceIdAsync(token.ReferenceId, CancellationToken.None);
token.ShouldNotBeNull();
}
[Fact]
public async Task UpdateAsync()
{
var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
var now = DateTime.Now;
token.ApplicationId = _testData.App2Id;
token.Payload = "New payload";
token.Status = OpenIddictConstants.Statuses.Revoked;
token.Subject = "New subject";
token.Type = "New type";
token.ExpirationDate = now;
await _tokenStore.UpdateAsync(token, CancellationToken.None);
token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None);
token.ApplicationId.ShouldBe(_testData.App2Id);
token.Payload.ShouldBe("New payload");
token.Subject.ShouldBe("New subject");
token.Type.ShouldBe("New type");
token.Status.ShouldBe(OpenIddictConstants.Statuses.Revoked);
token.ExpirationDate.ShouldBe(now);
}
}

35
modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/TokenCleanupService_Tests.cs

@ -0,0 +1,35 @@
using System.Threading.Tasks;
using OpenIddict.Abstractions;
using Shouldly;
using Xunit;
namespace Volo.Abp.OpenIddict.Tokens;
public class TokenCleanupService_Tests : OpenIddictDomainTestBase
{
private readonly IOpenIddictTokenManager _tokenManager;
private readonly IOpenIddictAuthorizationManager _authorizationManager;
private readonly TokenCleanupService _tokenCleanupService;
public TokenCleanupService_Tests()
{
_tokenManager = GetRequiredService<IOpenIddictTokenManager>();
_authorizationManager = GetRequiredService<IOpenIddictAuthorizationManager>();
_tokenCleanupService = GetRequiredService<TokenCleanupService>();
}
[Fact]
public async Task Should_Clear_Expired_Tokens()
{
var tokensCount = await _tokenManager.CountAsync();
var authorizationsCount = await _authorizationManager.CountAsync();
await _tokenCleanupService.CleanAsync();
(await _tokenManager.CountAsync())
.ShouldBe(tokensCount - 1);
(await _authorizationManager.CountAsync())
.ShouldBe(authorizationsCount - 1);
}
}

4
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj

@ -15,4 +15,8 @@
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Volo\Abp\OpenIddict" />
</ItemGroup>
</Project> </Project>

6
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictApplicationRepository_Tests.cs

@ -0,0 +1,6 @@
namespace Volo.Abp.OpenIddict.EntityFrameworkCore;
public class OpenIddictApplicationRepository_Tests : OpenIddictApplicationRepository_Tests<OpenIddictEntityFrameworkCoreTestModule>
{
}

6
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictAuthorizationRepository_Tests.cs

@ -0,0 +1,6 @@
namespace Volo.Abp.OpenIddict.EntityFrameworkCore;
public class OpenIddictAuthorizationRepository_Tests : OpenIddictAuthorizationRepository_Tests<OpenIddictEntityFrameworkCoreTestModule>
{
}

0
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs → modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs

0
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs → modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs

6
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictScopeRepository_Tests.cs

@ -0,0 +1,6 @@
namespace Volo.Abp.OpenIddict.EntityFrameworkCore;
public class OpenIddictScopeRepository_Tests : OpenIddictScopeRepository_Tests<OpenIddictEntityFrameworkCoreTestModule>
{
}

6
modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictTokenRepository_Tests.cs

@ -0,0 +1,6 @@
namespace Volo.Abp.OpenIddict.EntityFrameworkCore;
public class OpenIddictTokenRepository_Tests : OpenIddictTokenRepository_Tests<OpenIddictEntityFrameworkCoreTestModule>
{
}

27
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestModule.cs

@ -1,27 +0,0 @@
using System;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.Identity.MongoDB;
namespace Volo.Abp.OpenIddict.MongoDB;
[DependsOn(
typeof(OpenIddictTestBaseModule),
typeof(AbpIdentityMongoDbModule),
typeof(AbpOpenIddictMongoDbModule)
)]
public class OpenIddictMongoDbTestModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var stringArray = MongoDbFixture.ConnectionString.Split('?');
var connectionString = stringArray[0].EnsureEndsWith('/') +
"Db_" +
Guid.NewGuid().ToString("N") + "/?" + stringArray[1];
Configure<AbpDbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = connectionString;
});
}
}

4
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj

@ -15,4 +15,8 @@
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.MongoDB\Volo.Abp.Identity.MongoDB.csproj" /> <ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.MongoDB\Volo.Abp.Identity.MongoDB.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Volo\Abp\OpenIddict" />
</ItemGroup>
</Project> </Project>

0
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoDbFixture.cs → modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoDbFixture.cs

0
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoTestCollection.cs → modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoTestCollection.cs

9
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictApplicationRepository_Tests.cs

@ -0,0 +1,9 @@
using Xunit;
namespace Volo.Abp.OpenIddict.MongoDB;
[Collection(MongoTestCollection.Name)]
public class OpenIddictApplicationRepository_Tests : OpenIddictApplicationRepository_Tests<OpenIddictMongoDbTestModule>
{
}

9
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictAuthorizationRepository_Tests.cs

@ -0,0 +1,9 @@
using Xunit;
namespace Volo.Abp.OpenIddict.MongoDB;
[Collection(MongoTestCollection.Name)]
public class OpenIddictAuthorizationRepository_Tests : OpenIddictAuthorizationRepository_Tests<OpenIddictMongoDbTestModule>
{
}

0
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestBase.cs → modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestBase.cs

57
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestModule.cs

@ -0,0 +1,57 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.Identity.MongoDB;
using Volo.Abp.MongoDB;
using Volo.Abp.Uow;
namespace Volo.Abp.OpenIddict.MongoDB;
[DependsOn(
typeof(OpenIddictTestBaseModule),
typeof(AbpIdentityMongoDbModule),
typeof(AbpOpenIddictMongoDbModule)
)]
public class OpenIddictMongoDbTestModule : AbpModule
{
private static string _connectionString;
public override void ConfigureServices(ServiceConfigurationContext context)
{
var stringArray = MongoDbFixture.ConnectionString.Split('?');
_connectionString = stringArray[0].EnsureEndsWith('/') +
"Db_" +
Guid.NewGuid().ToString("N") + "/?" + stringArray[1];
Configure<AbpDbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = _connectionString;
});
}
public override void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
Migrate(context);
}
private static void Migrate(ApplicationInitializationContext context)
{
var dbContexts = context.ServiceProvider.GetServices<IAbpMongoDbContext>();
foreach (var dbContext in dbContexts)
{
var mongoUrl = new MongoUrl(_connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);
if (databaseName.IsNullOrWhiteSpace())
{
databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
}
(dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName));
}
}
}

9
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictScopeRepository_Tests.cs

@ -0,0 +1,9 @@
using Xunit;
namespace Volo.Abp.OpenIddict.MongoDB;
[Collection(MongoTestCollection.Name)]
public class OpenIddictScopeRepository_Tests : OpenIddictScopeRepository_Tests<OpenIddictMongoDbTestModule>
{
}

9
modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictTokenRepository_Tests.cs

@ -0,0 +1,9 @@
using Xunit;
namespace Volo.Abp.OpenIddict.MongoDB;
[Collection(MongoTestCollection.Name)]
public class OpenIddictTokenRepository_Tests : OpenIddictTokenRepository_Tests<OpenIddictMongoDbTestModule>
{
}

16
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/AbpOpenIddictTestData.cs

@ -1,16 +0,0 @@
using System;
namespace Volo.Abp.OpenIddict;
public static class AbpOpenIddictTestData
{
public static Guid App1Id { get; set; } = Guid.NewGuid();
public static string App1ClientId { get; set; } = "Client1";
public static Guid App2Id { get; set; } = Guid.NewGuid();
public static string App2ClientId { get; set; } = "Client2";
public static Guid Scope1Id { get; set; } = Guid.NewGuid();
public static string Scope1Name { get; set; } = "Scope1";
public static Guid Scope2Id { get; set; } = Guid.NewGuid();
public static string Scope2Name { get; set; } = "Scope2";
}

25
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs

@ -0,0 +1,25 @@
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.OpenIddict;
public class AbpOpenIddictTestData : ISingletonDependency
{
public Guid App1Id { get; set; } = Guid.NewGuid();
public string App1ClientId { get; set; } = "Client1";
public Guid App2Id { get; set; } = Guid.NewGuid();
public string App2ClientId { get; set; } = "Client2";
public Guid Scope1Id { get; set; } = Guid.NewGuid();
public string Scope1Name { get; set; } = "Scope1";
public Guid Scope2Id { get; set; } = Guid.NewGuid();
public string Scope2Name { get; set; } = "Scope2";
public Guid Token1Id { get; set; } = Guid.NewGuid();
public Guid Token2Id { get; set; } = Guid.NewGuid();
public Guid Authorization1Id { get; set; } = Guid.NewGuid();
public Guid Authorization2Id { get; set; } = Guid.NewGuid();
}

65
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictApplicationRepository_Tests.cs

@ -0,0 +1,65 @@
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.Applications;
using Xunit;
namespace Volo.Abp.OpenIddict;
public abstract class OpenIddictApplicationRepository_Tests<TStartupModule> : OpenIddictTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IOpenIddictApplicationRepository _applicationRepository;
private readonly AbpOpenIddictTestData _testData;
protected OpenIddictApplicationRepository_Tests()
{
_applicationRepository = GetRequiredService<IOpenIddictApplicationRepository>();
_testData = GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task GetListAsync()
{
(await _applicationRepository.GetListAsync()).Count.ShouldBe(2);
(await _applicationRepository.GetListAsync("id", 1, int.MaxValue)).Count.ShouldBe(1);
(await _applicationRepository.GetListAsync("id", 0, int.MaxValue, filter: _testData.App1ClientId)).Count.ShouldBe(1);
}
[Fact]
public async Task GetCountAsync()
{
(await _applicationRepository.GetCountAsync()).ShouldBe(2);
(await _applicationRepository.GetCountAsync(filter: _testData.App1ClientId)).ShouldBe(1);
}
[Fact]
public async Task FindByClientIdAsync()
{
var application = await _applicationRepository.FindByClientIdAsync(_testData.App1ClientId);
application.ShouldNotBeNull();
application.ClientId.ShouldBe(_testData.App1ClientId);
}
[Fact]
public async Task FindByPostLogoutRedirectUriAsync()
{
var applications = await _applicationRepository.FindByPostLogoutRedirectUriAsync("https://abp.io");
applications.Count.ShouldBe(2);
}
[Fact]
public async Task FindByRedirectUriAsync()
{
var applications = await _applicationRepository.FindByRedirectUriAsync("https://abp.io");
applications.Count.ShouldBe(2);
}
[Fact]
public async Task ListAsync()
{
(await _applicationRepository.ListAsync(int.MaxValue , 0)).Count.ShouldBe(2);
(await _applicationRepository.ListAsync(int.MaxValue , 2)).Count.ShouldBe(0);
}
}

72
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs

@ -0,0 +1,72 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using OpenIddict.Abstractions;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.Authorizations;
using Xunit;
namespace Volo.Abp.OpenIddict;
public abstract class OpenIddictAuthorizationRepository_Tests<TStartupModule> : OpenIddictTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IOpenIddictAuthorizationRepository _authorizationRepository;
private readonly AbpOpenIddictTestData _testData;
public OpenIddictAuthorizationRepository_Tests()
{
_authorizationRepository = GetRequiredService<IOpenIddictAuthorizationRepository>();
_testData = GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task FindAsync()
{
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: new Guid())).Count.ShouldBe(0);
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id)).Count.ShouldBe(1);
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "NonExistsStatus")).Count.ShouldBe(0);
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1")).Count.ShouldBe(1);
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1" ,type: "NonExistsType")).Count.ShouldBe(0);
(await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1" ,type: OpenIddictConstants.AuthorizationTypes.Permanent)).Count.ShouldBe(1);
}
[Fact]
public async Task FindByApplicationIdAsync()
{
var authorizations = await _authorizationRepository.FindByApplicationIdAsync(_testData.App1Id);
authorizations.Count.ShouldBe(1);
authorizations.First().ApplicationId.ShouldBe(_testData.App1Id);
}
[Fact]
public async Task FindByIdAsync()
{
var authorization = await _authorizationRepository.FindByIdAsync(_testData.Authorization1Id);
authorization.ShouldNotBeNull();
authorization.Id.ShouldBe(_testData.Authorization1Id);
}
[Fact]
public async Task FindBySubjectAsync()
{
(await _authorizationRepository.FindBySubjectAsync(subject:"TestSubject1")).Count.ShouldBe(1);
}
[Fact]
public async Task ListAsync()
{
(await _authorizationRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2);
(await _authorizationRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0);
}
[Fact]
public async Task GetPruneListAsync()
{
var threshold = DateTime.UtcNow - TimeSpan.FromDays(14);
(await _authorizationRepository.GetPruneListAsync(threshold, int.MaxValue)).Count.ShouldBe(1);
}
}

143
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictDataSeedContributor.cs → modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs

@ -2,43 +2,59 @@
using System.Globalization; using System.Globalization;
using System.Threading.Tasks; using System.Threading.Tasks;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using OpenIddict.Core;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.OpenIddict.Applications; using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.OpenIddict.Authorizations;
using Volo.Abp.OpenIddict.Scopes; using Volo.Abp.OpenIddict.Scopes;
using Volo.Abp.OpenIddict.Tokens;
using Volo.Abp.Timing;
namespace Volo.Abp.OpenIddict; namespace Volo.Abp.OpenIddict;
public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency
{ {
private readonly IGuidGenerator _guidGenerator;
private readonly ICurrentTenant _currentTenant;
private readonly IOpenIddictApplicationManager _applicationManager; private readonly IOpenIddictApplicationManager _applicationManager;
private readonly IOpenIddictScopeManager _scopeManager; private readonly IOpenIddictScopeManager _scopeManager;
private readonly IOpenIddictTokenManager _tokenManager;
private readonly IOpenIddictAuthorizationManager _authorizationManager;
private readonly AbpOpenIddictTestData _testData;
private readonly IClock _clock;
public OpenIddictDataSeedContributor( public OpenIddictDataSeedContributor(
IGuidGenerator guidGenerator, ICurrentTenant currentTenant, IOpenIddictApplicationManager applicationManager, IOpenIddictScopeManager scopeManager) IOpenIddictApplicationManager applicationManager,
IOpenIddictScopeManager scopeManager,
IOpenIddictTokenManager tokenManager,
IOpenIddictAuthorizationManager authorizationManager,
IClock clock,
AbpOpenIddictTestData testData)
{ {
_guidGenerator = guidGenerator;
_currentTenant = currentTenant;
_applicationManager = applicationManager; _applicationManager = applicationManager;
_scopeManager = scopeManager; _scopeManager = scopeManager;
_tokenManager = tokenManager;
_authorizationManager = authorizationManager;
_clock = clock;
_testData = testData;
} }
public async Task SeedAsync(DataSeedContext context) public async Task SeedAsync(DataSeedContext context)
{ {
await CreateScopesAsync(); await CreateScopesAsync();
await CreateApplicationsAsync(); await CreateApplicationsAsync();
await CreateAuthorizationsAsync();
await CreateTokensAsync();
} }
private async Task CreateScopesAsync() private async Task CreateScopesAsync()
{ {
var scope1 = (OpenIddictScopeModel)await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() await _scopeManager.CreateAsync(await GetOpenIddictScopeModelAsync(_testData.Scope1Id, new OpenIddictScopeDescriptor
{ {
Name = AbpOpenIddictTestData.Scope1Name, Name = _testData.Scope1Name,
DisplayName = "Test Scope 1", DisplayName = "Test Scope 1",
Description = "Test Scope 1",
DisplayNames = DisplayNames =
{ {
[CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围1", [CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围1",
@ -48,13 +64,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
{ {
"TestScope1Resource" "TestScope1Resource"
} }
}); }));
AbpOpenIddictTestData.Scope1Id = scope1.Id;
await _scopeManager.CreateAsync(await GetOpenIddictScopeModelAsync(_testData.Scope2Id, new OpenIddictScopeDescriptor()
var scope2 = (OpenIddictScopeModel)await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor()
{ {
Name = AbpOpenIddictTestData.Scope2Name, Name = _testData.Scope2Name,
DisplayName = "Test Scope 2", DisplayName = "Test Scope 2",
Description = "Test Scope 2",
DisplayNames = DisplayNames =
{ {
[CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围2", [CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围2",
@ -64,16 +80,21 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
{ {
"TestScopeResource2" "TestScopeResource2"
} }
}); }));
AbpOpenIddictTestData.Scope2Id = scope2.Id;
} }
private async Task<OpenIddictScopeModel> GetOpenIddictScopeModelAsync(Guid id, OpenIddictScopeDescriptor scopeDescriptor)
{
var scope = new OpenIddictScopeModel{Id = id};
await _scopeManager.PopulateAsync(scope, scopeDescriptor);
return scope;
}
private async Task CreateApplicationsAsync() private async Task CreateApplicationsAsync()
{ {
var app1 = (OpenIddictApplicationModel)await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor await _applicationManager.CreateAsync(await GetOpenIddictApplicationModelAsync(_testData.App1Id, new OpenIddictApplicationDescriptor
{ {
ClientId = AbpOpenIddictTestData.App1ClientId, ClientId = _testData.App1ClientId,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Test Application", DisplayName = "Test Application",
RedirectUris = RedirectUris =
@ -115,14 +136,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope1Name OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope1Name
} }
}); }));
AbpOpenIddictTestData.App1Id = app1.Id;
await _applicationManager.CreateAsync(await GetOpenIddictApplicationModelAsync(_testData.App2Id, new OpenIddictApplicationDescriptor
var app2 = (OpenIddictApplicationModel)await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
{ {
ClientId = AbpOpenIddictTestData.App2ClientId, ClientId = _testData.App2ClientId,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Test Application", DisplayName = "Test Application",
RedirectUris = RedirectUris =
@ -164,10 +184,79 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope1Name, OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope1Name,
OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope2Name, OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope2Name,
} }
}); }));
AbpOpenIddictTestData.App2Id = app2.Id; }
private async Task<OpenIddictApplicationModel> GetOpenIddictApplicationModelAsync(Guid id, OpenIddictApplicationDescriptor applicationDescriptor)
{
var application = new OpenIddictApplicationModel{Id = id};
await _applicationManager.PopulateAsync(application, applicationDescriptor);
return application;
}
private async Task CreateTokensAsync()
{
await _tokenManager.CreateAsync(await GetOpenIddictTokenModelAsync(_testData.Token1Id, new OpenIddictTokenDescriptor
{
ApplicationId = _testData.App1Id.ToString(),
AuthorizationId = _testData.Authorization1Id.ToString(),
Subject = "TestSubject1",
Type = "TestType1",
Status = OpenIddictConstants.Statuses.Redeemed,
Payload = "TestPayload1",
ReferenceId = "TestReferenceId1",
ExpirationDate = _clock.Now.AddDays(-30),
CreationDate = _clock.Now.AddDays(-30)
}));
await _tokenManager.CreateAsync(await GetOpenIddictTokenModelAsync(_testData.Token2Id, new OpenIddictTokenDescriptor
{
ApplicationId = _testData.App2Id.ToString(),
AuthorizationId = _testData.Authorization2Id.ToString(),
Subject = "TestSubject2",
Type = "TestType2",
Status = OpenIddictConstants.Statuses.Valid,
Payload = "TestPayload2",
ReferenceId = "TestReferenceId2",
}));
}
private async Task<OpenIddictTokenModel> GetOpenIddictTokenModelAsync(Guid id, OpenIddictTokenDescriptor tokenDescriptor)
{
var token = new OpenIddictTokenModel{Id = id};
await _tokenManager.PopulateAsync(token, tokenDescriptor);
return token;
}
private async Task CreateAuthorizationsAsync()
{
await _authorizationManager.CreateAsync(await GetOpenIddictAuthorizationModelAsync(_testData.Authorization1Id, new OpenIddictAuthorizationDescriptor
{
ApplicationId = _testData.App1Id.ToString(),
Status = "TestStatus1",
Subject = "TestSubject1",
Type = OpenIddictConstants.AuthorizationTypes.Permanent,
CreationDate = _clock.Now.AddDays(-30)
}));
await _authorizationManager.CreateAsync(await GetOpenIddictAuthorizationModelAsync(_testData.Authorization2Id, new OpenIddictAuthorizationDescriptor
{
ApplicationId = _testData.App2Id.ToString(),
Status = "TestStatus2",
Subject = "TestSubject2",
Type = OpenIddictConstants.AuthorizationTypes.AdHoc,
CreationDate = _clock.Now
}));
}
private async Task<OpenIddictAuthorizationModel> GetOpenIddictAuthorizationModelAsync(Guid id, OpenIddictAuthorizationDescriptor authorizationDescriptor)
{
var authorization = new OpenIddictAuthorizationModel{Id = id};
await _authorizationManager.PopulateAsync(authorization, authorizationDescriptor);
return authorization;
} }
} }

71
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictScopeRepository_Tests.cs

@ -0,0 +1,71 @@
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.Scopes;
using Xunit;
namespace Volo.Abp.OpenIddict;
public abstract class OpenIddictScopeRepository_Tests<TStartupModule> : OpenIddictTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IOpenIddictScopeRepository _scopeRepository;
private readonly AbpOpenIddictTestData _testData;
public OpenIddictScopeRepository_Tests()
{
_scopeRepository = GetRequiredService<IOpenIddictScopeRepository>();
_testData = GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task GetListAsync()
{
(await _scopeRepository.GetListAsync("id", 0, int.MaxValue)).Count.ShouldBe(2);
(await _scopeRepository.GetListAsync("id", 0, int.MaxValue, filter: _testData.Scope1Name)).Count.ShouldBe(1);
}
[Fact]
public async Task GetCountAsync()
{
(await _scopeRepository.GetCountAsync()).ShouldBe(2);
(await _scopeRepository.GetCountAsync(filter: _testData.Scope1Name)).ShouldBe(1);
}
[Fact]
public async Task FindByIdAsync()
{
var scope = await _scopeRepository.FindByIdAsync(_testData.Scope1Id);
scope.ShouldNotBeNull();
scope.Id.ShouldBe(_testData.Scope1Id);
}
[Fact]
public async Task FindByNameAsync()
{
var scope = await _scopeRepository.FindByNameAsync(_testData.Scope1Name);
scope.ShouldNotBeNull();
scope.Name.ShouldBe(_testData.Scope1Name);
}
[Fact]
public async Task FindByNamesAsync()
{
(await _scopeRepository.FindByNamesAsync(new []{_testData.Scope1Name, _testData.Scope2Name})).Count.ShouldBe(2);
}
[Fact]
public async Task FindByResourceAsync()
{
(await _scopeRepository.FindByResourceAsync("TestScope1Resource")).Count.ShouldBe(1);
}
[Fact]
public async Task ListAsync()
{
(await _scopeRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2);
(await _scopeRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0);
}
}

0
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBase.cs → modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBase.cs

0
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBaseModule.cs → modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBaseModule.cs

104
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs

@ -0,0 +1,104 @@
using System;
using System.Threading.Tasks;
using OpenIddict.Abstractions;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.Tokens;
using Xunit;
namespace Volo.Abp.OpenIddict;
public abstract class OpenIddictTokenRepository_Tests<TStartupModule> : OpenIddictTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IOpenIddictTokenRepository _tokenRepository;
private readonly AbpOpenIddictTestData _testData;
public OpenIddictTokenRepository_Tests()
{
_tokenRepository = GetRequiredService<IOpenIddictTokenRepository>();
_testData = GetRequiredService<AbpOpenIddictTestData>();
}
[Fact]
public async Task DeleteManyByApplicationIdAsync()
{
await _tokenRepository.DeleteManyByApplicationIdAsync(new Guid());
(await _tokenRepository.GetCountAsync()).ShouldBe(2);
await _tokenRepository.DeleteManyByApplicationIdAsync(_testData.App1Id);
(await _tokenRepository.GetCountAsync()).ShouldBe(1);
}
[Fact]
public async Task DeleteManyByAuthorizationIdAsync()
{
await _tokenRepository.DeleteManyByAuthorizationIdAsync(new Guid());
(await _tokenRepository.GetCountAsync()).ShouldBe(2);
await _tokenRepository.DeleteManyByAuthorizationIdAsync(_testData.Authorization1Id);
(await _tokenRepository.GetCountAsync()).ShouldBe(1);
}
[Fact]
public async Task FindAsync()
{
(await _tokenRepository.FindAsync("TestSubject1", new Guid())).Count.ShouldBe(0);
(await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id)).Count.ShouldBe(1);
(await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, "NonExistsStatus")).Count.ShouldBe(0);
(await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed)).Count.ShouldBe(1);
(await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "NonExistsType")).Count.ShouldBe(0);
(await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "TestType1")).Count.ShouldBe(1);
}
[Fact]
public async Task FindByApplicationIdAsync()
{
(await _tokenRepository.FindByApplicationIdAsync(_testData.App1Id)).Count.ShouldBe(1);
}
[Fact]
public async Task FindByAuthorizationIdAsync()
{
(await _tokenRepository.FindByAuthorizationIdAsync(_testData.Authorization1Id)).Count.ShouldBe(1);
}
[Fact]
public async Task FindByIdAsync()
{
var token = await _tokenRepository.FindByIdAsync(_testData.Token1Id);
token.ShouldNotBeNull();
token.Id.ShouldBe(_testData.Token1Id);
}
[Fact]
public async Task FindByReferenceIdAsync()
{
var token = await _tokenRepository.FindByIdAsync(_testData.Token1Id);
token = await _tokenRepository.FindByReferenceIdAsync(token.ReferenceId);
token.ShouldNotBeNull();
token.ReferenceId.ShouldBe(token.ReferenceId);
}
[Fact]
public async Task FindBySubjectAsync()
{
(await _tokenRepository.FindBySubjectAsync("TestSubject1")).Count.ShouldBe(1);
}
[Fact]
public async Task ListAsync()
{
(await _tokenRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2);
(await _tokenRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0);
}
[Fact]
public async Task GetPruneListAsync()
{
var threshold = DateTime.UtcNow - TimeSpan.FromDays(14);
(await _tokenRepository.GetPruneListAsync(threshold, int.MaxValue)).Count.ShouldBe(1);
}
}

0
modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Security/FakeCurrentPrincipalAccessor.cs → modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/Security/FakeCurrentPrincipalAccessor.cs

22
npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts

@ -1,4 +1,5 @@
import { import {
AfterViewInit,
ChangeDetectorRef, ChangeDetectorRef,
Directive, Directive,
Input, Input,
@ -8,20 +9,24 @@ import {
TemplateRef, TemplateRef,
ViewContainerRef, ViewContainerRef,
} from '@angular/core'; } from '@angular/core';
import { Subscription } from 'rxjs'; import { ReplaySubject, Subscription } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators'; import { distinctUntilChanged, take } from 'rxjs/operators';
import { PermissionService } from '../services/permission.service'; import { PermissionService } from '../services/permission.service';
@Directive({ @Directive({
selector: '[abpPermission]', selector: '[abpPermission]',
}) })
export class PermissionDirective implements OnDestroy, OnChanges { export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit {
@Input('abpPermission') condition: string | undefined; @Input('abpPermission') condition: string | undefined;
@Input('abpPermissionRunChangeDetection') runChangeDetection = true; @Input('abpPermissionRunChangeDetection') runChangeDetection = true;
subscription!: Subscription; subscription!: Subscription;
cdrSubject = new ReplaySubject();
rendered = false;
constructor( constructor(
@Optional() private templateRef: TemplateRef<any>, @Optional() private templateRef: TemplateRef<any>,
private vcRef: ViewContainerRef, private vcRef: ViewContainerRef,
@ -41,7 +46,11 @@ export class PermissionDirective implements OnDestroy, OnChanges {
this.vcRef.clear(); this.vcRef.clear();
if (isGranted) this.vcRef.createEmbeddedView(this.templateRef); if (isGranted) this.vcRef.createEmbeddedView(this.templateRef);
if (this.runChangeDetection) { if (this.runChangeDetection) {
this.cdRef.detectChanges(); if (!this.rendered) {
this.cdrSubject.next();
} else {
this.cdRef.detectChanges();
}
} else { } else {
this.cdRef.markForCheck(); this.cdRef.markForCheck();
} }
@ -55,4 +64,9 @@ export class PermissionDirective implements OnDestroy, OnChanges {
ngOnChanges() { ngOnChanges() {
this.check(); this.check();
} }
ngAfterViewInit() {
this.cdrSubject.pipe(take(1)).subscribe(() => this.cdRef.detectChanges());
this.rendered = true;
}
} }

16
npm/ng-packs/packages/core/src/lib/services/environment.service.ts

@ -7,6 +7,13 @@ import { InternalStore } from '../utils/internal-store-utils';
const mapToApiUrl = (key: string) => (apis: Apis) => const mapToApiUrl = (key: string) => (apis: Apis) =>
(apis[key] || apis.default).url || apis.default.url; (apis[key] || apis.default).url || apis.default.url;
const mapToIssuer = (issuer: string) => {
if (!issuer) {
return issuer;
}
return issuer.endsWith('/') ? issuer : issuer + '/';
};
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class EnvironmentService { export class EnvironmentService {
private readonly store = new InternalStore({} as Environment); private readonly store = new InternalStore({} as Environment);
@ -34,4 +41,13 @@ export class EnvironmentService {
setState(environment: Environment) { setState(environment: Environment) {
this.store.set(environment); this.store.set(environment);
} }
getIssuer() {
const issuer = this.store.state.oAuthConfig.issuer;
return mapToIssuer(issuer);
}
getIssuer$() {
return this.store.sliceState(state => state.oAuthConfig.issuer).pipe(map(mapToIssuer));
}
} }

14
npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts

@ -76,6 +76,20 @@ describe('PermissionDirective', () => {
expect(detectChanges).toHaveBeenCalled(); expect(detectChanges).toHaveBeenCalled();
}); });
it('should not call change detection before ngAfterViewInit', () => {
// hook before ngAfterViewInit
const detectChanges = jest.spyOn(cdr, 'detectChanges');
spectator.setHostInput({ condition: 'test' });
grantedPolicy$.next(true);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
directive.onInit = () => {
expect(detectChanges).not.toHaveBeenCalled();
};
expect(detectChanges).toHaveBeenCalled();
});
describe('#subscription', () => { describe('#subscription', () => {
it('should call the unsubscribe', () => { it('should call the unsubscribe', () => {
const spy = jest.fn(() => {}); const spy = jest.fn(() => {});

4
npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts

@ -2,10 +2,10 @@ export const DEFAULT_VALIDATION_BLUEPRINTS = {
creditCard: 'AbpValidation::ThisFieldIsNotAValidCreditCardNumber.', creditCard: 'AbpValidation::ThisFieldIsNotAValidCreditCardNumber.',
email: 'AbpValidation::ThisFieldIsNotAValidEmailAddress.', email: 'AbpValidation::ThisFieldIsNotAValidEmailAddress.',
invalid: 'AbpValidation::ThisFieldIsNotValid.', invalid: 'AbpValidation::ThisFieldIsNotValid.',
max: 'AbpValidation::ThisFieldMustBeBetween{0}And{1}[{{ min }},{{ max }}]', max: 'AbpValidation::ThisFieldMustBeLessOrEqual{0}[{{ max }}]',
maxlength: maxlength:
'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}[{{ requiredLength }}]', 'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}[{{ requiredLength }}]',
min: 'AbpValidation::ThisFieldMustBeBetween{0}And{1}[{{ min }},{{ max }}]', min: 'AbpValidation::ThisFieldMustBeGreaterThanOrEqual{0}[{{ min }}]',
minlength: minlength:
'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}[{{ requiredLength }}]', 'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}[{{ requiredLength }}]',
ngbDate: 'AbpValidation::ThisFieldIsNotValid.', ngbDate: 'AbpValidation::ThisFieldIsNotValid.',

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MyProjectNameMongoDbContext.cs

@ -14,7 +14,7 @@ public class MyProjectNameMongoDbContext : AbpMongoDbContext
{ {
base.CreateModel(modelBuilder); base.CreateModel(modelBuilder);
//builder.Entity<YourEntity>(b => //modelBuilder.Entity<YourEntity>(b =>
//{ //{
// //... // //...
//}); //});

Loading…
Cancel
Save