Browse Source

Merge branch 'dev' into blazor-full-stack-web-ui

pull/18876/head
Enis Necipoglu 3 years ago
parent
commit
78125c672c
  1. 2
      .github/ISSUE_TEMPLATE/config.yml
  2. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  3. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  4. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json
  5. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
  6. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  7. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  8. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  9. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  10. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  11. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json
  12. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  13. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json
  14. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  15. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json
  16. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json
  17. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  18. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
  19. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json
  20. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  21. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json
  22. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  23. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json
  24. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  25. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  26. 4
      docs/en/Modules/Tenant-Management.md
  27. 56
      docs/en/Testing.md
  28. BIN
      docs/en/images/solution-test-projects.png
  29. BIN
      docs/en/images/unitest-efcore-mongodb.png
  30. BIN
      docs/en/images/vs-run-tests-in-parallel.png
  31. BIN
      docs/en/images/vs-startup-template-tests.png
  32. 29
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  33. 52
      framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs
  34. 8
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs
  35. 2
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs
  36. 2
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs
  37. 19
      framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs
  38. 2
      latest-versions.json
  39. 2
      modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs
  40. 2
      modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs
  41. 2
      modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs
  42. 6
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs
  43. 1
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj
  44. 2
      modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs
  45. 2
      modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs
  46. 2
      modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs
  47. 2
      modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo/Abp/FeatureManagement/EntityFrameworkCore/AbpFeatureManagementEntityFrameworkCoreTestModule.cs
  48. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json
  49. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json
  50. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json
  51. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json
  52. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json
  53. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
  54. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json
  55. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json
  56. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json
  57. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json
  58. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json
  59. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json
  60. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json
  61. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json
  62. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json
  63. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json
  64. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json
  65. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json
  66. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json
  67. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json
  68. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json
  69. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json
  70. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json
  71. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json
  72. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json
  73. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json
  74. 2
      modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs
  75. 2
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs
  76. 2
      modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs
  77. 2
      modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs
  78. 2
      modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs
  79. 3
      npm/ng-packs/nx.json
  80. 121
      npm/ng-packs/packages/oauth/src/lib/tests/oauth-error-filter.service.spec.ts
  81. 2
      npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts
  82. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts
  83. 2
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs
  84. 2
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs

2
.github/ISSUE_TEMPLATE/config.yml

@ -2,7 +2,7 @@ blank_issues_enabled: true
contact_links: contact_links:
- name: Issue with ABP Commercial - name: Issue with ABP Commercial
url: https://support.abp.io/QA/Questions url: https://support.abp.io/QA/Questions
about: Please open issues relating to ABP Commercial in support.abp.io. about: Please open ABP Commercial related issues at https://support.abp.io.
- name: Ask a question (community support) - name: Ask a question (community support)
url: https://stackoverflow.com/questions/tagged/abp url: https://stackoverflow.com/questions/tagged/abp
about: Ask a question that will be answered by the ABP community about: Ask a question that will be answered by the ABP community

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json

@ -796,6 +796,7 @@
"PaymentFailedInfo": "عذرا، فشل الدفع! ", "PaymentFailedInfo": "عذرا، فشل الدفع! ",
"UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل", "UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل",
"ManageLicense": "التحكم في الترخيص", "ManageLicense": "التحكم في الترخيص",
"AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "سابق"
} }
} }

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json

@ -410,7 +410,7 @@
"PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ", "PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ",
"UsedPayment": "Tato platba již byla použita", "UsedPayment": "Tato platba již byla použita",
"ManageLicense": "Správa licence", "ManageLicense": "Správa licence",
"AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Předchozí"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json

@ -391,6 +391,7 @@
"PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ", "PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ",
"UsedPayment": "Diese Zahlung wurde bereits verwendet", "UsedPayment": "Diese Zahlung wurde bereits verwendet",
"ManageLicense": "Lizenz verwalten", "ManageLicense": "Lizenz verwalten",
"AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Vorherige"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json

@ -113,6 +113,7 @@
"BlackFridayDiscount": "Black Friday Discount", "BlackFridayDiscount": "Black Friday Discount",
"MultipleOrganizationInfo": "See All Your Organizations", "MultipleOrganizationInfo": "See All Your Organizations",
"PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin", "PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin",
"UsedPayment": "This payment has been already used" "UsedPayment": "This payment has been already used",
"Previous": "Previous"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -1180,6 +1180,7 @@
"ReturnOfInvestmentPageAbout": "This page covers the fundamental steps of developing a software solution and explains how the ABP.IO Platform reduces your development costs at each step.", "ReturnOfInvestmentPageAbout": "This page covers the fundamental steps of developing a software solution and explains how the ABP.IO Platform reduces your development costs at each step.",
"LearnMore": "Learn More", "LearnMore": "Learn More",
"ReturnOfInvestment": "Return of Investment", "ReturnOfInvestment": "Return of Investment",
"ReturnOfInvestment_Description": "Learn how to reduce your development costs by more than %50." "ReturnOfInvestment_Description": "Learn how to reduce your development costs by more than %50.",
"Previous": "Previous"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json

@ -391,6 +391,7 @@
"PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ", "PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ",
"UsedPayment": "Este pago ya ha sido utilizado.", "UsedPayment": "Este pago ya ha sido utilizado.",
"ManageLicense": "Gestionar licencia", "ManageLicense": "Gestionar licencia",
"AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json

@ -832,6 +832,7 @@
"PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ", "PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ",
"UsedPayment": "Tämä maksu on jo käytetty", "UsedPayment": "Tämä maksu on jo käytetty",
"ManageLicense": "Hallinnoi lisenssiä", "ManageLicense": "Hallinnoi lisenssiä",
"AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Edellinen"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json

@ -410,6 +410,7 @@
"PaymentFailedInfo": "Désolé, le paiement a échoué! ", "PaymentFailedInfo": "Désolé, le paiement a échoué! ",
"UsedPayment": "Ce paiement a déjà été utilisé", "UsedPayment": "Ce paiement a déjà été utilisé",
"ManageLicense": "Gérer la licence", "ManageLicense": "Gérer la licence",
"AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Précédent"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json

@ -409,6 +409,7 @@
"PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ", "PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ",
"UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है", "UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है",
"ManageLicense": "लाइसेंस प्रबंधन", "ManageLicense": "लाइसेंस प्रबंधन",
"AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम" "AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम",
"Previous": "पहले का"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json

@ -1088,6 +1088,7 @@
"PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ", "PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ",
"UsedPayment": "Ovo plaćanje je već iskorišteno", "UsedPayment": "Ovo plaćanje je već iskorišteno",
"ManageLicense": "Upravljanje licencom", "ManageLicense": "Upravljanje licencom",
"AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Prethodno"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json

