Skip to content

Commit 0768327

Browse files
committed
fix: fix failed unit tests
1 parent e63e7ec commit 0768327

4 files changed

Lines changed: 187 additions & 17 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"build": "node scripts/rollup/build.js",
7171
"testMockServer": "node test/__mock__/server.js &",
7272
"test": "jest --env=jsdom -c ./jest.config.json --silent --verbose",
73+
"publish": "lerna publish --conventional-commits",
7374
"commit": "npx git-cz"
7475
},
7576
"husky": {

packages/rcre/src/core/Form/FormItem.tsx

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -128,21 +128,36 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {
128128

129129
let isRequiredChanged = prevProps.required !== this.props.required;
130130
let isRuleChanged = !isEqual(prevRules, nextRules);
131+
let isFilterRuleChanged = false;
131132

132-
// let isFilterRuleChanged;
133-
// if (prevProps.filterRule && this.props.filterRule) {
134-
// let oldFilterRule = this.validFilterRule(prevProps.filterRule, null, prevRunTime, prevProps.filterErrMsg);
135-
// let nextFilterRule = this.validFilterRule(this.props.filterRule, null, nextRunTime, this.props.filterErrMsg);
136-
// isFilterRuleChanged = !isEqual(oldFilterRule, nextFilterRule);
137-
// }
133+
let controlledNames = Object.keys(this.controlElements);
138134

139-
// if (prevProps.validation && this.props.validation) {
140-
// let oldStatus = this.runValidation(prevProps.validation, null, prevRunTime);
141-
// let nextStatus = this.runValidation(this.props.validation, null, nextRunTime);
142-
// isFilterRuleChanged = !isEqual(oldStatus, nextStatus);
143-
// }
135+
for (let name of controlledNames) {
136+
let prevValue = prevProps.containerContext.$getData(name);
137+
let nextValue = this.props.containerContext.$getData(name);
144138

145-
if (isRequiredChanged || isRuleChanged) {
139+
if (prevProps.filterRule && this.props.filterRule) {
140+
let prevValidateResult = this.validFilterRule(prevProps.filterRule, prevValue, prevRunTime, prevProps.filterErrMsg);
141+
let nextValidateResult = this.validFilterRule(this.props.filterRule, nextValue, nextRunTime, this.props.filterErrMsg);
142+
143+
if (!isEqual(prevValidateResult, nextValidateResult)) {
144+
isFilterRuleChanged = true;
145+
break;
146+
}
147+
}
148+
149+
if (prevProps.validation && this.props.validation) {
150+
let oldStatus = this.runValidation(prevProps.validation, prevValue, prevRunTime);
151+
let nextStatus = this.runValidation(this.props.validation, nextValue, nextRunTime);
152+
153+
if (!isEqual(oldStatus, nextStatus)) {
154+
isFilterRuleChanged = true;
155+
break;
156+
}
157+
}
158+
}
159+
160+
if (isRequiredChanged || isRuleChanged || isFilterRuleChanged) {
146161
let names = Object.keys(this.controlElements);
147162
for (let name of names) {
148163
let element = this.controlElements[name];
@@ -496,10 +511,12 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {
496511

497512
private handleChange = (name: string, data: any) => {
498513
// 输入值改变,需要重置API请求锁
499-
console.log('validate');
500-
// this.isApiValidate = false;
501-
this.props.containerContext.$setData(name, data);
502-
this.validateFormItem(name, data);
514+
this.setState({
515+
validating: false
516+
}, () => {
517+
this.props.containerContext.$setData(name, data);
518+
this.validateFormItem(name, data);
519+
});
503520
}
504521

505522
private handleDelete = (name: string) => {

test/rcre/core/Form/FormItem.test.tsx

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,69 @@ describe('FormItem', () => {
13201320
test.setData(firstUserName, '123456');
13211321

13221322
formState = test.getFormState('form2');
1323-
1323+
1324+
expect(formState.valid).toBe(true);
1325+
expect(formState.control).toMatchSnapshot();
1326+
});
1327+
1328+
it('Container component updates will also trigger FormItem revalidation with validation property', async () => {
1329+
filter.setFilter('isUserValid', (username: any) => {
1330+
if (!username) {
1331+
return {
1332+
isValid: false,
1333+
errmsg: ''
1334+
};
1335+
}
1336+
1337+
let keys = Object.keys(username);
1338+
if (keys.some(key => !!username[key])) {
1339+
return {
1340+
isValid: true,
1341+
errmsg: ''
1342+
};
1343+
}
1344+
1345+
return {
1346+
isValid: false,
1347+
errmsg: ''
1348+
};
1349+
});
1350+
1351+
let config = {
1352+
body: [{
1353+
type: 'container',
1354+
model: 'demo',
1355+
children: [{
1356+
type: 'form',
1357+
name: 'form2',
1358+
children: [{
1359+
type: 'foreach',
1360+
dataSource: [1, 2, 3, 4, 5],
1361+
control: {
1362+
type: 'formItem',
1363+
validation: '#ES{isUserValid($data.username)}',
1364+
control: {
1365+
type: 'input',
1366+
name: 'username.#ES{$index}'
1367+
}
1368+
}
1369+
}]
1370+
}]
1371+
}]
1372+
};
1373+
1374+
let test = new RCRETestUtil(config);
1375+
test.setContainer('demo');
1376+
await test.triggerFormValidate('form2');
1377+
let formState = test.getFormState('form2');
1378+
expect(formState.valid).toBe(false);
1379+
expect(formState.control).toMatchSnapshot();
1380+
1381+
let firstUserName = test.getComponentByName('username.0');
1382+
test.setData(firstUserName, '123456');
1383+
1384+
formState = test.getFormState('form2');
1385+
13241386
expect(formState.valid).toBe(true);
13251387
expect(formState.control).toMatchSnapshot();
13261388
});

test/rcre/core/Form/__snapshots__/FormItem.test.tsx.snap

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,96 @@ Object {
9090
}
9191
`;
9292

93+
exports[`FormItem Container component updates will also trigger FormItem revalidation with validation property 1`] = `
94+
Object {
95+
"username.0": Object {
96+
"errorMsg": "",
97+
"formItemName": "username.0",
98+
"required": undefined,
99+
"rules": undefined,
100+
"status": "error",
101+
"valid": false,
102+
},
103+
"username.1": Object {
104+
"errorMsg": "",
105+
"formItemName": "username.1",
106+
"required": undefined,
107+
"rules": undefined,
108+
"status": "error",
109+
"valid": false,
110+
},
111+
"username.2": Object {
112+
"errorMsg": "",
113+
"formItemName": "username.2",
114+
"required": undefined,
115+
"rules": undefined,
116+
"status": "error",
117+
"valid": false,
118+
},
119+
"username.3": Object {
120+
"errorMsg": "",
121+
"formItemName": "username.3",
122+
"required": undefined,
123+
"rules": undefined,
124+
"status": "error",
125+
"valid": false,
126+
},
127+
"username.4": Object {
128+
"errorMsg": "",
129+
"formItemName": "username.4",
130+
"required": undefined,
131+
"rules": undefined,
132+
"status": "error",
133+
"valid": false,
134+
},
135+
}
136+
`;
137+
138+
exports[`FormItem Container component updates will also trigger FormItem revalidation with validation property 2`] = `
139+
Object {
140+
"username.0": Object {
141+
"errorMsg": "",
142+
"formItemName": "username.0",
143+
"required": undefined,
144+
"rules": undefined,
145+
"status": "success",
146+
"valid": true,
147+
},
148+
"username.1": Object {
149+
"errorMsg": "",
150+
"formItemName": "username.1",
151+
"required": undefined,
152+
"rules": undefined,
153+
"status": "success",
154+
"valid": true,
155+
},
156+
"username.2": Object {
157+
"errorMsg": "",
158+
"formItemName": "username.2",
159+
"required": undefined,
160+
"rules": undefined,
161+
"status": "success",
162+
"valid": true,
163+
},
164+
"username.3": Object {
165+
"errorMsg": "",
166+
"formItemName": "username.3",
167+
"required": undefined,
168+
"rules": undefined,
169+
"status": "success",
170+
"valid": true,
171+
},
172+
"username.4": Object {
173+
"errorMsg": "",
174+
"formItemName": "username.4",
175+
"required": undefined,
176+
"rules": undefined,
177+
"status": "success",
178+
"valid": true,
179+
},
180+
}
181+
`;
182+
93183
exports[`FormItem FormItem contains filterRule to be verified at initialization time 1`] = `
94184
Object {
95185
"errorMsg": "got something wrong",

0 commit comments

Comments
 (0)