step2_controller_test.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. App = require('app');
  19. require('controllers/main/service/widgets/create/step2_controller');
  20. describe('App.WidgetWizardStep2Controller', function () {
  21. var controller = App.WidgetWizardStep2Controller.create({
  22. content: Em.Object.create()
  23. });
  24. App.TestAliases.testAsComputedEqual(controller, 'isEditWidget', 'content.controllerName', 'widgetEditController');
  25. describe("#filteredMetrics", function () {
  26. var testCases = [
  27. {
  28. metric: {
  29. point_in_time: false
  30. },
  31. type: null,
  32. result: []
  33. },
  34. {
  35. metric: {
  36. point_in_time: true
  37. },
  38. type: null,
  39. result: [
  40. {
  41. point_in_time: true
  42. }
  43. ]
  44. },
  45. {
  46. metric: {
  47. temporal: false
  48. },
  49. type: 'GRAPH',
  50. result: []
  51. },
  52. {
  53. metric: {
  54. temporal: true
  55. },
  56. type: 'GRAPH',
  57. result: [
  58. {
  59. temporal: true
  60. }
  61. ]
  62. }
  63. ];
  64. testCases.forEach(function (test) {
  65. it("type=" + test.type + "; temporal=" + test.metric.temporal + "; point_in_time=" + test.metric.point_in_time, function () {
  66. controller.get('content').setProperties({
  67. widgetType: test.type,
  68. allMetrics: [test.metric]
  69. });
  70. controller.propertyDidChange('filteredMetrics');
  71. expect(controller.get('filteredMetrics')).to.eql(test.result);
  72. });
  73. });
  74. });
  75. describe("#isSubmitDisabled", function () {
  76. beforeEach(function () {
  77. this.expressionFunc = sinon.stub(controller, 'isExpressionComplete');
  78. this.graphFunc = sinon.stub(controller, 'isGraphDataComplete');
  79. this.templateFunc = sinon.stub(controller, 'isTemplateDataComplete');
  80. controller.set('expressions', ['']);
  81. });
  82. afterEach(function () {
  83. this.expressionFunc.restore();
  84. this.graphFunc.restore();
  85. this.templateFunc.restore();
  86. controller.get('expressions').clear();
  87. });
  88. it("invalid property", function () {
  89. controller.set('widgetPropertiesViews', [Em.Object.create({isValid: false})]);
  90. controller.propertyDidChange('isSubmitDisabled');
  91. expect(controller.get('isSubmitDisabled')).to.be.true;
  92. });
  93. it("valid number widget", function () {
  94. controller.set('widgetPropertiesViews', []);
  95. controller.set('content.widgetType', 'NUMBER');
  96. this.expressionFunc.returns(true);
  97. controller.propertyDidChange('isSubmitDisabled');
  98. expect(controller.get('isSubmitDisabled')).to.be.false;
  99. });
  100. it("invalid number widget", function () {
  101. controller.set('widgetPropertiesViews', []);
  102. controller.set('content.widgetType', 'NUMBER');
  103. this.expressionFunc.returns(false);
  104. controller.propertyDidChange('isSubmitDisabled');
  105. expect(controller.get('isSubmitDisabled')).to.be.true;
  106. });
  107. it("valid graph widget", function () {
  108. controller.set('widgetPropertiesViews', []);
  109. controller.set('content.widgetType', 'GRAPH');
  110. this.graphFunc.returns(true);
  111. controller.propertyDidChange('isSubmitDisabled');
  112. expect(controller.get('isSubmitDisabled')).to.be.false;
  113. });
  114. it("invalid graph widget", function () {
  115. controller.set('widgetPropertiesViews', []);
  116. controller.set('content.widgetType', 'GRAPH');
  117. this.graphFunc.returns(false);
  118. controller.propertyDidChange('isSubmitDisabled');
  119. expect(controller.get('isSubmitDisabled')).to.be.true;
  120. });
  121. it("valid template widget", function () {
  122. controller.set('widgetPropertiesViews', []);
  123. controller.set('content.widgetType', 'TEMPLATE');
  124. this.templateFunc.returns(true);
  125. controller.propertyDidChange('isSubmitDisabled');
  126. expect(controller.get('isSubmitDisabled')).to.be.false;
  127. });
  128. it("invalid template widget", function () {
  129. controller.set('widgetPropertiesViews', []);
  130. controller.set('content.widgetType', 'TEMPLATE');
  131. this.templateFunc.returns(false);
  132. controller.propertyDidChange('isSubmitDisabled');
  133. expect(controller.get('isSubmitDisabled')).to.be.true;
  134. });
  135. it("unknown widget type", function () {
  136. controller.set('widgetPropertiesViews', []);
  137. controller.set('content.widgetType', '');
  138. controller.propertyDidChange('isSubmitDisabled');
  139. expect(controller.get('isSubmitDisabled')).to.be.false;
  140. });
  141. });
  142. describe("#isExpressionComplete()", function () {
  143. var testCases = [
  144. {
  145. expression: null,
  146. result: false
  147. },
  148. {
  149. expression: Em.Object.create({isInvalid: true}),
  150. result: false
  151. },
  152. {
  153. expression: Em.Object.create({isInvalid: false, isEmpty: false}),
  154. result: true
  155. },
  156. {
  157. expression: Em.Object.create({isInvalid: false, isEmpty: true}),
  158. result: false
  159. }
  160. ];
  161. testCases.forEach(function (test) {
  162. it("expression = " + test.expression, function () {
  163. expect(controller.isExpressionComplete(test.expression)).to.equal(test.result);
  164. });
  165. });
  166. });
  167. describe("#isGraphDataComplete()", function () {
  168. beforeEach(function () {
  169. this.mock = sinon.stub(controller, 'isExpressionComplete');
  170. });
  171. afterEach(function () {
  172. this.mock.restore();
  173. });
  174. it("dataSets is empty", function () {
  175. expect(controller.isGraphDataComplete([])).to.be.false;
  176. });
  177. it("label is empty", function () {
  178. expect(controller.isGraphDataComplete([Em.Object.create({label: ''})])).to.be.false;
  179. });
  180. it("expression is not complete", function () {
  181. this.mock.returns(false);
  182. expect(controller.isGraphDataComplete([Em.Object.create({label: 'abc'})])).to.be.false;
  183. });
  184. it("expression is complete", function () {
  185. this.mock.returns(true);
  186. expect(controller.isGraphDataComplete([Em.Object.create({label: 'abc'})])).to.be.true;
  187. });
  188. });
  189. describe("#isTemplateDataComplete()", function () {
  190. beforeEach(function () {
  191. this.mock = sinon.stub(controller, 'isExpressionComplete');
  192. });
  193. afterEach(function () {
  194. this.mock.restore();
  195. });
  196. it("expressions is empty", function () {
  197. expect(controller.isTemplateDataComplete([])).to.be.false;
  198. });
  199. it("templateValue is empty", function () {
  200. expect(controller.isTemplateDataComplete([{}], '')).to.be.false;
  201. });
  202. it("expression is not complete", function () {
  203. this.mock.returns(false);
  204. expect(controller.isTemplateDataComplete([{}], 'abc')).to.be.false;
  205. });
  206. it("expression is complete", function () {
  207. this.mock.returns(true);
  208. expect(controller.isTemplateDataComplete([{}], 'abc')).to.be.true;
  209. });
  210. });
  211. describe("#addDataSet()", function () {
  212. it("", function () {
  213. controller.get('dataSets').clear();
  214. controller.addDataSet(null, true);
  215. expect(controller.get('dataSets').objectAt(0).get('id')).to.equal(1);
  216. expect(controller.get('dataSets').objectAt(0).get('isRemovable')).to.equal(false);
  217. controller.addDataSet(null);
  218. expect(controller.get('dataSets').objectAt(1).get('id')).to.equal(2);
  219. expect(controller.get('dataSets').objectAt(1).get('isRemovable')).to.equal(true);
  220. controller.get('dataSets').clear();
  221. });
  222. });
  223. describe("#removeDataSet()", function () {
  224. it("", function () {
  225. var dataSet = Em.Object.create();
  226. controller.get('dataSets').pushObject(dataSet);
  227. controller.removeDataSet({context: dataSet});
  228. expect(controller.get('dataSets')).to.be.empty;
  229. });
  230. });
  231. describe("#addExpression()", function () {
  232. it("", function () {
  233. controller.get('expressions').clear();
  234. controller.addExpression(null, true);
  235. expect(controller.get('expressions').objectAt(0).get('id')).to.equal(1);
  236. expect(controller.get('expressions').objectAt(0).get('isRemovable')).to.equal(false);
  237. controller.addExpression(null);
  238. expect(controller.get('expressions').objectAt(1).get('id')).to.equal(2);
  239. expect(controller.get('expressions').objectAt(1).get('isRemovable')).to.equal(true);
  240. controller.get('expressions').clear();
  241. });
  242. });
  243. describe("#removeExpression()", function () {
  244. it("", function () {
  245. var expression = Em.Object.create();
  246. controller.get('expressions').pushObject(expression);
  247. controller.removeExpression({context: expression});
  248. expect(controller.get('expressions')).to.be.empty;
  249. });
  250. });
  251. describe("#initWidgetData()", function () {
  252. it("new data", function () {
  253. controller.set('expressions', []);
  254. controller.set('dataSets', []);
  255. controller.get('content').setProperties({
  256. widgetProperties: {a: 1},
  257. widgetValues: [1],
  258. widgetMetrics: [2]
  259. });
  260. controller.initWidgetData();
  261. expect(controller.get('widgetProperties')).to.eql({a: 1});
  262. expect(controller.get('widgetValues')).to.eql([]);
  263. expect(controller.get('widgetMetrics')).to.eql([]);
  264. expect(controller.get('expressions')).to.not.be.empty;
  265. expect(controller.get('dataSets')).to.not.be.empty;
  266. });
  267. it("previously edited", function () {
  268. controller.set('expressions', [{}]);
  269. controller.set('dataSets', [{}]);
  270. controller.get('content').setProperties({
  271. widgetProperties: {a: 1},
  272. widgetValues: [1],
  273. widgetMetrics: [2]
  274. });
  275. controller.initWidgetData();
  276. expect(controller.get('widgetProperties')).to.eql({a: 1});
  277. expect(controller.get('widgetValues')).to.eql([1]);
  278. expect(controller.get('widgetMetrics')).to.eql([2]);
  279. expect(controller.get('expressions')).to.not.be.empty;
  280. expect(controller.get('dataSets')).to.not.be.empty;
  281. });
  282. });
  283. describe("#updateExpressions()", function () {
  284. beforeEach(function () {
  285. sinon.stub(controller, 'parseExpression').returns({values: [1], metrics: [1]});
  286. sinon.stub(controller, 'parseTemplateExpression').returns({values: [1], metrics: [1]});
  287. sinon.stub(controller, 'parseGraphDataset').returns({values: [1], metrics: [1]});
  288. });
  289. afterEach(function () {
  290. controller.parseExpression.restore();
  291. controller.parseTemplateExpression.restore();
  292. controller.parseGraphDataset.restore();
  293. });
  294. it("empty expressions", function () {
  295. controller.set('expressions', []);
  296. controller.updateExpressions();
  297. expect(controller.parseExpression.called).to.be.false;
  298. expect(controller.parseTemplateExpression.called).to.be.false;
  299. expect(controller.parseGraphDataset.called).to.be.false;
  300. expect(controller.get('widgetValues')).to.be.empty;
  301. expect(controller.get('widgetMetrics')).to.be.empty;
  302. });
  303. it("empty dataSets", function () {
  304. controller.set('dataSets', []);
  305. controller.updateExpressions();
  306. expect(controller.parseExpression.called).to.be.false;
  307. expect(controller.parseTemplateExpression.called).to.be.false;
  308. expect(controller.parseGraphDataset.called).to.be.false;
  309. expect(controller.get('widgetValues')).to.be.empty;
  310. expect(controller.get('widgetMetrics')).to.be.empty;
  311. });
  312. it("GAUGE widget", function () {
  313. controller.set('expressions', [{}]);
  314. controller.set('content.widgetType', 'GAUGE');
  315. controller.set('dataSets', [{}]);
  316. //controller.updateExpressions();
  317. expect(controller.parseExpression.calledOnce).to.be.true;
  318. expect(controller.parseTemplateExpression.called).to.be.false;
  319. expect(controller.parseGraphDataset.called).to.be.false;
  320. expect(controller.get('widgetValues')).to.not.be.empty;
  321. expect(controller.get('widgetMetrics')).to.not.be.empty;
  322. });
  323. it("NUMBER widget", function () {
  324. controller.set('expressions', [{}]);
  325. controller.set('content.widgetType', 'NUMBER');
  326. controller.set('dataSets', [{}]);
  327. //controller.updateExpressions();
  328. expect(controller.parseExpression.calledOnce).to.be.true;
  329. expect(controller.parseTemplateExpression.called).to.be.false;
  330. expect(controller.parseGraphDataset.called).to.be.false;
  331. expect(controller.get('widgetValues')).to.not.be.empty;
  332. expect(controller.get('widgetMetrics')).to.not.be.empty;
  333. });
  334. it("TEMPLATE widget", function () {
  335. controller.set('expressions', [{}]);
  336. controller.set('content.widgetType', 'TEMPLATE');
  337. controller.set('dataSets', [{}]);
  338. //controller.updateExpressions();
  339. expect(controller.parseExpression.called).to.be.false;
  340. expect(controller.parseTemplateExpression.calledOnce).to.be.true;
  341. expect(controller.parseGraphDataset.called).to.be.false;
  342. expect(controller.get('widgetValues')).to.not.be.empty;
  343. expect(controller.get('widgetMetrics')).to.not.be.empty;
  344. });
  345. it("GRAPH widget", function () {
  346. controller.set('expressions', [{}]);
  347. controller.set('content.widgetType', 'GRAPH');
  348. controller.set('dataSets', [{}]);
  349. //controller.updateExpressions();
  350. expect(controller.parseExpression.called).to.be.false;
  351. expect(controller.parseTemplateExpression.called).to.be.false;
  352. expect(controller.parseGraphDataset.calledOnce).to.be.true;
  353. expect(controller.get('widgetValues')).to.not.be.empty;
  354. expect(controller.get('widgetMetrics')).to.not.be.empty;
  355. });
  356. });
  357. describe("#parseGraphDataset()", function () {
  358. beforeEach(function () {
  359. sinon.stub(controller, 'parseExpression').returns({value: 'value'});
  360. });
  361. afterEach(function () {
  362. controller.parseExpression.restore();
  363. });
  364. it("empty dataSets", function () {
  365. expect(controller.parseGraphDataset([])).to.be.eql({
  366. metrics: [],
  367. values: []
  368. });
  369. });
  370. it("correct dataSets", function () {
  371. var result = controller.parseGraphDataset([Em.Object.create({label: 'label'})]);
  372. expect(result.values).to.be.eql([
  373. {
  374. "name": "label",
  375. "value": "value"
  376. }
  377. ]);
  378. expect(result.metrics).to.be.empty;
  379. });
  380. });
  381. describe("#parseTemplateExpression()", function () {
  382. beforeEach(function () {
  383. sinon.stub(controller, 'parseExpression').returns({value: 'value'});
  384. });
  385. afterEach(function () {
  386. controller.parseExpression.restore();
  387. });
  388. it("empty expressions", function () {
  389. expect(controller.parseTemplateExpression("{{Expression1}}", [])).to.be.eql({
  390. metrics: [],
  391. values: [
  392. {
  393. value: "{{Expression1}}"
  394. }
  395. ]
  396. });
  397. });
  398. it("correct expressions", function () {
  399. var result = controller.parseTemplateExpression("{{Expression1}}", [Em.Object.create({alias: '{{Expression1}}'})]);
  400. expect(result.values).to.be.eql([
  401. {
  402. value: "value"
  403. }
  404. ]);
  405. expect(result.metrics).to.be.empty;
  406. });
  407. });
  408. describe("#parseExpression()", function () {
  409. it("expression is empty", function () {
  410. expect(controller.parseExpression({data: []})).to.eql({
  411. metrics: [],
  412. value: ''
  413. });
  414. });
  415. it("expression is correct", function () {
  416. var data = [
  417. {
  418. name: 'm1',
  419. serviceName: 'S1',
  420. componentName: 'C1',
  421. metricPath: 'mp',
  422. hostComponentCriteria: 'hcc',
  423. isMetric: true
  424. },
  425. {
  426. name: '+'
  427. },
  428. {
  429. name: '10'
  430. }
  431. ];
  432. expect(controller.parseExpression({data: data})).to.eql({
  433. metrics: [
  434. {
  435. "name": "m1",
  436. "service_name": "S1",
  437. "component_name": "C1",
  438. "metric_path": "mp",
  439. "host_component_criteria": "hcc"
  440. }
  441. ],
  442. value: '${m1+10}'
  443. });
  444. });
  445. });
  446. describe("#updateProperties()", function () {
  447. it("widgetPropertiesViews is empty", function () {
  448. controller.set('widgetPropertiesViews', []);
  449. expect(controller.get('widgetProperties')).to.be.empty;
  450. });
  451. it("widgetPropertiesViews is correct", function () {
  452. controller.set('widgetPropertiesViews', [
  453. Em.Object.create({
  454. valueMap: {
  455. "key1": 'alias1'
  456. },
  457. key1: 1
  458. })
  459. ]);
  460. expect(controller.get('widgetProperties')).to.eql({
  461. "alias1": 1
  462. });
  463. });
  464. });
  465. describe("#renderProperties()", function () {
  466. beforeEach(function () {
  467. this.mock = sinon.stub(App.WidgetType, 'find');
  468. sinon.stub(App.WidgetPropertyTypes, 'findProperty').returns({valueMap: {}});
  469. sinon.stub(App.WidgetProperty, 'create').returns({});
  470. });
  471. afterEach(function () {
  472. this.mock.restore();
  473. App.WidgetPropertyTypes.findProperty.restore();
  474. App.WidgetProperty.create.restore();
  475. });
  476. it("no properties", function () {
  477. this.mock.returns(Em.Object.create({properties: []}));
  478. controller.renderProperties();
  479. expect(controller.get('widgetPropertiesViews')).to.be.empty;
  480. });
  481. it("correct properties", function () {
  482. this.mock.returns(Em.Object.create({properties: [{}]}));
  483. controller.renderProperties();
  484. expect(App.WidgetProperty.create.calledWith({valueMap: {}})).to.be.true;
  485. expect(controller.get('widgetPropertiesViews')).to.not.be.empty;
  486. });
  487. });
  488. describe("#parseValue()", function () {
  489. beforeEach(function () {
  490. sinon.stub(controller, 'getExpressionData').returns({});
  491. });
  492. afterEach(function () {
  493. controller.getExpressionData.restore();
  494. });
  495. it("empty value", function () {
  496. expect(controller.parseValue("", [])).to.be.empty;
  497. });
  498. it("correct value", function () {
  499. expect(controller.parseValue("${m1}", [])).to.not.be.empty;
  500. expect(controller.getExpressionData.calledWith("m1", [])).to.be.true;
  501. });
  502. });
  503. describe("#getExpressionData()", function () {
  504. beforeEach(function () {
  505. sinon.stub(controller, 'getExpressionVariable').returns({});
  506. });
  507. afterEach(function () {
  508. controller.getExpressionVariable.restore();
  509. });
  510. it("empty expression", function () {
  511. expect(controller.getExpressionData("", [])).to.be.empty;
  512. });
  513. it("correct expression", function () {
  514. expect(controller.getExpressionData("m1+10", [])).to.not.be.empty;
  515. expect(controller.getExpressionVariable.getCall(0).args).to.eql(["m1", 1, []]);
  516. expect(controller.getExpressionVariable.getCall(1).args).to.eql(["10", 3, []]);
  517. });
  518. });
  519. describe("#getExpressionVariable()", function () {
  520. it("get metric definition", function () {
  521. var metrics = [
  522. {
  523. name: 'm1',
  524. component_name: 'C1',
  525. service_name: 'S1',
  526. metric_path: 'mp',
  527. host_component_criteria: 'hcc'
  528. }
  529. ];
  530. expect(controller.getExpressionVariable("m1", 1, metrics)).to.be.eql(Em.Object.create({
  531. id: 1,
  532. name: 'm1',
  533. isMetric: true,
  534. componentName: 'C1',
  535. serviceName: 'S1',
  536. metricPath: 'mp',
  537. hostComponentCriteria: 'hcc'
  538. }));
  539. });
  540. it("get number definition", function () {
  541. expect(controller.getExpressionVariable("10", 2, [])).to.be.eql(Em.Object.create({
  542. id: 2,
  543. name: "10",
  544. isNumber: true
  545. }));
  546. });
  547. });
  548. describe("#next()", function () {
  549. beforeEach(function () {
  550. sinon.stub(App.router, 'send');
  551. });
  552. afterEach(function () {
  553. App.router.send.restore();
  554. });
  555. it("", function () {
  556. controller.next();
  557. expect(App.router.send.calledWith('next'));
  558. });
  559. });
  560. });