3 const assert
= require('assert');
4 const sinon
= require('sinon');
5 const fs
= require('fs');
6 const svh
= require('../../../src/db/schema-version-helper');
8 describe('SchemaVersionHelper', function () {
10 isDirectory: () => true,
16 isDirectory: () => false,
18 afterEach(function () {
21 describe('schemaVersionStringToObject', function () {
22 it('covers', function () {
28 const result
= svh
.schemaVersionStringToObject('1.2.3');
29 assert
.deepStrictEqual(result
, expected
);
31 }); // schemaVersionStringToObject
33 describe('schemaVersionObjectToNumber', function () {
34 it('covers', function () {
35 const expected
= 1002003;
36 const result
= svh
.schemaVersionObjectToNumber({
41 assert
.strictEqual(result
, expected
);
43 }); // schemaVersionObjectToNumber
45 describe('schemaVersionStringToNumber', function () {
46 it('covers', function () {
47 const expected
= 1002003;
48 const result
= svh
.schemaVersionStringToNumber('1.2.3');
49 assert
.strictEqual(result
, expected
);
51 }); // schemaVersionStringToNumber
53 describe('schemaVersionStringCmp', function () {
54 it('sorts', function () {
55 const expected
= ['0.0.0', '1.0.0', '1.5.3', '64.123.998', '64.123.999'];
56 const source
= ['1.5.3', '64.123.998', '1.0.0', '64.123.999', '0.0.0'];
57 source
.sort(svh
.schemaVersionStringCmp
);
58 assert
.deepStrictEqual(source
, expected
);
60 }); // schemaVersionStringCmp
62 describe('isSchemaMigrationDirectory', function () {
63 beforeEach(function () {
64 sinon
.stub(fs
, 'statSync');
66 it('is directory, is file', function () {
68 isDirectory: () => true,
71 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
72 assert
.strictEqual(result
, true);
74 it('is directory, not file', function () {
76 isDirectory: () => true,
79 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
80 assert
.strictEqual(result
, false);
82 it('not directory', function () {
84 isDirectory: () => false,
86 throw new Error('unexpected invocation');
89 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
90 assert
.strictEqual(result
, false);
92 it('file error', function () {
94 isDirectory: () => true,
96 throw new Error('expected error');
99 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
100 assert
.strictEqual(result
, false);
102 }); // isSchemaMigrationDirectory
104 describe('allSchemaVersions', function () {
105 beforeEach(function () {
106 sinon
.stub(fs
, 'readdirSync');
107 sinon
.stub(fs
, 'statSync');
108 sinon
.stub(svh
, 'isSchemaMigrationDirectory');
110 it('covers', function () {
111 const expected
= ['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.1.2'];
112 fs
.readdirSync
.returns(['1.1.2', 'file.txt', '1.1.0', '1.1.1', 'init.sql', '1.0.1', '1.0.0']);
113 // cannot seem to stub isSchemaMigration, so here are the internals of it stubbed
116 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.2'
117 .onCall(i
++).returns(notDir
) // 'file.txt'
118 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.0'
119 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.1'
120 .onCall(i
++).returns(notDir
) // 'init.sql'
121 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.0.1'
122 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.0.0'
124 const result
= svh
.allSchemaVersions('path');
125 assert
.deepStrictEqual(result
, expected
);
127 }); // allSchemaVersions
129 describe('unappliedSchemaVersions', function () {
130 let current
, supported
;
131 beforeEach(function () {
132 sinon
.stub(fs
, 'readdirSync');
133 sinon
.stub(fs
, 'statSync');
134 sinon
.stub(svh
, 'isSchemaMigrationDirectory');
136 min: { major: 1, minor: 0, patch: 1 },
137 max: { major: 1, minor: 1, patch: 1 },
139 current
= { major: 1, minor: 0, patch: 1 };
141 it('covers', function () {
142 const expected
= ['1.1.0', '1.1.1'];
143 fs
.readdirSync
.returns(['1.1.2', 'file.txt', '1.1.0', '1.1.1', 'init.sql', '1.0.1', '1.0.0']);
144 // cannot seem to stub isSchemaMigration, so here are the internals of it stubbed
147 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.2'
148 .onCall(i
++).returns(notDir
) // 'file.txt'
149 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.0'
150 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.1'
151 .onCall(i
++).returns(notDir
) // 'init.sql'
152 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.0.1'
153 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.0.0'
155 const result
= svh
.unappliedSchemaVersions('path', current
, supported
);
156 assert
.deepStrictEqual(result
, expected
);
158 }); // unappliedSchemaVersions