update dependencies and devDependencies, address lint issues
[squeep-indie-auther] / test / src / db / schema-version-helper.js
1 'use strict';
2
3 const assert = require('assert');
4 const sinon = require('sinon');
5 const fs = require('fs');
6 const svh = require('../../../src/db/schema-version-helper');
7
8 describe('SchemaVersionHelper', function () {
9 const isDir = {
10 isDirectory: () => true,
11 };
12 const isMig = {
13 isFile: () => true,
14 };
15 const notDir = {
16 isDirectory: () => false,
17 };
18 afterEach(function () {
19 sinon.restore();
20 });
21 describe('schemaVersionStringToObject', function () {
22 it('covers', function () {
23 const expected = {
24 major: 1,
25 minor: 2,
26 patch: 3,
27 };
28 const result = svh.schemaVersionStringToObject('1.2.3');
29 assert.deepStrictEqual(result, expected);
30 });
31 }); // schemaVersionStringToObject
32
33 describe('schemaVersionObjectToNumber', function () {
34 it('covers', function () {
35 const expected = 1002003;
36 const result = svh.schemaVersionObjectToNumber({
37 major: 1,
38 minor: 2,
39 patch: 3,
40 });
41 assert.strictEqual(result, expected);
42 });
43 }); // schemaVersionObjectToNumber
44
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);
50 });
51 }); // schemaVersionStringToNumber
52
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);
59 });
60 }); // schemaVersionStringCmp
61
62 describe('isSchemaMigrationDirectory', function () {
63 beforeEach(function () {
64 sinon.stub(fs, 'statSync');
65 });
66 it('is directory, is file', function () {
67 fs.statSync.returns({
68 isDirectory: () => true,
69 isFile: () => true,
70 });
71 const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
72 assert.strictEqual(result, true);
73 });
74 it('is directory, not file', function () {
75 fs.statSync.returns({
76 isDirectory: () => true,
77 isFile: () => false,
78 });
79 const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
80 assert.strictEqual(result, false);
81 });
82 it('not directory', function () {
83 fs.statSync.returns({
84 isDirectory: () => false,
85 isFile: () => {
86 throw new Error('unexpected invocation');
87 },
88 });
89 const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
90 assert.strictEqual(result, false);
91 });
92 it('file error', function () {
93 fs.statSync.returns({
94 isDirectory: () => true,
95 isFile: () => {
96 throw new Error('expected error');
97 },
98 });
99 const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
100 assert.strictEqual(result, false);
101 });
102 }); // isSchemaMigrationDirectory
103
104 describe('allSchemaVersions', function () {
105 beforeEach(function () {
106 sinon.stub(fs, 'readdirSync');
107 sinon.stub(fs, 'statSync');
108 sinon.stub(svh, 'isSchemaMigrationDirectory');
109 });
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
114 let i = 0;
115 fs.statSync
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'
123 ;
124 const result = svh.allSchemaVersions('path');
125 assert.deepStrictEqual(result, expected);
126 });
127 }); // allSchemaVersions
128
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');
135 supported = {
136 min: { major: 1, minor: 0, patch: 1 },
137 max: { major: 1, minor: 1, patch: 1 },
138 };
139 current = { major: 1, minor: 0, patch: 1 };
140 });
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
145 let i = 0;
146 fs.statSync
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 ;
155 const result = svh.unappliedSchemaVersions('path', current, supported);
156 assert.deepStrictEqual(result, expected);
157 });
158 }); // unappliedSchemaVersions
159
160 });