forked from percolatestudio/meteor-migrations
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmigrations_tests.js
228 lines (183 loc) · 6.16 KB
/
migrations_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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
Tinytest.add('Migrates up once and only once.', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// first one
Migrations.add({up: function () {run.push('u1');}, version: 1});
// migrates once
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// shouldn't do anything
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
});
Tinytest.add('Migrates up once and back down.', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// first one
Migrations.add({
up: function () {run.push('u1');},
down: function () {run.push('d1');},
version: 1
});
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// shouldn't do anything
Migrations.migrateTo('0');
test.equal(run, ['u1', 'd1']);
test.equal(Migrations.getVersion(), 0);
});
Tinytest.add('Migrates up several times.', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// first one
Migrations.add({up: function () {run.push('u1');}, version: 1});
// migrates once
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// add two more, out of order
Migrations.add({up: function () {run.push('u4');}, version: 4});
Migrations.add({up: function () {run.push('u3');}, version: 3});
// should run the next two nicely in order
Migrations.migrateTo('latest');
test.equal(run, ['u1', 'u3', 'u4']);
test.equal(Migrations.getVersion(), 4);
});
Tinytest.add('Tests migrating down', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// add the migrations
Migrations.add({up: function () {run.push('u1');}, version: 1});
Migrations.add({up: function () {run.push('u2');}, version: 2});
Migrations.add({
up: function () {run.push('u3');},
down: function () {run.push('d3');},
version: 3,
name: 'Down Migration' //give it a name, just for shits
});
// migrates up
Migrations.migrateTo('latest');
test.equal(run, ['u1', 'u2', 'u3']);
test.equal(Migrations.getVersion(), 3);
// migrates down
Migrations.migrateTo('2');
test.equal(run, ['u1', 'u2', 'u3', 'd3']);
test.equal(Migrations.getVersion(), 2);
// should throw as migration u2 has no down method and remain at the save ver
test.throws(function() {
Migrations.migrateTo('1');
}, /Cannot migrate/);
test.equal(run, ['u1', 'u2', 'u3', 'd3']);
test.equal(Migrations.getVersion(), 2);
});
Tinytest.add('Tests migrating down to version 0', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
test.equal(Migrations.getVersion(), 0);
Migrations.add({
up: function () {run.push('u1');},
down: function () {run.push('d1');},
version: 1
});
// migrates up
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// migrates down
Migrations.migrateTo(0);
test.equal(run, ['u1', 'd1']);
test.equal(Migrations.getVersion(), 0);
});
Tinytest.add('Checks that locking works correctly', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// add the migrations
Migrations.add({version: 1, up: function () {
run.push('u1');
// attempts a migration from within the migration, this should have no
// effect due to locking
Migrations.migrateTo('latest');
}});
// migrates up, should only migrate once
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
});
Tinytest.add('Does nothing for no migrations.', function(test) {
Migrations._reset();
// shouldnt do anything
Migrations.migrateTo('latest');
test.equal(Migrations.getVersion(), 0);
});
Tinytest.add('Checks that rerun works correctly', function(test) {
var run = []; //keeps track of migrations in here
Migrations._reset();
// add the migrations
Migrations.add({version: 1, up: function () {
run.push('u1');
}});
Migrations.migrateTo('latest');
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// shouldn't migrate
Migrations.migrateTo(1);
test.equal(run, ['u1']);
test.equal(Migrations.getVersion(), 1);
// should migrate again
Migrations.migrateTo('1,rerun');
test.equal(run, ['u1', 'u1']);
test.equal(Migrations.getVersion(), 1);
});
Tinytest.add('Migration callbacks include the migration as an argument', function(test) {
var contextArg;
Migrations._reset();
// add the migrations
var migration = {
version: 1,
up: function(m) { contextArg = m; }
};
Migrations.add(migration);
Migrations.migrateTo(1);
test.equal(contextArg === migration, true);
});
Tinytest.addAsync('Migrations can log to injected logger', function(test, done) {
Migrations._reset();
// Ensure this logging code only runs once. More than once and we get
// Tinytest errors that the test "returned multiple times", or "Trace: event
// after complete!". Give me a ping, Vasili. One ping only, please.
var calledDone = false;
Migrations.options.logger = function() {
if (!calledDone) {
calledDone = true;
test.isTrue(true);
done();
}
};
Migrations.add({ version: 1, up: function() { } });
Migrations.migrateTo(1);
Migrations.options.logger = null;
});
Tinytest.addAsync('Migrations should pass correct arguments to logger', function(test, done) {
Migrations._reset();
// Ensure this logging code only runs once. More than once and we get
// Tinytest errors that the test "returned multiple times", or "Trace: event
// after complete!". Give me a ping, Vasili. One ping only, please.
var calledDone = false;
var logger = function(opts) {
if (!calledDone) {
calledDone = true;
test.include(opts, 'level');
test.include(opts, 'message');
test.include(opts, 'tag');
test.equal(opts.tag, 'Migrations');
done();
}
};
Migrations.options.logger = logger;
Migrations.add({ version: 1, up: function() { } });
Migrations.migrateTo(1);
Migrations.options.logger = null;
});