4 const assert
= require('assert');
5 const sinon
= require('sinon'); // eslint-disable-line node/no-unpublished-require
6 const fs
= require('fs');
7 const svh
= require('../../../src/db/schema-version-helper');
9 describe('SchemaVersionHelper', function () {
11 isDirectory: () => true,
17 isDirectory: () => false,
19 afterEach(function () {
22 describe('schemaVersionStringToObject', function () {
23 it('covers', function () {
29 const result
= svh
.schemaVersionStringToObject('1.2.3');
30 assert
.deepStrictEqual(result
, expected
);
32 }); // schemaVersionStringToObject
34 describe('schemaVersionObjectToNumber', function () {
35 it('covers', function () {
36 const expected
= 1002003;
37 const result
= svh
.schemaVersionObjectToNumber({
42 assert
.strictEqual(result
, expected
);
44 }); // schemaVersionObjectToNumber
46 describe('schemaVersionStringToNumber', function () {
47 it('covers', function () {
48 const expected
= 1002003;
49 const result
= svh
.schemaVersionStringToNumber('1.2.3');
50 assert
.strictEqual(result
, expected
);
52 }); // schemaVersionStringToNumber
54 describe('schemaVersionStringCmp', function () {
55 it('sorts', function () {
56 const expected
= ['0.0.0', '1.0.0', '1.5.3', '64.123.998', '64.123.999'];
57 const source
= ['1.5.3', '64.123.998', '1.0.0', '64.123.999', '0.0.0'];
58 source
.sort(svh
.schemaVersionStringCmp
);
59 assert
.deepStrictEqual(source
, expected
);
61 }); // schemaVersionStringCmp
63 describe('isSchemaMigrationDirectory', function () {
64 beforeEach(function () {
65 sinon
.stub(fs
, 'statSync');
67 it('is directory, is file', function () {
69 isDirectory: () => true,
72 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
73 assert
.strictEqual(result
, true);
75 it('is directory, not file', function () {
77 isDirectory: () => true,
80 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
81 assert
.strictEqual(result
, false);
83 it('not directory', function () {
85 isDirectory: () => false,
87 throw new Error('unexpected invocation');
90 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
91 assert
.strictEqual(result
, false);
93 it('file error', function () {
95 isDirectory: () => true,
97 throw new Error('expected error');
100 const result
= svh
.isSchemaMigrationDirectory('path', '1.0.0');
101 assert
.strictEqual(result
, false);
103 }); // isSchemaMigrationDirectory
105 describe('allSchemaVersions', function () {
106 beforeEach(function () {
107 sinon
.stub(fs
, 'readdirSync');
108 sinon
.stub(fs
, 'statSync');
109 sinon
.stub(svh
, 'isSchemaMigrationDirectory');
111 it('covers', function () {
112 const expected
= ['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.1.2'];
113 fs
.readdirSync
.returns(['1.1.2', 'file.txt', '1.1.0', '1.1.1', 'init.sql', '1.0.1', '1.0.0']);
114 // cannot seem to stub isSchemaMigration, so here are the internals of it stubbed
117 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.2'
118 .onCall(i
++).returns(notDir
) // 'file.txt'
119 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.0'
120 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.1.1'
121 .onCall(i
++).returns(notDir
) // 'init.sql'
122 .onCall(i
++).returns(isDir
).onCall(i
++).returns(isMig
) // '1.0.1'
123 .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'
154 const result
= svh
.unappliedSchemaVersions('path', current
, supported
);
155 assert
.deepStrictEqual(result
, expected
);
157 }); // unappliedSchemaVersions