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