8000 fix flaky schema validation test (#20345) · trooso/arangodb@5b38f20 · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit 5b38f20

Browse files
authored
fix flaky schema validation test (arangodb#20345)
* fix flaky schema validation test * over-engineer test fix
1 parent 84425b4 commit 5b38f20

File tree

1 file changed

+71
-43
lines changed

1 file changed

+71
-43
lines changed

tests/js/client/shell/multi/shell-validation.js

Lines changed: 71 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22
/*global assertEqual, assertTrue, assertFalse, assertNotNull, assertNotUndefined, fail */
33

44
////////////////////////////////////////////////////////////////////////////////
5-
/// @brief test the collection interface
6-
///
7-
/// @file
8-
///
95
/// DISCLAIMER
106
///
117
/// Copyright 2020 ArangoDB Inc, Cologne, Germany
@@ -34,6 +30,7 @@ const { getEndpointById } = require('@arangodb/test-helper');
3430
const request = require('@arangodb/request');
3531
const db = internal.db;
3632
const arangodb = require("@arangodb");
33+
const _ = require("lodash");
3734
const ERRORS = arangodb.errors;
3835

3936
// helper
@@ -51,6 +48,19 @@ const waitInClusterUntil = func => {
5148
}
5249
};
5350

51+
const waitForCollectionPredicate = (collection, predicate) => {
52+
const shardList = collection.shards(true);
53+
for (const [shard, servers] of Object.entries(shardList)) {
54+
const endpoint = getEndpointById(servers[0]);
55+
const resp = request.get(`${endpoint}/_api/collection/${shard}/properties`);
56+
assertEqual(resp.statusCode, 200);
57+
if (!predicate(resp.json)) {
58+
return false;
59+
}
60+
}
61+
return true;
62+
};
63+
5464
const skipOptions = {"skipDocumentValidation": true};
5565

5666
function ValidationBasicsSuite() {
@@ -330,15 +340,23 @@ function ValidationBasicsSuite() {
330340
testLevelNone: () => {
331341
validatorJson.level = "none";
332342
testCollection.properties({"schema": validatorJson});
333-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
343+
waitInClusterUntil(() => {
344+
return waitForCollectionPredicate(testCollection, (json) => {
345+
return json.schema.level === validatorJson.level;
346+
});
347+
});
334348
assertEqual(testCollection.properties().schema.level, validatorJson.level);
335349
testCollection.insert(badDoc);
336350
},
337351

338352
testLevelNew: () => {
339353
validatorJson.level = "new";
340354
testCollection.properties({"schema": validatorJson});
341-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
355+
waitInClusterUntil(() => {
356+
return waitForCollectionPredicate(testCollection, (json) => {
357+
return json.schema.level === validatorJson.level;
358+
});
359+
});
342360
assertEqual(testCollection.properties().schema.level, validatorJson.level);
343361

344362
let doc = testCollection.insert(badDoc, skipOptions);
@@ -355,7 +373,11 @@ function ValidationBasicsSuite() {
355373
testLevelModerateInsert: () => {
356374
validatorJson.level = "moderate";
357375
testCollection.properties({"schema": validatorJson});
358-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
376+
waitInClusterUntil(() => {
377+
9E88 return waitForCollectionPredicate(testCollection, (json) => {
378+
return json.schema.level === validatorJson.level;
379+
});
380+
});
359381
assertEqual(testCollection.properties().schema.level, validatorJson.level);
360382

361383
testCollection.insert(badDoc, skipOptions);
@@ -370,7 +392,11 @@ function ValidationBasicsSuite() {
370392
testLevelModerateModifyBadToGood: () => {
371393
validatorJson.level = "moderate";
372394
testCollection.properties({"schema": validatorJson});
373-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
395+
waitInClusterUntil(() => {
396+
return waitForCollectionPredicate(testCollection, (json) => {
397+
return json.schema.level === validatorJson.level;
398+
});
399+
});
374400
assertEqual(testCollection.properties().schema.level, validatorJson.level);
375401

376402
let doc;
@@ -385,7 +411,11 @@ function ValidationBasicsSuite() {
385411
testLevelModerateModifyBadWithBad: () => {
386412
validatorJson.level = "moderate";
387413
testCollection.properties({"schema": validatorJson});
388-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
414+
waitInClusterUntil(() => {
415+
return waitForCollectionPredicate(testCollection, (json) => {
416+
return json.schema.level === validatorJson.level;
417+
});
418+
});
389419
assertEqual(testCollection.properties().schema.level, validatorJson.level);
390420

391421
let doc;
@@ -409,7 +439,12 @@ function ValidationBasicsSuite() {
409439
testLevelModerateUpdateGoodToBad: () => {
410440
validatorJson.level = "moderate";
411441
testCollection.properties({"schema": validatorJson});
412-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
442+
waitInClusterUntil(() => {
443+
return waitForCollectionPredicate(testCollection, (json) => {
444+
return json.schema.level === validatorJson.level;
445+
});
446+
return true;
447+
});
413448
assertEqual(testCollection.properties().schema.level, validatorJson.level);
414449

415450
let doc = testCollection.insert(goodDoc);
@@ -433,7 +468,11 @@ function ValidationBasicsSuite() {
433468
testLevelModerateReplaceGoodToBad: () => {
434469
validatorJson.level = "moderate";
435470
testCollection.properties({"schema": validatorJson});
436-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
471+
waitInClusterUntil(() => {
472+
return waitForCollectionPredicate(testCollection, (json) => {
473+
return json.schema.level === validatorJson.level;
474+
});
475+
});
437476
assertEqual(testCollection.properties().schema.level, validatorJson.level);
438477

439478
let doc = testCollection.insert(goodDoc);
@@ -454,9 +493,6 @@ function ValidationBasicsSuite() {
454493
},
455494

456495
testLevelStict: () => {
457-
validatorJson.level = "strict";
458-
testCollection.properties({"schema": validatorJson});
459-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
460496
assertEqual(testCollection.properties().schema.level, validatorJson.level);
461497

462498
let doc = testCollection.insert(badDoc, skipOptions);
@@ -508,16 +544,9 @@ function ValidationBasicsSuite() {
508544
}
509545
testCollection.properties({"schema": {}});
510546
waitInClusterUntil(() => {
511-
const shardList = testCollection.shards(true);
512-
for (const [shard, servers] of Object.entries(shardList)) {
513-
const endpoint = getEndpointById(servers[0]);
514-
const resp = request.get(`${endpoint}/_api/collection/${shard}/properties`);
515-
assertEqual(resp.statusCode, 200);
516-
if (resp.json.schema != null) {
517-
return false;
518-
}
519-
}
520-
return true;
547+
return waitForCollectionPredicate(testCollection, (json) => {
548+
return json.schema === null;
549+
});
521550
});
522551
assertEqual(testCollection.properties().schema, null);
523552
testCollection.insert(badDoc);
@@ -533,16 +562,9 @@ function ValidationBasicsSuite() {
533562
}
534563
testCollection.properties({"schema": null});
535564
waitInClusterUntil(() => {
536-
const shardList = testCollection.shards(true);
537-
for (const [shard, servers] of Object.entries(shardList)) {
538-
const endpoint = getEndpointById(servers[0]);
539-
const resp = request.get(`${endpoint}/_api/collection/${shard}/properties`);
540-
assertEqual(resp.statusCode, 200);
541-
if (resp.json.schema != null) {
542-
return false;
543-
}
544-
}
545-
return true;
565+
return waitForCollectionPredicate(testCollection, (json) => {
566+
return json.schema === null;
567+
});
546568
});
547569
assertEqual(testCollection.properties().schema, null);
548570
testCollection.insert(badDoc);
@@ -551,9 +573,6 @@ function ValidationBasicsSuite() {
551573

552574
// json ////////////////////////////////////////////////////////////////////////////////////////////
553575
testJson: () => {
554-
validatorJson.level = "strict";
555-
testCollection.properties({"schema": validatorJson});
556-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
557576
assertEqual(testCollection.properties().schema.level, validatorJson.level);
558577

559578
testCollection.insert(goodDoc);
@@ -571,11 +590,19 @@ function ValidationBasicsSuite() {
571590
required: ["numArray", "name"]
572591
};
573592
validatorJson.rule = p;
574-
validatorJson.level = "strict";
575593

576594
testCollection.properties({"schema": validatorJson});
577-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
595+
waitInClusterUntil(() => {
596+
return waitForCollectionPredicate(testCollection, (json) => {
597+
const rule = json.schema.rule;
598+
if (!rule.hasOwnProperty('required')) {
599+
return false;
600+
}
601+
return _.isEqual(rule.required, ["numArray", "name"]);
602+
});
603+
});
578604
assertEqual(testCollection.properties().schema.level, validatorJson.level);
605+
assertEqual(testCollection.properties().schema.rule.required, validatorJson.rule.required);
579606

580607
try {
581608
// name missing
@@ -609,9 +636,6 @@ function ValidationBasicsSuite() {
609636
},
610637
// AQL ////////////////////////////////////////////////////////////////////////////////////////////
611638
testAQLSchemaGet: () => {
612-
validatorJson.level = "strict";
613-
testCollection.properties({"schema": validatorJson});
614-
waitInClusterUntil(() => testCollection.properties().schema.level === validatorJson.level);
615639
assertEqual(testCollection.properties().schema.level, validatorJson.level);
616640

617641
// get regular schema
@@ -641,7 +665,11 @@ function ValidationBasicsSuite() {
641665
testAqlSchemaValidate: () => {
642666
// unset schema
643667
testCollection.properties({schema: {}});
644-
waitInClusterUntil(() => testCollection.properties().schema == null);
668+
waitInClusterUntil(() => {
669+
return waitForCollectionPredicate(testCollection, (json) => {
670+
return json.schema === null;
671+
});
672+
});
645673

646674
let res;
647675
// doc is not an object

0 commit comments

Comments
 (0)
0