Fix reules event filtering when no form is provided (#7592)

This commit is contained in:
Pablo Martinez Garcia 2022-04-22 13:04:49 +02:00 committed by GitHub
parent 039f167b75
commit 6174f8e100
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 7 deletions

View File

@ -26,6 +26,7 @@ import { FormModel } from '../components/widgets/core/form.model';
import { FormRulesEvent } from '../events/form-rules.event'; import { FormRulesEvent } from '../events/form-rules.event';
import { FormEvent } from '../events/form.event'; import { FormEvent } from '../events/form.event';
import { FormService } from '../services/form.service'; import { FormService } from '../services/form.service';
import { getTestScheduler } from 'jasmine-marbles';
class CustomRuleManager extends FormRulesManager<any> { class CustomRuleManager extends FormRulesManager<any> {
protected getRules() { protected getRules() {
@ -76,20 +77,36 @@ describe('Form Rules', () => {
expect(customRuleManager.initialize).toHaveBeenCalled(); expect(customRuleManager.initialize).toHaveBeenCalled();
}); });
it('should send the form loaded event when initialized', async (done) => { it('should send the form loaded event when initialized', () => {
const rulesManager = new CustomRuleManager(formService); const rulesManager = new CustomRuleManager(formService);
const getRulesSpy = spyOn<any>(rulesManager, 'getRules').and.returnValue({}); const getRulesSpy = spyOn<any>(rulesManager, 'getRules').and.returnValue({});
const handleRuleEventSpy = spyOn<any>(rulesManager, 'handleRuleEvent');
const formModel = new FormModel({ id: 'mock' }, {}, false); const formModel = new FormModel({ id: 'mock' }, {}, false);
const formEvent = new FormEvent(formModel); const formEvent = new FormEvent(formModel);
const event = new FormRulesEvent('formLoaded', formEvent); const event = new FormRulesEvent('formLoaded', formEvent);
formService.formRulesEvent.subscribe(formRulesEvent => { rulesManager.initialize(formModel);
expect(formRulesEvent).toEqual(event); getTestScheduler().flush();
done();
expect(getRulesSpy).toHaveBeenCalled();
expect(handleRuleEventSpy).toHaveBeenCalledWith(event, {});
}); });
it('should not receive the form event when event has no form', () => {
const rulesManager = new CustomRuleManager(formService);
spyOn<any>(rulesManager, 'getRules').and.returnValue({});
const handleRuleEventSpy = spyOn<any>(rulesManager, 'handleRuleEvent');
const formModel = new FormModel({ id: 'mock' }, {}, false);
const formEvent = new FormEvent(new FormModel(null));
const event = new FormRulesEvent('formLoaded', formEvent);
rulesManager.initialize(formModel); rulesManager.initialize(formModel);
expect(getRulesSpy).toHaveBeenCalled();
formService.formRulesEvent.next(event);
getTestScheduler().flush();
expect(handleRuleEventSpy).not.toHaveBeenCalledWith(event, jasmine.anything());
}); });
}); });

View File

@ -53,7 +53,7 @@ export abstract class FormRulesManager<T> {
if (!!rules) { if (!!rules) {
this.formService.formRulesEvent this.formService.formRulesEvent
.pipe( .pipe(
filter(event => !!event.form.id && event.form.id === formModel?.id), filter(event => !!event?.form?.id && event.form.id === formModel?.id),
takeUntil(this.onDestroy$) takeUntil(this.onDestroy$)
).subscribe(event => { ).subscribe(event => {
this.handleRuleEvent(event, rules); this.handleRuleEvent(event, rules);