@ -758,6 +758,7 @@
"PaymentFailedInfo": "Sajnos a fizetés sikertelen! ", "PaymentFailedInfo": "Sajnos a fizetés sikertelen! ",
"UsedPayment": "Ezt a fizetést már felhasználták", "UsedPayment": "Ezt a fizetést már felhasználták",
"ManageLicense": "Licenc kezelése", "ManageLicense": "Licenc kezelése",
"AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az <span class=\"gradient-commercial\">ABP Platform</span> által" "AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az <span class=\"gradient-commercial\">ABP Platform</span> által",
"Previous": "Előző"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Því miður, greiðsla mistókst! ", "PaymentFailedInfo": "Því miður, greiðsla mistókst! ",
"UsedPayment": "Þessi greiðsla hefur þegar verið notuð", "UsedPayment": "Þessi greiðsla hefur þegar verið notuð",
"ManageLicense": "Stjórna leyfi", "ManageLicense": "Stjórna leyfi",
"AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Fyrri"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json

@ -409,6 +409,7 @@
"PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ", "PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ",
"UsedPayment": "Questo pagamento è già stato utilizzato", "UsedPayment": "Questo pagamento è già stato utilizzato",
"ManageLicense": "Gestisci la licenza", "ManageLicense": "Gestisci la licenza",
"AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Precedente"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Excuses, betaling mislukt! ", "PaymentFailedInfo": "Excuses, betaling mislukt! ",
"UsedPayment": "Deze betaling is al gebruikt", "UsedPayment": "Deze betaling is al gebruikt",
"ManageLicense": "Licentie beheren", "ManageLicense": "Licentie beheren",
"AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Vorig"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ", "PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ",
"UsedPayment": "Ta płatność została już wykorzystana", "UsedPayment": "Ta płatność została już wykorzystana",
"ManageLicense": "Zarządzaj licencją", "ManageLicense": "Zarządzaj licencją",
"AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Poprzedni"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json

@ -411,6 +411,7 @@
"PaymentFailedInfo": "Desculpe, o pagamento falhou! ", "PaymentFailedInfo": "Desculpe, o pagamento falhou! ",
"UsedPayment": "Este pagamento já foi usado", "UsedPayment": "Este pagamento já foi usado",
"ManageLicense": "Gerenciar Licença", "ManageLicense": "Gerenciar Licença",
"AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ", "PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ",
"UsedPayment": "Această plată a fost deja utilizată", "UsedPayment": "Această plată a fost deja utilizată",
"ManageLicense": "Administrare licență", "ManageLicense": "Administrare licență",
"AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json

@ -1089,6 +1089,7 @@
"PaymentFailedInfo": "Извините, оплата не удалась! ", "PaymentFailedInfo": "Извините, оплата не удалась! ",
"UsedPayment": "Этот платеж уже использован", "UsedPayment": "Этот платеж уже использован",
"ManageLicense": "Управление лицензией", "ManageLicense": "Управление лицензией",
"AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Предыдущий"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json

@ -407,6 +407,7 @@
"PaymentFailedInfo": "Ľutujeme, platba zlyhala! ", "PaymentFailedInfo": "Ľutujeme, platba zlyhala! ",
"UsedPayment": "Táto platba už bola použitá", "UsedPayment": "Táto platba už bola použitá",
"ManageLicense": "Spravovať licenciu", "ManageLicense": "Spravovať licenciu",
"AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Predchádzajúce"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Žal plačilo ni uspelo! ", "PaymentFailedInfo": "Žal plačilo ni uspelo! ",
"UsedPayment": "To plačilo je že bilo uporabljeno", "UsedPayment": "To plačilo je že bilo uporabljeno",
"ManageLicense": "Upravljanje licenco", "ManageLicense": "Upravljanje licenco",
"AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Prejšnja"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json

@ -998,6 +998,7 @@
"MyOrganizations_Detail_LicenseStartDate": "Lisans Başlangıç Tarihi", "MyOrganizations_Detail_LicenseStartDate": "Lisans Başlangıç Tarihi",
"MyOrganizations_Detail_LicenseExpiryDate": "Bitiş Tarihi", "MyOrganizations_Detail_LicenseExpiryDate": "Bitiş Tarihi",
"ManageLicense": "Lisansı Yönet", "ManageLicense": "Lisansı Yönet",
"AbpPlatformLeptonXTheme": "<span class=\"gradient-commercial\">ABP Platform</span> Yönetici Kontrol Paneliniz için LeptonX Teması" "AbpPlatformLeptonXTheme": "<span class=\"gradient-commercial\">ABP Platform</span> Yönetici Kontrol Paneliniz için LeptonX Teması",
"Previous": "Önceki"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json

@ -388,6 +388,7 @@
"PaymentFailedInfo": "Rất tiếc, thanh toán không thành công! ", "PaymentFailedInfo": "Rất tiếc, thanh toán không thành công! ",
"UsedPayment": "Khoản thanh toán này đã được sử dụng", "UsedPayment": "Khoản thanh toán này đã được sử dụng",
"ManageLicense": "Quản lý Giấy phép", "ManageLicense": "Quản lý Giấy phép",
"AbpPlatformLeptonXTheme": "Chủ đề LeptonX cho Bảng điều khiển quản trị của bạn bởi <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Chủ đề LeptonX cho Bảng điều khiển quản trị của bạn bởi <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Trước"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json

@ -1090,6 +1090,7 @@
"PaymentFailedInfo": "抱歉,支付失败!", "PaymentFailedInfo": "抱歉,支付失败!",
"UsedPayment": "该付款已被使用", "UsedPayment": "该付款已被使用",
"ManageLicense": "管理许可证", "ManageLicense": "管理许可证",
"AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理仪表板的 LeptonX 主题" "AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理仪表板的 LeptonX 主题",
"Previous": "以前的"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json

@ -1079,6 +1079,7 @@
"PaymentFailedInfo": "抱歉,支付失败!", "PaymentFailedInfo": "抱歉,支付失败!",
"UsedPayment": "该付款已被使用", "UsedPayment": "该付款已被使用",
"ManageLicense": "管理許可證", "ManageLicense": "管理許可證",
"AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理儀表板的 LeptonX 主題" "AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理儀表板的 LeptonX 主題",
"Previous": "以前的"
} }
} }

4
docs/en/Modules/Tenant-Management.md

@ -56,7 +56,7 @@ This module defines the following ETOs (Event Transfer Objects) to allow you to
**Example: Get notified when a new tenant has been created** **Example: Get notified when a new tenant has been created**
``` ```cs
public class MyHandler : public class MyHandler :
IDistributedEventHandler<EntityCreatedEto<TenantEto>>, IDistributedEventHandler<EntityCreatedEto<TenantEto>>,
ITransientDependency ITransientDependency
@ -131,4 +131,4 @@ ABP Framework allows to use *database per tenant* approach that allows a tenant
## See Also ## See Also
* [Multi-Tenancy](../Multi-Tenancy.md) * [Multi-Tenancy](../Multi-Tenancy.md)
* [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas) * [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas)

56
docs/en/Testing.md

