diff --git a/lib/controllers/skill-infrastructure-controller/index.js b/lib/controllers/skill-infrastructure-controller/index.js index 4870eb75..b651e4ce 100644 --- a/lib/controllers/skill-infrastructure-controller/index.js +++ b/lib/controllers/skill-infrastructure-controller/index.js @@ -8,6 +8,7 @@ const MultiTasksView = require("../../view/multi-tasks-view"); const Messenger = require("../../view/messenger"); const hashUtils = require("../../utils/hash-utils"); const stringUtils = require("../../utils/string-utils"); +const profileHelper = require("../../utils/profile-helper"); const CONSTANTS = require("../../utils/constants"); const {isAcSkill, syncManifest} = require("../../utils/ac-util"); const acdl = require("@alexa/acdl"); @@ -314,17 +315,24 @@ module.exports = class SkillInfrastructureController { * @param {Function} callback */ _ensureSkillManifestGotUpdated(callback) { - let skillMetaController; + let vendorId; try { - skillMetaController = new SkillMetadataController({profile: this.profile, doDebug: this.doDebug}); + vendorId = profileHelper.resolveVendorId(this.profile); } catch (err) { return callback(err); } - skillMetaController.updateSkillManifest((err) => { - callback(err); - }); + // deploy skill package if the skill manifest has file icon uri, otherwise update it + if (Manifest.getInstance().hasFileIconUri()) { + this.skillMetaController.deploySkillPackage(vendorId, this.ignoreHash, (err) => { + callback(err); + }); + } else { + this.skillMetaController.updateSkillManifest((err) => { + callback(err); + }); + } } /** diff --git a/lib/model/manifest.js b/lib/model/manifest.js index 8a2f28eb..468899da 100644 --- a/lib/model/manifest.js +++ b/lib/model/manifest.js @@ -128,4 +128,14 @@ module.exports = class Manifest extends ConfigFile { setEventsSubscriptions(subscriptions) { this.setProperty(["manifest", Manifest.endpointTypes.EVENTS, "subscriptions"], subscriptions); } + + /** + * Returns if skill manifest has file icon uri + * @return {Boolean} + */ + hasFileIconUri() { + return Object.values(this.getPublishingLocales()) + .flatMap((locale) => Object.entries(locale)) + .some(([key, value]) => (key === "smallIconUri" || key === "largeIconUri") && value.startsWith("file://")); + } }; diff --git a/test/unit/controller/skill-infrastructure-controller-test.js b/test/unit/controller/skill-infrastructure-controller-test.js index bf9abc46..0f326fd9 100644 --- a/test/unit/controller/skill-infrastructure-controller-test.js +++ b/test/unit/controller/skill-infrastructure-controller-test.js @@ -763,40 +763,60 @@ describe("Controller test - skill infrastructure controller test", () => { describe("# test class method: _ensureSkillManifestGotUpdated", () => { const skillInfraController = new SkillInfrastructureController(TEST_CONFIGURATION); + let deploySkillPackageStub, updateSkillManifestStub; beforeEach(() => { - new ResourcesConfig(FIXTURE_RESOURCES_CONFIG_FILE_PATH); new Manifest(FIXTURE_MANIFEST_FILE_PATH); - sinon.stub(fs, "writeFileSync"); + deploySkillPackageStub = sinon.stub(SkillMetadataController.prototype, "deploySkillPackage").yields(); + updateSkillManifestStub = sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields(); }); afterEach(() => { - ResourcesConfig.dispose(); Manifest.dispose(); sinon.restore(); }); - it("| update skill manifest fails, expect error called back", (done) => { + it("| resolve vendor id fails, expect error called back", (done) => { + // setup + const TEST_ERROR = new Error("error"); + sinon.stub(profileHelper, "resolveVendorId").throws(TEST_ERROR); + // call + skillInfraController._ensureSkillManifestGotUpdated((err, res) => { + // verify + expect(res).equal(undefined); + expect(err).equal(TEST_ERROR); + expect(deploySkillPackageStub.calledOnce).equal(false); + expect(updateSkillManifestStub.calledOnce).equal(false); + done(); + }); + }); + + it("| skill manifest has no file icon uri, expect updateSkillManifest to be called with no error", (done) => { // setup sinon.stub(profileHelper, "resolveVendorId"); - sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields("error"); + sinon.stub(Manifest.prototype, "hasFileIconUri").returns(false); // call skillInfraController._ensureSkillManifestGotUpdated((err, res) => { // verify expect(res).equal(undefined); - expect(err).equal("error"); + expect(err).equal(undefined); + expect(deploySkillPackageStub.calledOnce).equal(false); + expect(updateSkillManifestStub.calledOnce).equal(true); done(); }); }); - it("| update skill manifest succeeds, expect call back with no error", (done) => { + it("| skill manifest has file icon uri, expect deploySkillPackage to be called with no error", (done) => { + // setup sinon.stub(profileHelper, "resolveVendorId"); - sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields(); + sinon.stub(Manifest.prototype, "hasFileIconUri").returns(true); // call skillInfraController._ensureSkillManifestGotUpdated((err, res) => { // verify expect(res).equal(undefined); expect(err).equal(undefined); + expect(deploySkillPackageStub.calledOnce).equal(true); + expect(updateSkillManifestStub.calledOnce).equal(false); done(); }); }); diff --git a/test/unit/model/manifest-test.js b/test/unit/model/manifest-test.js index a9663acb..4fafc83b 100644 --- a/test/unit/model/manifest-test.js +++ b/test/unit/model/manifest-test.js @@ -211,5 +211,37 @@ describe("Model test - manifest file test", () => { Manifest.dispose(); }); }); + + describe("# verify function hasFileIconUri", () => { + it("| icon uri https path, expect false", () => { + new Manifest(MANIFEST_FILE); + Manifest.getInstance().setPublishingLocales({ + "en-US": { + name: "skillName", + summary: "one sentence description", + description: "skill description", + smallIconUri: "https://some.url.com/images/en-US_smallIcon.png", + largeIconUri: "https://some.url.com/images/en-US_largeIconUri.png", + }, + }); + expect(Manifest.getInstance().hasFileIconUri()).equal(false); + Manifest.dispose(); + }); + + it("| icon uri file path relative to skill package assets, expect true", () => { + new Manifest(MANIFEST_FILE); + Manifest.getInstance().setPublishingLocales({ + "en-US": { + name: "skillName", + summary: "one sentence description", + description: "skill description", + smallIconUri: "file://assets/images/en-US_smallIcon.png", + largeIconUri: "file://assets/images/en-US_largeIconUri.png", + }, + }); + expect(Manifest.getInstance().hasFileIconUri()).equal(true); + Manifest.dispose(); + }); + }); }); });