@oraclecc/dcu
Version:
Development tools for Oracle Commerce Cloud.
308 lines (232 loc) • 12.2 kB
JavaScript
"use strict"
const constants = require("../constants").constants
const matchers = require('./matchers')
const mockery = require("./mockery")
describe("Widget Grabber", () => {
const baseWidgetDir = "widget"
const myLittleWidgetName = "My Little Widget"
const myLittleWidgetDir = `${baseWidgetDir}/${myLittleWidgetName}`
const myLittleWidgetJsDir = `${myLittleWidgetDir}/js`
const myLittleWidgetInstancesDir = `${myLittleWidgetDir}/instances`
const myLittleWidgetJsFile = `${myLittleWidgetJsDir}/myLittle.js`
const myLittleWidgetMetadata = `${myLittleWidgetDir}/widget.json`
const myLittleWidgetVersionsDir = `${myLittleWidgetDir}/versions`
const myLittleWidgetVersionOneDir = `${myLittleWidgetVersionsDir}/1`
const myHomeMadeWidgetDir = "widget/My Home Made Widget"
const myHomeMadeWidgetUserMetadata = `${myHomeMadeWidgetDir}/widgetMetadata.json`
const myUserWidgetConfigMetadata = `${myHomeMadeWidgetDir}/config/configMetadata.json`
const myHomeMadeWidgetJsFile = `${myHomeMadeWidgetDir}/js/myLittle.js`
const myHomeMadeWidgetConfigLocaleLocaleEn = `${myHomeMadeWidgetDir}/config/locales/en.json`
const myHomeMadeWidgetBaseLocaleEnFile = `${myHomeMadeWidgetDir}/locales/en/ns.myhomemadewidgettype.json`
const myHomeMadeWidgetBaseDisplayTemplate = `${myHomeMadeWidgetDir}/display.template`
const myHomeMadeWidgetBaseLess = `${myHomeMadeWidgetDir}/widget.less`
const myLittleWebContentWidgetName = "My Little Web Content Widget"
const myLittleWebContentInstanceName = `${myLittleWebContentWidgetName} Instance`
const myLittleWebContentWidgetDir = `widget/${myLittleWebContentWidgetName}`
const myLittleWebContentWidgetJsDir = `${myLittleWebContentWidgetDir}/js`
const myLittleWebContentWidgetMetadata = `${myLittleWebContentWidgetDir}/widget.json`
const self = this
beforeEach(() => {
mockery.use(jasmine.createSpy)
matchers.add(jasmine)
self.endPointTransceiver = mockery.mockModule("../endPointTransceiver",
"getAllWidgetInstances", "getWidgetDescriptorJavascriptInfoById", "getWidgetLocaleContent",
"getWidgetDescriptorMetadata", "getConfigMetadataForWidgetDescriptor", "getConfigLocaleContentForWidgetDescriptor",
"getWidgetDescriptorBaseLocaleContent", "getWidgetMetadata", "getWidgetDescriptorJavascriptExtensionInfoById")
self.endPointTransceiver.locales = [{name: "en"}]
mockery.mockModules(self, "../utils", "../grabberUtils", "../etags", "../metadata", "../logger", "../widgetInstanceGrabber")
self.utils.sanitizeName.returnsFirstArg()
self.widgetInstanceGrabber.widgetTypeToDirectoryMap = new Map()
self.widgetGrabber = mockery.require("../widgetGrabber")
self.grabberUtils.copyFieldContentsToFile.returnsPromise()
self.endPointTransceiver.getWidgetDescriptorJavascriptInfoById.returnsResponse(
{
jsFiles: [
{
name: "myLittle.js"
},
{
name: "myLittle.js",
extension: "true"
}
]
})
self.endPointTransceiver.get.returnsResponse("some widget js source", "get js etag")
self.endPointTransceiver.getWidgetDescriptorMetadata.returnsResponse({metadata: {}}, "get metadata etag")
self.endPointTransceiver.getConfigMetadataForWidgetDescriptor.returnsResponse({metadata: {metadataKey: "metadataValue"}}, "config metadata etag")
self.endPointTransceiver.getConfigLocaleContentForWidgetDescriptor.returnsResponse({localeData: {localeKey: "localeValue"}}, "config locale etag")
self.endPointTransceiver.getWidgetDescriptorBaseLocaleContent.returnsResponse({localeData: {resources: {localeKey: "localeValue"}}}, "base locale etag")
})
afterEach(mockery.stopAll)
const resources = {
"buttonEditCartSummary": "Edit",
"cartSummaryItemLimitText": "Showing initial __noOfItems__ cart items",
"colorText": "Color: ",
"overrideKey": "Should not see this"
}
function mockValidInstances() {
self.endPointTransceiver.getAllWidgetInstances.returnsItems(
{
displayName: myLittleWidgetName,
widgetType: "myLittleWidgetType",
editableWidget: true,
jsEditable: true,
repositoryId: "rep0001",
id: "rep0001",
version: 1,
instances: [],
layouts: []
},
{
displayName: "My Home Made Widget",
widgetType: "myHomeMadeWidgetType",
editableWidget: true,
jsEditable: true,
repositoryId: "rep0010",
id: "rep0010",
version: 1,
instances: [],
source: 101,
configurable: true,
i18nresources: "myhomemadewidgettype",
layouts: []
}
)
}
it("should let you grab all Widgets", done => {
self.endPointTransceiver.serverSupports.returnsTrue()
mockValidInstances()
self.widgetGrabber.grabAllWidgets(true).then(() => {
expect(self.endPointTransceiver.getAllWidgetInstances).toHaveBeenCalledWith("?source=100")
expect(self.endPointTransceiver.getAllWidgetInstances).toHaveBeenCalledWith("?source=101")
expect(self.endPointTransceiver.getWidgetDescriptorJavascriptInfoById).toHaveBeenCalledWith(["rep0001"])
const paths = [baseWidgetDir, myLittleWidgetInstancesDir, myLittleWidgetDir, myLittleWidgetJsDir]
paths.forEach(path => expect(self.utils.makeTrackedDirectory).toHaveBeenCalledWith(path))
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith(myLittleWidgetJsFile, "some widget js source", "get js etag")
expect(self.metadata.writeMetadata).toHaveBeenCalledWith(myLittleWidgetMetadata,
{
widgetType: "myLittleWidgetType",
version: 1,
displayName: myLittleWidgetName,
elementized: false
})
expect(self.logger.info).toHaveBeenCalledWith("grabbingWidget", {name: myLittleWidgetName})
// See if the directory map is right. Simple case - latest widget.
expect(self.widgetGrabber.getDirectoryForWidget("myLittleWidgetType", 3, true)).toEqual(myLittleWidgetDir)
// More complex case - not latest version. Make sure dirs got created.
expect(self.widgetGrabber.getDirectoryForWidget("myLittleWidgetType", 1, false)).toEqual(myLittleWidgetVersionOneDir)
expect(self.utils.makeTrackedDirectory).toHaveBeenCalledWith(myLittleWidgetVersionsDir)
expect(self.utils.makeTrackedDirectory).toHaveBeenCalledWith(myLittleWidgetVersionOneDir)
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith(myHomeMadeWidgetUserMetadata, '{}', 'get metadata etag')
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith(myUserWidgetConfigMetadata, '{\n "metadataKey": "metadataValue"\n}', 'config metadata etag')
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith(myHomeMadeWidgetJsFile, 'some widget js source', 'get js etag')
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith(myHomeMadeWidgetConfigLocaleLocaleEn, '{\n "localeKey": "localeValue"\n}', 'config locale etag')
expect(self.utils.writeFile).toHaveBeenCalledWith(myHomeMadeWidgetBaseLocaleEnFile, JSON.stringify(
{
"resources": {
"localeKey": "localeValue"
}
}, null, 2))
expect(self.etags.writeEtag).toHaveBeenCalledWith(myHomeMadeWidgetBaseLocaleEnFile, "base locale etag")
expect(self.grabberUtils.copyFieldContentsToFile).toHaveBeenCalledWith('getWidgetDescriptorBaseTemplate', 'rep0010', 'source', myHomeMadeWidgetBaseDisplayTemplate)
expect(self.grabberUtils.copyFieldContentsToFile).toHaveBeenCalledWith('getWidgetDescriptorBaseLess', 'rep0010', 'source', myHomeMadeWidgetBaseLess)
done()
})
})
it("should handle aliased locales", (done) => {
self.endPointTransceiver.serverSupports.returnsTrue()
mockValidInstances()
self.endPointTransceiver.locales = [
{
name: "chinese",
aliases : ["new chinese alias", "old chinese alias"]
}]
self.endPointTransceiver.getWidgetLocaleContent.returnsResponse({}, "widget locale content etag")
self.endPointTransceiver.getConfigLocaleContentForWidgetDescriptor.returnsResponse({}, "config locale etag")
self.endPointTransceiver.getWidgetDescriptorBaseLocaleContent.returnsResponse({}, "base locale etag")
self.widgetGrabber.grabAllWidgets(true).then(() => {
expect(self.grabberUtils.writeFileAndETag).not.toHaveBeenCalledWith(myHomeMadeWidgetConfigLocaleLocaleEn, '{\n "localeKey": "localeValue"\n}', 'config locale etag')
expect(self.utils.writeFile).not.toHaveBeenCalled()
done()
})
})
it("should let you grab Web Content Widgets", done => {
self.endPointTransceiver.getWidgetDescriptorJavascriptExtensionInfoById.returnsResponse(
{
jsFiles : [
{
url : "module js url",
extension : "true",
name : "extension.js"
}
]
},
"module etag")
self.endPointTransceiver.getAllWidgetInstances.returnsItems(
{
displayName: myLittleWebContentWidgetName,
widgetType: "webContent",
editableWidget: true,
jsEditable: false,
repositoryId: "rep0001",
version: 3,
javascriptExtension: true,
instances: [
{
displayName: myLittleWebContentInstanceName,
repositoryId: "rep0002",
id: "rep0002",
version: 3
}
],
layouts: []
})
self.widgetGrabber.grabAllWidgets(true).then(() => {
expect(self.endPointTransceiver.getAllWidgetInstances).toHaveBeenCalledWith("?source=100")
expect(self.endPointTransceiver.getAllWidgetInstances).toHaveBeenCalledWith("?source=101")
const paths = [baseWidgetDir, myLittleWebContentWidgetDir]
paths.forEach(path => expect(self.utils.makeTrackedDirectory).toHaveBeenCalledWith(path))
expect(self.utils.makeTrackedDirectory).not.toHaveBeenCalledWith(myLittleWebContentWidgetJsDir)
expect(self.grabberUtils.writeFileAndETag).not.toHaveBeenCalledWith(myLittleWidgetJsFile, "some widget js source", "get js etag")
expect(self.metadata.writeMetadata).toHaveBeenCalledWith(myLittleWebContentWidgetMetadata,
{
widgetType: "webContent",
version: 3,
displayName: myLittleWebContentWidgetName,
elementized: false
})
expect(self.grabberUtils.writeFileAndETag).toHaveBeenCalledWith("widget/My Little Web Content Widget/module/js/extension.js", "some widget js source", "get js etag")
expect(self.widgetInstanceGrabber.widgetTypeToDirectoryMap.get("webContent")).toEqual("widget/My Little Web Content Widget")
done()
})
})
it("should warn when endpoints are not available", done => {
self.endPointTransceiver.serverSupports.returnsFalse()
mockValidInstances()
self.widgetGrabber.grabAllWidgets(true).then(() => {
expect(self.logger.warn).toHaveBeenCalledWith("widgetDescriptorMetadataCannotBeGrabbed")
expect(self.logger.warn).toHaveBeenCalledWith("baseWidgetContentCannotBeGrabbed")
expect(self.logger.warn).toHaveBeenCalledWith("widgetDescriptorMetadataCannotBeGrabbed")
expect(self.logger.warn).toHaveBeenCalledWith("baseWidgetContentCannotBeGrabbed")
done()
})
})
it("should let you grab a specific widget", done => {
self.endPointTransceiver.serverSupports.returnsTrue()
mockValidInstances()
self.utils.splitPath.returns("My Home Made Widget")
self.widgetGrabber.grabSpecificWidget("widget/My Home Made Widget").then(() => {
expect(self.logger.info).toHaveBeenCalledWith("grabbingWidget", {name: "My Home Made Widget"})
done()
})
})
it("should not let you grab a silly widget", done => {
self.endPointTransceiver.serverSupports.returnsTrue()
mockValidInstances()
self.utils.splitPath.returns("My Imaginary Widget")
return self.widgetGrabber.grabSpecificWidget("widget/My Imaginary Widget").then(() => {
expect(self.logger.warn).toHaveBeenCalledWith("noMatchFound", { name: "My Imaginary Widget" })
done()
})
})
})