Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit f6f2491

Browse files
committed
Fixing edge-case ancestor re-validation with new fields + unit tests
1 parent efa5bac commit f6f2491

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

src/utils/update-field.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export default function updateField(state, path, newState, newSubState, updater)
2828
let fullState = state;
2929

3030
if (!field) {
31-
fullState = i.merge(state, createInitialState(
31+
fullState = i.merge(createInitialState(
3232
state.$form.model,
33-
tempInitialState(path)));
33+
tempInitialState(path)), state);
3434

3535
field = get(fullState, path);
3636
}

test/form-reducer-actions-spec.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,58 @@ describe('formReducer() (V1)', () => {
480480
}
481481
});
482482
}));
483+
484+
describe('valid state of parent forms', () => {
485+
const reducer = formReducer('test', {
486+
foo: 'foo',
487+
meta: {
488+
bar: 'deep',
489+
},
490+
});
491+
492+
const invalidFoo = reducer(undefined,
493+
actions.setValidity('test.foo', false));
494+
495+
it('parent form should be invalid if child is invalid', () => {
496+
assert.isFalse(invalidFoo.$form.valid);
497+
assert.isFalse(invalidFoo.foo.valid);
498+
});
499+
500+
const invalidFooBar = reducer(invalidFoo,
501+
actions.setValidity('test.meta.bar', false));
502+
503+
it('parent form should remain invalid if grandchild is invalid', () => {
504+
assert.isFalse(invalidFooBar.$form.valid);
505+
assert.isFalse(invalidFooBar.foo.valid);
506+
assert.isFalse(invalidFooBar.meta.bar.valid);
507+
});
508+
509+
const focusedNewField = reducer(invalidFooBar,
510+
actions.focus('test.meta.new', true));
511+
512+
it('parent form should remain invalid if new field dynamically added', () => {
513+
assert.isFalse(focusedNewField.$form.valid);
514+
assert.isFalse(focusedNewField.foo.valid);
515+
assert.isFalse(focusedNewField.meta.bar.valid);
516+
assert.isTrue(focusedNewField.meta.new.valid);
517+
});
518+
519+
const invalidFooValidBar = reducer(focusedNewField,
520+
actions.setValidity('test.meta.bar', true));
521+
522+
it('parent form should remain invalid if only grandchild is valid', () => {
523+
assert.isFalse(invalidFooValidBar.$form.valid);
524+
assert.isFalse(invalidFooValidBar.foo.valid);
525+
assert.isTrue(invalidFooValidBar.meta.bar.valid);
526+
});
527+
528+
const validFooValidBar = reducer(invalidFooValidBar,
529+
actions.setValidity('test.foo', true));
530+
531+
it('parent form should be valid if all descendants are valid', () => {
532+
assert.isTrue(validFooValidBar.$form.valid);
533+
assert.isTrue(validFooValidBar.foo.valid);
534+
assert.isTrue(validFooValidBar.meta.bar.valid);
535+
});
536+
});
483537
});

0 commit comments

Comments
 (0)