-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
transactions_tests.js
97 lines (83 loc) · 3.1 KB
/
transactions_tests.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
'use strict';
const chai = require('chai');
const expect = chai.expect;
const core = require('../../lib/core');
const sessions = core.Sessions;
const TestRunnerContext = require('./runner').TestRunnerContext;
const gatherTestSuites = require('./runner').gatherTestSuites;
const generateTopologyTests = require('./runner').generateTopologyTests;
describe('Transactions', function() {
const testContext = new TestRunnerContext();
[
{ name: 'spec tests', specPath: `${__dirname}/spec/transactions` },
{
name: 'withTransaction spec tests',
specPath: `${__dirname}/spec/transactions/convenient-api`
}
].forEach(suiteSpec => {
describe(suiteSpec.name, function() {
const testSuites = gatherTestSuites(suiteSpec.specPath);
after(() => testContext.teardown());
before(function() {
return testContext.setup(this.configuration);
});
function testFilter(spec) {
const SKIP_TESTS = [
// commitTransaction retry seems to be swallowed by mongos in these three cases
'commitTransaction retry succeeds on new mongos',
'commitTransaction retry fails on new mongos',
'unpin after transient error within a transaction and commit',
'count'
];
return SKIP_TESTS.indexOf(spec.description) === -1;
}
generateTopologyTests(testSuites, testContext, testFilter);
});
});
describe('withTransaction', function() {
let session, sessionPool;
beforeEach(() => {
const topology = new core.Server();
sessionPool = new sessions.ServerSessionPool(topology);
session = new sessions.ClientSession(topology, sessionPool);
});
afterEach(() => {
sessionPool.endAllPooledSessions();
});
it('should provide a useful error if a Promise is not returned', {
metadata: { requires: { topology: ['replicaset', 'sharded'], mongodb: '>=4.1.5' } },
test: function(done) {
function fnThatDoesntReturnPromise() {
return false;
}
expect(() => session.withTransaction(fnThatDoesntReturnPromise)).to.throw(
/must return a Promise/
);
session.endSession(done);
}
});
});
describe('startTransaction', function() {
it('should error if transactions are not supported', {
metadata: { requires: { topology: ['sharded'], mongodb: '4.0.x' } },
test: function(done) {
const configuration = this.configuration;
const client = configuration.newClient(configuration.writeConcernMax(), { poolSize: 1 });
client.connect((err, client) => {
const session = client.startSession();
const db = client.db(configuration.db);
const coll = db.collection('transaction_error_test');
coll.insertOne({ a: 1 }, err => {
expect(err).to.not.exist;
expect(() => session.startTransaction()).to.throw(
'Transactions are not supported on sharded clusters in MongoDB < 4.2.'
);
session.endSession(() => {
client.close(done);
});
});
});
}
});
});
});