mysql-initializer.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. // eslint-disable-next-line @typescript-eslint/unbound-method
  26. await promisify(this.conn.end).bind(this.conn)();
  27. }
  28. private async getMysqlConnection(
  29. connectionOptions: MysqlConnectionOptions,
  30. ): Promise<import('mysql').Connection> {
  31. const { createConnection } = await import('mysql');
  32. const conn = createConnection({
  33. host: connectionOptions.host,
  34. port: connectionOptions.port,
  35. user: connectionOptions.username,
  36. password: connectionOptions.password,
  37. });
  38. // eslint-disable-next-line @typescript-eslint/unbound-method
  39. const connect = promisify(conn.connect).bind(conn);
  40. await connect();
  41. return conn;
  42. }
  43. private getDbNameFromFilename(filename: string): string {
  44. return 'e2e_' + path.basename(filename).replace(/[^a-z0-9_]/gi, '_');
  45. }
  46. }