From cabb20b5f1a2645547429685fe20d1035a9bf635 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 8 Apr 2020 15:39:58 +0300 Subject: [PATCH] feat(theme-shared): create getValidators utility function #3514 --- .../src/lib/tests/validation-utils.spec.ts | 52 +++++++++++++++++++ .../theme-shared/src/lib/utils/index.ts | 1 + .../src/lib/utils/validation-utils.ts | 45 ++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts new file mode 100644 index 0000000000..3cda3b5403 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts @@ -0,0 +1,52 @@ +import { ConfigState } from '@abp/ng.core'; +import { Component } from '@angular/core'; +import { createComponentFactory, Spectator } from '@ngneat/spectator'; +import { NgxValidateCoreModule, validatePassword } from '@ngx-validate/core'; +import { NgxsModule, Store } from '@ngxs/store'; +import { HttpClient } from '@angular/common/http'; +import { getPasswordValidators } from '../utils'; +import { Validators } from '@angular/forms'; + +@Component({ template: '', selector: 'abp-dummy' }) +class DummyComponent {} + +describe('ValidationUtils', () => { + let spectator: Spectator; + const createComponent = createComponentFactory({ + component: DummyComponent, + imports: [NgxsModule.forRoot([ConfigState]), NgxValidateCoreModule.forRoot()], + mocks: [HttpClient], + }); + + beforeEach(() => (spectator = createComponent())); + + describe('#getPasswordValidators', () => { + it('should return password valdiators', () => { + const store = spectator.get(Store); + store.reset({ + ConfigState: { + setting: { + values: { + 'Abp.Identity.Password.RequiredLength': '6', + 'Abp.Identity.Password.RequiredUniqueChars': '1', + 'Abp.Identity.Password.RequireNonAlphanumeric': 'True', + 'Abp.Identity.Password.RequireLowercase': 'True', + 'Abp.Identity.Password.RequireUppercase': 'True', + 'Abp.Identity.Password.RequireDigit': 'True', + }, + }, + }, + }); + const validators = getPasswordValidators(store); + const expectedValidators = [ + validatePassword(['number', 'small', 'capital', 'special']), + Validators.minLength(6), + Validators.maxLength(128), + ]; + + validators.forEach((validator, index) => { + expect(validator.toString()).toBe(expectedValidators[index].toString()); + }); + }); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts index 3742880cb7..f50cf2ffe0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts @@ -1,2 +1,3 @@ export * from './widget-utils'; export * from './date-parser-formatter'; +export * from './validation-utils'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts b/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts new file mode 100644 index 0000000000..c1067a0042 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts @@ -0,0 +1,45 @@ +import { Store } from '@ngxs/store'; +import { ABP, ConfigState } from '@abp/ng.core'; +import { PasswordRules, validatePassword } from '@ngx-validate/core'; +import { Validators } from '@angular/forms'; + +const { minLength, maxLength } = Validators; + +export function getPasswordValidators(store: Store) { + const getRule = getRuleFn(store); + + const passwordRulesArr = [] as PasswordRules; + let requiredLength = 1; + + if (getRule('RequireDigit') === 'true') { + passwordRulesArr.push('number'); + } + + if (getRule('RequireLowercase') === 'true') { + passwordRulesArr.push('small'); + } + + if (getRule('RequireUppercase') === 'true') { + passwordRulesArr.push('capital'); + } + + if (getRule('RequireNonAlphanumeric') === 'true') { + passwordRulesArr.push('special'); + } + + if (Number.isInteger(+getRule('RequiredLength'))) { + requiredLength = +getRule('RequiredLength'); + } + + return [validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(128)]; +} + +function getRuleFn(store: Store) { + return (key: string) => { + const passwordRules: ABP.Dictionary = store.selectSnapshot( + ConfigState.getSettings('Identity.Password'), + ); + + return (passwordRules[`Abp.Identity.Password.${key}`] || '').toLowerCase(); + }; +}