@proteinjs/db 1.49.1 → 1.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +1 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/src/MigrationRunner.d.ts +96 -1
- package/dist/src/MigrationRunner.d.ts.map +1 -1
- package/dist/src/MigrationRunner.js +285 -48
- package/dist/src/MigrationRunner.js.map +1 -1
- package/dist/src/Table.d.ts +5 -1
- package/dist/src/Table.d.ts.map +1 -1
- package/dist/src/tables/MigrationTable.d.ts +26 -0
- package/dist/src/tables/MigrationTable.d.ts.map +1 -1
- package/dist/src/tables/MigrationTable.js.map +1 -1
- package/dist/test/MigrationPlan.test.d.ts +2 -0
- package/dist/test/MigrationPlan.test.d.ts.map +1 -0
- package/dist/test/MigrationPlan.test.js +448 -0
- package/dist/test/MigrationPlan.test.js.map +1 -0
- package/generated/index.ts +1 -1
- package/generated/test/index.ts +1 -1
- package/package.json +2 -2
- package/src/MigrationRunner.ts +276 -39
- package/src/Table.ts +5 -1
- package/src/tables/MigrationTable.ts +27 -0
- package/test/MigrationPlan.test.ts +337 -0
package/dist/src/Table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { Moment } from '../opt/moment';
|
|
2
2
|
import { Table } from '../Table';
|
|
3
3
|
import { SourceRecord } from '../source/SourceRecord';
|
|
4
|
+
/**
|
|
5
|
+
* What a migration's run would touch, counted READ-ONLY before the series runs: the plan a
|
|
6
|
+
* deploy reads before it commits to the run ({@link MigrationRunner.planPendingMigrations}), and
|
|
7
|
+
* the number a caller sizes the run's deadline from.
|
|
8
|
+
*/
|
|
9
|
+
export interface MigrationEstimate {
|
|
10
|
+
/** How many units the run would touch — zero when nothing is left to do (a rerun over converted data). */
|
|
11
|
+
units: number;
|
|
12
|
+
/** The unit's name, a plural noun ("roots", "rows"). */
|
|
13
|
+
unit: string;
|
|
14
|
+
/**
|
|
15
|
+
* Seconds one unit takes, when the migration has measured it (a rehearsal over a copy of a live
|
|
16
|
+
* database); the plan projects `units × secondsPerUnit`. Absent, the plan reports the count and
|
|
17
|
+
* no projection.
|
|
18
|
+
*/
|
|
19
|
+
secondsPerUnit?: number;
|
|
20
|
+
/** Where the numbers come from, and anything the reader of the plan should know. */
|
|
21
|
+
note?: string;
|
|
22
|
+
}
|
|
4
23
|
export interface Migration extends SourceRecord {
|
|
5
24
|
/**
|
|
6
25
|
* The declaring loader's class name (`BackfillOnboardingStateForExistingAccounts`) — the
|
|
@@ -59,6 +78,13 @@ export interface Migration extends SourceRecord {
|
|
|
59
78
|
duration?: string;
|
|
60
79
|
output?: any;
|
|
61
80
|
run: () => Promise<any | void>;
|
|
81
|
+
/**
|
|
82
|
+
* The estimate door: a READ-ONLY count of the work `run` would do ({@link MigrationEstimate}).
|
|
83
|
+
* Optional — the plan logs "no estimate declared" without it. Read before the series runs (the
|
|
84
|
+
* plan lines {@link MigrationRunner.runPendingMigrations} logs before its first run) and by the
|
|
85
|
+
* dry run that applies nothing ({@link MigrationRunner.planPendingMigrations}). Never writes.
|
|
86
|
+
*/
|
|
87
|
+
estimate?: () => Promise<MigrationEstimate>;
|
|
62
88
|
}
|
|
63
89
|
export declare class MigrationTable extends Table<Migration> {
|
|
64
90
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationTable.d.ts","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAA2B,MAAM,wBAAwB,CAAC;AAE/E,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"MigrationTable.d.ts","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAA2B,MAAM,wBAAwB,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,0GAA0G;IAC1G,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC7C;AAED,qBAAa,cAAe,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC3C,IAAI,SAAe;IAC1B;;;;;;;;;OASG;IACI,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAGnC;IACF;;;;;OAKG;IACI,OAAO,UAAQ;IACtB;;;;;;;;;;;;;;OAcG;IACI,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAQ/B;IACF;;;;;OAKG;IACI,OAAO;;;;;;;;;;;;;;;;;;;;;;MAeX;IACI,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CASjE;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationTable.js","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sCAAuF;AACvF,kCAAiC;AACjC,uDAA+E;
|
|
1
|
+
{"version":3,"file":"MigrationTable.js","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationPlan.test.d.ts","sourceRoot":"","sources":["../../test/MigrationPlan.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
// EnvInfo.isDev() requires a GlobalDataStorage implementation that only exists in a running app
|
|
51
|
+
// (the same mock the containment suite uses).
|
|
52
|
+
jest.mock('@proteinjs/server-api', function () { return ({
|
|
53
|
+
EnvInfo: { isDev: function () { return true; } },
|
|
54
|
+
}); });
|
|
55
|
+
/**
|
|
56
|
+
* The world the runner sees, planted per test: the system db (a ledger in memory — the runner's
|
|
57
|
+
* every read and write lands here, so writes are OBSERVABLE) and the build's declared migrations
|
|
58
|
+
* (the reflection source-record loaders for the migration table, which this harness has no
|
|
59
|
+
* reflection graph to serve).
|
|
60
|
+
*/
|
|
61
|
+
var mockWorld = {
|
|
62
|
+
db: undefined,
|
|
63
|
+
loaders: [],
|
|
64
|
+
};
|
|
65
|
+
jest.mock('../src/Db', function () { return (__assign(__assign({}, jest.requireActual('../src/Db')), { getDbAsSystem: function () { return mockWorld.db; } })); });
|
|
66
|
+
jest.mock('../src/source/SourceRecord', function () { return (__assign(__assign({}, jest.requireActual('../src/source/SourceRecord')), { getSourceRecordLoaders: function () { return mockWorld.loaders; } })); });
|
|
67
|
+
var logger_1 = require("@proteinjs/logger");
|
|
68
|
+
var MigrationRunner_1 = require("../src/MigrationRunner");
|
|
69
|
+
var MigrationTable_1 = require("../src/tables/MigrationTable");
|
|
70
|
+
var SourceRecordRepo_1 = require("../src/source/SourceRecordRepo");
|
|
71
|
+
/**
|
|
72
|
+
* The plan before the run (the estimate door): every pending migration's estimate is logged as
|
|
73
|
+
* one line BEFORE the series' first run, a migration without an estimate says so, and the dry run
|
|
74
|
+
* (`planPendingMigrations`) reads the estimates and applies nothing — no run, no ledger write.
|
|
75
|
+
*
|
|
76
|
+
* Pinned on OUTCOMES: the order of events (log lines vs. run effects) in one shared list, the
|
|
77
|
+
* writes the fake ledger received, the plan's own numbers.
|
|
78
|
+
*/
|
|
79
|
+
/** A migration ledger in memory, with the reads and writes the runner makes. */
|
|
80
|
+
var FakeLedgerDb = /** @class */ (function () {
|
|
81
|
+
function FakeLedgerDb() {
|
|
82
|
+
this.rows = [];
|
|
83
|
+
this.writes = [];
|
|
84
|
+
this.exists = true;
|
|
85
|
+
}
|
|
86
|
+
FakeLedgerDb.prototype.tableExists = function () {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
88
|
+
return __generator(this, function (_a) {
|
|
89
|
+
return [2 /*return*/, this.exists];
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
FakeLedgerDb.prototype.query = function () {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
95
|
+
return __generator(this, function (_a) {
|
|
96
|
+
return [2 /*return*/, this.rows.map(function (row) { return (__assign({}, row)); })];
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
FakeLedgerDb.prototype.get = function (_table, _a) {
|
|
101
|
+
var id = _a.id;
|
|
102
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
103
|
+
var row;
|
|
104
|
+
return __generator(this, function (_b) {
|
|
105
|
+
row = this.rows.find(function (candidate) { return candidate.id === id; });
|
|
106
|
+
return [2 /*return*/, row ? __assign({}, row) : undefined];
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
FakeLedgerDb.prototype.update = function (_table, partial) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
112
|
+
var row;
|
|
113
|
+
return __generator(this, function (_a) {
|
|
114
|
+
this.writes.push(partial);
|
|
115
|
+
row = this.rows.find(function (candidate) { return candidate.id === partial.id; });
|
|
116
|
+
if (row) {
|
|
117
|
+
Object.assign(row, partial);
|
|
118
|
+
}
|
|
119
|
+
return [2 /*return*/];
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
return FakeLedgerDb;
|
|
124
|
+
}());
|
|
125
|
+
describe('MigrationRunner — the plan before the run', function () {
|
|
126
|
+
var migrationTable = new MigrationTable_1.MigrationTable();
|
|
127
|
+
var events;
|
|
128
|
+
var db;
|
|
129
|
+
var plantedIds;
|
|
130
|
+
/** A source declaration registered in this process (what init's source sync registers). */
|
|
131
|
+
var plant = function (id, overrides) {
|
|
132
|
+
if (overrides === void 0) { overrides = {}; }
|
|
133
|
+
var migration = __assign({ id: id, description: "plan test migration ".concat(id), run: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
134
|
+
return __generator(this, function (_a) {
|
|
135
|
+
events.push("run:".concat(id));
|
|
136
|
+
return [2 /*return*/, "".concat(id, " output")];
|
|
137
|
+
});
|
|
138
|
+
}); } }, overrides);
|
|
139
|
+
new SourceRecordRepo_1.SourceRecordRepo().loadSourceRecord(migrationTable.name, migration);
|
|
140
|
+
plantedIds.push(id);
|
|
141
|
+
return migration;
|
|
142
|
+
};
|
|
143
|
+
/** A ledger row for a planted migration, as the source sync lands it. */
|
|
144
|
+
var ledgerRow = function (migration, status, extra) {
|
|
145
|
+
if (status === void 0) { status = 'proposed'; }
|
|
146
|
+
if (extra === void 0) { extra = {}; }
|
|
147
|
+
db.rows.push(__assign({ id: migration.id, description: migration.description, status: status }, extra));
|
|
148
|
+
};
|
|
149
|
+
var runner = function () {
|
|
150
|
+
var instance = new MigrationRunner_1.MigrationRunner();
|
|
151
|
+
instance.logger = new logger_1.Logger({
|
|
152
|
+
name: 'MigrationRunner',
|
|
153
|
+
logWriter: {
|
|
154
|
+
write: function (log) {
|
|
155
|
+
events.push("log:".concat(log.message));
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
return instance;
|
|
160
|
+
};
|
|
161
|
+
var planLines = function () { return events.filter(function (event) { return event.startsWith('log:Migration plan'); }); };
|
|
162
|
+
beforeEach(function () {
|
|
163
|
+
events = [];
|
|
164
|
+
db = new FakeLedgerDb();
|
|
165
|
+
plantedIds = [];
|
|
166
|
+
mockWorld.db = db;
|
|
167
|
+
mockWorld.loaders = [];
|
|
168
|
+
});
|
|
169
|
+
afterEach(function () {
|
|
170
|
+
// The repo is a process-wide static: unregister what this test planted so ids never leak
|
|
171
|
+
// between tests (a stale registration would resolve a later test's ghost row).
|
|
172
|
+
var repo = new SourceRecordRepo_1.SourceRecordRepo();
|
|
173
|
+
for (var _i = 0, plantedIds_1 = plantedIds; _i < plantedIds_1.length; _i++) {
|
|
174
|
+
var id = plantedIds_1[_i];
|
|
175
|
+
delete repo.constructor.SOURCE_RECORD_MAP["".concat(migrationTable.name, ":").concat(id)];
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
it('logs each pending migration’s plan line and the total BEFORE the first run, and the series still runs', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
179
|
+
var estimated, unestimated, summary, firstRun, _i, _a, line;
|
|
180
|
+
return __generator(this, function (_b) {
|
|
181
|
+
switch (_b.label) {
|
|
182
|
+
case 0:
|
|
183
|
+
estimated = plant('plan-a-estimated', {
|
|
184
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
185
|
+
return __generator(this, function (_a) {
|
|
186
|
+
return [2 /*return*/, ({
|
|
187
|
+
units: 40,
|
|
188
|
+
unit: 'roots',
|
|
189
|
+
secondsPerUnit: 0.3,
|
|
190
|
+
note: 'measured on a rehearsal',
|
|
191
|
+
})];
|
|
192
|
+
});
|
|
193
|
+
}); },
|
|
194
|
+
});
|
|
195
|
+
unestimated = plant('plan-b-unestimated');
|
|
196
|
+
ledgerRow(estimated);
|
|
197
|
+
ledgerRow(unestimated);
|
|
198
|
+
return [4 /*yield*/, runner().runPendingMigrations()];
|
|
199
|
+
case 1:
|
|
200
|
+
summary = _b.sent();
|
|
201
|
+
expect(summary.applied).toEqual(['plan-a-estimated', 'plan-b-unestimated']);
|
|
202
|
+
expect(planLines()).toEqual([
|
|
203
|
+
'log:Migration plan: (plan-a-estimated) plan test migration plan-a-estimated — 40 roots, ≈ 12 s at 0.3 s per unit (measured on a rehearsal)',
|
|
204
|
+
'log:Migration plan: (plan-b-unestimated) plan test migration plan-b-unestimated — no estimate declared',
|
|
205
|
+
'log:Migration plan total: 2 pending, ≈ 12 s projected over 1 of them, 1 without a projection (plan-b-unestimated)',
|
|
206
|
+
]);
|
|
207
|
+
firstRun = events.indexOf('run:plan-a-estimated');
|
|
208
|
+
expect(firstRun).toBeGreaterThan(-1);
|
|
209
|
+
for (_i = 0, _a = planLines(); _i < _a.length; _i++) {
|
|
210
|
+
line = _a[_i];
|
|
211
|
+
expect(events.indexOf(line)).toBeLessThan(firstRun);
|
|
212
|
+
}
|
|
213
|
+
expect(events.indexOf('run:plan-b-unestimated')).toBeGreaterThan(firstRun);
|
|
214
|
+
return [2 /*return*/];
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}); });
|
|
218
|
+
it('the dry run reads the estimates and applies nothing — no run, no ledger write, an unresolved row reported not stamped', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
219
|
+
var estimateReads, pendingA, pendingB, counted, applied, manual, retired, plan;
|
|
220
|
+
return __generator(this, function (_a) {
|
|
221
|
+
switch (_a.label) {
|
|
222
|
+
case 0:
|
|
223
|
+
estimateReads = 0;
|
|
224
|
+
pendingA = plant('dry-a', {
|
|
225
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
226
|
+
return __generator(this, function (_a) {
|
|
227
|
+
estimateReads++;
|
|
228
|
+
return [2 /*return*/, { units: 3, unit: 'rows', secondsPerUnit: 2 }];
|
|
229
|
+
});
|
|
230
|
+
}); },
|
|
231
|
+
});
|
|
232
|
+
pendingB = plant('dry-b', {
|
|
233
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
234
|
+
return __generator(this, function (_a) {
|
|
235
|
+
estimateReads++;
|
|
236
|
+
return [2 /*return*/, { units: 10, unit: 'rows', secondsPerUnit: 0.5 }];
|
|
237
|
+
});
|
|
238
|
+
}); },
|
|
239
|
+
});
|
|
240
|
+
counted = plant('dry-c-counted-only', {
|
|
241
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
242
|
+
return [2 /*return*/, ({ units: 5, unit: 'items', note: 'no timing yet' })];
|
|
243
|
+
}); }); },
|
|
244
|
+
});
|
|
245
|
+
applied = plant('dry-d-applied', { estimate: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
246
|
+
return [2 /*return*/, ({ units: 999, unit: 'rows', secondsPerUnit: 9 })];
|
|
247
|
+
}); }); } });
|
|
248
|
+
manual = plant('dry-e-manual', { manual: true });
|
|
249
|
+
retired = plant('dry-f-retired');
|
|
250
|
+
ledgerRow(pendingA);
|
|
251
|
+
ledgerRow(pendingB, 'failure');
|
|
252
|
+
ledgerRow(counted, 'running');
|
|
253
|
+
ledgerRow(applied, 'success');
|
|
254
|
+
ledgerRow(manual);
|
|
255
|
+
ledgerRow(retired, 'proposed', { retired: true });
|
|
256
|
+
db.rows.push({ id: 'dry-g-ghost', description: 'loader deleted after an old release ran it' });
|
|
257
|
+
return [4 /*yield*/, runner().planPendingMigrations()];
|
|
258
|
+
case 1:
|
|
259
|
+
plan = _a.sent();
|
|
260
|
+
expect(events.filter(function (event) { return event.startsWith('run:'); })).toEqual([]);
|
|
261
|
+
expect(db.writes).toEqual([]);
|
|
262
|
+
expect(estimateReads).toBe(2);
|
|
263
|
+
expect(plan.pending.map(function (entry) { return entry.id; })).toEqual(['dry-a', 'dry-b', 'dry-c-counted-only']);
|
|
264
|
+
expect(plan.pending[0]).toEqual({
|
|
265
|
+
id: 'dry-a',
|
|
266
|
+
description: 'plan test migration dry-a',
|
|
267
|
+
estimate: { units: 3, unit: 'rows', secondsPerUnit: 2 },
|
|
268
|
+
projectedSeconds: 6,
|
|
269
|
+
});
|
|
270
|
+
expect(plan.pending[1].projectedSeconds).toBe(5);
|
|
271
|
+
expect(plan.pending[2]).toEqual({
|
|
272
|
+
id: 'dry-c-counted-only',
|
|
273
|
+
description: 'plan test migration dry-c-counted-only',
|
|
274
|
+
estimate: { units: 5, unit: 'items', note: 'no timing yet' },
|
|
275
|
+
unprojectedReason: 'no seconds per unit declared',
|
|
276
|
+
});
|
|
277
|
+
expect(plan.projectedSeconds).toBe(11);
|
|
278
|
+
expect(plan.projected).toBe(2);
|
|
279
|
+
expect(plan.unprojected).toEqual(['dry-c-counted-only']);
|
|
280
|
+
expect(plan.alreadyApplied).toEqual(['dry-d-applied']);
|
|
281
|
+
expect(plan.skippedManual).toEqual(['dry-e-manual']);
|
|
282
|
+
expect(plan.retired).toEqual(['dry-f-retired']);
|
|
283
|
+
expect(plan.unresolved).toEqual(['dry-g-ghost']);
|
|
284
|
+
expect(plan.freshDatabase).toBe(false);
|
|
285
|
+
expect(planLines()).toEqual([
|
|
286
|
+
'log:Migration plan: (dry-a) plan test migration dry-a — 3 rows, ≈ 6 s at 2 s per unit',
|
|
287
|
+
'log:Migration plan: (dry-b) plan test migration dry-b — 10 rows, ≈ 5 s at 0.5 s per unit',
|
|
288
|
+
'log:Migration plan: (dry-c-counted-only) plan test migration dry-c-counted-only — 5 items, no seconds per unit declared (no timing yet)',
|
|
289
|
+
'log:Migration plan total: 3 pending, ≈ 11 s projected over 2 of them, 1 without a projection (dry-c-counted-only)',
|
|
290
|
+
]);
|
|
291
|
+
return [2 /*return*/];
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}); });
|
|
295
|
+
it('plans a migration the build declares that has no ledger row yet — after the ledger’s pending rows, in id order', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
296
|
+
var inLedger, declaredOnly, plan;
|
|
297
|
+
return __generator(this, function (_a) {
|
|
298
|
+
switch (_a.label) {
|
|
299
|
+
case 0:
|
|
300
|
+
inLedger = plant('new-0-in-ledger', {
|
|
301
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
302
|
+
return [2 /*return*/, ({ units: 1, unit: 'rows', secondsPerUnit: 1 })];
|
|
303
|
+
}); }); },
|
|
304
|
+
});
|
|
305
|
+
ledgerRow(inLedger);
|
|
306
|
+
declaredOnly = function (id, estimate) { return ({
|
|
307
|
+
loader: {
|
|
308
|
+
table: { name: migrationTable.name },
|
|
309
|
+
record: { id: id, description: "declared ".concat(id), run: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
310
|
+
return [2 /*return*/, events.push("run:".concat(id))];
|
|
311
|
+
}); }); }, estimate: estimate },
|
|
312
|
+
},
|
|
313
|
+
}); };
|
|
314
|
+
mockWorld.loaders = [
|
|
315
|
+
declaredOnly('new-z-later', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
316
|
+
return [2 /*return*/, ({ units: 4, unit: 'rows', secondsPerUnit: 10, note: 'new this build' })];
|
|
317
|
+
}); }); }),
|
|
318
|
+
declaredOnly('new-m-manual-later'),
|
|
319
|
+
{
|
|
320
|
+
loader: {
|
|
321
|
+
table: { name: 'some_other_source_table' },
|
|
322
|
+
record: { id: 'not-a-migration', run: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
323
|
+
return [2 /*return*/, undefined];
|
|
324
|
+
}); }); } },
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
declaredOnly('new-b-earlier'),
|
|
328
|
+
];
|
|
329
|
+
mockWorld.loaders[1].loader.record.manual = true;
|
|
330
|
+
mockWorld.loaders[1].loader.record.preSchemaSync = false;
|
|
331
|
+
mockWorld.loaders[3].loader.record.preSchemaSync = true;
|
|
332
|
+
return [4 /*yield*/, runner().planPendingMigrations()];
|
|
333
|
+
case 1:
|
|
334
|
+
plan = _a.sent();
|
|
335
|
+
expect(plan.pending.map(function (entry) { return entry.id; })).toEqual(['new-0-in-ledger', 'new-b-earlier', 'new-z-later']);
|
|
336
|
+
expect(plan.pending[1]).toEqual({
|
|
337
|
+
id: 'new-b-earlier',
|
|
338
|
+
description: 'declared new-b-earlier',
|
|
339
|
+
preSchemaSync: true,
|
|
340
|
+
unprojectedReason: 'no estimate declared',
|
|
341
|
+
});
|
|
342
|
+
expect(plan.pending[2].projectedSeconds).toBe(40);
|
|
343
|
+
expect(plan.projectedSeconds).toBe(41);
|
|
344
|
+
expect(plan.skippedManual).toEqual(['new-m-manual-later']);
|
|
345
|
+
expect(events.filter(function (event) { return event.startsWith('run:'); })).toEqual([]);
|
|
346
|
+
expect(db.writes).toEqual([]);
|
|
347
|
+
expect(planLines()[1]).toBe('log:Migration plan: (new-b-earlier) declared new-b-earlier [runs at init, before schema sync] — no estimate declared');
|
|
348
|
+
return [2 /*return*/];
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
}); });
|
|
352
|
+
it('on a fresh database (no ledger table) lists every declared migration and reads no estimate', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
353
|
+
var plan;
|
|
354
|
+
return __generator(this, function (_a) {
|
|
355
|
+
switch (_a.label) {
|
|
356
|
+
case 0:
|
|
357
|
+
db.exists = false;
|
|
358
|
+
mockWorld.loaders = [
|
|
359
|
+
{
|
|
360
|
+
loader: {
|
|
361
|
+
table: { name: migrationTable.name },
|
|
362
|
+
record: {
|
|
363
|
+
id: 'fresh-a',
|
|
364
|
+
description: 'declared fresh-a',
|
|
365
|
+
run: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
366
|
+
return [2 /*return*/, events.push('run:fresh-a')];
|
|
367
|
+
}); }); },
|
|
368
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
369
|
+
return __generator(this, function (_a) {
|
|
370
|
+
throw new Error('the estimate must not be read on a fresh database — its tables do not exist');
|
|
371
|
+
});
|
|
372
|
+
}); },
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
];
|
|
377
|
+
return [4 /*yield*/, runner().planPendingMigrations()];
|
|
378
|
+
case 1:
|
|
379
|
+
plan = _a.sent();
|
|
380
|
+
expect(plan.freshDatabase).toBe(true);
|
|
381
|
+
expect(plan.pending).toEqual([
|
|
382
|
+
{ id: 'fresh-a', description: 'declared fresh-a', unprojectedReason: 'fresh database, nothing to count' },
|
|
383
|
+
]);
|
|
384
|
+
expect(plan.projectedSeconds).toBe(0);
|
|
385
|
+
expect(plan.unprojected).toEqual(['fresh-a']);
|
|
386
|
+
expect(planLines()).toEqual([
|
|
387
|
+
'log:Migration plan: (fresh-a) declared fresh-a — fresh database, nothing to count',
|
|
388
|
+
'log:Migration plan total: 1 pending, ≈ 0 s projected over 0 of them, 1 without a projection (fresh-a)',
|
|
389
|
+
]);
|
|
390
|
+
expect(db.writes).toEqual([]);
|
|
391
|
+
return [2 /*return*/];
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
}); });
|
|
395
|
+
it('an estimate that throws fails the plan loudly — a plan that cannot count is not a plan', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
396
|
+
var broken;
|
|
397
|
+
return __generator(this, function (_a) {
|
|
398
|
+
switch (_a.label) {
|
|
399
|
+
case 0:
|
|
400
|
+
broken = plant('broken-estimate', {
|
|
401
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
402
|
+
return __generator(this, function (_a) {
|
|
403
|
+
throw new Error('count query failed');
|
|
404
|
+
});
|
|
405
|
+
}); },
|
|
406
|
+
});
|
|
407
|
+
ledgerRow(broken);
|
|
408
|
+
return [4 /*yield*/, expect(runner().planPendingMigrations()).rejects.toThrow('count query failed')];
|
|
409
|
+
case 1:
|
|
410
|
+
_a.sent();
|
|
411
|
+
expect(events.filter(function (event) { return event.startsWith('run:'); })).toEqual([]);
|
|
412
|
+
expect(db.writes).toEqual([]);
|
|
413
|
+
return [2 /*return*/];
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}); });
|
|
417
|
+
it('a throwing estimate names the migration in the failure — the reader of the plan Job’s log knows which count failed', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
418
|
+
var fine, broken;
|
|
419
|
+
return __generator(this, function (_a) {
|
|
420
|
+
switch (_a.label) {
|
|
421
|
+
case 0:
|
|
422
|
+
fine = plant('names-a-fine', { estimate: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
423
|
+
return [2 /*return*/, ({ units: 1, unit: 'rows', secondsPerUnit: 1 })];
|
|
424
|
+
}); }); } });
|
|
425
|
+
broken = plant('names-b-broken', {
|
|
426
|
+
estimate: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
427
|
+
return __generator(this, function (_a) {
|
|
428
|
+
throw new Error('count query failed');
|
|
429
|
+
});
|
|
430
|
+
}); },
|
|
431
|
+
});
|
|
432
|
+
ledgerRow(fine);
|
|
433
|
+
ledgerRow(broken);
|
|
434
|
+
return [4 /*yield*/, expect(runner().planPendingMigrations()).rejects.toThrow('Migration plan: (names-b-broken) plan test migration names-b-broken — the estimate failed: count query failed')];
|
|
435
|
+
case 1:
|
|
436
|
+
_a.sent();
|
|
437
|
+
expect(events.filter(function (event) { return event.startsWith('run:'); })).toEqual([]);
|
|
438
|
+
expect(db.writes).toEqual([]);
|
|
439
|
+
// The line for the migration before it landed; no line for the one that could not count.
|
|
440
|
+
expect(planLines()).toEqual([
|
|
441
|
+
'log:Migration plan: (names-a-fine) plan test migration names-a-fine — 1 rows, ≈ 1 s at 1 s per unit',
|
|
442
|
+
]);
|
|
443
|
+
return [2 /*return*/];
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
}); });
|
|
447
|
+
});
|
|
448
|
+
//# sourceMappingURL=MigrationPlan.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationPlan.test.js","sourceRoot":"","sources":["../../test/MigrationPlan.test.ts"],"names":[],"mappings":"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"}
|