@ -36,7 +36,7 @@ There are more than one test project, organized by the layers;
* `Domain.Tests` is used to test your Domain Layer objects (like [Domain Services](Domain-Services.md) and [Entities](Entities.md)). * `Domain.Tests` is used to test your Domain Layer objects (like [Domain Services](Domain-Services.md) and [Entities](Entities.md)).
* `Application.Tests` is used to test your Application Layer (like [Application Services](Application-Services.md)). * `Application.Tests` is used to test your Application Layer (like [Application Services](Application-Services.md)).
* `EntityFrameworkCore.Tests` is used to test your custom repository implementations or EF Core mappings (this project will be different if you use another [Database Provider](Data-Access.md)). * `EntityFrameworkCore.Tests` is used to implement abstract test classes and test your custom repository implementations or EF Core mappings (this project will be different if you use another [Database Provider](Data-Access.md)).
* `Web.Tests` is used to test the UI Layer (like Pages, Controllers and View Components). This project does exists only for MVC / Razor Page applications. * `Web.Tests` is used to test the UI Layer (like Pages, Controllers and View Components). This project does exists only for MVC / Razor Page applications.
* `TestBase` contains some classes those are shared/used by the other projects. * `TestBase` contains some classes those are shared/used by the other projects.
@ -537,12 +537,13 @@ using Xunit;
namespace MyProject.Issues namespace MyProject.Issues
{ {
public class IssueManager_Integration_Tests : MyProjectDomainTestBase public abstract class IssueManager_Integration_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IssueManager _issueManager; private readonly IssueManager _issueManager;
private readonly Issue _issue; private readonly Issue _issue;
public IssueManager_Integration_Tests() protected IssueManager_Integration_Tests()
{ {
_issueManager = GetRequiredService<IssueManager>(); _issueManager = GetRequiredService<IssueManager>();
_issue = new Issue _issue = new Issue
@ -577,6 +578,8 @@ namespace MyProject.Issues
} }
```` ````
> The `IssueManager_Integration_Tests` class is an abstract class, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
* First test method assigns the issue to the User 1, which has already assigned to 3 issues in the Data Seed code. So, it throws a `BusinessException`. * First test method assigns the issue to the User 1, which has already assigned to 3 issues in the Data Seed code. So, it throws a `BusinessException`.
* Second test method assigns the issue to User 2, which has only 1 issue assigned. So, the method succeeds. * Second test method assigns the issue to User 2, which has only 1 issue assigned. So, the method succeeds.
@ -625,11 +628,12 @@ using Xunit;
namespace MyProject.Issues namespace MyProject.Issues
{ {
public class IssueAppService_Tests : MyProjectApplicationTestBase public abstract class IssueAppService_Tests<TStartupModule> : MyProjectApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IIssueAppService _issueAppService; private readonly IIssueAppService _issueAppService;
public IssueAppService_Tests() protected IssueAppService_Tests()
{ {
_issueAppService = GetRequiredService<IIssueAppService>(); _issueAppService = GetRequiredService<IIssueAppService>();
} }
@ -647,6 +651,8 @@ namespace MyProject.Issues
} }
```` ````
> The `IssueAppService_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
It's that simple. This test method tests everything, including the application service, EF Core mapping, object to object mapping and the repository implementation. In this way, you can fully test the Application Layer and the Domain Layer of your solution. It's that simple. This test method tests everything, including the application service, EF Core mapping, object to object mapping and the repository implementation. In this way, you can fully test the Application Layer and the Domain Layer of your solution.
### Dealing with Unit of Work in Integration Tests ### Dealing with Unit of Work in Integration Tests
@ -658,11 +664,12 @@ In the ABP Framework, all the database operations must be performed inside a uni
In some cases, you may need to manually control the unit of work scope. Consider the following test method: In some cases, you may need to manually control the unit of work scope. Consider the following test method:
````csharp ````csharp
public class IssueRepository_Tests : MyProjectDomainTestBase public abstract class IssueRepository_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IRepository<Issue, Guid> _issueRepository; private readonly IRepository<Issue, Guid> _issueRepository;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_issueRepository = GetRequiredService<IRepository<Issue, Guid>>(); _issueRepository = GetRequiredService<IRepository<Issue, Guid>>();
} }
@ -676,17 +683,20 @@ public class IssueRepository_Tests : MyProjectDomainTestBase
} }
```` ````
> The `IssueRepository_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
We are using `_issueRepository.GetQueryableAsync` to obtain an `IQueryable<Issue>` object. Then, we are using the `FirstOrDefaultAsync` method to query an issue by its title. The database query is executed at this point, and you get an exception indicating that there is no active unit of work. We are using `_issueRepository.GetQueryableAsync` to obtain an `IQueryable<Issue>` object. Then, we are using the `FirstOrDefaultAsync` method to query an issue by its title. The database query is executed at this point, and you get an exception indicating that there is no active unit of work.
To make that test properly working, you should manually start a unit of work scope as shown in the following example: To make that test properly working, you should manually start a unit of work scope as shown in the following example:
````csharp ````csharp
public class IssueRepository_Tests : MyProjectDomainTestBase public abstract class IssueRepository_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IRepository<Issue, Guid> _issueRepository; private readonly IRepository<Issue, Guid> _issueRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_issueRepository = GetRequiredService<IRepository<Issue, Guid>>(); _issueRepository = GetRequiredService<IRepository<Issue, Guid>>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
@ -716,12 +726,13 @@ In some cases, you may want to directory work with the Entity Framework's `DbCon
The following example shows how you can create a `DbContext` object in a test method: The following example shows how you can create a `DbContext` object in a test method:
````csharp ````csharp
public class MyDbContext_Tests : MyProjectDomainTestBase public abstract class MyDbContext_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IDbContextProvider<MyProjectDbContext> _dbContextProvider; private readonly IDbContextProvider<MyProjectDbContext> _dbContextProvider;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_dbContextProvider = GetRequiredService<IDbContextProvider<MyProjectDbContext>>(); _dbContextProvider = GetRequiredService<IDbContextProvider<MyProjectDbContext>>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
@ -740,10 +751,33 @@ public class MyDbContext_Tests : MyProjectDomainTestBase
} }
```` ````
> The `MyDbContext_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
Just like we've done in the *Dealing with Unit of Work in Integration Tests* section, we should perform `DbContext` operations inside an active unit of work. Just like we've done in the *Dealing with Unit of Work in Integration Tests* section, we should perform `DbContext` operations inside an active unit of work.
For [MongoDB](MongoDB.md), you can use the `IMongoDbContextProvider<T>` service to obtain a `DbContext` object and directly use MongoDB APIs in your test methods. For [MongoDB](MongoDB.md), you can use the `IMongoDbContextProvider<T>` service to obtain a `DbContext` object and directly use MongoDB APIs in your test methods.
## Implementing unit tests in EF Core and MongoDB
The unit test classes in the `.Domain.Test` and `.Application.Tests` projects are all abstract classes. Therefore, we need to implement the test classes in EF Core or MongoDB test projects to run the tests, otherwise they will be ignored.
An example implementation for the `IssueManager_Integration_Tests` class in the `.EntityFrameworkCore.Tests` project is shown below:
````csharp
namespace MyProject.EntityFrameworkCore.Applications;
public class EfCoreIssueAppService_Tests : IssueAppService_Tests<MyProjectEntityFrameworkCoreTestModule>
{
}
````
> By deriving from the related abstract classes, now we can see the all tests in the test explorers and run them.
![unitest-efcore-mongodb](images/unitest-efcore-mongodb.png)
As you can see from the folder structure, all tests are clearly placed into the related subfolders, and they will be seen in the test explorer with this separation. Thus, you can clearly see which tests are related to which layers and projects.
## UI Tests ## UI Tests
In general, there are two types of UI Tests; In general, there are two types of UI Tests;

BIN
docs/en/images/solution-test-projects.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 109 KiB

BIN
docs/en/images/unitest-efcore-mongodb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
docs/en/images/vs-run-tests-in-parallel.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 576 KiB

BIN
docs/en/images/vs-startup-template-tests.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 344 KiB

29
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs

@ -54,19 +54,22 @@ public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper>
output.TagMode = TagMode.StartTagAndEndTag; output.TagMode = TagMode.StartTagAndEndTag;
output.TagName = "div"; output.TagName = "div";
LeaveOnlyGroupAttributes(context, output); LeaveOnlyGroupAttributes(context, output);
if (TagHelper.FloatingLabel && !isCheckBox) if (!IsOutputHidden(output))
{ {
output.Attributes.AddClass("form-floating"); if (TagHelper.FloatingLabel && !isCheckBox)
} {
if (TagHelper.AddMarginBottomClass) output.Attributes.AddClass("form-floating");
{ }
output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); if (TagHelper.AddMarginBottomClass)
} {
if (isCheckBox) output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3");
{ }
output.Attributes.AddClass("custom-checkbox"); if (isCheckBox)
output.Attributes.AddClass("custom-control"); {
output.Attributes.AddClass("form-check"); output.Attributes.AddClass("custom-checkbox");
output.Attributes.AddClass("custom-control");
output.Attributes.AddClass("form-check");
}
} }
output.Content.AppendHtml(innerHtml); output.Content.AppendHtml(innerHtml);
} }
@ -263,7 +266,7 @@ public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper>
} }
protected virtual async Task<string> GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox) protected virtual async Task<string> GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox)
{ {
if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel) if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel)
{ {
return string.Empty; return string.Empty;

52
framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs

@ -0,0 +1,52 @@
using System.Threading;
using Microsoft.Data.Sqlite;
using Volo.Abp.Threading;
namespace Volo.Abp.EntityFrameworkCore.Sqlite;
/// <summary>
/// This class is for unit testing purposes.
/// It prevents exceptions in concurrent testing because Sqlite is not thread-safe.
/// </summary>
public class AbpUnitTestSqliteConnection : SqliteConnection
{
public AbpUnitTestSqliteConnection(string connectionString)
: base(connectionString)
{
}
public override SqliteCommand CreateCommand()
{
return new AbpSqliteCommand
{
Connection = this,
CommandTimeout = DefaultTimeout,
Transaction = Transaction
};
}
}
internal class AbpSqliteCommand : SqliteCommand
{
private readonly static SemaphoreSlim Semaphore = new SemaphoreSlim(1, 1);
public override SqliteConnection? Connection
{
get => base.Connection;
set
{
using (Semaphore.Lock())
{
base.Connection = value;
}
}
}
protected override void Dispose(bool disposing)
{
using (Semaphore.Lock())
{
base.Dispose(disposing);
}
}
}

8
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs

@ -11,6 +11,8 @@ public class AbpStringToEnumConverter<T> : JsonConverter<T>
private JsonSerializerOptions? _readJsonSerializerOptions; private JsonSerializerOptions? _readJsonSerializerOptions;
private JsonSerializerOptions? _writeJsonSerializerOptions;
public AbpStringToEnumConverter() public AbpStringToEnumConverter()
: this(namingPolicy: null, allowIntegerValues: true) : this(namingPolicy: null, allowIntegerValues: true)
{ {
@ -39,7 +41,11 @@ public class AbpStringToEnumConverter<T> : JsonConverter<T>
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{ {
JsonSerializer.Serialize(writer, value); _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, x =>
x == this ||
x.GetType() == typeof(AbpStringToEnumFactory));
JsonSerializer.Serialize(writer, value, _writeJsonSerializerOptions);
} }
public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

2
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs

@ -62,7 +62,7 @@ public class AbpAuditingTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
using (var context = new AbpAuditingTestDbContext(new DbContextOptionsBuilder<AbpAuditingTestDbContext>() using (var context = new AbpAuditingTestDbContext(new DbContextOptionsBuilder<AbpAuditingTestDbContext>()

2
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs

@ -93,7 +93,7 @@ public class AbpEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
using (var context = new TestMigrationsDbContext(new DbContextOptionsBuilder<TestMigrationsDbContext>().UseSqlite(connection).Options)) using (var context = new TestMigrationsDbContext(new DbContextOptionsBuilder<TestMigrationsDbContext>().UseSqlite(connection).Options))

19
framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Shouldly; using Shouldly;
using Volo.Abp.Json.SystemTextJson.JsonConverters; using Volo.Abp.Json.SystemTextJson.JsonConverters;
using Xunit; using Xunit;
@ -53,10 +54,26 @@ public class AbpStringToEnum_Tests
var testClassJson = JsonSerializer.Serialize(new TestClass() var testClassJson = JsonSerializer.Serialize(new TestClass()
{ {
Day = DayOfWeek.Monday Day = DayOfWeek.Monday
}); }, options);
testClassJson.ShouldBe("{\"Day\":1}"); testClassJson.ShouldBe("{\"Day\":1}");
options = new JsonSerializerOptions()
{
Converters =
{
new AbpStringToEnumFactory(),
new JsonStringEnumConverter()
}
};
testClassJson = JsonSerializer.Serialize(new TestClass()
{
Day = DayOfWeek.Monday
}, options);
testClassJson.ShouldBe("{\"Day\":\"Monday\"}");
testClassJson = JsonSerializer.Serialize(new Dictionary<DayOfWeek, string> testClassJson = JsonSerializer.Serialize(new Dictionary<DayOfWeek, string>
{ {
{DayOfWeek.Monday, "Mo"} {DayOfWeek.Monday, "Mo"}

2
latest-versions.json

@ -1,6 +1,6 @@
[ [
{ {
"version": "8.0.3", "version": "8.0.4",
"releaseDate": "", "releaseDate": "",
"type": "stable", "type": "stable",
"message": "" "message": ""

2
modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs

@ -44,7 +44,7 @@ public class AbpAccountApplicationTestModule : AbpModule
} }
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new IdentityDbContext( new IdentityDbContext(

2
modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs

@ -31,7 +31,7 @@ public class AbpAuditLoggingEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new AbpAuditLoggingDbContext( new AbpAuditLoggingDbContext(

2
modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs

@ -31,7 +31,7 @@ public class AbpBackgroundJobsEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new BackgroundJobsDbContext( new BackgroundJobsDbContext(

6
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs

@ -2,6 +2,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Volo.Abp.EntityFrameworkCore.Sqlite;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -9,7 +10,8 @@ namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
[DependsOn( [DependsOn(
typeof(BlobStoringDatabaseTestBaseModule), typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule) typeof(BlobStoringDatabaseEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqliteModule)
)] )]
public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule
{ {
@ -28,7 +30,7 @@ public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new BlobStoringDbContext( new BlobStoringDbContext(

1
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj

@ -11,6 +11,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" />
<ProjectReference Include="..\..\src\Volo.Abp.BlobStoring.Database.EntityFrameworkCore\Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\src\Volo.Abp.BlobStoring.Database.EntityFrameworkCore\Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.Sqlite\Volo.Abp.EntityFrameworkCore.Sqlite.csproj" />
<ProjectReference Include="..\Volo.Abp.BlobStoring.Database.TestBase\Volo.Abp.BlobStoring.Database.TestBase.csproj" /> <ProjectReference Include="..\Volo.Abp.BlobStoring.Database.TestBase\Volo.Abp.BlobStoring.Database.TestBase.csproj" />
</ItemGroup> </ItemGroup>

2
modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs

@ -33,7 +33,7 @@ namespace Volo.Blogging.EntityFrameworkCore
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
var options = new DbContextOptionsBuilder<BloggingDbContext>().UseSqlite(connection).Options; var options = new DbContextOptionsBuilder<BloggingDbContext>().UseSqlite(connection).Options;

2
modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs

@ -30,7 +30,7 @@ public class CmsKitEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new CmsKitDbContext( new CmsKitDbContext(

2
modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs

@ -30,7 +30,7 @@ namespace Volo.Docs.EntityFrameworkCore
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new DocsDbContext( new DocsDbContext(

2
modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo/Abp/FeatureManagement/EntityFrameworkCore/AbpFeatureManagementEntityFrameworkCoreTestModule.cs

@ -36,7 +36,7 @@ public class AbpFeatureManagementEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new FeatureManagementDbContext( new FeatureManagementDbContext(

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "رقم الهاتف", "DisplayName:PhoneNumber": "رقم الهاتف",
"DisplayName:TwoFactorEnabled": "التحقق من عاملين", "DisplayName:TwoFactorEnabled": "التحقق من عاملين",
"DisplayName:IsActive": "نشيط", "DisplayName:IsActive": "نشيط",
"DisplayName:LockoutEnabled": "تأمين الحساب بعد محاولات تسجيل الدخول الفاشلة", "DisplayName:LockoutEnabled": "تأمين الحساب",
"NewRole": "دور جديد", "NewRole": "دور جديد",
"RoleName": "اسم الدور", "RoleName": "اسم الدور",
"CreationTime": "وقت الإنشاء", "CreationTime": "وقت الإنشاء",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefonní číslo", "DisplayName:PhoneNumber": "Telefonní číslo",
"DisplayName:TwoFactorEnabled": "Dvoufázové ověřování", "DisplayName:TwoFactorEnabled": "Dvoufázové ověřování",
"DisplayName:IsActive": "Aktivní", "DisplayName:IsActive": "Aktivní",
"DisplayName:LockoutEnabled": "Zamčení účtu po neúspěšných pokusech", "DisplayName:LockoutEnabled": "Zamčení účtu",
"NewRole": "Nová role", "NewRole": "Nová role",
"RoleName": "Název role", "RoleName": "Název role",
"CreationTime": "Vytvořeno", "CreationTime": "Vytvořeno",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefonnummer", "DisplayName:PhoneNumber": "Telefonnummer",
"DisplayName:TwoFactorEnabled": "Zwei-Faktor-Überprüfung", "DisplayName:TwoFactorEnabled": "Zwei-Faktor-Überprüfung",
"DisplayName:IsActive": "Aktiv", "DisplayName:IsActive": "Aktiv",
"DisplayName:LockoutEnabled": "Benutzerkonto nach fehlgeschlagenen Anmeldeversuchen sperren", "DisplayName:LockoutEnabled": "Konto-Sperrung",
"NewRole": "Neue Rolle", "NewRole": "Neue Rolle",
"RoleName": "Rollenname", "RoleName": "Rollenname",
"CreationTime": "Erstellungszeitpunkt", "CreationTime": "Erstellungszeitpunkt",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json

@ -26,7 +26,7 @@
"DisplayName:PhoneNumber": "Τηλεφωνικό νούμερο", "DisplayName:PhoneNumber": "Τηλεφωνικό νούμερο",
"DisplayName:TwoFactorEnabled": "Επαλήθευση δύο παραγόντων", "DisplayName:TwoFactorEnabled": "Επαλήθευση δύο παραγόντων",
"DisplayName:IsActive": "Ενεργός", "DisplayName:IsActive": "Ενεργός",
"DisplayName:LockoutEnabled": "Κλείδωμα λογαριασμού μετά από αποτυχημένες προσπάθειες σύνδεσης", "DisplayName:LockoutEnabled": "Κλείδωμα λογαριασμού",
"NewRole": "Νέος ρόλος", "NewRole": "Νέος ρόλος",
"RoleName": "Όνομα ρόλου", "RoleName": "Όνομα ρόλου",
"CreationTime": "Χρόνος δημιουργίας", "CreationTime": "Χρόνος δημιουργίας",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json

@ -26,7 +26,7 @@
"DisplayName:Email": "Email Address", "DisplayName:Email": "Email Address",
"DisplayName:PhoneNumber": "Phone Number", "DisplayName:PhoneNumber": "Phone Number",
"DisplayName:TwoFactorEnabled": "Two factor verification", "DisplayName:TwoFactorEnabled": "Two factor verification",
"DisplayName:LockoutEnabled": "Lock account after failed login attempts", "DisplayName:LockoutEnabled": "Account lockout",
"NewRole": "New role", "NewRole": "New role",
"RoleName": "Role name", "RoleName": "Role name",
"CreationTime": "Creation time", "CreationTime": "Creation time",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Phone number", "DisplayName:PhoneNumber": "Phone number",
"DisplayName:TwoFactorEnabled": "Two factor verification", "DisplayName:TwoFactorEnabled": "Two factor verification",
"DisplayName:IsActive": "Active", "DisplayName:IsActive": "Active",
"DisplayName:LockoutEnabled": "Lock account after failed login attempts", "DisplayName:LockoutEnabled": "Account lockout",
"NewRole": "New role", "NewRole": "New role",
"RoleName": "Role name", "RoleName": "Role name",
"CreationTime": "Creation time", "CreationTime": "Creation time",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Número de teléfono", "DisplayName:PhoneNumber": "Número de teléfono",
"DisplayName:TwoFactorEnabled": "Autenticación en dos pasos", "DisplayName:TwoFactorEnabled": "Autenticación en dos pasos",
"DisplayName:IsActive": "Activo", "DisplayName:IsActive": "Activo",
"DisplayName:LockoutEnabled": "Bloquear la cuenta después de intentos de inicio de sesión fallidos", "DisplayName:LockoutEnabled": "Bloqueo de cuenta",
"NewRole": "Nuevo rol", "NewRole": "Nuevo rol",
"RoleName": "Nombre de rol", "RoleName": "Nombre de rol",
"CreationTime": "Fecha de creación", "CreationTime": "Fecha de creación",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json

@ -26,7 +26,7 @@
"DisplayName:PhoneNumber": "شماره تلفن", "DisplayName:PhoneNumber": "شماره تلفن",
"DisplayName:TwoFactorEnabled": "احراز هویت دو مرحله ای", "DisplayName:TwoFactorEnabled": "احراز هویت دو مرحله ای",
"DisplayName:IsActive": "فعال", "DisplayName:IsActive": "فعال",
"DisplayName:LockoutEnabled": "قفل کردن حساب در صورت عدم موفقیت در ورود به سیستم", "DisplayName:LockoutEnabled": "قفل کردن حساب",
"NewRole": "نقش/وظیفه جدید", "NewRole": "نقش/وظیفه جدید",
"RoleName": "نام نقش/وظیفه", "RoleName": "نام نقش/وظیفه",
"CreationTime": "زمان ایجاد", "CreationTime": "زمان ایجاد",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Puhelinnumero", "DisplayName:PhoneNumber": "Puhelinnumero",
"DisplayName:TwoFactorEnabled": "Kahden tekijän todentaminen", "DisplayName:TwoFactorEnabled": "Kahden tekijän todentaminen",
"DisplayName:IsActive": "Aktiivinen", "DisplayName:IsActive": "Aktiivinen",
"DisplayName:LockoutEnabled": "Lukitse tili epäonnistuneiden kirjautumisyritysten jälkeen", "DisplayName:LockoutEnabled": "Tilin lukitus",
"NewRole": "Uusi rooli", "NewRole": "Uusi rooli",
"RoleName": "Roolinimi", "RoleName": "Roolinimi",
"CreationTime": "Luomisaika", "CreationTime": "Luomisaika",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Numéro de téléphone", "DisplayName:PhoneNumber": "Numéro de téléphone",
"DisplayName:TwoFactorEnabled": "Vérification de deux facteurs", "DisplayName:TwoFactorEnabled": "Vérification de deux facteurs",
"DisplayName:IsActive": "actif", "DisplayName:IsActive": "actif",
"DisplayName:LockoutEnabled": "Verrouiller le compte après l’échec des tentatives de connexion", "DisplayName:LockoutEnabled": "Verrouillage du compte",
"NewRole": "Nouveau rôle", "NewRole": "Nouveau rôle",
"RoleName": "Nom du rôle", "RoleName": "Nom du rôle",
"CreationTime": "Temps de création", "CreationTime": "Temps de création",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "फ़ोन नंबर", "DisplayName:PhoneNumber": "फ़ोन नंबर",
"DisplayName:TwoFactorEnabled": "दो कारक सत्यापन", "DisplayName:TwoFactorEnabled": "दो कारक सत्यापन",
"DisplayName:IsActive": "सक्रिय", "DisplayName:IsActive": "सक्रिय",
"DisplayName:LockoutEnabled": "असफल लॉगिन प्रयासों के बाद लॉक खाता", "DisplayName:LockoutEnabled": "खाता लॉकआउट",
"NewRole": "नयी भूमिका", "NewRole": "नयी भूमिका",
"RoleName": "भूमिका का नाम", "RoleName": "भूमिका का नाम",
"CreationTime": "रचना समय", "CreationTime": "रचना समय",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Broj telefona", "DisplayName:PhoneNumber": "Broj telefona",
"DisplayName:TwoFactorEnabled": "Two factor verifikacija", "DisplayName:TwoFactorEnabled": "Two factor verifikacija",
"DisplayName:IsActive": "Aktivan", "DisplayName:IsActive": "Aktivan",
"DisplayName:LockoutEnabled": "Zaključaj račun nakon neuspjelih pokušaja prijave", "DisplayName:LockoutEnabled": "Zaključavanje računa",
"NewRole": "Nova uloga", "NewRole": "Nova uloga",
"RoleName": "Naziv uloge", "RoleName": "Naziv uloge",
"CreationTime": "Vrijeme stvaranja", "CreationTime": "Vrijeme stvaranja",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefonszám", "DisplayName:PhoneNumber": "Telefonszám",
"DisplayName:TwoFactorEnabled": "Kétlépcsős azonosítás", "DisplayName:TwoFactorEnabled": "Kétlépcsős azonosítás",
"DisplayName:IsActive": "Aktív", "DisplayName:IsActive": "Aktív",
"DisplayName:LockoutEnabled": "Fiók zárolása sikertelen bejelentkezési kísérletek után", "DisplayName:LockoutEnabled": "Fiók zárolása",
"NewRole": "Új szerepkör", "NewRole": "Új szerepkör",
"RoleName": "Szerepkör neve", "RoleName": "Szerepkör neve",
"CreationTime": "Létrehozás időpontja", "CreationTime": "Létrehozás időpontja",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Símanúmer", "DisplayName:PhoneNumber": "Símanúmer",
"DisplayName:TwoFactorEnabled": "Tvíþætt sannprófun", "DisplayName:TwoFactorEnabled": "Tvíþætt sannprófun",
"DisplayName:IsActive": "Virkur", "DisplayName:IsActive": "Virkur",
"DisplayName:LockoutEnabled": "Læsa notandareikning eftir misheppnaðar innskráningar", "DisplayName:LockoutEnabled": "Loka reikningi",
"NewRole": "Nýtt hlutverk", "NewRole": "Nýtt hlutverk",
"RoleName": "Nafn hlutverks", "RoleName": "Nafn hlutverks",
"CreationTime": "Búið til", "CreationTime": "Búið til",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Numero di telefono", "DisplayName:PhoneNumber": "Numero di telefono",
"DisplayName:TwoFactorEnabled": "Verifica a due fattori", "DisplayName:TwoFactorEnabled": "Verifica a due fattori",
"DisplayName:IsActive": "Attivo", "DisplayName:IsActive": "Attivo",
"DisplayName:LockoutEnabled": "Blocca account dopo tentativi di accesso falliti", "DisplayName:LockoutEnabled": "Blocco account",
"NewRole": "Nuovo ruolo", "NewRole": "Nuovo ruolo",
"RoleName": "Nome del ruolo", "RoleName": "Nome del ruolo",
"CreationTime": "Orario di creazione", "CreationTime": "Orario di creazione",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefoonnummer", "DisplayName:PhoneNumber": "Telefoonnummer",
"DisplayName:TwoFactorEnabled": "Tweefactor authenticatie", "DisplayName:TwoFactorEnabled": "Tweefactor authenticatie",
"DisplayName:IsActive": "Actief", "DisplayName:IsActive": "Actief",
"DisplayName:LockoutEnabled": "Account vergrendelen na mislukte inlogpogingen", "DisplayName:LockoutEnabled": "Account vergrendelen",
"NewRole": "Nieuwe rol", "NewRole": "Nieuwe rol",
"RoleName": "Rol naam", "RoleName": "Rol naam",
"CreationTime": "Creatie tijd", "CreationTime": "Creatie tijd",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Numer telefonu", "DisplayName:PhoneNumber": "Numer telefonu",
"DisplayName:TwoFactorEnabled": "Dwustopniowa weryfikacja", "DisplayName:TwoFactorEnabled": "Dwustopniowa weryfikacja",
"DisplayName:IsActive": "Aktywny", "DisplayName:IsActive": "Aktywny",
"DisplayName:LockoutEnabled": "Blokowanie konta po nieudanych próbach zalogowania", "DisplayName:LockoutEnabled": "Blokada konta",
"NewRole": "Nowa rola", "NewRole": "Nowa rola",
"RoleName": "Nazwa roli", "RoleName": "Nazwa roli",
"CreationTime": "Data utworzenia", "CreationTime": "Data utworzenia",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefone", "DisplayName:PhoneNumber": "Telefone",
"DisplayName:TwoFactorEnabled": "Verificação em dois fatores", "DisplayName:TwoFactorEnabled": "Verificação em dois fatores",
"DisplayName:IsActive": "Ativo", "DisplayName:IsActive": "Ativo",
"DisplayName:LockoutEnabled": "Bloquear conta após falhas ao entrar", "DisplayName:LockoutEnabled": "Bloqueio de Conta",
"NewRole": "Novo Perfil", "NewRole": "Novo Perfil",
"RoleName": "Perfil", "RoleName": "Perfil",
"CreationTime": "Data de Criação", "CreationTime": "Data de Criação",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Număr de telefon", "DisplayName:PhoneNumber": "Număr de telefon",
"DisplayName:TwoFactorEnabled": "Autentificare în doi paşi", "DisplayName:TwoFactorEnabled": "Autentificare în doi paşi",
"DisplayName:IsActive": "Activ", "DisplayName:IsActive": "Activ",
"DisplayName:LockoutEnabled": "Blocaţi contul după încercări eşuate de autentificare", "DisplayName:LockoutEnabled": "Blocare cont",
"NewRole": "Rol nou", "NewRole": "Rol nou",
"RoleName": "Nume rol", "RoleName": "Nume rol",
"CreationTime": "Data creării", "CreationTime": "Data creării",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Номер телефона", "DisplayName:PhoneNumber": "Номер телефона",
"DisplayName:TwoFactorEnabled": "Двухфакторная проверка подлинности", "DisplayName:TwoFactorEnabled": "Двухфакторная проверка подлинности",
"DisplayName:IsActive": "Активный", "DisplayName:IsActive": "Активный",
"DisplayName:LockoutEnabled": "Заблокировать учетную запись после неудачных попыток входа", "DisplayName:LockoutEnabled": "Блокировка учетной записи",
"NewRole": "Новая роль", "NewRole": "Новая роль",
"RoleName": "Имя роли", "RoleName": "Имя роли",
"CreationTime": "Время создания", "CreationTime": "Время создания",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefónne číslo", "DisplayName:PhoneNumber": "Telefónne číslo",
"DisplayName:TwoFactorEnabled": "Dvojfaktorové overenie", "DisplayName:TwoFactorEnabled": "Dvojfaktorové overenie",
"DisplayName:IsActive": "Aktívne", "DisplayName:IsActive": "Aktívne",
"DisplayName:LockoutEnabled": "Uzamknúť účet po neúspešných pokusoch o prihlásenie", "DisplayName:LockoutEnabled": "Uzamknúť účet",
"NewRole": "Nová rola", "NewRole": "Nová rola",
"RoleName": "Názov roly", "RoleName": "Názov roly",
"CreationTime": "Čas vytvorenia", "CreationTime": "Čas vytvorenia",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefonska številka", "DisplayName:PhoneNumber": "Telefonska številka",
"DisplayName:TwoFactorEnabled": "Dvostopenjsko preverjanje", "DisplayName:TwoFactorEnabled": "Dvostopenjsko preverjanje",
"DisplayName:IsActive": "Aktiven", "DisplayName:IsActive": "Aktiven",
"DisplayName:LockoutEnabled": "Zaklepanje računa po neuspelih poskusih prijave", "DisplayName:LockoutEnabled": "Zaklepanje računa",
"NewRole": "Nova vloga", "NewRole": "Nova vloga",
"RoleName": "Naziv vloge", "RoleName": "Naziv vloge",
"CreationTime": "Čas nastanka", "CreationTime": "Čas nastanka",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Telefon numarası", "DisplayName:PhoneNumber": "Telefon numarası",
"DisplayName:TwoFactorEnabled": "İki aşamalı doğrulama", "DisplayName:TwoFactorEnabled": "İki aşamalı doğrulama",
"DisplayName:IsActive": "Aktif", "DisplayName:IsActive": "Aktif",
"DisplayName:LockoutEnabled": "Başarısız giriş denemeleri sonrası hesabı kilitleme", "DisplayName:LockoutEnabled": "Hesap kilitlenmesi",
"NewRole": "Yeni rol", "NewRole": "Yeni rol",
"RoleName": "Rol adı", "RoleName": "Rol adı",
"CreationTime": "Oluşturma zamanı", "CreationTime": "Oluşturma zamanı",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "Số điện thoại", "DisplayName:PhoneNumber": "Số điện thoại",
"DisplayName:TwoFactorEnabled": "Xác thực hai yếu tố", "DisplayName:TwoFactorEnabled": "Xác thực hai yếu tố",
"DisplayName:IsActive": "Tích cực", "DisplayName:IsActive": "Tích cực",
"DisplayName:LockoutEnabled": "Khóa tài khoản sau những lần đăng nhập thất bại", "DisplayName:LockoutEnabled": "Khóa tài khoản",
"NewRole": "Vai trò mới", "NewRole": "Vai trò mới",
"RoleName": "Tên vai trò", "RoleName": "Tên vai trò",
"CreationTime": "Thời gian tạo", "CreationTime": "Thời gian tạo",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "手机号码", "DisplayName:PhoneNumber": "手机号码",
"DisplayName:TwoFactorEnabled": "二次认证", "DisplayName:TwoFactorEnabled": "二次认证",
"DisplayName:IsActive": "启用", "DisplayName:IsActive": "启用",
"DisplayName:LockoutEnabled": "登录失败,账户被锁定", "DisplayName:LockoutEnabled": "账户锁定",
"NewRole": "新角色", "NewRole": "新角色",
"RoleName": "角色名称", "RoleName": "角色名称",
"CreationTime": "创建时间", "CreationTime": "创建时间",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json

@ -27,7 +27,7 @@
"DisplayName:PhoneNumber": "手機號碼", "DisplayName:PhoneNumber": "手機號碼",
"DisplayName:TwoFactorEnabled": "二次認證", "DisplayName:TwoFactorEnabled": "二次認證",
"DisplayName:IsActive": "啟用", "DisplayName:IsActive": "啟用",
"DisplayName:LockoutEnabled": "登入失敗,帳號被鎖定", "DisplayName:LockoutEnabled": "帳號鎖定",
"NewRole": "新角色", "NewRole": "新角色",
"RoleName": "角色名稱", "RoleName": "角色名稱",
"CreationTime": "建立時間", "CreationTime": "建立時間",

2
modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs

@ -35,7 +35,7 @@ public class AbpIdentityEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new IdentityDbContext( new IdentityDbContext(

2
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs

@ -40,7 +40,7 @@ public class AbpIdentityServerTestEntityFrameworkCoreModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new IdentityDbContext( new IdentityDbContext(

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

@ -37,7 +37,7 @@ public class OpenIddictEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new IdentityDbContext( new IdentityDbContext(

2
modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs

@ -33,7 +33,7 @@ public class AbpSettingManagementEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new SettingManagementDbContext( new SettingManagementDbContext(

2
modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs

@ -37,7 +37,7 @@ public class AbpTenantManagementEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new TenantManagementDbContext( new TenantManagementDbContext(

3
npm/ng-packs/nx.json

@ -77,6 +77,5 @@
"!{projectRoot}/.eslintrc.json" "!{projectRoot}/.eslintrc.json"
] ]
}, },
"parallel": 3, "parallel": 3
"nxCloudAccessToken": "NjEzZTliYmMtYmU1MC00ZmI4LWFhOTAtYWY0ZDhiMjhiNzQ0fHJlYWQtd3JpdGU="
} }

121
npm/ng-packs/packages/oauth/src/lib/tests/oauth-error-filter.service.spec.ts

@ -0,0 +1,121 @@
import { createServiceFactory, SpectatorService } from '@ngneat/spectator';
import { OAuthErrorFilterService } from '../services';
import { AuthErrorEvent, AuthErrorFilter } from '@abp/ng.core';
import { OAuthErrorEvent } from 'angular-oauth2-oidc';
const ids = {
firstFilter: 'firstFilter',
secondFilter: 'secondFilter',
};
type Reason = object & { error: { grant_type: string | undefined; }; };
describe('AuthService', () => {
let spectator: SpectatorService<OAuthErrorFilterService>;
let oAuthErrorFilterService: OAuthErrorFilterService;
const createService = createServiceFactory(OAuthErrorFilterService);
let firstFilter: AuthErrorFilter = {
id: '',
executable: Boolean(),
execute: () => Boolean(),
};
let secondFilter: AuthErrorFilter = {
id: '',
executable: Boolean(),
execute: () => Boolean(),
};
beforeEach(() => {
spectator = createService();
oAuthErrorFilterService = spectator.inject(OAuthErrorFilterService);
firstFilter = {
id: ids.firstFilter,
executable: true,
execute: (event: AuthErrorEvent) => {
const { reason } = event;
const {
error: { grant_type },
} = <Reason>(reason || {});
return !!grant_type && grant_type === ids.firstFilter;
},
};
secondFilter = {
id: ids.secondFilter,
executable: true,
execute: (event: AuthErrorEvent) => {
const { reason } = event;
const {
error: { grant_type },
} = <Reason>(reason || {});
return !!grant_type && grant_type === ids.secondFilter;
},
};
});
it('should add filter to filter service', () => {
oAuthErrorFilterService.add(firstFilter);
expect(oAuthErrorFilterService.filters()).toContain(firstFilter);
expect(oAuthErrorFilterService.filters()).toHaveLength(1);
oAuthErrorFilterService.add(secondFilter);
expect(oAuthErrorFilterService.filters()).toHaveLength(2);
});
it('should be able to get item by id', () => {
oAuthErrorFilterService.add(firstFilter);
expect(oAuthErrorFilterService.get(ids.firstFilter)).toBe(firstFilter);
});
it('should be able to patch item', () => {
oAuthErrorFilterService.add(firstFilter);
oAuthErrorFilterService.patch({ id: ids.firstFilter, executable: false });
expect(oAuthErrorFilterService.get(ids.firstFilter)?.executable).toBe(false);
});
it('should be able to remove item', () => {
oAuthErrorFilterService.add(firstFilter);
oAuthErrorFilterService.add(secondFilter);
oAuthErrorFilterService.remove(ids.firstFilter);
expect(oAuthErrorFilterService.filters()).not.toContain(firstFilter);
expect(oAuthErrorFilterService.filters()).toContain(secondFilter);
expect(oAuthErrorFilterService.filters()).toHaveLength(1);
});
it('if any execute method returns true, it should return the true value.', () => {
oAuthErrorFilterService.add(firstFilter);
oAuthErrorFilterService.add(secondFilter);
const event = {
reason: {
error: {
grant_type: ids.secondFilter,
},
},
} as OAuthErrorEvent;
expect(oAuthErrorFilterService.run(event)).toBe(true);
});
it('if none of execute method returns true, it should return the false.', () => {
oAuthErrorFilterService.add(firstFilter);
oAuthErrorFilterService.add(secondFilter);
const event = {
reason: {
error: {
grant_type: 'random-event',
},
},
} as OAuthErrorEvent;
expect(oAuthErrorFilterService.run(event)).toBe(false);
});
});

2
npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts

@ -13,4 +13,4 @@ export class ModalCloseDirective {
onClick() { onClick() {
this.modal?.close(); this.modal?.close();
} }
} }

4
npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts

@ -51,7 +51,9 @@ export class ModalComponent implements OnInit, OnDestroy, DismissableModal {
this._busy = value; this._busy = value;
} }
@Input() options: NgbModalOptions = {}; @Input() options: NgbModalOptions = {
keyboard: true,
};
@Input() suppressUnsavedChangesWarning = this.suppressUnsavedChangesWarningToken; @Input() suppressUnsavedChangesWarning = this.suppressUnsavedChangesWarningToken;

2
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs

@ -59,7 +59,7 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
var options = new DbContextOptionsBuilder<MyProjectNameDbContext>() var options = new DbContextOptionsBuilder<MyProjectNameDbContext>()

2
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs

@ -33,7 +33,7 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new MyProjectNameDbContext( new MyProjectNameDbContext(

Loading…
Cancel
Save