2019-12-10 17:44:35 +08:00
|
|
|
import {Config} from '../../src/common/config/private/Config';
|
2019-01-28 03:36:42 +08:00
|
|
|
import * as path from 'path';
|
2021-01-04 17:32:19 +08:00
|
|
|
import * as fs from 'fs';
|
2019-12-15 00:27:01 +08:00
|
|
|
import {SQLConnection} from '../../src/backend/model/database/sql/SQLConnection';
|
2021-04-18 21:48:35 +08:00
|
|
|
import {DatabaseType, ServerConfig} from '../../src/common/config/private/PrivateConfig';
|
2020-12-29 05:08:57 +08:00
|
|
|
import {ProjectPath} from '../../src/backend/ProjectPath';
|
2021-01-17 17:56:33 +08:00
|
|
|
import {DirectoryDTO} from '../../src/common/entities/DirectoryDTO';
|
|
|
|
import {DirectoryEntity} from '../../src/backend/model/database/sql/enitites/DirectoryEntity';
|
|
|
|
import {ObjectManagers} from '../../src/backend/model/ObjectManagers';
|
|
|
|
import {DiskMangerWorker} from '../../src/backend/model/threading/DiskMangerWorker';
|
|
|
|
import {IndexingManager} from '../../src/backend/model/database/sql/IndexingManager';
|
|
|
|
import {GalleryManager} from '../../src/backend/model/database/sql/GalleryManager';
|
|
|
|
import {Connection} from 'typeorm';
|
2021-04-02 03:48:38 +08:00
|
|
|
import {Utils} from '../../src/common/Utils';
|
2019-01-28 03:36:42 +08:00
|
|
|
|
|
|
|
declare let describe: any;
|
|
|
|
const savedDescribe = describe;
|
|
|
|
|
2021-01-17 17:56:33 +08:00
|
|
|
class IndexingManagerTest extends IndexingManager {
|
|
|
|
|
|
|
|
public async saveToDB(scannedDirectory: DirectoryDTO): Promise<void> {
|
|
|
|
return super.saveToDB(scannedDirectory);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class GalleryManagerTest extends GalleryManager {
|
|
|
|
|
|
|
|
public async selectParentDir(connection: Connection, directoryName: string, directoryParent: string): Promise<DirectoryEntity> {
|
|
|
|
return super.selectParentDir(connection, directoryName, directoryParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public async fillParentDir(connection: Connection, dir: DirectoryEntity): Promise<void> {
|
|
|
|
return super.fillParentDir(connection, dir);
|
|
|
|
}
|
|
|
|
}
|
2021-01-16 23:59:59 +08:00
|
|
|
|
2021-04-02 03:48:38 +08:00
|
|
|
export class DBTestHelper {
|
2019-01-28 03:36:42 +08:00
|
|
|
|
|
|
|
static enable = {
|
2021-04-02 03:48:38 +08:00
|
|
|
memory: false,
|
2019-01-28 03:36:42 +08:00
|
|
|
sqlite: true,
|
2021-01-16 23:59:59 +08:00
|
|
|
mysql: process.env.TEST_MYSQL !== 'false'
|
2019-01-28 03:36:42 +08:00
|
|
|
};
|
|
|
|
public static readonly savedDescribe = savedDescribe;
|
|
|
|
tempDir: string;
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
constructor(public dbType: DatabaseType) {
|
2019-02-23 06:39:01 +08:00
|
|
|
this.tempDir = path.join(__dirname, './tmp');
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
|
|
|
|
2021-04-02 03:48:38 +08:00
|
|
|
static describe(settingsOverride: {
|
|
|
|
memory?: boolean;
|
|
|
|
sqlite?: boolean;
|
|
|
|
mysql?: boolean;
|
2021-04-18 21:48:35 +08:00
|
|
|
} = {}): (name: string, tests: (helper?: DBTestHelper) => void) => void {
|
2021-04-02 03:48:38 +08:00
|
|
|
const settings = Utils.clone(DBTestHelper.enable);
|
|
|
|
for (const key of Object.keys(settingsOverride)) {
|
2021-04-18 21:48:35 +08:00
|
|
|
(settings as any)[key] = (settingsOverride as any)[key];
|
2021-04-02 03:48:38 +08:00
|
|
|
}
|
|
|
|
return (name: string, tests: (helper?: DBTestHelper) => void) => {
|
|
|
|
savedDescribe(name, async () => {
|
|
|
|
if (settings.sqlite) {
|
2021-04-18 21:48:35 +08:00
|
|
|
const helper = new DBTestHelper(DatabaseType.sqlite);
|
2021-04-02 03:48:38 +08:00
|
|
|
savedDescribe('sqlite', () => {
|
|
|
|
return tests(helper);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (settings.mysql) {
|
2021-04-18 21:48:35 +08:00
|
|
|
const helper = new DBTestHelper(DatabaseType.mysql);
|
|
|
|
savedDescribe('mysql', function(): void {
|
2021-04-02 03:48:38 +08:00
|
|
|
this.timeout(99999999); // hint for the test environment
|
|
|
|
// @ts-ignore
|
|
|
|
return tests(helper);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (settings.memory) {
|
2021-04-18 21:48:35 +08:00
|
|
|
const helper = new DBTestHelper(DatabaseType.memory);
|
2021-04-02 03:48:38 +08:00
|
|
|
savedDescribe('memory', () => {
|
|
|
|
return tests(helper);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
|
|
|
|
2021-01-17 17:56:33 +08:00
|
|
|
public static async persistTestDir(directory: DirectoryDTO): Promise<DirectoryEntity> {
|
|
|
|
await ObjectManagers.InitSQLManagers();
|
|
|
|
const connection = await SQLConnection.getConnection();
|
|
|
|
ObjectManagers.getInstance().IndexingManager.indexDirectory = () => Promise.resolve(null);
|
|
|
|
|
|
|
|
|
|
|
|
const im = new IndexingManagerTest();
|
|
|
|
await im.saveToDB(directory);
|
|
|
|
// not saving subdirs. saveToDB destroys data
|
|
|
|
// await im.saveToDB(subDir);
|
|
|
|
// await im.saveToDB(subDir2);
|
|
|
|
|
|
|
|
if (ObjectManagers.getInstance().IndexingManager &&
|
|
|
|
ObjectManagers.getInstance().IndexingManager.IsSavingInProgress) {
|
|
|
|
await ObjectManagers.getInstance().IndexingManager.SavingReady;
|
|
|
|
}
|
|
|
|
|
|
|
|
const gm = new GalleryManagerTest();
|
|
|
|
const dir = await gm.selectParentDir(connection, directory.name, path.join(path.dirname('.'), path.sep));
|
|
|
|
await gm.fillParentDir(connection, dir);
|
|
|
|
|
|
|
|
const populateDir = async (d: DirectoryDTO) => {
|
|
|
|
for (let i = 0; i < d.directories.length; i++) {
|
|
|
|
d.directories[i] = await gm.selectParentDir(connection, d.directories[i].name,
|
|
|
|
path.join(DiskMangerWorker.pathFromParent(d), path.sep));
|
2021-04-18 21:48:35 +08:00
|
|
|
await gm.fillParentDir(connection, d.directories[i] as any);
|
2021-01-17 17:56:33 +08:00
|
|
|
await populateDir(d.directories[i]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
await populateDir(dir);
|
|
|
|
|
|
|
|
await ObjectManagers.reset();
|
|
|
|
return dir;
|
|
|
|
}
|
2021-01-16 23:59:59 +08:00
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
public async initDB(): Promise<void> {
|
|
|
|
if (this.dbType === DatabaseType.sqlite) {
|
2019-01-28 03:36:42 +08:00
|
|
|
await this.initSQLite();
|
2021-04-18 21:48:35 +08:00
|
|
|
} else if (this.dbType === DatabaseType.mysql) {
|
2019-01-28 03:36:42 +08:00
|
|
|
await this.initMySQL();
|
2021-05-11 21:20:36 +08:00
|
|
|
} else if (this.dbType === DatabaseType.memory) {
|
|
|
|
Config.Server.Database.type = DatabaseType.memory;
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
public async clearDB(): Promise<void> {
|
|
|
|
if (this.dbType === DatabaseType.sqlite) {
|
2019-01-28 03:36:42 +08:00
|
|
|
await this.clearUpSQLite();
|
2021-04-18 21:48:35 +08:00
|
|
|
} else if (this.dbType === DatabaseType.mysql) {
|
2019-01-28 03:36:42 +08:00
|
|
|
await this.clearUpMysql();
|
2021-04-18 21:48:35 +08:00
|
|
|
} else if (this.dbType === DatabaseType.memory) {
|
2021-04-02 03:48:38 +08:00
|
|
|
await this.clearUpMemory();
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
private async initMySQL(): Promise<void> {
|
2019-01-28 03:36:42 +08:00
|
|
|
await this.resetMySQL();
|
|
|
|
}
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
private async resetMySQL(): Promise<void> {
|
|
|
|
Config.Server.Database.type = DatabaseType.mysql;
|
2019-12-09 21:05:06 +08:00
|
|
|
Config.Server.Database.mysql.database = 'pigallery2_test';
|
2019-01-28 03:36:42 +08:00
|
|
|
const conn = await SQLConnection.getConnection();
|
|
|
|
await conn.query('DROP DATABASE IF EXISTS ' + conn.options.database);
|
|
|
|
await conn.query('CREATE DATABASE IF NOT EXISTS ' + conn.options.database);
|
|
|
|
await SQLConnection.close();
|
2021-05-24 04:26:27 +08:00
|
|
|
await ObjectManagers.InitSQLManagers();
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
private async clearUpMysql(): Promise<void> {
|
2021-05-24 04:26:27 +08:00
|
|
|
await ObjectManagers.reset();
|
2021-04-18 21:48:35 +08:00
|
|
|
Config.Server.Database.type = DatabaseType.mysql;
|
2019-12-09 21:05:06 +08:00
|
|
|
Config.Server.Database.mysql.database = 'pigallery2_test';
|
2019-01-28 03:36:42 +08:00
|
|
|
const conn = await SQLConnection.getConnection();
|
|
|
|
await conn.query('DROP DATABASE IF EXISTS ' + conn.options.database);
|
|
|
|
await SQLConnection.close();
|
|
|
|
}
|
|
|
|
|
2021-05-24 04:26:27 +08:00
|
|
|
private async initSQLite(): Promise<void> {
|
|
|
|
await this.resetSQLite();
|
|
|
|
}
|
|
|
|
|
|
|
|
private async resetSQLite(): Promise<void> {
|
|
|
|
Config.Server.Database.type = DatabaseType.sqlite;
|
|
|
|
Config.Server.Database.dbFolder = this.tempDir;
|
|
|
|
ProjectPath.reset();
|
|
|
|
await ObjectManagers.reset();
|
|
|
|
await fs.promises.rmdir(this.tempDir, {recursive: true});
|
|
|
|
await ObjectManagers.InitSQLManagers();
|
|
|
|
}
|
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
private async clearUpSQLite(): Promise<void> {
|
2021-05-24 04:26:27 +08:00
|
|
|
Config.Server.Database.type = DatabaseType.sqlite;
|
|
|
|
Config.Server.Database.dbFolder = this.tempDir;
|
|
|
|
ProjectPath.reset();
|
|
|
|
await ObjectManagers.reset();
|
|
|
|
await fs.promises.rmdir(this.tempDir, {recursive: true});
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|
2021-04-02 03:48:38 +08:00
|
|
|
|
2021-04-18 21:48:35 +08:00
|
|
|
private async clearUpMemory(): Promise<void> {
|
2021-04-02 03:48:38 +08:00
|
|
|
return this.resetSQLite();
|
|
|
|
}
|
2019-01-28 03:36:42 +08:00
|
|
|
}
|