fix(database): mock db

This commit is contained in:
chenos 2022-02-13 13:41:17 +08:00
parent 01e5e1cbac
commit db3285d452
2 changed files with 69 additions and 10 deletions

View File

@ -1,6 +1,6 @@
import { generatePrefixByPath, mockDatabase } from './index';
import { Collection } from '../collection'; import { Collection } from '../collection';
import { Database } from '../database'; import { Database } from '../database';
import { generatePrefixByPath, mockDatabase } from './index';
test('collection disable authGenId', async () => { test('collection disable authGenId', async () => {
const db = mockDatabase(); const db = mockDatabase();
@ -15,6 +15,7 @@ test('collection disable authGenId', async () => {
await db.sync(); await db.sync();
expect(model.rawAttributes['id']).toBeUndefined(); expect(model.rawAttributes['id']).toBeUndefined();
await db.close();
}); });
test('new collection', async () => { test('new collection', async () => {

View File

@ -1,4 +1,6 @@
import { uid } from '@nocobase/utils';
import merge from 'deepmerge'; import merge from 'deepmerge';
import { Sequelize } from 'sequelize';
import { Database, DatabaseOptions } from '../database'; import { Database, DatabaseOptions } from '../database';
export function generatePrefixByPath() { export function generatePrefixByPath() {
@ -12,12 +14,15 @@ export function generatePrefixByPath() {
return key; return key;
} }
export function getConfig(config = {}, options?: any): DatabaseOptions { export function getConfig(config: any = {}, options?: any): DatabaseOptions {
return merge( if (process.env.DB_DIALECT === 'sqlite') {
{ const defaults = {
dialect: 'sqlite', dialect: process.env.DB_DIALECT as any,
storage: options?.storage || ':memory:', storage: ':memory:',
logging: options?.logging || false, logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,
// sync: {
// force: true,
// },
hooks: { hooks: {
beforeDefine(model, options) { beforeDefine(model, options) {
options.tableName = `${generatePrefixByPath()}_${ options.tableName = `${generatePrefixByPath()}_${
@ -25,10 +30,63 @@ export function getConfig(config = {}, options?: any): DatabaseOptions {
}`; }`;
}, },
}, },
};
return merge(defaults, config, options);
}
const database = `mock_${uid()}`;
let dbExists = false;
const defaults = {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT as any,
dialect: process.env.DB_DIALECT as any,
logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,
dialectOptions: {
charset: 'utf8mb4',
collate: 'utf8mb4_unicode_ci',
}, },
config || {}, hooks: {
options, beforeDefine(model, options) {
) as any; options.tableName = `${generatePrefixByPath()}_${
options.tableName || options.modelName || options.name.plural
}`;
},
async beforeSync({ sequelize }: any) {
if (config.database) {
return;
}
if (dbExists) {
return;
}
return;
const db = new Sequelize({
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT as any,
dialect: process.env.DB_DIALECT as any,
logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,
dialectOptions: {
charset: 'utf8mb4',
collate: 'utf8mb4_unicode_ci',
},
});
await db.query(`CREATE DATABASE "${database}";`);
await db.close();
sequelize.options.database = database;
sequelize.config.database = database;
const ConnectionManager = sequelize.dialect.connectionManager.constructor;
const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
sequelize.dialect.connectionManager = connectionManager;
sequelize.connectionManager = connectionManager;
dbExists = true;
},
},
};
return merge(defaults, config, options);
} }
export function mockDatabase(options?: DatabaseOptions): Database { export function mockDatabase(options?: DatabaseOptions): Database {