feat: Add options to skip automatic creation of internal database indexes on server start (#9897)
This commit is contained in:
@@ -649,4 +649,179 @@ describe_only_db('mongo')('MongoStorageAdapter', () => {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
describe('index creation options', () => {
|
||||
beforeEach(async () => {
|
||||
await new MongoStorageAdapter({ uri: databaseURI }).deleteAllClasses();
|
||||
});
|
||||
|
||||
async function getIndexes(collectionName) {
|
||||
const adapter = Config.get(Parse.applicationId).database.adapter;
|
||||
const collections = await adapter.database.listCollections({ name: collectionName }).toArray();
|
||||
if (collections.length === 0) {
|
||||
return [];
|
||||
}
|
||||
return await adapter.database.collection(collectionName).indexes();
|
||||
}
|
||||
|
||||
it('should skip username index when createIndexUserUsername is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserUsername: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'username_1')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create username index when createIndexUserUsername is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserUsername: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'username_1')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip case-insensitive username index when createIndexUserUsernameCaseInsensitive is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserUsernameCaseInsensitive: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'case_insensitive_username')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create case-insensitive username index when createIndexUserUsernameCaseInsensitive is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserUsernameCaseInsensitive: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'case_insensitive_username')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip email index when createIndexUserEmail is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmail: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'email_1')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create email index when createIndexUserEmail is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmail: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'email_1')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip case-insensitive email index when createIndexUserEmailCaseInsensitive is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmailCaseInsensitive: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'case_insensitive_email')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create case-insensitive email index when createIndexUserEmailCaseInsensitive is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmailCaseInsensitive: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === 'case_insensitive_email')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip email verify token index when createIndexUserEmailVerifyToken is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmailVerifyToken: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create email verify token index when createIndexUserEmailVerifyToken is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserEmailVerifyToken: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip password reset token index when createIndexUserPasswordResetToken is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserPasswordResetToken: false },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create password reset token index when createIndexUserPasswordResetToken is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexUserPasswordResetToken: true },
|
||||
});
|
||||
const indexes = await getIndexes('_User');
|
||||
expect(indexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should skip role name index when createIndexRoleName is false', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexRoleName: false },
|
||||
});
|
||||
const indexes = await getIndexes('_Role');
|
||||
expect(indexes.find(idx => idx.name === 'name_1')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should create role name index when createIndexRoleName is true', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: { createIndexRoleName: true },
|
||||
});
|
||||
const indexes = await getIndexes('_Role');
|
||||
expect(indexes.find(idx => idx.name === 'name_1')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should create all indexes by default when options are undefined', async () => {
|
||||
await reconfigureServer({
|
||||
databaseAdapter: undefined,
|
||||
databaseURI,
|
||||
databaseOptions: {},
|
||||
});
|
||||
|
||||
const userIndexes = await getIndexes('_User');
|
||||
const roleIndexes = await getIndexes('_Role');
|
||||
|
||||
// Verify all indexes are created with default behavior (backward compatibility)
|
||||
expect(userIndexes.find(idx => idx.name === 'username_1')).toBeDefined();
|
||||
expect(userIndexes.find(idx => idx.name === 'case_insensitive_username')).toBeDefined();
|
||||
expect(userIndexes.find(idx => idx.name === 'email_1')).toBeDefined();
|
||||
expect(userIndexes.find(idx => idx.name === 'case_insensitive_email')).toBeDefined();
|
||||
expect(userIndexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeDefined();
|
||||
expect(userIndexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeDefined();
|
||||
expect(roleIndexes.find(idx => idx.name === 'name_1')).toBeDefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user