diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 8da2082360..2261ab7bab 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: true contact_links: - name: Issue with ABP Commercial 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) url: https://stackoverflow.com/questions/tagged/abp about: Ask a question that will be answered by the ABP community diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index 43d4ff28a0..2cc5c7a11f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -796,6 +796,7 @@ "PaymentFailedInfo": "عذرا، فشل الدفع! ", "UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل", "ManageLicense": "التحكم في الترخيص", - "AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل ABP Platform" + "AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل ABP Platform", + "Previous": "سابق" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json index c3115ecb93..4861435912 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json @@ -410,7 +410,7 @@ "PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ", "UsedPayment": "Tato platba již byla použita", "ManageLicense": "Správa licence", - "AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od ABP Platform" - + "AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od ABP Platform", + "Previous": "Předchozí" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json index 2f0187d190..5d1f760655 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json @@ -391,6 +391,7 @@ "PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ", "UsedPayment": "Diese Zahlung wurde bereits verwendet", "ManageLicense": "Lizenz verwalten", - "AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von ABP Platform", + "Previous": "Vorherige" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json index 3636e5d08e..a4044de13f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json @@ -113,6 +113,7 @@ "BlackFridayDiscount": "Black Friday Discount", "MultipleOrganizationInfo": "See All Your Organizations", "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" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 4c7c9ffec3..0c4448e8a9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/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.", "LearnMore": "Learn More", "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" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json index 3055152190..10875ea1b8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json @@ -391,6 +391,7 @@ "PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ", "UsedPayment": "Este pago ya ha sido utilizado.", "ManageLicense": "Gestionar licencia", - "AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por ABP Platform" + "AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por ABP Platform", + "Previous": "Anterior" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json index 6a9c7014e5..e303f60dbd 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json @@ -832,6 +832,7 @@ "PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ", "UsedPayment": "Tämä maksu on jo käytetty", "ManageLicense": "Hallinnoi lisenssiä", - "AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta ABP Platform", + "Previous": "Edellinen" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json index 1308409a4b..c7cae03c8c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json @@ -410,6 +410,7 @@ "PaymentFailedInfo": "Désolé, le paiement a échoué! ", "UsedPayment": "Ce paiement a déjà été utilisé", "ManageLicense": "Gérer la licence", - "AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par ABP Platform" + "AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par ABP Platform", + "Previous": "Précédent" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json index d4088fc14a..36ac06ab07 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json @@ -409,6 +409,7 @@ "PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ", "UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है", "ManageLicense": "लाइसेंस प्रबंधन", - "AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम" + "AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम", + "Previous": "पहले का" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json index 7396ceea89..d5f2ee2455 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json @@ -1088,6 +1088,7 @@ "PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ", "UsedPayment": "Ovo plaćanje je već iskorišteno", "ManageLicense": "Upravljanje licencom", - "AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane ABP Platform", + "Previous": "Prethodno" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json index b6169dedb1..03c1fe410e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json @@ -758,6 +758,7 @@ "PaymentFailedInfo": "Sajnos a fizetés sikertelen! ", "UsedPayment": "Ezt a fizetést már felhasználták", "ManageLicense": "Licenc kezelése", - "AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az ABP Platform által" + "AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az ABP Platform által", + "Previous": "Előző" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json index f2fe887688..6ddc3d9665 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json @@ -388,6 +388,7 @@ "PaymentFailedInfo": "Því miður, greiðsla mistókst! ", "UsedPayment": "Þessi greiðsla hefur þegar verið notuð", "ManageLicense": "Stjórna leyfi", - "AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af ABP Platform", + "Previous": "Fyrri" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json index ca62992ead..a29242c20e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json @@ -409,6 +409,7 @@ "PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ", "UsedPayment": "Questo pagamento è già stato utilizzato", "ManageLicense": "Gestisci la licenza", - "AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di ABP Platform" + "AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di ABP Platform", + "Previous": "Precedente" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json index 43a2ec29fb..d4414aec51 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json @@ -388,6 +388,7 @@ "PaymentFailedInfo": "Excuses, betaling mislukt! ", "UsedPayment": "Deze betaling is al gebruikt", "ManageLicense": "Licentie beheren", - "AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door ABP Platform", + "Previous": "Vorig" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json index e5c2d99253..15f305439b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json @@ -388,6 +388,7 @@ "PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ", "UsedPayment": "Ta płatność została już wykorzystana", "ManageLicense": "Zarządzaj licencją", - "AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od ABP Platform" + "AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od ABP Platform", + "Previous": "Poprzedni" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json index 7d5b636488..11866ee839 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json @@ -411,6 +411,7 @@ "PaymentFailedInfo": "Desculpe, o pagamento falhou! ", "UsedPayment": "Este pagamento já foi usado", "ManageLicense": "Gerenciar Licença", - "AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por ABP Platform" + "AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por ABP Platform", + "Previous": "Anterior" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json index cd438f98cd..731d2a7dc7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json @@ -388,6 +388,7 @@ "PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ", "UsedPayment": "Această plată a fost deja utilizată", "ManageLicense": "Administrare licență", - "AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la ABP Platform" + "AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la ABP Platform", + "Previous": "Anterior" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json index 782743ab76..7c504f57db 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json @@ -1089,6 +1089,7 @@ "PaymentFailedInfo": "Извините, оплата не удалась! ", "UsedPayment": "Этот платеж уже использован", "ManageLicense": "Управление лицензией", - "AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от ABP Platform" + "AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от ABP Platform", + "Previous": "Предыдущий" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json index 473d23ca48..d709d3a146 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json @@ -407,6 +407,7 @@ "PaymentFailedInfo": "Ľutujeme, platba zlyhala! ", "UsedPayment": "Táto platba už bola použitá", "ManageLicense": "Spravovať licenciu", - "AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od ABP Platform" + "AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od ABP Platform", + "Previous": "Predchádzajúce" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json index 314dcce4b3..cc935ed0de 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json @@ -388,6 +388,7 @@ "PaymentFailedInfo": "Žal plačilo ni uspelo! ", "UsedPayment": "To plačilo je že bilo uporabljeno", "ManageLicense": "Upravljanje licenco", - "AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani ABP Platform" + "AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani ABP Platform", + "Previous": "Prejšnja" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json index d11e461116..11884275b4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json @@ -998,6 +998,7 @@ "MyOrganizations_Detail_LicenseStartDate": "Lisans Başlangıç Tarihi", "MyOrganizations_Detail_LicenseExpiryDate": "Bitiş Tarihi", "ManageLicense": "Lisansı Yönet", - "AbpPlatformLeptonXTheme": "ABP Platform Yönetici Kontrol Paneliniz için LeptonX Teması" + "AbpPlatformLeptonXTheme": "ABP Platform Yönetici Kontrol Paneliniz için LeptonX Teması", + "Previous": "Önceki" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json index 39f1b7cb9c..77d8968c5c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json +++ b/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! ", "UsedPayment": "Khoản thanh toán này đã được sử dụng", "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 ABP Platform" + "AbpPlatformLeptonXTheme": "Chủ đề LeptonX cho Bảng điều khiển quản trị của bạn bởi ABP Platform", + "Previous": "Trước" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index 19aac6757d..0d65066fc5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -1090,6 +1090,7 @@ "PaymentFailedInfo": "抱歉,支付失败!", "UsedPayment": "该付款已被使用", "ManageLicense": "管理许可证", - "AbpPlatformLeptonXTheme": "由 ABP Platform 提供的您的管理仪表板的 LeptonX 主题" + "AbpPlatformLeptonXTheme": "由 ABP Platform 提供的您的管理仪表板的 LeptonX 主题", + "Previous": "以前的" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json index b1e8e87a21..b495b690dd 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json @@ -1079,6 +1079,7 @@ "PaymentFailedInfo": "抱歉,支付失败!", "UsedPayment": "该付款已被使用", "ManageLicense": "管理許可證", - "AbpPlatformLeptonXTheme": "由 ABP Platform 提供的您的管理儀表板的 LeptonX 主題" + "AbpPlatformLeptonXTheme": "由 ABP Platform 提供的您的管理儀表板的 LeptonX 主題", + "Previous": "以前的" } } \ No newline at end of file diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md index 0d43c5e31e..6245db82c8 100644 --- a/docs/en/Modules/Tenant-Management.md +++ b/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** -``` +```cs public class MyHandler : IDistributedEventHandler>, ITransientDependency @@ -131,4 +131,4 @@ ABP Framework allows to use *database per tenant* approach that allows a tenant ## See Also * [Multi-Tenancy](../Multi-Tenancy.md) -* [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas) \ No newline at end of file +* [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas) diff --git a/docs/en/Testing.md b/docs/en/Testing.md index fe005756ca..e58defc619 100644 --- a/docs/en/Testing.md +++ b/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)). * `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. * `TestBase` contains some classes those are shared/used by the other projects. @@ -537,12 +537,13 @@ using Xunit; namespace MyProject.Issues { - public class IssueManager_Integration_Tests : MyProjectDomainTestBase + public abstract class IssueManager_Integration_Tests : MyProjectDomainTestBase + where TStartupModule : IAbpModule { private readonly IssueManager _issueManager; private readonly Issue _issue; - public IssueManager_Integration_Tests() + protected IssueManager_Integration_Tests() { _issueManager = GetRequiredService(); _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`. * 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 { - public class IssueAppService_Tests : MyProjectApplicationTestBase + public abstract class IssueAppService_Tests : MyProjectApplicationTestBase + where TStartupModule : IAbpModule { private readonly IIssueAppService _issueAppService; - public IssueAppService_Tests() + protected IssueAppService_Tests() { _issueAppService = GetRequiredService(); } @@ -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. ### 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: ````csharp -public class IssueRepository_Tests : MyProjectDomainTestBase +public abstract class IssueRepository_Tests : MyProjectDomainTestBase + where TStartupModule : IAbpModule { private readonly IRepository _issueRepository; - public IssueRepository_Tests() + protected IssueRepository_Tests() { _issueRepository = GetRequiredService>(); } @@ -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` 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: ````csharp -public class IssueRepository_Tests : MyProjectDomainTestBase +public abstract class IssueRepository_Tests : MyProjectDomainTestBase + where TStartupModule : IAbpModule { private readonly IRepository _issueRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; - public IssueRepository_Tests() + protected IssueRepository_Tests() { _issueRepository = GetRequiredService>(); _unitOfWorkManager = GetRequiredService(); @@ -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: ````csharp -public class MyDbContext_Tests : MyProjectDomainTestBase +public abstract class MyDbContext_Tests : MyProjectDomainTestBase + where TStartupModule : IAbpModule { private readonly IDbContextProvider _dbContextProvider; private readonly IUnitOfWorkManager _unitOfWorkManager; - public IssueRepository_Tests() + protected IssueRepository_Tests() { _dbContextProvider = GetRequiredService>(); _unitOfWorkManager = GetRequiredService(); @@ -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. For [MongoDB](MongoDB.md), you can use the `IMongoDbContextProvider` 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 +{ + +} +```` + +> 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 In general, there are two types of UI Tests; diff --git a/docs/en/images/solution-test-projects.png b/docs/en/images/solution-test-projects.png index e51c368e9f..87ac41c6a1 100644 Binary files a/docs/en/images/solution-test-projects.png and b/docs/en/images/solution-test-projects.png differ diff --git a/docs/en/images/unitest-efcore-mongodb.png b/docs/en/images/unitest-efcore-mongodb.png new file mode 100644 index 0000000000..4145d9d7c9 Binary files /dev/null and b/docs/en/images/unitest-efcore-mongodb.png differ diff --git a/docs/en/images/vs-run-tests-in-parallel.png b/docs/en/images/vs-run-tests-in-parallel.png index 765cba5100..cb33bd76c2 100644 Binary files a/docs/en/images/vs-run-tests-in-parallel.png and b/docs/en/images/vs-run-tests-in-parallel.png differ diff --git a/docs/en/images/vs-startup-template-tests.png b/docs/en/images/vs-startup-template-tests.png index f16d79a4c7..0e45200e13 100644 Binary files a/docs/en/images/vs-startup-template-tests.png and b/docs/en/images/vs-startup-template-tests.png differ diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index 37343b72ed..e9cbd0a997 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -54,19 +54,22 @@ public class AbpInputTagHelperService : AbpTagHelperService output.TagMode = TagMode.StartTagAndEndTag; output.TagName = "div"; LeaveOnlyGroupAttributes(context, output); - if (TagHelper.FloatingLabel && !isCheckBox) + if (!IsOutputHidden(output)) { - output.Attributes.AddClass("form-floating"); - } - if (TagHelper.AddMarginBottomClass) - { - output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); - } - if (isCheckBox) - { - output.Attributes.AddClass("custom-checkbox"); - output.Attributes.AddClass("custom-control"); - output.Attributes.AddClass("form-check"); + if (TagHelper.FloatingLabel && !isCheckBox) + { + output.Attributes.AddClass("form-floating"); + } + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); + } + if (isCheckBox) + { + output.Attributes.AddClass("custom-checkbox"); + output.Attributes.AddClass("custom-control"); + output.Attributes.AddClass("form-check"); + } } output.Content.AppendHtml(innerHtml); } @@ -263,7 +266,7 @@ public class AbpInputTagHelperService : AbpTagHelperService } protected virtual async Task GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox) - { + { if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel) { return string.Empty; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs new file mode 100644 index 0000000000..e3b0dd7e30 --- /dev/null +++ b/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; + +/// +/// This class is for unit testing purposes. +/// It prevents exceptions in concurrent testing because Sqlite is not thread-safe. +/// +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); + } + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs index 9b20a4aa09..ac6208f47b 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs @@ -11,6 +11,8 @@ public class AbpStringToEnumConverter : JsonConverter private JsonSerializerOptions? _readJsonSerializerOptions; + private JsonSerializerOptions? _writeJsonSerializerOptions; + public AbpStringToEnumConverter() : this(namingPolicy: null, allowIntegerValues: true) { @@ -39,7 +41,11 @@ public class AbpStringToEnumConverter : JsonConverter 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) diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs index 3a21cfaf5a..c753d65d07 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs @@ -62,7 +62,7 @@ public class AbpAuditingTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); using (var context = new AbpAuditingTestDbContext(new DbContextOptionsBuilder() diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs index f23ac14fda..7db3130827 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs @@ -93,7 +93,7 @@ public class AbpEntityFrameworkCoreTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); using (var context = new TestMigrationsDbContext(new DbContextOptionsBuilder().UseSqlite(connection).Options)) diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs index 8d00afd109..3996ddafe5 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using System.Text.Json.Serialization; using Shouldly; using Volo.Abp.Json.SystemTextJson.JsonConverters; using Xunit; @@ -53,10 +54,26 @@ public class AbpStringToEnum_Tests var testClassJson = JsonSerializer.Serialize(new TestClass() { Day = DayOfWeek.Monday - }); + }, options); 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.Monday, "Mo"} diff --git a/latest-versions.json b/latest-versions.json index aa4257f8a2..7752a099aa 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,6 +1,6 @@ [ { - "version": "8.0.3", + "version": "8.0.4", "releaseDate": "", "type": "stable", "message": "" diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs index 100087f1fb..2a6c932753 100644 --- a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new IdentityDbContext( diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs index bb8570d253..42d246625e 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new AbpAuditLoggingDbContext( diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs index a642ddc227..c19016d0d0 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new BackgroundJobsDbContext( diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs index 082b1640b7..038ca5874d 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs @@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage; +using Volo.Abp.EntityFrameworkCore.Sqlite; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; @@ -9,7 +10,8 @@ namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore; [DependsOn( typeof(BlobStoringDatabaseTestBaseModule), - typeof(BlobStoringDatabaseEntityFrameworkCoreModule) + typeof(BlobStoringDatabaseEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqliteModule) )] public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule { @@ -28,7 +30,7 @@ public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new BlobStoringDbContext( diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj index 59db9b77df..b48e29993d 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj @@ -11,6 +11,7 @@ + diff --git a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs index 0a27448f6e..498e8e7ab6 100644 --- a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs +++ b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs @@ -33,7 +33,7 @@ namespace Volo.Blogging.EntityFrameworkCore private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); var options = new DbContextOptionsBuilder().UseSqlite(connection).Options; diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs index 9b7fee252a..139e4bdce9 100644 --- a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/CmsKitEntityFrameworkCoreTestModule.cs @@ -30,7 +30,7 @@ public class CmsKitEntityFrameworkCoreTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new CmsKitDbContext( diff --git a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs index eb3a5ae5bd..fe3e32291f 100644 --- a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs +++ b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo/Docs/EntityFrameworkCore/DocsEntityFrameworkCoreTestModule.cs @@ -30,7 +30,7 @@ namespace Volo.Docs.EntityFrameworkCore private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new DocsDbContext( diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo/Abp/FeatureManagement/EntityFrameworkCore/AbpFeatureManagementEntityFrameworkCoreTestModule.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo/Abp/FeatureManagement/EntityFrameworkCore/AbpFeatureManagementEntityFrameworkCoreTestModule.cs index 3329f1dba6..242cf75233 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo/Abp/FeatureManagement/EntityFrameworkCore/AbpFeatureManagementEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new FeatureManagementDbContext( diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json index f64fedeacd..7b3edfb3d9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "رقم الهاتف", "DisplayName:TwoFactorEnabled": "التحقق من عاملين", "DisplayName:IsActive": "نشيط", - "DisplayName:LockoutEnabled": "تأمين الحساب بعد محاولات تسجيل الدخول الفاشلة", + "DisplayName:LockoutEnabled": "تأمين الحساب", "NewRole": "دور جديد", "RoleName": "اسم الدور", "CreationTime": "وقت الإنشاء", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json index 28a6d2efe7..a3079f81af 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefonní číslo", "DisplayName:TwoFactorEnabled": "Dvoufázové ověřování", "DisplayName:IsActive": "Aktivní", - "DisplayName:LockoutEnabled": "Zamčení účtu po neúspěšných pokusech", + "DisplayName:LockoutEnabled": "Zamčení účtu", "NewRole": "Nová role", "RoleName": "Název role", "CreationTime": "Vytvořeno", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json index 2869bc563b..1db549aee7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefonnummer", "DisplayName:TwoFactorEnabled": "Zwei-Faktor-Überprüfung", "DisplayName:IsActive": "Aktiv", - "DisplayName:LockoutEnabled": "Benutzerkonto nach fehlgeschlagenen Anmeldeversuchen sperren", + "DisplayName:LockoutEnabled": "Konto-Sperrung", "NewRole": "Neue Rolle", "RoleName": "Rollenname", "CreationTime": "Erstellungszeitpunkt", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json index 9c1db90c91..fa761f73f3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json @@ -26,7 +26,7 @@ "DisplayName:PhoneNumber": "Τηλεφωνικό νούμερο", "DisplayName:TwoFactorEnabled": "Επαλήθευση δύο παραγόντων", "DisplayName:IsActive": "Ενεργός", - "DisplayName:LockoutEnabled": "Κλείδωμα λογαριασμού μετά από αποτυχημένες προσπάθειες σύνδεσης", + "DisplayName:LockoutEnabled": "Κλείδωμα λογαριασμού", "NewRole": "Νέος ρόλος", "RoleName": "Όνομα ρόλου", "CreationTime": "Χρόνος δημιουργίας", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json index 209d4a0aee..a6c719d29e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json @@ -26,7 +26,7 @@ "DisplayName:Email": "Email Address", "DisplayName:PhoneNumber": "Phone Number", "DisplayName:TwoFactorEnabled": "Two factor verification", - "DisplayName:LockoutEnabled": "Lock account after failed login attempts", + "DisplayName:LockoutEnabled": "Account lockout", "NewRole": "New role", "RoleName": "Role name", "CreationTime": "Creation time", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index 4347a55a00..024c4c8b79 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Phone number", "DisplayName:TwoFactorEnabled": "Two factor verification", "DisplayName:IsActive": "Active", - "DisplayName:LockoutEnabled": "Lock account after failed login attempts", + "DisplayName:LockoutEnabled": "Account lockout", "NewRole": "New role", "RoleName": "Role name", "CreationTime": "Creation time", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json index af59c54d3c..118a53d47a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json +++ b/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:TwoFactorEnabled": "Autenticación en dos pasos", "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", "RoleName": "Nombre de rol", "CreationTime": "Fecha de creación", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json index 14b99b3ec7..625e5feea7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json @@ -26,7 +26,7 @@ "DisplayName:PhoneNumber": "شماره تلفن", "DisplayName:TwoFactorEnabled": "احراز هویت دو مرحله ای", "DisplayName:IsActive": "فعال", - "DisplayName:LockoutEnabled": "قفل کردن حساب در صورت عدم موفقیت در ورود به سیستم", + "DisplayName:LockoutEnabled": "قفل کردن حساب", "NewRole": "نقش/وظیفه جدید", "RoleName": "نام نقش/وظیفه", "CreationTime": "زمان ایجاد", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json index 74d1769602..a433aa3d88 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Puhelinnumero", "DisplayName:TwoFactorEnabled": "Kahden tekijän todentaminen", "DisplayName:IsActive": "Aktiivinen", - "DisplayName:LockoutEnabled": "Lukitse tili epäonnistuneiden kirjautumisyritysten jälkeen", + "DisplayName:LockoutEnabled": "Tilin lukitus", "NewRole": "Uusi rooli", "RoleName": "Roolinimi", "CreationTime": "Luomisaika", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json index ce23db8ac0..4e4d878da8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json +++ b/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:TwoFactorEnabled": "Vérification de deux facteurs", "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", "RoleName": "Nom du rôle", "CreationTime": "Temps de création", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json index 6be48c96ae..5b13ce5d3d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "फ़ोन नंबर", "DisplayName:TwoFactorEnabled": "दो कारक सत्यापन", "DisplayName:IsActive": "सक्रिय", - "DisplayName:LockoutEnabled": "असफल लॉगिन प्रयासों के बाद लॉक खाता", + "DisplayName:LockoutEnabled": "खाता लॉकआउट", "NewRole": "नयी भूमिका", "RoleName": "भूमिका का नाम", "CreationTime": "रचना समय", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json index edf6d40637..95c14b6f2f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Broj telefona", "DisplayName:TwoFactorEnabled": "Two factor verifikacija", "DisplayName:IsActive": "Aktivan", - "DisplayName:LockoutEnabled": "Zaključaj račun nakon neuspjelih pokušaja prijave", + "DisplayName:LockoutEnabled": "Zaključavanje računa", "NewRole": "Nova uloga", "RoleName": "Naziv uloge", "CreationTime": "Vrijeme stvaranja", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json index d4d357a5ce..c9e5181bcb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefonszám", "DisplayName:TwoFactorEnabled": "Kétlépcsős azonosítás", "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", "RoleName": "Szerepkör neve", "CreationTime": "Létrehozás időpontja", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json index e9509004d4..b038b06c07 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Símanúmer", "DisplayName:TwoFactorEnabled": "Tvíþætt sannprófun", "DisplayName:IsActive": "Virkur", - "DisplayName:LockoutEnabled": "Læsa notandareikning eftir misheppnaðar innskráningar", + "DisplayName:LockoutEnabled": "Loka reikningi", "NewRole": "Nýtt hlutverk", "RoleName": "Nafn hlutverks", "CreationTime": "Búið til", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json index ef6ed8c5fa..c57e5af8ab 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Numero di telefono", "DisplayName:TwoFactorEnabled": "Verifica a due fattori", "DisplayName:IsActive": "Attivo", - "DisplayName:LockoutEnabled": "Blocca account dopo tentativi di accesso falliti", + "DisplayName:LockoutEnabled": "Blocco account", "NewRole": "Nuovo ruolo", "RoleName": "Nome del ruolo", "CreationTime": "Orario di creazione", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json index 291061f39d..586523f3f0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefoonnummer", "DisplayName:TwoFactorEnabled": "Tweefactor authenticatie", "DisplayName:IsActive": "Actief", - "DisplayName:LockoutEnabled": "Account vergrendelen na mislukte inlogpogingen", + "DisplayName:LockoutEnabled": "Account vergrendelen", "NewRole": "Nieuwe rol", "RoleName": "Rol naam", "CreationTime": "Creatie tijd", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json index 3be940bca7..825338bf07 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Numer telefonu", "DisplayName:TwoFactorEnabled": "Dwustopniowa weryfikacja", "DisplayName:IsActive": "Aktywny", - "DisplayName:LockoutEnabled": "Blokowanie konta po nieudanych próbach zalogowania", + "DisplayName:LockoutEnabled": "Blokada konta", "NewRole": "Nowa rola", "RoleName": "Nazwa roli", "CreationTime": "Data utworzenia", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json index 0cb440915d..ff89754e8c 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefone", "DisplayName:TwoFactorEnabled": "Verificação em dois fatores", "DisplayName:IsActive": "Ativo", - "DisplayName:LockoutEnabled": "Bloquear conta após falhas ao entrar", + "DisplayName:LockoutEnabled": "Bloqueio de Conta", "NewRole": "Novo Perfil", "RoleName": "Perfil", "CreationTime": "Data de Criação", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json index 995db6bac1..1723206fc2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json +++ b/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:TwoFactorEnabled": "Autentificare în doi paşi", "DisplayName:IsActive": "Activ", - "DisplayName:LockoutEnabled": "Blocaţi contul după încercări eşuate de autentificare", + "DisplayName:LockoutEnabled": "Blocare cont", "NewRole": "Rol nou", "RoleName": "Nume rol", "CreationTime": "Data creării", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json index 79d4e83075..871324d8e5 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Номер телефона", "DisplayName:TwoFactorEnabled": "Двухфакторная проверка подлинности", "DisplayName:IsActive": "Активный", - "DisplayName:LockoutEnabled": "Заблокировать учетную запись после неудачных попыток входа", + "DisplayName:LockoutEnabled": "Блокировка учетной записи", "NewRole": "Новая роль", "RoleName": "Имя роли", "CreationTime": "Время создания", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json index 3ba7eb1184..3233f064a4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefónne číslo", "DisplayName:TwoFactorEnabled": "Dvojfaktorové overenie", "DisplayName:IsActive": "Aktívne", - "DisplayName:LockoutEnabled": "Uzamknúť účet po neúspešných pokusoch o prihlásenie", + "DisplayName:LockoutEnabled": "Uzamknúť účet", "NewRole": "Nová rola", "RoleName": "Názov roly", "CreationTime": "Čas vytvorenia", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json index 23e323c0e2..bf25f83bff 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefonska številka", "DisplayName:TwoFactorEnabled": "Dvostopenjsko preverjanje", "DisplayName:IsActive": "Aktiven", - "DisplayName:LockoutEnabled": "Zaklepanje računa po neuspelih poskusih prijave", + "DisplayName:LockoutEnabled": "Zaklepanje računa", "NewRole": "Nova vloga", "RoleName": "Naziv vloge", "CreationTime": "Čas nastanka", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index c6386b499c..9910fa338c 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "Telefon numarası", "DisplayName:TwoFactorEnabled": "İki aşamalı doğrulama", "DisplayName:IsActive": "Aktif", - "DisplayName:LockoutEnabled": "Başarısız giriş denemeleri sonrası hesabı kilitleme", + "DisplayName:LockoutEnabled": "Hesap kilitlenmesi", "NewRole": "Yeni rol", "RoleName": "Rol adı", "CreationTime": "Oluşturma zamanı", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json index 04d6c03cf2..70cf3635a6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json +++ b/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:TwoFactorEnabled": "Xác thực hai yếu tố", "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", "RoleName": "Tên vai trò", "CreationTime": "Thời gian tạo", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index a6a008f920..b690b3a437 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "手机号码", "DisplayName:TwoFactorEnabled": "二次认证", "DisplayName:IsActive": "启用", - "DisplayName:LockoutEnabled": "登录失败,账户被锁定", + "DisplayName:LockoutEnabled": "账户锁定", "NewRole": "新角色", "RoleName": "角色名称", "CreationTime": "创建时间", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index db10b63ebd..fad617e511 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -27,7 +27,7 @@ "DisplayName:PhoneNumber": "手機號碼", "DisplayName:TwoFactorEnabled": "二次認證", "DisplayName:IsActive": "啟用", - "DisplayName:LockoutEnabled": "登入失敗,帳號被鎖定", + "DisplayName:LockoutEnabled": "帳號鎖定", "NewRole": "新角色", "RoleName": "角色名稱", "CreationTime": "建立時間", diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs index beb2797ea9..f0d1966bd0 100644 --- a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new IdentityDbContext( diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs index 6e934d1d8c..e6711fc180 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new IdentityDbContext( diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs index b7bf216098..c47ecc7996 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new IdentityDbContext( diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs index 9a2c51853e..58df348af7 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new SettingManagementDbContext( diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs index 9358a42216..336fbb228f 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs +++ b/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() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new TenantManagementDbContext( diff --git a/npm/ng-packs/nx.json b/npm/ng-packs/nx.json index 0687396169..57e7ea8df5 100644 --- a/npm/ng-packs/nx.json +++ b/npm/ng-packs/nx.json @@ -77,6 +77,5 @@ "!{projectRoot}/.eslintrc.json" ] }, - "parallel": 3, - "nxCloudAccessToken": "NjEzZTliYmMtYmU1MC00ZmI4LWFhOTAtYWY0ZDhiMjhiNzQ0fHJlYWQtd3JpdGU=" + "parallel": 3 } diff --git a/npm/ng-packs/packages/oauth/src/lib/tests/oauth-error-filter.service.spec.ts b/npm/ng-packs/packages/oauth/src/lib/tests/oauth-error-filter.service.spec.ts new file mode 100644 index 0000000000..c8af0f934d --- /dev/null +++ b/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; + 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 || {}); + + return !!grant_type && grant_type === ids.firstFilter; + }, + }; + + secondFilter = { + id: ids.secondFilter, + executable: true, + execute: (event: AuthErrorEvent) => { + const { reason } = event; + const { + error: { grant_type }, + } = (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); + }); +}); \ No newline at end of file diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts index a20c8d8a34..97d6b14fb9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-close.directive.ts @@ -13,4 +13,4 @@ export class ModalCloseDirective { onClick() { this.modal?.close(); } -} +} \ No newline at end of file diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index ebb0515a08..297fa23c56 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/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; } - @Input() options: NgbModalOptions = {}; + @Input() options: NgbModalOptions = { + keyboard: true, + }; @Input() suppressUnsavedChangesWarning = this.suppressUnsavedChangesWarningToken; diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs index 1804d8cff7..b316391b5f 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs @@ -59,7 +59,7 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); var options = new DbContextOptionsBuilder() diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs index 7abdfb25f8..aed68ef88c 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs @@ -33,7 +33,7 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule private static SqliteConnection CreateDatabaseAndGetConnection() { - var connection = new SqliteConnection("Data Source=:memory:"); + var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:"); connection.Open(); new MyProjectNameDbContext(