@sprucelabs/data-stores 31.0.9 → 31.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/databases/MongoDatabase.js +4 -4
- package/build/databases/database.utilities.d.ts +1 -1
- package/build/databases/database.utilities.js +6 -3
- package/build/esm/databases/MongoDatabase.js +4 -4
- package/build/esm/databases/database.utilities.d.ts +1 -1
- package/build/esm/databases/database.utilities.js +6 -3
- package/build/esm/tests/databaseAssertUtil.d.ts +2 -1
- package/build/esm/tests/databaseAssertUtil.js +11 -0
- package/build/esm/types/database.types.d.ts +1 -0
- package/build/tests/databaseAssertUtil.d.ts +2 -1
- package/build/tests/databaseAssertUtil.js +9 -0
- package/build/types/database.types.d.ts +1 -0
- package/package.json +1 -1
|
@@ -350,7 +350,7 @@ class MongoDatabase {
|
|
|
350
350
|
await this.dropIndex(collectionName, extra);
|
|
351
351
|
}
|
|
352
352
|
for (const index of indexes) {
|
|
353
|
-
if (!this.doesInclude(currentIndexes, this.normalizeIndex(index))) {
|
|
353
|
+
if (!this.doesInclude(currentIndexes, this.normalizeIndex(index, isSyncingUniqueIndexes))) {
|
|
354
354
|
try {
|
|
355
355
|
await this[func](collectionName, index);
|
|
356
356
|
}
|
|
@@ -364,7 +364,7 @@ class MongoDatabase {
|
|
|
364
364
|
}
|
|
365
365
|
async createUniqueIndex(collection, index) {
|
|
366
366
|
const currentIndexes = await this.getUniqueIndexes(collection);
|
|
367
|
-
const indexWithFilter = this.normalizeIndex(index);
|
|
367
|
+
const indexWithFilter = this.normalizeIndex(index, true);
|
|
368
368
|
this.assertIndexDoesNotExist(currentIndexes, indexWithFilter, collection);
|
|
369
369
|
const created = {};
|
|
370
370
|
indexWithFilter.fields.forEach((name) => {
|
|
@@ -395,8 +395,8 @@ class MongoDatabase {
|
|
|
395
395
|
}
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
|
-
normalizeIndex(index) {
|
|
399
|
-
return (0, database_utilities_1.normalizeIndex)(index);
|
|
398
|
+
normalizeIndex(index, isUnique) {
|
|
399
|
+
return (0, database_utilities_1.normalizeIndex)(index, isUnique);
|
|
400
400
|
}
|
|
401
401
|
async syncUniqueIndexes(collectionName, indexes) {
|
|
402
402
|
await this._syncIndexes(collectionName, indexes, 'createUniqueIndex', true);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IndexWithFilter, Index } from '../types/database.types';
|
|
2
2
|
export declare function doesIndexesInclude(haystack: Index[], needle: Index): boolean;
|
|
3
3
|
export declare function areIndexesEqual(left: Index, right: Index): boolean;
|
|
4
|
-
export declare function normalizeIndex(index: Index): IndexWithFilter;
|
|
4
|
+
export declare function normalizeIndex(index: Index, isUnique?: boolean): IndexWithFilter;
|
|
5
5
|
export declare function pluckMissingIndexes(left: Index[], right: Index[]): Index[];
|
|
@@ -21,7 +21,7 @@ function areIndexesEqual(left, right) {
|
|
|
21
21
|
const name2 = generateIndexName(normalizeIndex(right));
|
|
22
22
|
return name1 === name2;
|
|
23
23
|
}
|
|
24
|
-
function generateIndexName(indexWithFilter) {
|
|
24
|
+
function generateIndexName(indexWithFilter, isUnique) {
|
|
25
25
|
if (indexWithFilter.name) {
|
|
26
26
|
return indexWithFilter.name;
|
|
27
27
|
}
|
|
@@ -29,9 +29,12 @@ function generateIndexName(indexWithFilter) {
|
|
|
29
29
|
if (indexWithFilter.filter) {
|
|
30
30
|
name += '_filtered';
|
|
31
31
|
}
|
|
32
|
+
if (isUnique) {
|
|
33
|
+
name += '_unique';
|
|
34
|
+
}
|
|
32
35
|
return name;
|
|
33
36
|
}
|
|
34
|
-
function normalizeIndex(index) {
|
|
37
|
+
function normalizeIndex(index, isUnique) {
|
|
35
38
|
const fields = Array.isArray(index) ? index : index.fields;
|
|
36
39
|
const filter = Array.isArray(index) ? undefined : index.filter;
|
|
37
40
|
fields.sort();
|
|
@@ -41,7 +44,7 @@ function normalizeIndex(index) {
|
|
|
41
44
|
if (filter) {
|
|
42
45
|
normalized.filter = filter;
|
|
43
46
|
}
|
|
44
|
-
normalized.name = generateIndexName(normalized);
|
|
47
|
+
normalized.name = generateIndexName(normalized, isUnique);
|
|
45
48
|
return normalized;
|
|
46
49
|
}
|
|
47
50
|
function pluckMissingIndexes(left, right) {
|
|
@@ -386,7 +386,7 @@ export default class MongoDatabase {
|
|
|
386
386
|
yield this.dropIndex(collectionName, extra);
|
|
387
387
|
}
|
|
388
388
|
for (const index of indexes) {
|
|
389
|
-
if (!this.doesInclude(currentIndexes, this.normalizeIndex(index))) {
|
|
389
|
+
if (!this.doesInclude(currentIndexes, this.normalizeIndex(index, isSyncingUniqueIndexes))) {
|
|
390
390
|
try {
|
|
391
391
|
yield this[func](collectionName, index);
|
|
392
392
|
}
|
|
@@ -402,7 +402,7 @@ export default class MongoDatabase {
|
|
|
402
402
|
createUniqueIndex(collection, index) {
|
|
403
403
|
return __awaiter(this, void 0, void 0, function* () {
|
|
404
404
|
const currentIndexes = yield this.getUniqueIndexes(collection);
|
|
405
|
-
const indexWithFilter = this.normalizeIndex(index);
|
|
405
|
+
const indexWithFilter = this.normalizeIndex(index, true);
|
|
406
406
|
this.assertIndexDoesNotExist(currentIndexes, indexWithFilter, collection);
|
|
407
407
|
const created = {};
|
|
408
408
|
indexWithFilter.fields.forEach((name) => {
|
|
@@ -434,8 +434,8 @@ export default class MongoDatabase {
|
|
|
434
434
|
}
|
|
435
435
|
});
|
|
436
436
|
}
|
|
437
|
-
normalizeIndex(index) {
|
|
438
|
-
return normalizeIndex(index);
|
|
437
|
+
normalizeIndex(index, isUnique) {
|
|
438
|
+
return normalizeIndex(index, isUnique);
|
|
439
439
|
}
|
|
440
440
|
syncUniqueIndexes(collectionName, indexes) {
|
|
441
441
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IndexWithFilter, Index } from '../types/database.types';
|
|
2
2
|
export declare function doesIndexesInclude(haystack: Index[], needle: Index): boolean;
|
|
3
3
|
export declare function areIndexesEqual(left: Index, right: Index): boolean;
|
|
4
|
-
export declare function normalizeIndex(index: Index): IndexWithFilter;
|
|
4
|
+
export declare function normalizeIndex(index: Index, isUnique?: boolean): IndexWithFilter;
|
|
5
5
|
export declare function pluckMissingIndexes(left: Index[], right: Index[]): Index[];
|
|
@@ -12,7 +12,7 @@ export function areIndexesEqual(left, right) {
|
|
|
12
12
|
const name2 = generateIndexName(normalizeIndex(right));
|
|
13
13
|
return name1 === name2;
|
|
14
14
|
}
|
|
15
|
-
function generateIndexName(indexWithFilter) {
|
|
15
|
+
function generateIndexName(indexWithFilter, isUnique) {
|
|
16
16
|
if (indexWithFilter.name) {
|
|
17
17
|
return indexWithFilter.name;
|
|
18
18
|
}
|
|
@@ -20,9 +20,12 @@ function generateIndexName(indexWithFilter) {
|
|
|
20
20
|
if (indexWithFilter.filter) {
|
|
21
21
|
name += '_filtered';
|
|
22
22
|
}
|
|
23
|
+
if (isUnique) {
|
|
24
|
+
name += '_unique';
|
|
25
|
+
}
|
|
23
26
|
return name;
|
|
24
27
|
}
|
|
25
|
-
export function normalizeIndex(index) {
|
|
28
|
+
export function normalizeIndex(index, isUnique) {
|
|
26
29
|
const fields = Array.isArray(index) ? index : index.fields;
|
|
27
30
|
const filter = Array.isArray(index) ? undefined : index.filter;
|
|
28
31
|
fields.sort();
|
|
@@ -32,7 +35,7 @@ export function normalizeIndex(index) {
|
|
|
32
35
|
if (filter) {
|
|
33
36
|
normalized.filter = filter;
|
|
34
37
|
}
|
|
35
|
-
normalized.name = generateIndexName(normalized);
|
|
38
|
+
normalized.name = generateIndexName(normalized, isUnique);
|
|
36
39
|
return normalized;
|
|
37
40
|
}
|
|
38
41
|
export function pluckMissingIndexes(left, right) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Database, IndexWithFilter, TestConnect } from '../types/database.types';
|
|
2
2
|
import { DataStore } from '../types/stores.types';
|
|
3
|
-
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertUpdateReturnsMatchedCounts", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanFindOrWithBadIdField", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexesAddsMissingIndexes", "assertSyncingUniqueIndexesSkipsExistingUniqueIndexes", "assertSyncingUniqueIndexesRemovesExtraUniqueIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncUniqueIndexesSkipsOnesThatExist", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
|
3
|
+
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertUpdateReturnsMatchedCounts", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanFindOrWithBadIdField", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexesAddsMissingIndexes", "assertSyncingUniqueIndexesSkipsExistingUniqueIndexes", "assertSyncingUniqueIndexesRemovesExtraUniqueIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncUniqueIndexesSkipsOnesThatExist", "assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
|
4
4
|
type OriginalMethods = (typeof methods)[number];
|
|
5
5
|
type BangMethods = `!${OriginalMethods}`;
|
|
6
6
|
export type DatabaseAssertionName = OriginalMethods | BangMethods;
|
|
@@ -38,6 +38,7 @@ declare const databaseAssertUtil: {
|
|
|
38
38
|
assertSettingUniqueIndexViolationThrowsSpruceError(connect: TestConnect): Promise<void>;
|
|
39
39
|
assertDuplicateKeyThrowsOnInsert(connect: TestConnect): Promise<void>;
|
|
40
40
|
assertSyncUniqueIndexesSkipsOnesThatExist(connect: TestConnect): Promise<void>;
|
|
41
|
+
assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex(connect: TestConnect): Promise<void>;
|
|
41
42
|
assertSyncingUniqueIndexesRemovesExtraUniqueIndexes(connect: TestConnect): Promise<void>;
|
|
42
43
|
assertSyncingUniqueIndexesSkipsExistingUniqueIndexes(connect: TestConnect): Promise<void>;
|
|
43
44
|
assertSyncingUniqueIndexesAddsMissingIndexes(connect: TestConnect): Promise<void>;
|
|
@@ -74,6 +74,7 @@ const methods = [
|
|
|
74
74
|
'assertSyncingUniqueIndexesRemovesExtraUniqueIndexes',
|
|
75
75
|
'assertSyncingUniqueIndexesIsRaceProof',
|
|
76
76
|
'assertSyncUniqueIndexesSkipsOnesThatExist',
|
|
77
|
+
'assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex',
|
|
77
78
|
'assertUniqueIndexBlocksDuplicates',
|
|
78
79
|
'assertDuplicateKeyThrowsOnInsert',
|
|
79
80
|
'assertSettingUniqueIndexViolationThrowsSpruceError',
|
|
@@ -765,6 +766,16 @@ const databaseAssertUtil = {
|
|
|
765
766
|
yield this.shutdown(db);
|
|
766
767
|
});
|
|
767
768
|
},
|
|
769
|
+
assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex(connect) {
|
|
770
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
771
|
+
const db = yield connectToDabatase(connect);
|
|
772
|
+
yield db.syncIndexes(this.collectionName, [
|
|
773
|
+
['nested.field1'],
|
|
774
|
+
['nested.field2'],
|
|
775
|
+
]);
|
|
776
|
+
yield db.syncUniqueIndexes(this.collectionName, [['nested.field1']]);
|
|
777
|
+
});
|
|
778
|
+
},
|
|
768
779
|
assertSyncingUniqueIndexesRemovesExtraUniqueIndexes(connect) {
|
|
769
780
|
return __awaiter(this, void 0, void 0, function* () {
|
|
770
781
|
const db = yield connectToDabatase(connect);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Database, IndexWithFilter, TestConnect } from '../types/database.types';
|
|
2
2
|
import { DataStore } from '../types/stores.types';
|
|
3
|
-
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertUpdateReturnsMatchedCounts", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanFindOrWithBadIdField", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexesAddsMissingIndexes", "assertSyncingUniqueIndexesSkipsExistingUniqueIndexes", "assertSyncingUniqueIndexesRemovesExtraUniqueIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncUniqueIndexesSkipsOnesThatExist", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
|
3
|
+
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertUpdateReturnsMatchedCounts", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanFindOrWithBadIdField", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexesAddsMissingIndexes", "assertSyncingUniqueIndexesSkipsExistingUniqueIndexes", "assertSyncingUniqueIndexesRemovesExtraUniqueIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncUniqueIndexesSkipsOnesThatExist", "assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
|
4
4
|
type OriginalMethods = (typeof methods)[number];
|
|
5
5
|
type BangMethods = `!${OriginalMethods}`;
|
|
6
6
|
export type DatabaseAssertionName = OriginalMethods | BangMethods;
|
|
@@ -38,6 +38,7 @@ declare const databaseAssertUtil: {
|
|
|
38
38
|
assertSettingUniqueIndexViolationThrowsSpruceError(connect: TestConnect): Promise<void>;
|
|
39
39
|
assertDuplicateKeyThrowsOnInsert(connect: TestConnect): Promise<void>;
|
|
40
40
|
assertSyncUniqueIndexesSkipsOnesThatExist(connect: TestConnect): Promise<void>;
|
|
41
|
+
assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex(connect: TestConnect): Promise<void>;
|
|
41
42
|
assertSyncingUniqueIndexesRemovesExtraUniqueIndexes(connect: TestConnect): Promise<void>;
|
|
42
43
|
assertSyncingUniqueIndexesSkipsExistingUniqueIndexes(connect: TestConnect): Promise<void>;
|
|
43
44
|
assertSyncingUniqueIndexesAddsMissingIndexes(connect: TestConnect): Promise<void>;
|
|
@@ -70,6 +70,7 @@ const methods = [
|
|
|
70
70
|
'assertSyncingUniqueIndexesRemovesExtraUniqueIndexes',
|
|
71
71
|
'assertSyncingUniqueIndexesIsRaceProof',
|
|
72
72
|
'assertSyncUniqueIndexesSkipsOnesThatExist',
|
|
73
|
+
'assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex',
|
|
73
74
|
'assertUniqueIndexBlocksDuplicates',
|
|
74
75
|
'assertDuplicateKeyThrowsOnInsert',
|
|
75
76
|
'assertSettingUniqueIndexViolationThrowsSpruceError',
|
|
@@ -699,6 +700,14 @@ const databaseAssertUtil = {
|
|
|
699
700
|
]);
|
|
700
701
|
await this.shutdown(db);
|
|
701
702
|
},
|
|
703
|
+
async assertCanHaveUniqueIndexOnFieldThatIsAlreadyInIndex(connect) {
|
|
704
|
+
const db = await connectToDabatase(connect);
|
|
705
|
+
await db.syncIndexes(this.collectionName, [
|
|
706
|
+
['nested.field1'],
|
|
707
|
+
['nested.field2'],
|
|
708
|
+
]);
|
|
709
|
+
await db.syncUniqueIndexes(this.collectionName, [['nested.field1']]);
|
|
710
|
+
},
|
|
702
711
|
async assertSyncingUniqueIndexesRemovesExtraUniqueIndexes(connect) {
|
|
703
712
|
const db = await connectToDabatase(connect);
|
|
704
713
|
await db.syncUniqueIndexes(this.collectionName, [
|