diff --git a/src/persistence/EntityPersistExecutor.ts b/src/persistence/EntityPersistExecutor.ts index b4a0bc23d3..7ef4767823 100644 --- a/src/persistence/EntityPersistExecutor.ts +++ b/src/persistence/EntityPersistExecutor.ts @@ -53,8 +53,10 @@ export class EntityPersistExecutor { // save data in the query runner - this is useful functionality to share data from outside of the world // with third classes - like subscribers and listener methods - if (this.options && this.options.data) + let oldQueryRunnerData = queryRunner.data; + if (this.options && this.options.data) { queryRunner.data = this.options.data; + } try { @@ -166,6 +168,7 @@ export class EntityPersistExecutor { } } finally { + queryRunner.data = oldQueryRunnerData; // release query runner only if its created by us if (!this.queryRunner) diff --git a/test/functional/entity-subscriber/query-data/entity/Example.ts b/test/functional/entity-subscriber/query-data/entity/Example.ts new file mode 100644 index 0000000000..548cc525fb --- /dev/null +++ b/test/functional/entity-subscriber/query-data/entity/Example.ts @@ -0,0 +1,10 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "../../../../../src/"; + +@Entity() +export class Example { + @PrimaryGeneratedColumn() + id: number; + + @Column() + value: number = 0; +} diff --git a/test/functional/entity-subscriber/query-data/query-data.ts b/test/functional/entity-subscriber/query-data/query-data.ts new file mode 100644 index 0000000000..2d737ad8f2 --- /dev/null +++ b/test/functional/entity-subscriber/query-data/query-data.ts @@ -0,0 +1,61 @@ +import { + Connection, +} from "../../../../src"; +import {closeTestingConnections, createTestingConnections} from "../../../utils/test-utils"; +import {expect} from "chai"; +import { MockSubscriber } from "./subscribers/MockSubscriber"; +import { Example } from "./entity/Example"; + +describe("entity subscriber > query data", () => { + let connections: Connection[]; + before(async () => connections = await createTestingConnections({ + entities: [ Example ], + subscribers: [ MockSubscriber ], + dropSchema: true, + schemaCreate: true, + enabledDrivers: [ "sqlite" ] + })); + beforeEach(() => { + for (const connection of connections) { + (connection.subscribers[0] as MockSubscriber).calledData.length = 0; + } + }) + after(() => closeTestingConnections(connections)); + + it("passes query data to subscriber", () => Promise.all(connections.map(async connection => { + const subscriber = connection.subscribers[0] as MockSubscriber; + + const example = new Example(); + + await connection.manager.save(example); + + example.value++; + + await connection.manager.save(example, { data: { Hello: "World" } }); + + expect(subscriber.calledData).to.be.eql([ + { Hello: "World" }, + ]); + }))); + + it("cleans up the data after the save completes", () => Promise.all(connections.map(async connection => { + const subscriber = connection.subscribers[0] as MockSubscriber; + + const example = new Example(); + + await connection.manager.save(example); + + example.value++; + + await connection.manager.save(example, { data: { Hello: "World" } }); + + example.value++; + + await connection.manager.save(example); + + expect(subscriber.calledData).to.be.eql([ + { Hello: "World" }, + {}, + ]); + }))); +}); diff --git a/test/functional/entity-subscriber/query-data/subscribers/MockSubscriber.ts b/test/functional/entity-subscriber/query-data/subscribers/MockSubscriber.ts new file mode 100644 index 0000000000..d6c1fb0b70 --- /dev/null +++ b/test/functional/entity-subscriber/query-data/subscribers/MockSubscriber.ts @@ -0,0 +1,10 @@ +import { EntitySubscriberInterface, EventSubscriber, UpdateEvent } from "../../../../../src"; + +@EventSubscriber() +export class MockSubscriber implements EntitySubscriberInterface { + calledData: any[] = []; + + afterUpdate(event: UpdateEvent): void { + this.calledData.push(event.queryRunner.data); + } +} diff --git a/test/functional/entity-subscriber-transaction-flow/entity-subscriber-transaction-flow.ts b/test/functional/entity-subscriber/transaction-flow/entity-subscriber-transaction-flow.ts similarity index 93% rename from test/functional/entity-subscriber-transaction-flow/entity-subscriber-transaction-flow.ts rename to test/functional/entity-subscriber/transaction-flow/entity-subscriber-transaction-flow.ts index d9b404a665..fdffdfce48 100644 --- a/test/functional/entity-subscriber-transaction-flow/entity-subscriber-transaction-flow.ts +++ b/test/functional/entity-subscriber/transaction-flow/entity-subscriber-transaction-flow.ts @@ -2,17 +2,17 @@ import { Connection, EntitySubscriberInterface, EventSubscriber, -} from "../../../src"; -import {closeTestingConnections, createTestingConnections} from "../../utils/test-utils"; +} from "../../../../src"; +import {closeTestingConnections, createTestingConnections} from "../../../utils/test-utils"; import sinon from "sinon"; import {expect} from "chai"; -import {SapDriver} from "../../../src/driver/sap/SapDriver"; -import {OracleDriver} from "../../../src/driver/oracle/OracleDriver"; -import {AuroraDataApiPostgresDriver} from "../../../src/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver"; -import {AuroraDataApiDriver} from "../../../src/driver/aurora-data-api/AuroraDataApiDriver"; -import {SqlServerDriver} from "../../../src/driver/sqlserver/SqlServerDriver"; +import {SapDriver} from "../../../../src/driver/sap/SapDriver"; +import {OracleDriver} from "../../../../src/driver/oracle/OracleDriver"; +import {AuroraDataApiPostgresDriver} from "../../../../src/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver"; +import {AuroraDataApiDriver} from "../../../../src/driver/aurora-data-api/AuroraDataApiDriver"; +import {SqlServerDriver} from "../../../../src/driver/sqlserver/SqlServerDriver"; -describe("entity subscriber transaction flow", () => { +describe("entity subscriber > transaction flow", () => { let beforeTransactionStart = sinon.spy(); let afterTransactionStart = sinon.spy();