blob: 57b64af74256e98a56325b7affb9aa9b95fa3a5e [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
App = require('app');
require('controllers/main/service/widgets/create/step2_controller');
describe('App.WidgetWizardStep2Controller', function () {
var controller = App.WidgetWizardStep2Controller.create({
content: Em.Object.create()
});
App.TestAliases.testAsComputedEqual(controller, 'isEditWidget', 'content.controllerName', 'widgetEditController');
describe("#filteredMetrics", function () {
var testCases = [
{
metric: {
point_in_time: false
},
type: null,
result: []
},
{
metric: {
point_in_time: true
},
type: null,
result: [
{
point_in_time: true
}
]
},
{
metric: {
temporal: false
},
type: 'GRAPH',
result: []
},
{
metric: {
temporal: true
},
type: 'GRAPH',
result: [
{
temporal: true
}
]
}
];
testCases.forEach(function (test) {
it("type=" + test.type + "; temporal=" + test.metric.temporal + "; point_in_time=" + test.metric.point_in_time, function () {
controller.get('content').setProperties({
widgetType: test.type,
allMetrics: [test.metric]
});
controller.propertyDidChange('filteredMetrics');
expect(controller.get('filteredMetrics')).to.eql(test.result);
});
});
});
describe("#isSubmitDisabled", function () {
beforeEach(function () {
this.expressionFunc = sinon.stub(controller, 'isExpressionComplete');
this.graphFunc = sinon.stub(controller, 'isGraphDataComplete');
this.templateFunc = sinon.stub(controller, 'isTemplateDataComplete');
controller.set('expressions', ['']);
});
afterEach(function () {
this.expressionFunc.restore();
this.graphFunc.restore();
this.templateFunc.restore();
controller.get('expressions').clear();
});
it("invalid property", function () {
controller.set('widgetPropertiesViews', [Em.Object.create({isValid: false})]);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.true;
});
it("valid number widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'NUMBER');
this.expressionFunc.returns(true);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.false;
});
it("invalid number widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'NUMBER');
this.expressionFunc.returns(false);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.true;
});
it("valid graph widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'GRAPH');
this.graphFunc.returns(true);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.false;
});
it("invalid graph widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'GRAPH');
this.graphFunc.returns(false);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.true;
});
it("valid template widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'TEMPLATE');
this.templateFunc.returns(true);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.false;
});
it("invalid template widget", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', 'TEMPLATE');
this.templateFunc.returns(false);
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.true;
});
it("unknown widget type", function () {
controller.set('widgetPropertiesViews', []);
controller.set('content.widgetType', '');
controller.propertyDidChange('isSubmitDisabled');
expect(controller.get('isSubmitDisabled')).to.be.false;
});
});
describe("#isExpressionComplete()", function () {
var testCases = [
{
expression: null,
result: false,
title: 'no expression'
},
{
expression: Em.Object.create({isInvalid: true}),
result: false,
title: 'invalid expression, no data array'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: false}),
result: false,
title: 'no data array'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: true}),
result: false,
title: 'empty expression'
},
{
expression: Em.Object.create({isInvalid: true, data: []}),
result: false,
title: 'invalid expression, empty data array'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: false, data: []}),
result: false,
title: 'empty data array'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: true, data: []}),
result: false,
title: 'empty expression and data array'
},
{
expression: Em.Object.create({isInvalid: true, data: [{isMetric: false}]}),
result: false,
title: 'invalid expression, no metrics'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: false, data: [{isMetric: false}]}),
result: false,
title: 'no metrics'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: true, data: [{isMetric: false}]}),
result: false,
title: 'empty expression, no metrics'
},
{
expression: Em.Object.create({isInvalid: true, data: [{isMetric: false}, {isMetric: true}]}),
result: false,
title: 'invalid expression'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: false, data: [{isMetric: false}, {isMetric: true}]}),
result: true,
title: 'valid expression'
},
{
expression: Em.Object.create({isInvalid: false, isEmpty: true, data: [{isMetric: false}, {isMetric: true}]}),
result: false,
title: 'empty expression, valid data array'
}
];
testCases.forEach(function (test) {
it(test.title, function () {
expect(controller.isExpressionComplete(test.expression)).to.equal(test.result);
});
});
});
describe("#isGraphDataComplete()", function () {
beforeEach(function () {
this.mock = sinon.stub(controller, 'isExpressionComplete');
});
afterEach(function () {
this.mock.restore();
});
it("dataSets is empty", function () {
expect(controller.isGraphDataComplete([])).to.be.false;
});
it("label is empty", function () {
expect(controller.isGraphDataComplete([Em.Object.create({label: ''})])).to.be.false;
});
it("expression is not complete", function () {
this.mock.returns(false);
expect(controller.isGraphDataComplete([Em.Object.create({label: 'abc'})])).to.be.false;
});
it("expression is complete", function () {
this.mock.returns(true);
expect(controller.isGraphDataComplete([Em.Object.create({label: 'abc'})])).to.be.true;
});
});
describe("#isTemplateDataComplete()", function () {
beforeEach(function () {
this.mock = sinon.stub(controller, 'isExpressionComplete');
});
afterEach(function () {
this.mock.restore();
});
it("expressions is empty", function () {
expect(controller.isTemplateDataComplete([])).to.be.false;
});
it("templateValue is empty", function () {
expect(controller.isTemplateDataComplete([{}], '')).to.be.false;
});
it("expression is not complete", function () {
this.mock.returns(false);
expect(controller.isTemplateDataComplete([{}], 'abc')).to.be.false;
});
it("expression is complete", function () {
this.mock.returns(true);
expect(controller.isTemplateDataComplete([{}], 'abc')).to.be.true;
});
});
describe("#addDataSet()", function () {
beforeEach(function () {
controller.get('dataSets').clear();
controller.addDataSet(null, true);
controller.addDataSet(null);
});
afterEach(function() {
controller.get('dataSets').clear();
});
it('check id', function () {
expect(controller.get('dataSets').mapProperty('id')).to.eql([1, 2]);
});
it('check isRemovable', function () {
expect(controller.get('dataSets').mapProperty('isRemovable')).to.eql([false, true]);
});
});
describe("#removeDataSet()", function () {
it('should remove selected dataSet', function () {
var dataSet = Em.Object.create();
controller.get('dataSets').pushObject(dataSet);
controller.removeDataSet({context: dataSet});
expect(controller.get('dataSets')).to.be.empty;
});
});
describe("#addExpression()", function () {
beforeEach(function () {
controller.get('expressions').clear();
controller.addExpression(null, true);
controller.addExpression(null);
});
afterEach(function () {
controller.get('expressions').clear();
});
it('check id', function () {
expect(controller.get('expressions').mapProperty('id')).to.eql([1, 2]);
});
it('check isRemovable', function () {
expect(controller.get('expressions').mapProperty('isRemovable')).to.eql([false, true]);
});
});
describe("#removeExpression()", function () {
it("should remove selected expression", function () {
var expression = Em.Object.create();
controller.get('expressions').pushObject(expression);
controller.removeExpression({context: expression});
expect(controller.get('expressions')).to.be.empty;
});
});
describe("#initWidgetData()", function () {
describe("new data", function () {
beforeEach(function () {
controller.set('expressions', []);
controller.set('dataSets', []);
controller.get('content').setProperties({
widgetProperties: {a: 1},
widgetValues: [1],
widgetMetrics: [2]
});
controller.initWidgetData();
});
it('widgetProperties is {a: 1}', function () {
expect(controller.get('widgetProperties')).to.eql({a: 1});
});
it('widgetValues is []', function () {
expect(controller.get('widgetValues')).to.eql([]);
});
it('widgetMetrics is []', function () {
expect(controller.get('widgetMetrics')).to.eql([]);
});
it('expressions is not empty', function () {
expect(controller.get('expressions')).to.not.be.empty;
});
it('dataSets is not empty', function () {
expect(controller.get('dataSets')).to.not.be.empty;
});
});
describe("previously edited", function () {
beforeEach(function () {
controller.set('expressions', [{}]);
controller.set('dataSets', [{}]);
controller.get('content').setProperties({
widgetProperties: {a: 1},
widgetValues: [1],
widgetMetrics: [2]
});
controller.initWidgetData();
});
it('widgetProperties is {a: 1}', function () {
expect(controller.get('widgetProperties')).to.eql({a: 1});
});
it('widgetValues is [1]', function () {
expect(controller.get('widgetValues')).to.eql([1]);
});
it('widgetMetrics is [2]', function () {
expect(controller.get('widgetMetrics')).to.eql([2]);
});
it('expressions is not empty', function () {
expect(controller.get('expressions')).to.not.be.empty;
});
it('dataSets is not empty', function () {
expect(controller.get('dataSets')).to.not.be.empty;
});
});
});
describe("#updateExpressions()", function () {
beforeEach(function () {
sinon.stub(controller, 'parseExpression').returns({values: [1], metrics: [1]});
sinon.stub(controller, 'parseTemplateExpression').returns({values: [1], metrics: [1]});
sinon.stub(controller, 'parseGraphDataset').returns({values: [1], metrics: [1]});
});
afterEach(function () {
controller.parseExpression.restore();
controller.parseTemplateExpression.restore();
controller.parseGraphDataset.restore();
});
describe("empty expressions", function () {
beforeEach(function () {
controller.set('expressions', []);
controller.updateExpressions();
});
it('parseExpression is not called', function () {
expect(controller.parseExpression.called).to.be.false;
});
it('parseTemplateExpression is not called', function () {
expect(controller.parseTemplateExpression.called).to.be.false;
});
it('parseGraphDataset is not called', function () {
expect(controller.parseGraphDataset.called).to.be.false;
});
it('widgetValues is empty', function () {
expect(controller.get('widgetValues')).to.be.empty;
});
it('widgetMetrics is empty', function () {
expect(controller.get('widgetMetrics')).to.be.empty;
});
});
describe("empty dataSets", function () {
beforeEach(function () {
controller.set('dataSets', []);
controller.updateExpressions();
});
it('parseExpression is not called', function () {
expect(controller.parseExpression.called).to.be.false;
});
it('parseTemplateExpression is not called', function () {
expect(controller.parseTemplateExpression.called).to.be.false;
});
it('parseGraphDataset is not called', function () {
expect(controller.parseGraphDataset.called).to.be.false;
});
it('widgetValues is empty', function () {
expect(controller.get('widgetValues')).to.be.empty;
});
it('widgetMetrics is empty', function () {
expect(controller.get('widgetMetrics')).to.be.empty;
});
});
describe("GAUGE widget", function () {
beforeEach(function () {
controller.set('expressions', [{}]);
controller.set('content.widgetType', 'GAUGE');
controller.set('dataSets', [{}]);
//controller.updateExpressions();
});
it('parseExpression is called once', function () {
expect(controller.parseExpression.calledOnce).to.be.true;
});
it('parseTemplateExpression is not called', function () {
expect(controller.parseTemplateExpression.called).to.be.false;
});
it('parseGraphDataset is not called', function () {
expect(controller.parseGraphDataset.called).to.be.false;
});
it('widgetValues is not empty', function () {
expect(controller.get('widgetValues')).to.not.be.empty;
});
it('widgetMetrics is not empty', function () {
expect(controller.get('widgetMetrics')).to.not.be.empty;
});
});
describe("NUMBER widget", function () {
beforeEach(function () {
controller.set('expressions', [{}]);
controller.set('content.widgetType', 'NUMBER');
controller.set('dataSets', [{}]);
//controller.updateExpressions();
});
it('parseExpression is called once', function () {
expect(controller.parseExpression.calledOnce).to.be.true;
});
it('parseTemplateExpression is not called', function () {
expect(controller.parseTemplateExpression.called).to.be.false;
});
it('parseGraphDataset is not called', function () {
expect(controller.parseGraphDataset.called).to.be.false;
});
it('widgetValues is not empty', function () {
expect(controller.get('widgetValues')).to.not.be.empty;
});
it('widgetMetrics is not empty', function () {
expect(controller.get('widgetMetrics')).to.not.be.empty;
});
});
describe("TEMPLATE widget", function () {
beforeEach(function () {
controller.set('expressions', [{}]);
controller.set('content.widgetType', 'TEMPLATE');
controller.set('dataSets', [{}]);
//controller.updateExpressions();
});
it('parseExpression is not called', function () {
expect(controller.parseExpression.called).to.be.false;
});
it('parseTemplateExpression is called once', function () {
expect(controller.parseTemplateExpression.calledOnce).to.be.true;
});
it('parseGraphDataset is not called', function () {
expect(controller.parseGraphDataset.called).to.be.false;
});
it('widgetValues is not empty', function () {
expect(controller.get('widgetValues')).to.not.be.empty;
});
it('widgetMetrics is not empty', function () {
expect(controller.get('widgetMetrics')).to.not.be.empty;
});
});
describe("GRAPH widget", function () {
beforeEach(function () {
controller.set('expressions', [{}]);
controller.set('content.widgetType', 'GRAPH');
controller.set('dataSets', [{}]);
//controller.updateExpressions();
});
it('parseExpression is not called', function () {
expect(controller.parseExpression.called).to.be.false;
});
it('parseTemplateExpression is not called', function () {
expect(controller.parseTemplateExpression.called).to.be.false;
});
it('parseGraphDataset is called once', function () {
expect(controller.parseGraphDataset.calledOnce).to.be.true;
});
it('widgetValues is not empty', function () {
expect(controller.get('widgetValues')).to.not.be.empty;
});
it('widgetMetrics is not empty', function () {
expect(controller.get('widgetMetrics')).to.not.be.empty;
});
});
});
describe("#parseGraphDataset()", function () {
beforeEach(function () {
sinon.stub(controller, 'parseExpression').returns({value: 'value'});
});
afterEach(function () {
controller.parseExpression.restore();
});
it("empty dataSets", function () {
expect(controller.parseGraphDataset([])).to.be.eql({
metrics: [],
values: []
});
});
it("correct dataSets", function () {
var result = controller.parseGraphDataset([Em.Object.create({label: 'label'})]);
expect(result.values).to.be.eql([
{
"name": "label",
"value": "value"
}
]);
expect(result.metrics).to.be.empty;
});
});
describe("#parseTemplateExpression()", function () {
beforeEach(function () {
sinon.stub(controller, 'parseExpression').returns({value: 'value'});
});
afterEach(function () {
controller.parseExpression.restore();
});
it("empty expressions", function () {
expect(controller.parseTemplateExpression("{{Expression1}}", [])).to.be.eql({
metrics: [],
values: [
{
value: "{{Expression1}}"
}
]
});
});
it("correct expressions", function () {
var result = controller.parseTemplateExpression("{{Expression1}}", [Em.Object.create({alias: '{{Expression1}}'})]);
expect(result.values).to.be.eql([
{
value: "value"
}
]);
expect(result.metrics).to.be.empty;
});
});
describe("#parseExpression()", function () {
it("expression is empty", function () {
expect(controller.parseExpression({data: []})).to.eql({
metrics: [],
value: ''
});
});
it("expression is correct", function () {
var data = [
{
name: 'm1',
serviceName: 'S1',
componentName: 'C1',
metricPath: 'mp',
hostComponentCriteria: 'hcc',
isMetric: true
},
{
name: '+'
},
{
name: '10'
}
];
expect(controller.parseExpression({data: data})).to.eql({
metrics: [
{
"name": "m1",
"service_name": "S1",
"component_name": "C1",
"metric_path": "mp",
"host_component_criteria": "hcc"
}
],
value: '${m1+10}'
});
});
});
describe("#updateProperties()", function () {
it("widgetPropertiesViews is empty", function () {
controller.set('widgetPropertiesViews', []);
expect(controller.get('widgetProperties')).to.be.empty;
});
it("widgetPropertiesViews is correct", function () {
controller.set('widgetPropertiesViews', [
Em.Object.create({
valueMap: {
"key1": 'alias1'
},
key1: 1
})
]);
expect(controller.get('widgetProperties')).to.eql({
"alias1": 1
});
});
});
describe("#renderProperties()", function () {
beforeEach(function () {
this.mock = sinon.stub(App.WidgetType, 'find');
sinon.stub(App.WidgetPropertyTypes, 'findProperty').returns({valueMap: {}});
sinon.stub(App.WidgetProperty, 'create').returns({});
});
afterEach(function () {
this.mock.restore();
App.WidgetPropertyTypes.findProperty.restore();
App.WidgetProperty.create.restore();
});
it("no properties", function () {
this.mock.returns(Em.Object.create({properties: []}));
controller.renderProperties();
expect(controller.get('widgetPropertiesViews')).to.be.empty;
});
it("correct properties", function () {
this.mock.returns(Em.Object.create({properties: [{}]}));
controller.renderProperties();
expect(App.WidgetProperty.create.calledWith({valueMap: {}})).to.be.true;
expect(controller.get('widgetPropertiesViews')).to.not.be.empty;
});
});
describe("#parseValue()", function () {
beforeEach(function () {
sinon.stub(controller, 'getExpressionData').returns({});
});
afterEach(function () {
controller.getExpressionData.restore();
});
it("empty value", function () {
expect(controller.parseValue("", [])).to.be.empty;
});
it("correct value", function () {
expect(controller.parseValue("${m1}", [])).to.not.be.empty;
expect(controller.getExpressionData.calledWith("m1", [])).to.be.true;
});
});
describe("#getExpressionData()", function () {
beforeEach(function () {
sinon.stub(controller, 'getExpressionVariable').returns({});
});
afterEach(function () {
controller.getExpressionVariable.restore();
});
it("empty expression", function () {
expect(controller.getExpressionData("", [])).to.be.empty;
});
it("correct expression", function () {
expect(controller.getExpressionData("m1+10", [])).to.not.be.empty;
expect(controller.getExpressionVariable.getCall(0).args).to.eql(["m1", 1, []]);
expect(controller.getExpressionVariable.getCall(1).args).to.eql(["10", 3, []]);
});
});
describe("#getExpressionVariable()", function () {
it("get metric definition", function () {
var metrics = [
{
name: 'm1',
component_name: 'C1',
service_name: 'S1',
metric_path: 'mp',
host_component_criteria: 'hcc'
}
];
expect(controller.getExpressionVariable("m1", 1, metrics)).to.be.eql(Em.Object.create({
id: 1,
name: 'm1',
isMetric: true,
componentName: 'C1',
serviceName: 'S1',
metricPath: 'mp',
hostComponentCriteria: 'hcc'
}));
});
it("get number definition", function () {
expect(controller.getExpressionVariable("10", 2, [])).to.be.eql(Em.Object.create({
id: 2,
name: "10",
isNumber: true
}));
});
});
describe("#next()", function () {
beforeEach(function () {
sinon.stub(App.router, 'send');
});
afterEach(function () {
App.router.send.restore();
});
it("user is moved to the next step", function () {
controller.next();
expect(App.router.send.calledWith('next')).to.be.true;
});
});
});