Skip to content

Commit dc0fffd

Browse files
author
Fernando Leal
committed
Ajustes no gerenciamento de commits e rollbacks em transactions
Testes adicionados para validar a alteração.
1 parent 2b626aa commit dc0fffd

File tree

5 files changed

+105
-14
lines changed

5 files changed

+105
-14
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
"main": "./src/index.js",
66
"types": "./src/index.d.ts",
77
"scripts": {
8-
"test": "ts-mocha src/test/**/*.spec.ts",
8+
"test": "tsc && ts-mocha src/test/**/*.spec.ts",
99
"test-grep": "npm run test -- --grep",
1010
"test-single": "npm run test-grep -- Mapper --debug-brk",
1111
"lint": "tslint -p tsconfig.json",
1212
"build": "tsc",
13-
"publish-npm": "tsc & npm publish",
13+
"publish-npm": "tsc && npm publish",
1414
"publish-npm-alpha": "tsc && npm publish --tag alpha",
15-
"pack": "cd dist/ & npm pack ../",
15+
"pack": "cd dist/ && npm pack ../",
1616
"ts-mocha": "ts-mocha"
1717
},
1818
"dependencies": {
@@ -37,7 +37,7 @@
3737
"sinon": "^12.0.1",
3838
"sqlite3": "^5.0.2",
3939
"ts-mocha": "^9.0.2",
40-
"ts-node": "^10.4.0",
40+
"ts-node": "^10.7.0",
4141
"tslint": "^6.1.3",
4242
"typescript": "^4.6.3"
4343
},

src/test/managed-transaction.spec.ts

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Ddl } from "./../ddl/ddl";
2-
import { expect } from "chai";
2+
import { expect } from 'chai';
33
import { ObjectToTest } from "./objeto-to-test";
44
import { getMapper } from "./mappers-table-new";
55
import { Crud } from "../crud";
@@ -8,14 +8,20 @@ import { SQLiteDatabase } from "./database/sqlite-database";
88
import { DatabaseObject } from "../definitions";
99
import { QueryCompiled } from "../core";
1010
import { TestClazz } from "./models/test-clazz";
11-
import { firstValueFrom } from "rxjs";
11+
import { firstValueFrom, lastValueFrom } from "rxjs";
12+
import * as sinon from "sinon";
13+
import { SinonSandbox } from "sinon";
1214

