const should = require('should'); const sinon = require('sinon'); const _ = require('lodash'); const validate = require('../../../../core/frontend/services/themes/validate'); const gscan = require('gscan'); describe('Themes', function () { let checkZipStub; let checkStub; let formatStub; beforeEach(function () { checkZipStub = sinon.stub(gscan, 'checkZip'); checkStub = sinon.stub(gscan, 'check'); formatStub = sinon.stub(gscan, 'format'); }); afterEach(function () { sinon.restore(); }); describe('Validate', function () { const testTheme = { name: 'supertheme', version: '1.0.0', path: '/path/to/theme' }; it('[success] validates a valid zipped theme', function () { checkZipStub.resolves({}); formatStub.returns({results: {error: []}}); return validate.check(testTheme, true) .then((checkedTheme) => { checkZipStub.calledOnce.should.be.true(); checkZipStub.calledWith(testTheme).should.be.true(); checkStub.callCount.should.be.equal(0); formatStub.calledOnce.should.be.true(); checkedTheme.should.be.an.Object(); should.equal(validate.canActivate(checkedTheme), true); }); }); it('[success] validates a valid unzipped theme', function () { checkStub.resolves({}); formatStub.returns({results: {error: []}}); return validate.check(testTheme, false) .then((checkedTheme) => { checkZipStub.callCount.should.be.equal(0); checkStub.calledOnce.should.be.true(); checkStub.calledWith(testTheme.path).should.be.true(); formatStub.calledOnce.should.be.true(); checkedTheme.should.be.an.Object(); should.equal(validate.canActivate(checkedTheme), true); }); }); it('[failure] validates an invalid zipped theme', function () { checkZipStub.resolves({}); formatStub.returns({ results: { error: [ { fatal: true, level: 'error', rule: 'Replace the {{#if author.cover}} helper with {{#if author.cover_image}}', details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of author here.', failures: [{}], code: 'GS001-DEPR-CON-AC' } ] } }); return validate.check(testTheme, true) .then((checkedTheme) => { checkZipStub.calledOnce.should.be.true(); checkZipStub.calledWith(testTheme).should.be.true(); checkStub.callCount.should.be.equal(0); formatStub.calledOnce.should.be.true(); should.equal(validate.canActivate(checkedTheme), false); }); }); it('[failure] validates an invalid unzipped theme', function () { checkStub.resolves({}); formatStub.returns({ results: { error: [ { fatal: true, level: 'error', rule: 'Replace the {{#if author.cover}} helper with {{#if author.cover_image}}', details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of author here.', failures: [{}], code: 'GS001-DEPR-CON-AC' } ] } }); return validate.check(testTheme, false) .then((checkedTheme) => { checkStub.calledOnce.should.be.true(); checkStub.calledWith(testTheme.path).should.be.true(); checkZipStub.callCount.should.be.equal(0); formatStub.calledOnce.should.be.true(); should.equal(validate.canActivate(checkedTheme), false); }); }); it('[failure] can handle a corrupt zip file', function () { checkZipStub.rejects(new Error('invalid zip file')); formatStub.returns({results: {error: []}}); return validate.check(testTheme, true) .then((checkedTheme) => { checkedTheme.should.not.exist(); }).catch((error) => { error.should.be.an.Object(); error.message.should.be.equal('invalid zip file'); checkZipStub.calledOnce.should.be.true(); checkZipStub.calledWith(testTheme).should.be.true(); checkStub.callCount.should.be.equal(0); formatStub.calledOnce.should.be.false(); }); }); }); });