initial commit
[squeep-indie-auther] / test / src / db / schema-version-helper.js
diff --git a/test/src/db/schema-version-helper.js b/test/src/db/schema-version-helper.js
new file mode 100644 (file)
index 0000000..b69735e
--- /dev/null
@@ -0,0 +1,159 @@
+/* eslint-env mocha */
+'use strict';
+
+const assert = require('assert');
+const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
+const fs = require('fs');
+const svh = require('../../../src/db/schema-version-helper');
+
+describe('SchemaVersionHelper', function () {
+  const isDir = {
+    isDirectory: () => true,
+  };
+  const isMig = {
+    isFile: () => true,
+  };
+  const notDir = {
+    isDirectory: () => false,
+  };
+  afterEach(function () {
+    sinon.restore();
+  });
+  describe('schemaVersionStringToObject', function () {
+    it('covers', function () {
+      const expected = {
+        major: 1,
+        minor: 2,
+        patch: 3,
+      };
+      const result = svh.schemaVersionStringToObject('1.2.3');
+      assert.deepStrictEqual(result, expected);
+    });
+  }); // schemaVersionStringToObject
+
+  describe('schemaVersionObjectToNumber', function () {
+    it('covers', function () {
+      const expected = 1002003;
+      const result = svh.schemaVersionObjectToNumber({
+        major: 1,
+        minor: 2,
+        patch: 3,
+      });
+      assert.strictEqual(result, expected);
+    });
+  }); // schemaVersionObjectToNumber
+
+  describe('schemaVersionStringToNumber', function () {
+    it('covers', function () {
+      const expected = 1002003;
+      const result = svh.schemaVersionStringToNumber('1.2.3');
+      assert.strictEqual(result, expected);
+    });
+  }); // schemaVersionStringToNumber
+
+  describe('schemaVersionStringCmp', function () {
+    it('sorts', function () {
+      const expected = ['0.0.0', '1.0.0', '1.5.3', '64.123.998', '64.123.999'];
+      const source = ['1.5.3', '64.123.998', '1.0.0', '64.123.999', '0.0.0'];
+      source.sort(svh.schemaVersionStringCmp);
+      assert.deepStrictEqual(source, expected);
+    });
+  }); // schemaVersionStringCmp
+
+  describe('isSchemaMigrationDirectory', function () {
+    beforeEach(function () {
+      sinon.stub(fs, 'statSync');
+    });
+    it('is directory, is file', function () {
+      fs.statSync.returns({
+        isDirectory: () => true,
+        isFile: () => true,
+      });
+      const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
+      assert.strictEqual(result, true);
+    });
+    it('is directory, not file', function () {
+      fs.statSync.returns({
+        isDirectory: () => true,
+        isFile: () => false,
+      });
+      const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
+      assert.strictEqual(result, false);
+    });
+    it('not directory', function () {
+      fs.statSync.returns({
+        isDirectory: () => false,
+        isFile: () => {
+          throw new Error('unexpected invocation');
+        },
+      });
+      const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
+      assert.strictEqual(result, false);
+    });
+    it('file error', function () {
+      fs.statSync.returns({
+        isDirectory: () => true,
+        isFile: () => {
+          throw new Error('expected error');
+        },
+      });
+      const result = svh.isSchemaMigrationDirectory('path', '1.0.0');
+      assert.strictEqual(result, false);
+    });
+  }); // isSchemaMigrationDirectory
+
+  describe('allSchemaVersions', function () {
+    beforeEach(function () {
+      sinon.stub(fs, 'readdirSync');
+      sinon.stub(fs, 'statSync');
+      sinon.stub(svh, 'isSchemaMigrationDirectory');
+    });
+    it('covers', function () {
+      const expected = ['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.1.2'];
+      fs.readdirSync.returns(['1.1.2', 'file.txt', '1.1.0', '1.1.1', 'init.sql', '1.0.1', '1.0.0']);
+      // cannot seem to stub isSchemaMigration, so here are the internals of it stubbed
+      let i = 0;
+      fs.statSync
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.2'
+        .onCall(i++).returns(notDir) // 'file.txt'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.0'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.1'
+        .onCall(i++).returns(notDir) // 'init.sql'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.0.1'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.0.0'
+      const result = svh.allSchemaVersions('path');
+      assert.deepStrictEqual(result, expected);
+    });
+  }); // allSchemaVersions
+
+  describe('unappliedSchemaVersions', function () {
+    let current, supported;
+    beforeEach(function () {
+      sinon.stub(fs, 'readdirSync');
+      sinon.stub(fs, 'statSync');
+      sinon.stub(svh, 'isSchemaMigrationDirectory');
+      supported = {
+        min: { major: 1, minor: 0, patch: 1 },
+        max: { major: 1, minor: 1, patch: 1 },
+      };
+      current = { major: 1, minor: 0, patch: 1 };
+      });
+    it('covers', function () {
+      const expected = ['1.1.0', '1.1.1'];
+      fs.readdirSync.returns(['1.1.2', 'file.txt', '1.1.0', '1.1.1', 'init.sql', '1.0.1', '1.0.0']);
+      // cannot seem to stub isSchemaMigration, so here are the internals of it stubbed
+      let i = 0;
+      fs.statSync
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.2'
+        .onCall(i++).returns(notDir) // 'file.txt'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.0'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.1.1'
+        .onCall(i++).returns(notDir) // 'init.sql'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.0.1'
+        .onCall(i++).returns(isDir).onCall(i++).returns(isMig) // '1.0.0'
+      const result = svh.unappliedSchemaVersions('path', current, supported);
+      assert.deepStrictEqual(result, expected);
+    });
+  }); // unappliedSchemaVersions
+
+});
\ No newline at end of file