mysql-initializer.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import path from 'path';
  2. import { DataSourceOptions } from 'typeorm';
  3. import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions';
  4. import { promisify } from 'util';
  5. import { TestDbInitializer } from './test-db-initializer';
  6. export class MysqlInitializer implements TestDbInitializer<MysqlConnectionOptions> {
  7. private conn: import('mysql').Connection;
  8. async init(
  9. testFileName: string,
  10. connectionOptions: MysqlConnectionOptions,
  11. ): Promise<MysqlConnectionOptions> {
  12. const dbName = this.getDbNameFromFilename(testFileName);
  13. this.conn = await this.getMysqlConnection(connectionOptions);
  14. (connectionOptions as any).database = dbName;
  15. (connectionOptions as any).synchronize = true;
  16. const query = promisify(this.conn.query).bind(this.conn);
  17. await query(`DROP DATABASE IF EXISTS ${dbName}`);
  18. await query(`CREATE DATABASE IF NOT EXISTS ${dbName}`);
  19. return connectionOptions;
  20. }
  21. async populate(populateFn: () => Promise<void>): Promise<void> {
  22. await populateFn();
  23. }
  24. async destroy() {
  25. await promisify(this.conn.end).bind(this.conn)();
  26. }
  27. private async getMysqlConnection(
  28. connectionOptions: MysqlConnectionOptions,
  29. ): Promise<import('mysql').Connection> {
  30. const { createConnection } = await import('mysql');
  31. const conn = createConnection({
  32. host: connectionOptions.host,
  33. port: connectionOptions.port,
  34. user: connectionOptions.username,
  35. password: connectionOptions.password,
  36. });
  37. const connect = promisify(conn.connect).bind(conn);
  38. await connect();
  39. return conn;
  40. }
  41. private getDbNameFromFilename(filename: string): string {
  42. return 'e2e_' + path.basename(filename).replace(/[^a-z0-9_]/gi, '_');
  43. }
  44. }