manage_alert_notifications_controller_test.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  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. var App = require('app');
  19. var controller;
  20. var helpers = require('test/helpers');
  21. describe('App.ManageAlertNotificationsController', function () {
  22. beforeEach(function () {
  23. controller = App.ManageAlertNotificationsController.create({});
  24. sinon.stub(App.ajax, 'send');
  25. });
  26. afterEach(function () {
  27. App.ajax.send.restore();
  28. });
  29. describe('#alertNotifications', function () {
  30. beforeEach(function () {
  31. sinon.stub(App.AlertNotification, 'find', function () {
  32. return [1, 2, 3];
  33. });
  34. });
  35. afterEach(function () {
  36. App.AlertNotification.find.restore();
  37. });
  38. it("should return all alert notifications if controller isLoaded", function () {
  39. controller.set('isLoaded', true);
  40. expect(controller.get('alertNotifications')).to.eql([1, 2, 3]);
  41. });
  42. it("should return [] if controller isLoaded=false", function () {
  43. controller.set('isLoaded', false);
  44. expect(controller.get('alertNotifications')).to.eql([]);
  45. });
  46. });
  47. describe('#loadAlertNotifications()', function () {
  48. it("should send ajax request and set isLoaded to false", function () {
  49. controller.set('isLoaded', true);
  50. controller.loadAlertNotifications();
  51. expect(controller.get('isLoaded')).to.be.false;
  52. });
  53. });
  54. describe('#getAlertNotificationsSuccessCallback()', function () {
  55. beforeEach(function () {
  56. sinon.spy(App.alertNotificationMapper, 'map');
  57. });
  58. afterEach(function () {
  59. App.alertNotificationMapper.map.restore();
  60. });
  61. it("should call mapper and set isLoaded to true", function () {
  62. controller.set('isLoaded', false);
  63. controller.getAlertNotificationsSuccessCallback('test');
  64. expect(controller.get('isLoaded')).to.be.true;
  65. expect(App.alertNotificationMapper.map.calledWith('test')).to.be.true;
  66. });
  67. });
  68. describe('#getAlertNotificationsErrorCallback()', function () {
  69. it("should set isLoaded to true", function () {
  70. controller.set('isLoaded', false);
  71. controller.getAlertNotificationsSuccessCallback('test');
  72. expect(controller.get('isLoaded')).to.be.true;
  73. });
  74. });
  75. describe('#addAlertNotification()', function () {
  76. beforeEach(function () {
  77. sinon.stub(controller, 'showCreateEditPopup');
  78. });
  79. afterEach(function () {
  80. controller.showCreateEditPopup.restore();
  81. });
  82. it("should set value for inputFields and call showCreateEditPopup", function () {
  83. controller.set('inputFields', Em.Object.create({
  84. a: {
  85. value: '',
  86. defaultValue: 'a'
  87. },
  88. b: {
  89. value: '',
  90. defaultValue: 'b'
  91. },
  92. c: {
  93. value: '',
  94. defaultValue: 'c'
  95. },
  96. severityFilter: {
  97. value: [],
  98. defaultValue: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
  99. },
  100. global: {
  101. value: false
  102. },
  103. allGroups: Em.Object.create({
  104. value: 'custom'
  105. })
  106. }));
  107. controller.addAlertNotification();
  108. Em.keys(controller.get('inputFields')).forEach(function (key) {
  109. expect(controller.get('inputFields.' + key + '.value')).to.eql(controller.get('inputFields.' + key + '.defaultValue'));
  110. });
  111. expect(controller.showCreateEditPopup.calledOnce).to.be.true;
  112. });
  113. });
  114. describe('#editAlertNotification()', function () {
  115. beforeEach(function () {
  116. sinon.stub(controller, 'showCreateEditPopup', Em.K);
  117. sinon.stub(controller, 'fillEditCreateInputs', Em.K);
  118. });
  119. afterEach(function () {
  120. controller.showCreateEditPopup.restore();
  121. controller.fillEditCreateInputs.restore();
  122. });
  123. it("should call fillEditCreateInputs and showCreateEditPopup", function () {
  124. controller.editAlertNotification();
  125. expect(controller.fillEditCreateInputs.calledOnce).to.be.true;
  126. expect(controller.showCreateEditPopup.calledWith(true)).to.be.true;
  127. });
  128. });
  129. describe('#fillEditCreateInputs()', function () {
  130. it("should map properties from selectedAlertNotification to inputFields (ambari.dispatch.recipients ignored)", function () {
  131. controller.set('selectedAlertNotification', Em.Object.create({
  132. name: 'test_name',
  133. global: true,
  134. description: 'test_description',
  135. groups: ['test1', 'test2'],
  136. type: 'EMAIL',
  137. alertStates: ['OK', 'UNKNOWN'],
  138. properties: {
  139. 'ambari.dispatch.recipients': [
  140. 'test1@test.test',
  141. 'test2@test.test'
  142. ],
  143. 'customName': 'customValue',
  144. "mail.smtp.from" : "from",
  145. "ambari.dispatch.credential.username" : "user",
  146. "mail.smtp.host" : "s1",
  147. "mail.smtp.port" : "25",
  148. "mail.smtp.auth" : "true",
  149. "ambari.dispatch.credential.password" : "pass",
  150. "mail.smtp.starttls.enable" : "true"
  151. }
  152. }));
  153. controller.set('inputFields', Em.Object.create({
  154. name: {
  155. value: ''
  156. },
  157. groups: {
  158. value: []
  159. },
  160. global: {
  161. value: false
  162. },
  163. allGroups: {
  164. value: false
  165. },
  166. method: {
  167. value: ''
  168. },
  169. email: {
  170. value: ''
  171. },
  172. severityFilter: {
  173. value: []
  174. },
  175. description: {
  176. value: ''
  177. },
  178. SMTPServer: {
  179. value: ''
  180. },
  181. SMTPPort: {
  182. value: ''
  183. },
  184. SMTPUseAuthentication: {
  185. value: ''
  186. },
  187. SMTPUsername: {
  188. value: ''
  189. },
  190. SMTPPassword: {
  191. value: ''
  192. },
  193. retypeSMTPPassword: {
  194. value: ''
  195. },
  196. SMTPSTARTTLS: {
  197. value: ''
  198. },
  199. emailFrom: {
  200. value: ''
  201. },
  202. version: {
  203. value: ''
  204. },
  205. OIDs: {
  206. value: ''
  207. },
  208. community: {
  209. value: ''
  210. },
  211. port: {
  212. value: ''
  213. },
  214. customProperties: [
  215. {name: 'customName', value: 'customValue1', defaultValue: 'customValue1'},
  216. {name: 'customName2', value: 'customValue1', defaultValue: 'customValue1'}
  217. ]
  218. }));
  219. controller.fillEditCreateInputs();
  220. expect(JSON.stringify(controller.get('inputFields'))).to.equal(JSON.stringify({
  221. name: {
  222. value: 'test_name'
  223. },
  224. groups: {
  225. value: ['test1', 'test2']
  226. },
  227. global: {
  228. value: true,
  229. disabled: true
  230. },
  231. allGroups: {
  232. value: 'all'
  233. },
  234. method: {
  235. value: 'EMAIL'
  236. },
  237. email: {
  238. value: 'test1@test.test, test2@test.test'
  239. },
  240. severityFilter: {
  241. value: ['OK', 'UNKNOWN']
  242. },
  243. description: {
  244. value: 'test_description'
  245. },
  246. SMTPServer: {
  247. value: 's1'
  248. },
  249. SMTPPort: {
  250. value: '25'
  251. },
  252. SMTPUseAuthentication: {
  253. value: "true"
  254. },
  255. SMTPUsername: {
  256. value: 'user'
  257. },
  258. SMTPPassword: {
  259. value: 'pass'
  260. },
  261. retypeSMTPPassword: {
  262. value: 'pass'
  263. },
  264. SMTPSTARTTLS: {
  265. value: "true"
  266. },
  267. emailFrom: {
  268. value: 'from'
  269. },
  270. version: {},
  271. OIDs: {},
  272. community: {},
  273. port: {},
  274. customProperties: [
  275. {name: 'customName', value: 'customValue', defaultValue: 'customValue'}
  276. ]
  277. }));
  278. });
  279. });
  280. describe("#showCreateEditPopup()", function () {
  281. beforeEach(function () {
  282. sinon.spy(App.ModalPopup, 'show');
  283. });
  284. afterEach(function () {
  285. App.ModalPopup.show.restore();
  286. });
  287. it("should open popup and set popup object to createEditPopup", function () {
  288. controller.showCreateEditPopup();
  289. expect(App.ModalPopup.show.calledOnce).to.be.true;
  290. });
  291. describe('#bodyClass', function () {
  292. var view;
  293. beforeEach(function () {
  294. view = controller.showCreateEditPopup().get('bodyClass').create({
  295. controller: Em.Object.create({
  296. inputFields: {
  297. global: {},
  298. allGroups: {},
  299. SMTPPassword: {},
  300. retypeSMTPPassword: {}
  301. }
  302. }),
  303. groupSelect: Em.Object.create({
  304. selection: [],
  305. content: [{}, {}]
  306. }),
  307. parentView: Em.Object.create({
  308. hasErrors: false
  309. })
  310. });
  311. });
  312. describe('#selectAllGroups', function () {
  313. it('should check inputFields.allGroups.value', function () {
  314. view.set('controller.inputFields.allGroups.value', 'all');
  315. view.selectAllGroups();
  316. expect(view.get('groupSelect.selection')).to.eql([]);
  317. view.set('controller.inputFields.allGroups.value', 'custom');
  318. view.selectAllGroups();
  319. expect(view.get('groupSelect.selection')).to.eql([{}, {}]);
  320. });
  321. });
  322. describe('#clearAllGroups', function () {
  323. it('should check inputFields.allGroups.value', function () {
  324. view.set('controller.inputFields.allGroups.value', 'custom');
  325. view.selectAllGroups();
  326. view.set('controller.inputFields.allGroups.value', 'all');
  327. view.clearAllGroups();
  328. expect(view.get('groupSelect.selection')).to.eql([{}, {}]);
  329. view.set('controller.inputFields.allGroups.value', 'custom');
  330. view.clearAllGroups();
  331. expect(view.get('groupSelect.selection')).to.eql([]);
  332. });
  333. });
  334. describe('#retypePasswordValidation', function () {
  335. it('should check inputFields.retypeSMTPPassword.value', function () {
  336. view.set('controller.inputFields.retypeSMTPPassword.errorMsg', null);
  337. view.set('controller.inputFields.SMTPPassword.value', 'pass');
  338. view.set('controller.inputFields.retypeSMTPPassword.value', 'pas');
  339. expect(view.get('controller.inputFields.retypeSMTPPassword.errorMsg')).to.equal(Em.I18n.t('alerts.notifications.error.retypePassword'));
  340. expect(view.get('parentView.hasErrors')).to.be.true;
  341. });
  342. it('should check inputFields.retypeSMTPPassword.value', function () {
  343. view.set('parentView.hasErrors', true);
  344. view.set('controller.inputFields.retypeSMTPPassword.errorMsg', 'error');
  345. view.set('controller.inputFields.SMTPPassword.value', 'pass');
  346. view.set('controller.inputFields.retypeSMTPPassword.value', 'pass');
  347. expect(view.get('controller.inputFields.retypeSMTPPassword.errorMsg')).to.equal(null);
  348. expect(view.get('parentView.hasErrors')).to.be.false;
  349. });
  350. });
  351. });
  352. });
  353. describe("#formatNotificationAPIObject()", function () {
  354. var inputFields = Em.Object.create({
  355. name: {
  356. value: 'test_name'
  357. },
  358. groups: {
  359. value: [{id: 1}, {id: 2}, {id: 3}]
  360. },
  361. allGroups: {
  362. value: 'custom'
  363. },
  364. global: {
  365. value: false
  366. },
  367. method: {
  368. value: 'EMAIL'
  369. },
  370. email: {
  371. value: 'test1@test.test, test2@test.test,test3@test.test , test4@test.test'
  372. },
  373. severityFilter: {
  374. value: ['OK', 'CRITICAL']
  375. },
  376. SMTPServer: {
  377. value: 's1'
  378. },
  379. SMTPPort: {
  380. value: '25'
  381. },
  382. SMTPUseAuthentication: {
  383. value: "true"
  384. },
  385. SMTPUsername: {
  386. value: 'user'
  387. },
  388. SMTPPassword: {
  389. value: 'pass'
  390. },
  391. SMTPSTARTTLS: {
  392. value: "true"
  393. },
  394. emailFrom: {
  395. value: 'from'
  396. },
  397. description: {
  398. value: 'test_description'
  399. },
  400. customProperties: [
  401. {name: 'n1', value: 'v1'},
  402. {name: 'n2', value: 'v2'}
  403. ]
  404. });
  405. it("should create object with properties from inputFields values", function () {
  406. controller.set('inputFields', inputFields);
  407. var result = controller.formatNotificationAPIObject();
  408. expect(JSON.stringify(result)).to.eql(JSON.stringify({
  409. AlertTarget: {
  410. name: 'test_name',
  411. description: 'test_description',
  412. global: false,
  413. notification_type: 'EMAIL',
  414. alert_states: ['OK', 'CRITICAL'],
  415. properties: {
  416. 'ambari.dispatch.recipients': [
  417. 'test1@test.test',
  418. 'test2@test.test',
  419. 'test3@test.test',
  420. 'test4@test.test'
  421. ],
  422. "mail.smtp.host" : "s1",
  423. "mail.smtp.port" : "25",
  424. "mail.smtp.from" : "from",
  425. "mail.smtp.auth" : "true",
  426. "ambari.dispatch.credential.username" : "user",
  427. "ambari.dispatch.credential.password" : "pass",
  428. "mail.smtp.starttls.enable" : "true",
  429. 'n1': 'v1',
  430. 'n2': 'v2'
  431. },
  432. groups: [1,2,3]
  433. }
  434. }));
  435. });
  436. it('should ignore groups if global is true', function () {
  437. controller.set('inputFields', inputFields);
  438. controller.set('inputFields.allGroups.value', 'all');
  439. var result = controller.formatNotificationAPIObject();
  440. expect(Em.keys(result.AlertTarget)).to.not.contain('groups');
  441. });
  442. });
  443. describe('#createAlertNotification()', function () {
  444. it("should send ajax request", function () {
  445. controller.createAlertNotification();
  446. expect(App.ajax.send.calledOnce).to.be.true;
  447. });
  448. });
  449. describe('#createAlertNotificationSuccessCallback()', function () {
  450. beforeEach(function () {
  451. controller.set('createEditPopup', {
  452. hide: Em.K
  453. });
  454. sinon.stub(controller, 'loadAlertNotifications', Em.K);
  455. sinon.spy(controller.createEditPopup, 'hide');
  456. });
  457. afterEach(function () {
  458. controller.loadAlertNotifications.restore();
  459. controller.createEditPopup.hide.restore();
  460. });
  461. it("should call loadAlertNotifications and createEditPopup.hide", function () {
  462. controller.createAlertNotificationSuccessCallback();
  463. expect(controller.loadAlertNotifications.calledOnce).to.be.true;
  464. expect(controller.createEditPopup.hide.calledOnce).to.be.true;
  465. });
  466. });
  467. describe('#updateAlertNotification()', function () {
  468. it("should send ajax request", function () {
  469. controller.updateAlertNotification();
  470. expect(App.ajax.send.calledOnce).to.be.true;
  471. });
  472. });
  473. describe('#updateAlertNotificationSuccessCallback()', function () {
  474. beforeEach(function () {
  475. controller.set('createEditPopup', {
  476. hide: Em.K
  477. });
  478. sinon.stub(controller, 'loadAlertNotifications', Em.K);
  479. sinon.spy(controller.createEditPopup, 'hide');
  480. });
  481. afterEach(function () {
  482. controller.loadAlertNotifications.restore();
  483. controller.createEditPopup.hide.restore();
  484. });
  485. it("should call loadAlertNotifications and createEditPopup.hide", function () {
  486. controller.updateAlertNotificationSuccessCallback();
  487. expect(controller.loadAlertNotifications.calledOnce).to.be.true;
  488. expect(controller.createEditPopup.hide.calledOnce).to.be.true;
  489. });
  490. });
  491. describe('#deleteAlertNotification()', function () {
  492. beforeEach(function () {
  493. sinon.spy(App, 'showConfirmationPopup');
  494. });
  495. afterEach(function () {
  496. App.showConfirmationPopup.restore();
  497. });
  498. it("should show popup and send request on confirmation", function () {
  499. var popup = controller.deleteAlertNotification();
  500. expect(App.showConfirmationPopup.calledOnce).to.be.true;
  501. popup.onPrimary();
  502. expect(App.ajax.send.calledOnce).to.be.true;
  503. });
  504. });
  505. describe('#deleteAlertNotificationSuccessCallback()', function () {
  506. it("should call loadAlertNotifications, selectedAlertNotification.deleteRecord and set null to selectedAlertNotification", function () {
  507. var mockSelectedAlertNotification = {
  508. deleteRecord: Em.K
  509. };
  510. controller.set('selectedAlertNotification', mockSelectedAlertNotification);
  511. sinon.stub(controller, 'loadAlertNotifications', Em.K);
  512. sinon.spy(mockSelectedAlertNotification, 'deleteRecord');
  513. controller.deleteAlertNotificationSuccessCallback();
  514. expect(controller.loadAlertNotifications.calledOnce).to.be.true;
  515. expect(mockSelectedAlertNotification.deleteRecord.calledOnce).to.be.true;
  516. expect(controller.get('selectedAlertNotification')).to.equal(null);
  517. controller.loadAlertNotifications.restore();
  518. mockSelectedAlertNotification.deleteRecord.restore();
  519. });
  520. });
  521. describe('#duplicateAlertNotification()', function () {
  522. beforeEach(function () {
  523. sinon.stub(controller, 'fillEditCreateInputs', Em.K);
  524. sinon.stub(controller, 'showCreateEditPopup', Em.K);
  525. });
  526. afterEach(function () {
  527. controller.fillEditCreateInputs.restore();
  528. controller.showCreateEditPopup.restore();
  529. });
  530. it("should call fillEditCreateInputs and showCreateEditPopup", function () {
  531. controller.duplicateAlertNotification();
  532. expect(controller.fillEditCreateInputs.calledWith(true)).to.be.true;
  533. expect(controller.showCreateEditPopup.calledOnce).to.be.true;
  534. });
  535. });
  536. describe('#addCustomProperty', function () {
  537. beforeEach(function () {
  538. controller.set('inputFields.customProperties', []);
  539. });
  540. it('should add custom Property to customProperties', function () {
  541. controller.set('newCustomProperty', {name: 'n1', value: 'v1'});
  542. controller.addCustomProperty();
  543. helpers.nestedExpect([{name: 'n1', value: 'v1', defaultValue: 'v1'}], controller.get('inputFields.customProperties'));
  544. });
  545. });
  546. describe('#removeCustomPropertyHandler', function () {
  547. var c = {name: 'n2', value: 'v2', defaultValue: 'v2'};
  548. beforeEach(function () {
  549. controller.set('inputFields.customProperties', [
  550. {name: 'n1', value: 'v1', defaultValue: 'v1'},
  551. c,
  552. {name: 'n3', value: 'v3', defaultValue: 'v3'}
  553. ]);
  554. });
  555. it('should remove selected custom property', function () {
  556. controller.removeCustomPropertyHandler({context: c});
  557. helpers.nestedExpect(
  558. [
  559. {name: 'n1', value: 'v1', defaultValue: 'v1'},
  560. {name: 'n3', value: 'v3', defaultValue: 'v3'}
  561. ],
  562. controller.get('inputFields.customProperties')
  563. );
  564. });
  565. });
  566. describe('#addCustomPropertyHandler', function () {
  567. it('should clean up newCustomProperty on primary click', function () {
  568. controller.set('newCustomProperty', {name: 'n1', value: 'v1'});
  569. controller.addCustomPropertyHandler().onPrimary();
  570. expect(controller.get('newCustomProperty')).to.eql({name: '', value: ''});
  571. });
  572. describe('#bodyClass', function () {
  573. var view;
  574. beforeEach(function () {
  575. view = controller.addCustomPropertyHandler().get('bodyClass').create({
  576. parentView: Em.View.create(),
  577. controller: Em.Object.create({
  578. inputFields: Em.Object.create({
  579. customProperties: [
  580. {name: 'n1', value: 'v1', defaultValue: 'v1'}
  581. ]
  582. }),
  583. newCustomProperty: {name: '', value: ''}
  584. })
  585. });
  586. });
  587. describe('#errorHandler', function () {
  588. it('should fire invalid name', function () {
  589. view.set('controller.newCustomProperty.name', '!!');
  590. view.errorsHandler();
  591. expect(view.get('isError')).to.be.true;
  592. expect(view.get('parentView.disablePrimary')).to.be.true;
  593. expect(view.get('errorMessage.length') > 0).to.be.true;
  594. });
  595. it('should fire existing property name', function () {
  596. view.set('controller.newCustomProperty.name', 'n1');
  597. view.errorsHandler();
  598. expect(view.get('isError')).to.be.true;
  599. expect(view.get('parentView.disablePrimary')).to.be.true;
  600. expect(view.get('errorMessage.length') > 0).to.be.true;
  601. });
  602. });
  603. });
  604. });
  605. });