Skip to content

Commit

Permalink
fix: only pass data from SaveOptions during that query (#7886)
Browse files Browse the repository at this point in the history
this resets the `data` passed from `SaveOptions` to `QueryRunner`
once the persistence operation has completed
  • Loading branch information
imnotjames committed Jul 11, 2021
1 parent 063aafa commit 1de2e13
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 9 deletions.
5 changes: 4 additions & 1 deletion src/persistence/EntityPersistExecutor.ts
Expand Up @@ -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 {

Expand Down Expand Up @@ -166,6 +168,7 @@ export class EntityPersistExecutor {
}

} finally {
queryRunner.data = oldQueryRunnerData;

// release query runner only if its created by us
if (!this.queryRunner)
Expand Down
10 changes: 10 additions & 0 deletions 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;
}
61 changes: 61 additions & 0 deletions 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" },
{},
]);
})));
});
@@ -0,0 +1,10 @@
import { EntitySubscriberInterface, EventSubscriber, UpdateEvent } from "../../../../../src";

@EventSubscriber()
export class MockSubscriber implements EntitySubscriberInterface {
calledData: any[] = [];

afterUpdate(event: UpdateEvent<any>): void {
this.calledData.push(event.queryRunner.data);
}
}
Expand Up @@ -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();
Expand Down

0 comments on commit 1de2e13

Please sign in to comment.