1315
describe("Managed Transaction", () => {
1416
let crud: Crud;
1517
let ddl: Ddl;
1618
let database: DatabaseObject;
1719

20+
let sandbox: SinonSandbox;
21+
1822
before(async () => {
23+
sandbox = sinon.createSandbox();
24+
1925
const mapper = getMapper();
2026

2127
database = await new SQLiteDatabase().init();
@@ -25,14 +31,14 @@ describe("Managed Transaction", () => {
2531

2632
beforeEach(async () => {
2733
await ddl.create(GuidClazz).execute().toPromise();
34+
sandbox.restore();
2835
});
2936

3037
afterEach(async () => {
3138
await ddl.drop(GuidClazz).execute().toPromise();
3239
});
3340

3441
it("Transaction Simple", async () => {
35-
3642
const transaction = database.managedTransaction();
3743

3844
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
@@ -68,7 +74,6 @@ describe("Managed Transaction", () => {
6874
});
6975

7076
it("Transaction inactive", async () => {
71-
7277
const transaction = database.managedTransaction();
7378

7479
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
@@ -85,13 +90,91 @@ describe("Managed Transaction", () => {
8590
expect(queryUpdateResult[0].description).to.equal(obj1.description);
8691
expect(queryUpdateResult[0].guid).to.equal(obj1.guid);
8792

88-
expect(() => transaction.add(ddl.drop(GuidClazz))).to.throw(`Transaction (id: ${transaction.id}) is no longer active, and can no longer be used`);
93+
expect(() => transaction.add(ddl.drop(GuidClazz))).to.throw(`Transaction (id: ${transaction.id}) is no longer active, and can no longer be used. Current status: COMMITTED`);
8994

9095
const deleteResult = await ddl.drop(GuidClazz).execute().toPromise();
9196
expect(deleteResult.length).to.equal(1);
9297
expect(deleteResult[0].rowsAffected).to.equal(1);
9398
});
9499

100+
it("Transaction two rollback", async () => {
101+
const warn = sandbox.spy(console, "warn");
102+
103+
const transaction = database.managedTransaction();
104+
105+
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
106+
transaction.add(
107+
crud
108+
.insert(GuidClazz, { toSave: obj1 })
109+
);
110+
111+
// first rollback
112+
await transaction.rollback();
113+
expect(warn.notCalled).to.true;
114+
115+
// second rollback
116+
await transaction.rollback();
117+
118+
const expectedWarnTransaction = `Transaction (id: ${transaction.id}) already rollbacked`;
119+
sinon.assert.calledWith(warn, expectedWarnTransaction);
120+
});
121+
122+
it("Transaction two commit", async () => {
123+
const warn = sandbox.spy(console, "warn");
124+
125+
const transaction = database.managedTransaction();
126+
127+
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
128+
transaction.add(
129+
crud
130+
.insert(GuidClazz, { toSave: obj1 })
131+
);
132+
133+
// first commit
134+
await lastValueFrom(transaction.commit());
135+
expect(warn.notCalled).to.true;
136+
137+
// second commit
138+
await lastValueFrom(transaction.commit());
139+
140+
const expectedWarnTransaction = `Transaction (id: ${transaction.id}) already committed`;
141+
sinon.assert.calledWith(warn, expectedWarnTransaction);
142+
});
143+
144+
it("Transaction a commit and a rollback", async () => {
145+
const transaction = database.managedTransaction();
146+
147+
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
148+
transaction.add(
149+
crud
150+
.insert(GuidClazz, { toSave: obj1 })
151+
);
152+
153+
// commit
154+
await lastValueFrom(transaction.commit());
155+
156+
// rollback
157+
await expect(transaction.rollback())
158+
.to.rejectedWith(`Transaction (id: ${transaction.id}) is no longer active, and can no longer be used. Current status: COMMITTED`);
159+
});
160+
161+
it("Transaction a rollback and a commit", async () => {
162+
const transaction = database.managedTransaction();
163+
164+
const obj1 = Object.assign({}, ObjectToTest.guidClazz);
165+
transaction.add(
166+
crud
167+
.insert(GuidClazz, { toSave: obj1 })
168+
);
169+
170+
// rollback
171+
await transaction.rollback();
172+
173+
// commit
174+
await expect(lastValueFrom(transaction.commit()))
175+
.to.rejectedWith(`Transaction (id: ${transaction.id}) is no longer active, and can no longer be used. Current status: ROLLBACKED`);
176+
});
177+
95178
it("Transaction execute immediate", async () => {
96179

97180
const transaction = database.managedTransaction();

src/transaction/managed-transaction.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ export class ManagedTransaction {
8787
* Rollback in current transaction
8888
*/
8989
public async rollback(): Promise<boolean> {
90+
if(this._status === TransactionStatus.ROLLBACKED){
91+
console.warn(`Transaction (id: ${this._idTransaction}) already rollbacked`)
92+
return true;
93+
}
9094
this.checkTransactionActive();
9195
this.clearStackTransaction();
9296
if (this._status === TransactionStatus.STARTED
@@ -124,6 +128,10 @@ export class ManagedTransaction {
124128
* Commit a transaction
125129
*/
126130
private async commitExecute(): Promise<boolean> {
131+
if(this._status === TransactionStatus.COMMITTED){
132+
console.warn(`Transaction (id: ${this._idTransaction}) already committed`)
133+
return true;
134+
}
127135
this.checkParametersAllowedInTransaction();
128136
this.checkTransactionActive();
129137
if (this._status === TransactionStatus.STARTED
@@ -136,7 +144,7 @@ export class ManagedTransaction {
136144
this.status = TransactionStatus.STARTED;
137145
await this.sqlBatch(batch);
138146
}
139-
return this.finishTransaction(TransactionStatus.COMMITED);
147+
return this.finishTransaction(TransactionStatus.COMMITTED);
140148
}
141149

142150
/**
@@ -165,7 +173,7 @@ export class ManagedTransaction {
165173
*/
166174
private checkTransactionActive(): void {
167175
if (!this.isTransactionActive()) {
168-
throw new DatabaseBuilderError(`Transaction (id: ${this._idTransaction}) is no longer active, and can no longer be used`);
176+
throw new DatabaseBuilderError(`Transaction (id: ${this._idTransaction}) is no longer active, and can no longer be used. Current status: ${TransactionStatus[this._status]}`);
169177
}
170178
}
171179

@@ -182,7 +190,7 @@ export class ManagedTransaction {
182190
* Finish transaction and set status
183191
* @param status Status for finished transaction
184192
*/
185-
private finishTransaction(status: TransactionStatus.ROLLBACKED | TransactionStatus.COMMITED | TransactionStatus.RELEASED): boolean {
193+
private finishTransaction(status: TransactionStatus.ROLLBACKED | TransactionStatus.COMMITTED | TransactionStatus.RELEASED): boolean {
186194
this.status = status;
187195
this.clearStackTransaction();
188196
return true;

src/transaction/transaction-status.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ export enum TransactionStatus {
22
OPEN,
33
STARTED,
44
RELEASED,
5-
COMMITED,
5+
COMMITTED,
66
ROLLBACKED
77
}

0 commit comments

Comments
 (0)