-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs / test: Added tests and documentation for Feature 7253 - Migrati…
…ons Javascript output
- Loading branch information
Showing
6 changed files
with
231 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import { PrimaryGeneratedColumn, Entity, Column, CreateDateColumn } from "../../../../src"; | ||
|
||
@Entity() | ||
export class Post { | ||
|
||
@PrimaryGeneratedColumn() | ||
id?: number; | ||
|
||
@Column() | ||
title: string; | ||
|
||
@CreateDateColumn() | ||
readonly createdAt?: Date; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
import sinon from "sinon"; | ||
import { ConnectionOptions, ConnectionOptionsReader, DatabaseType } from "../../../src"; | ||
import { setupTestingConnections, createTestingConnections, closeTestingConnections, reloadTestingDatabases } from "../../utils/test-utils"; | ||
import { CommandUtils } from "../../../src/commands/CommandUtils"; | ||
import { MigrationGenerateCommand } from "../../../src/commands/MigrationGenerateCommand"; | ||
import { MigrationCreateCommand } from "../../../src/commands/MigrationCreateCommand"; | ||
import { Post } from "./entity/Post"; | ||
import { resultsTemplates } from "./results-templates"; | ||
|
||
describe("github issues > #7253 Allow migration files to be output in Javascript", () => { | ||
let connectionOptions: ConnectionOptions[]; | ||
let createFileStub: sinon.SinonStub; | ||
let timerStub: sinon.SinonFakeTimers; | ||
let getConnectionOptionsStub: sinon.SinonStub; | ||
let migrationGenerateCommand: MigrationGenerateCommand; | ||
let migrationCreateCommand: MigrationCreateCommand; | ||
let connectionOptionsReader: ConnectionOptionsReader; | ||
let baseConnectionOptions: ConnectionOptions; | ||
|
||
const enabledDrivers = [ | ||
"mysql", | ||
] as DatabaseType[]; | ||
|
||
// simulate args: `npm run typeorm migration:run -- -n test-migration -d test-directory` | ||
const testHandlerArgs = (options: Record<string, any>) => ({ | ||
"$0": "test", | ||
"_": ["test"], | ||
"name": "test-migration", | ||
"dir": "test-directory", | ||
...options | ||
}); | ||
|
||
before(async () => { | ||
// clean out db from any prior tests in case previous state impacts the generated migrations | ||
const connections = await createTestingConnections({ | ||
entities: [], | ||
enabledDrivers | ||
}); | ||
await reloadTestingDatabases(connections); | ||
await closeTestingConnections(connections); | ||
|
||
connectionOptions = setupTestingConnections({ | ||
entities: [Post], | ||
enabledDrivers | ||
}); | ||
connectionOptionsReader = new ConnectionOptionsReader(); | ||
|
||
migrationGenerateCommand = new MigrationGenerateCommand(); | ||
migrationCreateCommand = new MigrationCreateCommand(); | ||
createFileStub = sinon.stub(CommandUtils, "createFile"); | ||
|
||
timerStub = sinon.useFakeTimers(1610975184784); | ||
}); | ||
|
||
after(async () => { | ||
timerStub.restore(); | ||
createFileStub.restore(); | ||
}); | ||
|
||
beforeEach(async () => { | ||
baseConnectionOptions = await connectionOptionsReader.get(connectionOptions[0].name as string); | ||
getConnectionOptionsStub = sinon.stub(ConnectionOptionsReader.prototype, "get").resolves({ | ||
...baseConnectionOptions, | ||
entities: [Post] | ||
}); | ||
}); | ||
|
||
afterEach(async () => { | ||
getConnectionOptionsStub.restore(); | ||
}); | ||
|
||
it("writes regular empty migration file when no option is passed", async () => { | ||
createFileStub.resetHistory(); | ||
|
||
await migrationCreateCommand.handler(testHandlerArgs({ | ||
"connection": connectionOptions[0].name | ||
})); | ||
|
||
// compare against control test strings in results-templates.ts | ||
sinon.assert.calledWith( | ||
createFileStub, | ||
sinon.match(/test-directory.*test-migration.ts/), | ||
sinon.match(resultsTemplates.create.control) | ||
); | ||
|
||
getConnectionOptionsStub.restore(); | ||
}); | ||
|
||
it("writes Javascript empty migration file when option is passed", async () => { | ||
createFileStub.resetHistory(); | ||
|
||
await migrationCreateCommand.handler(testHandlerArgs({ | ||
"connection": connectionOptions[0].name, | ||
"outputJs": true | ||
})); | ||
|
||
// compare against control test strings in results-templates.ts | ||
sinon.assert.calledWith( | ||
createFileStub, | ||
sinon.match(/test-directory.*test-migration.js/), | ||
sinon.match(resultsTemplates.create.javascript) | ||
); | ||
|
||
getConnectionOptionsStub.restore(); | ||
}); | ||
|
||
it("writes regular migration file when no option is passed", async () => { | ||
createFileStub.resetHistory(); | ||
|
||
await migrationGenerateCommand.handler(testHandlerArgs({ | ||
"connection": connectionOptions[0].name | ||
})); | ||
|
||
// compare against control test strings in results-templates.ts | ||
sinon.assert.calledWith( | ||
createFileStub, | ||
sinon.match(/test-directory.*test-migration.ts/), | ||
sinon.match(resultsTemplates.generate.control) | ||
); | ||
|
||
getConnectionOptionsStub.restore(); | ||
}); | ||
|
||
it("writes Javascript printed file when option is passed", async () => { | ||
createFileStub.resetHistory(); | ||
|
||
await migrationGenerateCommand.handler(testHandlerArgs({ | ||
"connection": connectionOptions[0].name, | ||
"outputJs": true | ||
})); | ||
|
||
// compare against "pretty" test strings in results-templates.ts | ||
sinon.assert.calledWith( | ||
createFileStub, | ||
sinon.match(/test-directory.*test-migration.js/), | ||
sinon.match(resultsTemplates.generate.javascript) | ||
); | ||
getConnectionOptionsStub.restore(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
export const resultsTemplates: Record<string, any> = { | ||
create: { | ||
control: `import {MigrationInterface, QueryRunner} from "typeorm"; | ||
export class testMigration1610975184784 implements MigrationInterface { | ||
public async up(queryRunner: QueryRunner): Promise<void> { | ||
} | ||
public async down(queryRunner: QueryRunner): Promise<void> { | ||
} | ||
}`, | ||
javascript: `const { MigrationInterface, QueryRunner } = require("typeorm"); | ||
module.exports = class testMigration1610975184784 { | ||
async up(queryRunner) { | ||
} | ||
async down(queryRunner) { | ||
} | ||
}` | ||
}, | ||
generate: { | ||
control: `import {MigrationInterface, QueryRunner} from "typeorm"; | ||
export class testMigration1610975184784 implements MigrationInterface { | ||
name = 'testMigration1610975184784' | ||
public async up(queryRunner: QueryRunner): Promise<void> { | ||
await queryRunner.query("CREATE TABLE \`post\` (\`id\` int NOT NULL AUTO_INCREMENT, \`title\` varchar(255) NOT NULL, \`createdAt\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB"); | ||
} | ||
public async down(queryRunner: QueryRunner): Promise<void> { | ||
await queryRunner.query("DROP TABLE \`post\`"); | ||
} | ||
}`, | ||
javascript: `const { MigrationInterface, QueryRunner } = require("typeorm"); | ||
module.exports = class testMigration1610975184784 { | ||
name = 'testMigration1610975184784' | ||
async up(queryRunner) { | ||
await queryRunner.query("CREATE TABLE \`post\` (\`id\` int NOT NULL AUTO_INCREMENT, \`title\` varchar(255) NOT NULL, \`createdAt\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB"); | ||
} | ||
async down(queryRunner) { | ||
await queryRunner.query("DROP TABLE \`post\`"); | ||
} | ||
}` | ||
} | ||
}; |