You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2014/05/07 15:06:20 UTC

git commit: AMBARI-5694. Unit test for step views. (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk 35bf069ba -> e702b3175


AMBARI-5694. Unit test for step views. (onechiporenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e702b317
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e702b317
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e702b317

Branch: refs/heads/trunk
Commit: e702b31753d3f581f747cbe95c0bc64036d92504
Parents: 35bf069
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Wed May 7 15:42:50 2014 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Wed May 7 16:06:11 2014 +0300

----------------------------------------------------------------------
 ambari-web/app/views/wizard/step2_view.js       |   1 +
 ambari-web/app/views/wizard/step5_view.js       |   3 +-
 ambari-web/test/views/wizard/step0_view_test.js |  56 +-
 ambari-web/test/views/wizard/step1_view_test.js | 622 +++++++++++++++++--
 ambari-web/test/views/wizard/step2_view_test.js | 129 ++++
 ambari-web/test/views/wizard/step3_view_test.js |  46 ++
 ambari-web/test/views/wizard/step5_view_test.js |  69 ++
 7 files changed, 883 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/app/views/wizard/step2_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/wizard/step2_view.js b/ambari-web/app/views/wizard/step2_view.js
index d0133a3..e227e8c 100644
--- a/ambari-web/app/views/wizard/step2_view.js
+++ b/ambari-web/app/views/wizard/step2_view.js
@@ -70,6 +70,7 @@ App.WizardStep2View = Em.View.extend({
    * TODO: incupsulate it inside of App.SshKeyFileUploader
    */
   isFileApi: function () {
+    /* istanbul ignore next */
     return window.File && window.FileReader && window.FileList;
   }.property(),
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/app/views/wizard/step5_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/wizard/step5_view.js b/ambari-web/app/views/wizard/step5_view.js
index 9a43a99..5a55e0f 100644
--- a/ambari-web/app/views/wizard/step5_view.js
+++ b/ambari-web/app/views/wizard/step5_view.js
@@ -116,15 +116,14 @@ App.SelectHostView = Em.Select.extend({
     }
     return hosts;
   },
+
   /**
    * On click start lazy loading
    * @method click
    */
   click: function () {
     var source = [];
-    var componentName = this.get('componentName');
     var availableHosts = this.getAvailableHosts();
-    var selectedHost = this.get('selectedHost');
 
     if (!this.get('isLoaded') && this.get('isLazyLoading')) {
       //filter out hosts, which already pushed in select

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/test/views/wizard/step0_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step0_view_test.js b/ambari-web/test/views/wizard/step0_view_test.js
index 22acdfa..5f350a2 100644
--- a/ambari-web/test/views/wizard/step0_view_test.js
+++ b/ambari-web/test/views/wizard/step0_view_test.js
@@ -20,24 +20,70 @@ var App = require('app');
 require('views/wizard/step0_view');
 
 var view, controller = Em.Object.create({
-  clusterNameError: ''
+  clusterNameError: '',
+  loadStep: Em.K
 });
 
 describe('App.WizardStep0View', function () {
 
-  beforeEach(function() {
+  beforeEach(function () {
     view = App.WizardStep0View.create({'controller': controller});
   });
 
-  describe('#onError', function() {
-    it('should be true if clusterNameError appears', function() {
+  describe('#onError', function () {
+    it('should be true if clusterNameError appears', function () {
       controller.set('clusterNameError', 'ERROR');
       expect(view.get('onError')).to.equal(true);
     });
-    it('should be false if clusterNameError doesn\'t appears', function() {
+    it('should be false if clusterNameError doesn\'t appears', function () {
       controller.set('clusterNameError', '');
       expect(view.get('onError')).to.equal(false);
     });
   });
 
+  describe('#didInsertElement', function () {
+    beforeEach(function () {
+      sinon.stub(App, 'popover', Em.K);
+      sinon.spy(view.get('controller'), 'loadStep');
+    });
+    afterEach(function () {
+      App.popover.restore();
+      view.get('controller').loadStep.restore();
+    });
+    it('should call loadStep', function () {
+      view.didInsertElement();
+      expect(view.get('controller').loadStep.calledOnce).to.equal(true);
+    });
+    it('should create popover', function () {
+      view.didInsertElement();
+      expect(App.popover.calledOnce).to.equal(true);
+    });
+  });
+
 });
+
+describe('App.WizardStep0ViewClusterNameInput', function () {
+
+  beforeEach(function() {
+    view = App.WizardStep0ViewClusterNameInput.create({
+      parentView: Em.Object.create({
+        controller: Em.Object.create({
+          submit: Em.K
+        })
+      })
+    });
+  });
+
+  describe('#keyPress', function() {
+    it('should return true if pressed not Enter', function() {
+      expect(view.keyPress({keyCode: 1})).to.equal(true);
+    });
+    it('should submit form if Enter pressed', function() {
+      sinon.spy(view.get('parentView.controller'), 'submit');
+      expect(view.keyPress({keyCode: 13})).to.equal(false);
+      expect(view.get('parentView.controller').submit.calledOnce).to.equal(true);
+      view.get('parentView.controller').submit.restore();
+    });
+  });
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/test/views/wizard/step1_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step1_view_test.js b/ambari-web/test/views/wizard/step1_view_test.js
index 68af264..8fe9880 100644
--- a/ambari-web/test/views/wizard/step1_view_test.js
+++ b/ambari-web/test/views/wizard/step1_view_test.js
@@ -29,22 +29,25 @@ var controller = Em.Object.create({
 
 describe('App.WizardStep1View', function () {
 
-  beforeEach(function() {
+  beforeEach(function () {
     view = App.WizardStep1View.create({'controller': controller});
+    view.set('$', function () {
+      return Em.Object.create({hide: Em.K, toggle: Em.K});
+    });
   });
 
-  describe('#osTypeToGroup', function() {
+  describe('#osTypeToGroup', function () {
 
     var tests = Em.A([
-      {os:'redhat5', e: 0},
+      {os: 'redhat5', e: 0},
       {os: 'redhat6', e: 1},
       {os: 'suse11', e: 2},
       {os: 'debian12', e: 3},
       {os: 'bulgen', e: -1}
     ]);
 
-    tests.forEach(function(test) {
-      it(test.os, function() {
+    tests.forEach(function (test) {
+      it(test.os, function () {
         expect(view.osTypeToGroup(test.os)).to.equal(test.e);
       });
     });
@@ -61,33 +64,45 @@ describe('App.WizardStep1View', function () {
       {type: -1, e: []}
     ]);
 
-    tests.forEach(function(test) {
-      it(test.type, function() {
+    tests.forEach(function (test) {
+      it(test.type, function () {
         expect(view.groupToOsType(test.type)).to.eql(test.e);
       });
     });
 
   });
 
-  describe('#emptyRepoExist', function() {
+  describe('#emptyRepoExist', function () {
 
     var tests = Em.A([
       {
-        allRepositoriesGroup: [{'empty-error': false},{'empty-error': false},{'empty-error': false}],
+        allRepositoriesGroup: [
+          {'empty-error': false},
+          {'empty-error': false},
+          {'empty-error': false}
+        ],
         e: false
       },
       {
-        allRepositoriesGroup: [{'empty-error': true},{'empty-error': false},{'empty-error': false}],
+        allRepositoriesGroup: [
+          {'empty-error': true},
+          {'empty-error': false},
+          {'empty-error': false}
+        ],
         e: true
       },
       {
-        allRepositoriesGroup: [{'empty-error': true},{'empty-error': true},{'empty-error': true}],
+        allRepositoriesGroup: [
+          {'empty-error': true},
+          {'empty-error': true},
+          {'empty-error': true}
+        ],
         e: true
       }
     ]);
 
-    tests.forEach(function(test) {
-      it(test.allRepositoriesGroup.mapProperty('empty-error').join(', '), function() {
+    tests.forEach(function (test) {
+      it(test.allRepositoriesGroup.mapProperty('empty-error').join(', '), function () {
         view.set('allRepositoriesGroup', test.allRepositoriesGroup);
         expect(view.get('emptyRepoExist')).to.equal(test.e);
       });
@@ -95,25 +110,37 @@ describe('App.WizardStep1View', function () {
 
   });
 
-  describe('#allRepoUnchecked', function() {
+  describe('#allRepoUnchecked', function () {
 
     var tests = Em.A([
       {
-        allRepositoriesGroup: [{'checked': false},{'checked': false},{'checked': false}],
+        allRepositoriesGroup: [
+          {'checked': false},
+          {'checked': false},
+          {'checked': false}
+        ],
         e: true
       },
       {
-        allRepositoriesGroup: [{'checked': true},{'checked': false},{'checked': false}],
+        allRepositoriesGroup: [
+          {'checked': true},
+          {'checked': false},
+          {'checked': false}
+        ],
         e: false
       },
       {
-        allRepositoriesGroup: [{'checked': true},{'checked': true},{'checked': true}],
+        allRepositoriesGroup: [
+          {'checked': true},
+          {'checked': true},
+          {'checked': true}
+        ],
         e: false
       }
     ]);
 
-    tests.forEach(function(test) {
-      it(test.allRepositoriesGroup.mapProperty('checked').join(', '), function() {
+    tests.forEach(function (test) {
+      it(test.allRepositoriesGroup.mapProperty('checked').join(', '), function () {
         view.set('allRepositoriesGroup', test.allRepositoriesGroup);
         expect(view.get('allRepoUnchecked')).to.equal(test.e);
       });
@@ -121,7 +148,7 @@ describe('App.WizardStep1View', function () {
 
   });
 
-  describe('#stacks', function() {
+  describe('#stacks', function () {
 
     var tests = Em.A([
       {
@@ -145,8 +172,8 @@ describe('App.WizardStep1View', function () {
       }
     ]);
 
-    tests.forEach(function(test) {
-      it(test.m, function() {
+    tests.forEach(function (test) {
+      it(test.m, function () {
         view.set('controller.content.stacks', test.stacks);
         var stacks = view.get('stacks');
         expect(stacks.mapProperty('name')).to.eql(test.e.names);
@@ -156,7 +183,7 @@ describe('App.WizardStep1View', function () {
 
   });
 
-  describe('#isSubmitDisabled', function() {
+  describe('#isSubmitDisabled', function () {
 
     var tests = Em.A([
       {
@@ -209,8 +236,8 @@ describe('App.WizardStep1View', function () {
       }
     ]);
 
-    tests.forEach(function(test) {
-      it(test.emptyRepoExist.toString() + ' ' + test.allRepoUnchecked.toString() + ' ' + test.invalidUrlExist.toString(), function() {
+    tests.forEach(function (test) {
+      it(test.emptyRepoExist.toString() + ' ' + test.allRepoUnchecked.toString() + ' ' + test.invalidUrlExist.toString(), function () {
         view = App.WizardStep1View.create();
         view.reopen({
           emptyRepoExist: test.emptyRepoExist,
@@ -223,7 +250,7 @@ describe('App.WizardStep1View', function () {
 
   });
 
-  describe('#invalidUrlExist', function() {
+  describe('#invalidUrlExist', function () {
     var tests = Em.A([
       {
         stacks: [Em.Object.create({isSelected: true, invalidCnt: 1})],
@@ -250,8 +277,8 @@ describe('App.WizardStep1View', function () {
         e: false
       }
     ]);
-    tests.forEach(function(test) {
-      it(test.m, function() {
+    tests.forEach(function (test) {
+      it(test.m, function () {
         view.set('controller.content.stacks', test.stacks);
         view.set('allRepositoriesGroup', test.allRepositoriesGroup);
         expect(view.get('invalidUrlExist')).to.equal(test.e);
@@ -259,40 +286,563 @@ describe('App.WizardStep1View', function () {
     });
   });
 
-  describe('#totalErrorCnt', function() {
+  describe('#totalErrorCnt', function () {
     var tests = Em.A([
       {
-        allRepositoriesGroup: [{checked:false}],
+        allRepositoriesGroup: [
+          {checked: false}
+        ],
         m: 'allRepoUnchecked',
         e: 1
       },
       {
-        allRepositoriesGroup: [{checked:true, 'empty-error': true}, {checked:false, 'empty-error': true}],
+        allRepositoriesGroup: [
+          {checked: true, 'empty-error': true},
+          {checked: false, 'empty-error': true}
+        ],
         m: 'two with empty-error',
         e: 2
       },
       {
-        allRepositoriesGroup: [{checked:true, 'validation': 'icon-exclamation-sign'}, {checked:false, 'validation': 'icon-exclamation-sign'}],
+        allRepositoriesGroup: [
+          {checked: true, 'validation': 'icon-exclamation-sign'},
+          {checked: false, 'validation': 'icon-exclamation-sign'}
+        ],
         m: 'two with validation="icon-exclamation-sign"',
         e: 2
       },
       {
-        allRepositoriesGroup: [{checked:true, 'empty-error': true, 'validation': 'icon-exclamation-sign'}, {checked:false, 'empty-error': true, 'validation': 'icon-exclamation-sign'}],
+        allRepositoriesGroup: [
+          {checked: true, 'empty-error': true, 'validation': 'icon-exclamation-sign'},
+          {checked: false, 'empty-error': true, 'validation': 'icon-exclamation-sign'}
+        ],
         m: 'two with empty-error, two with validation="icon-exclamation-sign"',
         e: 4
       },
       {
-        allRepositoriesGroup: [{checked:true}],
+        allRepositoriesGroup: [
+          {checked: true}
+        ],
         m: 'no errors/warnings etc',
         e: 0
       }
     ]);
-    tests.forEach(function(test) {
-      it(test.m, function() {
+    tests.forEach(function (test) {
+      it(test.m, function () {
         view.set('allRepositoriesGroup', test.allRepositoriesGroup);
         expect(view.get('totalErrorCnt')).to.equal(test.e);
       });
     });
   });
 
+  describe('#didInsertElement', function () {
+    it('should create tooltip', function () {
+      sinon.stub($.fn, 'tooltip', Em.K);
+      view.set('isRLCollapsed', false);
+      view.didInsertElement();
+      expect($.fn.tooltip.calledOnce).to.equal(true);
+      $.fn.tooltip.restore();
+    });
+  });
+
+  describe('#stackRadioButton', function () {
+
+    var v;
+    beforeEach(function () {
+      v = view.get('stackRadioButton').create({
+        content: Em.Object.create({
+          name: ''
+        }),
+        controller: Em.Object.create({
+          content: Em.Object.create({
+            stacks: []
+          })
+        })
+      });
+    });
+
+    describe('#checked', function () {
+      it('should be equal content.isSelected', function () {
+        v.set('content.isSelected', true);
+        expect(v.get('checked')).to.equal(true);
+        v.set('content.isSelected', false);
+        expect(v.get('checked')).to.equal(false);
+      });
+    });
+
+    describe('#click', function () {
+      it('should select proper stack', function () {
+        v.set('controller.content.stacks', Em.A([Em.Object.create({name: 'n-1'}), Em.Object.create({name: 'n-2'}), Em.Object.create({name: 'n-3'})]));
+        v.set('content.name', 'n 2');
+        v.click();
+        expect(v.get('controller.content.stacks').getEach('isSelected')).to.eql([false, true, false]);
+      });
+    });
+
+  });
+
+  describe('#popoverView', function () {
+
+    var v;
+    beforeEach(function () {
+      v = view.get('popoverView').create();
+      sinon.stub(App, 'popover', Em.K);
+    });
+
+    afterEach(function () {
+      App.popover.restore();
+    });
+
+    describe('#didInsertElement', function () {
+      it('should create popover', function () {
+        v.didInsertElement();
+        expect(App.popover.calledOnce).to.equal(true);
+      });
+    });
+
+  });
+
+  describe('#onToggleBlock', function () {
+    it('should toggle isRLCollapsed', function () {
+      view.set('isRLCollapsed', true);
+      view.onToggleBlock();
+      expect(view.get('isRLCollapsed')).to.equal(false);
+      view.onToggleBlock();
+      expect(view.get('isRLCollapsed')).to.equal(true);
+    });
+  });
+
+  describe('#setGroupByOs', function () {
+    Em.A([
+        {
+          allGroupsCheckbox: [true, false, true],
+          groupNumber: 1,
+          m: 'should update group',
+          os: {
+            baseUrl: 'baseUrl',
+            latestBaseUrl: 'latestBaseUrl',
+            defaultBaseUrl: 'defaultBaseUrl',
+            validation: 'icon-exclamation-sign',
+            errorTitle: 'errorTitle',
+            errorContent: 'errorContent'
+          },
+          e: {
+            'checked': false,
+            'baseUrl': 'baseUrl',
+            'latestBaseUrl': 'latestBaseUrl',
+            'defaultBaseUrl': 'defaultBaseUrl',
+            'empty-error': false,
+            'invalid-error': true,
+            'validation': 'icon-exclamation-sign',
+            'undo': true,
+            'clearAll': 'baseUrl',
+            'errorTitle': 'errorTitle',
+            'errorContent': 'errorContent',
+            'group-number': 1
+          }
+        },
+        {
+          allGroupsCheckbox: [true, false, true],
+          groupNumber: 0,
+          m: 'should update group (2)',
+          os: {
+            baseUrl: '',
+            latestBaseUrl: 'latestBaseUrl',
+            defaultBaseUrl: 'defaultBaseUrl',
+            validation: 'validation',
+            errorTitle: 'errorTitle',
+            errorContent: 'errorContent'
+          },
+          e: {
+            'checked': true,
+            'baseUrl': '',
+            'latestBaseUrl': 'latestBaseUrl',
+            'defaultBaseUrl': 'defaultBaseUrl',
+            'empty-error': true,
+            'invalid-error': false,
+            'validation': 'validation',
+            'undo': true,
+            'clearAll': '',
+            'errorTitle': 'errorTitle',
+            'errorContent': 'errorContent',
+            'group-number': 0
+          }
+        },
+        {
+          allGroupsCheckbox: [true, false, true],
+          groupNumber: 0,
+          m: 'should update group (3)',
+          os: {
+            baseUrl: 'latestBaseUrl',
+            latestBaseUrl: 'latestBaseUrl',
+            defaultBaseUrl: 'defaultBaseUrl',
+            validation: 'validation',
+            errorTitle: 'errorTitle',
+            errorContent: 'errorContent'
+          },
+          e: {
+            'checked': true,
+            'baseUrl': 'latestBaseUrl',
+            'latestBaseUrl': 'latestBaseUrl',
+            'defaultBaseUrl': 'defaultBaseUrl',
+            'empty-error': false,
+            'invalid-error': false,
+            'validation': 'validation',
+            'undo': false,
+            'clearAll': 'latestBaseUrl',
+            'errorTitle': 'errorTitle',
+            'errorContent': 'errorContent',
+            'group-number': 0
+          }
+        }
+      ]).forEach(function (test) {
+        it(test.m, function () {
+          var group = Em.Object.create({});
+          view.set('allGroupsCheckbox', test.allGroupsCheckbox);
+          view.setGroupByOs(group, test.os, test.groupNumber);
+          Em.keys(test.e).forEach(function (k) {
+            expect(group.get(k)).to.equal(test.e[k]);
+          });
+        });
+      });
+  });
+
+  describe('#updateByCheckbox', function () {
+
+    it('shouldn\'t do nothing if no stack selected', function () {
+      var groups = [
+        {},
+        {},
+        {}
+      ];
+      view.reopen({
+        allRepositoriesGroup: groups,
+        controller: {
+          content: {
+            stacks: [
+              {isSelected: false}
+            ]
+          }
+        }
+      });
+      view.updateByCheckbox();
+      view.get('allRepositoriesGroup').forEach(function(g) {
+        expect(g).to.eql({});
+      });
+    });
+
+    it('target group isn\'t checked', function() {
+      view.reopen({
+        allGroupsCheckbox: [true],
+        allRepositoriesGroup: [
+          Em.Object.create({
+            'group-number': 0,
+            checked: false
+          })
+        ],
+        controller: {
+          content: {
+            stacks: [
+              {
+                isSelected: true,
+                operatingSystems: [
+                  {
+                    osType: 'redhat5',
+                    baseUrl: 'baseUrl',
+                    latestBaseUrl: 'latestBaseUrl',
+                    validation: '',
+                    selected: ''
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      });
+      view.updateByCheckbox();
+      var os = view.get('controller.content.stacks')[0].operatingSystems[0],
+        targetGroup = view.get('allRepositoriesGroup.firstObject');
+      expect(os.baseUrl).to.equal(os.latestBaseUrl);
+      expect(os.selected).to.equal(false);
+      expect(os.validation).to.be.null;
+      expect(view.get('allGroupsCheckbox')).to.eql([false]);
+      expect(targetGroup.get('baseUrl')).to.equal('latestBaseUrl');
+      expect(targetGroup.get('latestBaseUrl')).to.equal('latestBaseUrl');
+      expect(targetGroup.get('undo')).to.equal(false);
+      expect(targetGroup.get('invalid-error')).to.equal(false);
+      expect(targetGroup.get('clearAll')).to.equal(false);
+      expect(targetGroup.get('empty-error')).to.equal(false);
+      expect(targetGroup.get('validation')).to.be.null;
+    });
+
+    it('target group is checked, skipValidationChecked = true', function() {
+      view.reopen({
+        allGroupsCheckbox: [false],
+        skipValidationChecked: true,
+        allRepositoriesGroup: [
+          Em.Object.create({
+            'group-number': 0,
+            checked: true,
+            baseUrl: ''
+          })
+        ],
+        controller: {
+          content: {
+            stacks: [
+              {
+                isSelected: true,
+                operatingSystems: [
+                  {
+                    osType: 'redhat5',
+                    baseUrl: 'baseUrl',
+                    latestBaseUrl: 'latestBaseUrl',
+                    validation: '',
+                    selected: ''
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      });
+      view.updateByCheckbox();
+      var os = view.get('controller.content.stacks')[0].operatingSystems[0],
+        targetGroup = view.get('allRepositoriesGroup.firstObject');
+      expect(os.selected).to.equal(true);
+      expect(os.skipValidation).to.equal(true);
+      expect(view.get('allGroupsCheckbox')).to.eql([true]);
+      expect(targetGroup.get('invalid-error')).to.equal(false);
+      expect(targetGroup.get('empty-error')).to.equal(true);
+      expect(targetGroup.get('clearAll')).to.equal('');
+      expect(targetGroup.get('validation')).to.be.null;
+    });
+
+  });
+
+  describe('#clearGroupLocalRepository', function() {
+    it('should be proxy for doActionForGroupLocalRepository', function() {
+      sinon.stub(view, 'doActionForGroupLocalRepository', Em.K);
+      view.clearGroupLocalRepository({});
+      expect(view.doActionForGroupLocalRepository.calledWith({}, '')).to.equal(true);
+      view.doActionForGroupLocalRepository.restore();
+    });
+  });
+
+  describe('#undoGroupLocalRepository', function() {
+    it('should be proxy for doActionForGroupLocalRepository', function() {
+      sinon.stub(view, 'doActionForGroupLocalRepository', Em.K);
+      view.undoGroupLocalRepository({});
+      expect(view.doActionForGroupLocalRepository.calledWith({}, 'latestBaseUrl')).to.equal(true);
+      view.doActionForGroupLocalRepository.restore();
+    });
+  });
+
+  describe('#doActionForGroupLocalRepository', function() {
+
+    beforeEach(function() {
+      sinon.stub(view, 'loadRepositories', Em.K);
+    });
+
+    afterEach(function() {
+      view.loadRepositories.restore();
+    });
+
+    it('should update OS in selected stack', function() {
+      var event = {context: Em.Object.create({'group-number': 0})};
+      view.reopen({
+        allGroupsCheckbox: [true],
+        allRepositoriesGroup: [
+          Em.Object.create({
+            'group-number': 0,
+            checked: false
+          })
+        ],
+        controller: {
+          content: {
+            stacks: [
+              {
+                isSelected: true,
+                operatingSystems: [
+                  {
+                    osType: 'redhat5',
+                    baseUrl: 'baseUrl',
+                    latestBaseUrl: 'latestBaseUrl',
+                    validation: '',
+                    selected: ''
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      });
+      view.doActionForGroupLocalRepository(event, '');
+      var os = view.get('controller.content.stacks')[0].operatingSystems[0];
+      expect(os.baseUrl).to.equal('');
+      expect(os.validation).to.be.null;
+      expect(view.loadRepositories.calledOnce).to.equal(true);
+    });
+
+    it('should update OS in selected stack (2)', function() {
+      var event = {context: Em.Object.create({'group-number': 0})};
+      view.reopen({
+        allGroupsCheckbox: [true],
+        allRepositoriesGroup: [
+          Em.Object.create({
+            'group-number': 0,
+            checked: false
+          })
+        ],
+        controller: {
+          content: {
+            stacks: [
+              {
+                isSelected: true,
+                operatingSystems: [
+                  {
+                    osType: 'redhat5',
+                    baseUrl: 'baseUrl',
+                    latestBaseUrl: 'latestBaseUrl',
+                    validation: '',
+                    selected: ''
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      });
+      view.doActionForGroupLocalRepository(event, 'latestBaseUrl');
+      var os = view.get('controller.content.stacks')[0].operatingSystems[0];
+      expect(os.baseUrl).to.equal('latestBaseUrl');
+      expect(os.validation).to.be.null;
+      expect(view.loadRepositories.calledOnce).to.equal(true);
+    });
+
+  });
+
+  describe('#editGroupLocalRepository', function() {
+
+    it('should update os and group', function() {
+      view.reopen({
+        allGroupsCheckbox: [true],
+        allRepositoriesGroup: [
+          Em.Object.create({
+            'group-number': 0,
+            checked: false,
+            baseUrl: 'b1'
+          })
+        ],
+        controller: {
+          content: {
+            stacks: [
+              {
+                isSelected: true,
+                operatingSystems: [
+                  {
+                    osType: 'redhat5',
+                    baseUrl: 'baseUrl',
+                    latestBaseUrl: 'latestBaseUrl',
+                    validation: '',
+                    selected: ''
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      });
+      view.editGroupLocalRepository();
+      var os = view.get('controller.content.stacks')[0].operatingSystems[0],
+        targetGroup = view.get('allRepositoriesGroup.firstObject');
+      expect(os.baseUrl).to.equal(targetGroup.get('baseUrl'));
+      expect(os.validation).to.be.null;
+
+
+      expect(targetGroup.get('undo')).to.equal(true);
+      expect(targetGroup.get('invalid-error')).to.equal(false);
+      expect(targetGroup.get('empty-error')).to.equal(false);
+      expect(targetGroup.get('validation')).to.be.null;
+    });
+
+  });
+
+  describe('#loadRepositories', function() {
+    beforeEach(function() {
+      sinon.stub(view, 'setGroupByOs', Em.K);
+      sinon.stub(view, 'updateByCheckbox', Em.K);
+      sinon.stub(view, 'editGroupLocalRepository', Em.K);
+      sinon.stub(App, 'get', function(k) {
+        if('supports.ubuntu' == k) return true;
+        return Em.get(App, k);
+      });
+    });
+    afterEach(function() {
+      view.setGroupByOs.restore();
+      view.updateByCheckbox.restore();
+      view.editGroupLocalRepository.restore();
+      App.get.restore();
+    });
+    Em.A([
+        {
+          osType: 'redhat5',
+          e: {
+            i: 0,
+            o: 'Red Hat 5'
+          }
+        },
+        {
+          osType: 'redhat6',
+          e: {
+            i: 1,
+            o: 'Red Hat 6'
+          }
+        },
+        {
+          osType: 'suse11',
+          e: {
+            i: 2,
+            o: 'SLES 11'
+          }
+        },
+        {
+          osType: 'debian12',
+          e: {
+            i: 3,
+            o: 'Ubuntu 12'
+          }
+        }
+      ]).forEach(function (test) {
+        it(test.osType, function () {
+          view.reopen({
+            allGroupsCheckbox: [true],
+            allRepositoriesGroup: [
+              Em.Object.create({
+                'group-number': 0,
+                checked: false,
+                baseUrl: 'b1'
+              })
+            ],
+            controller: {
+              content: {
+                stacks: [
+                  {
+                    isSelected: true,
+                    operatingSystems: [
+                      {
+                        osType: test.osType,
+                        baseUrl: 'baseUrl'
+                      }
+                    ]
+                  }
+                ]
+              }
+            }
+          });
+          view.loadRepositories();
+          expect(view.get('allRepositoriesGroup')[test.e.i][0].get('osType')).to.equal(test.e.o);
+        });
+      });
+  });
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/test/views/wizard/step2_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step2_view_test.js b/ambari-web/test/views/wizard/step2_view_test.js
index a048f5d..47db377 100644
--- a/ambari-web/test/views/wizard/step2_view_test.js
+++ b/ambari-web/test/views/wizard/step2_view_test.js
@@ -38,4 +38,133 @@ describe('App.WizardStep0View', function () {
     });
   });
 
+  describe('#didInsertElement', function() {
+    beforeEach(function () {
+      sinon.stub(App, 'popover', Em.K);
+      view.set('controller.hostsError', 'some text');
+      view.set('controller.sshKeyError', 'some text');
+    });
+    afterEach(function () {
+      App.popover.restore();
+    });
+    it('should clean hostsError', function () {
+      view.didInsertElement();
+      expect(view.get('controller.hostsError')).to.be.null;
+    });
+    it('should clean sshKeyError', function () {
+      view.didInsertElement();
+      expect(view.get('controller.sshKeyError')).to.be.null;
+    });
+    it('should create popover', function () {
+      view.didInsertElement();
+      expect(App.popover.calledOnce).to.equal(true);
+    });
+  });
+
+  describe('#providingSSHKeyRadioButton', function() {
+    var v;
+
+    beforeEach(function() {
+      v = view.get('providingSSHKeyRadioButton').create({
+        controller: Em.Object.create({
+          content: {
+            installOptions: {
+              useSsh: true,
+              manualInstall: true
+            }
+          }
+        })
+      });
+    });
+
+    describe('#checked', function() {
+      it('should be equal to controller.content.installOptions.useSsh', function () {
+        v.set('controller.content.installOptions.useSsh', false);
+        expect(v.get('checked')).to.equal(false);
+        v.set('controller.content.installOptions.useSsh', true);
+        expect(v.get('checked')).to.equal(true);
+      });
+    });
+
+    describe('#click', function() {
+      it('should update controller.content.installOptions.useSsh', function () {
+        v.set('controller.content.installOptions.useSsh', false);
+        v.click();
+        expect(v.get('controller.content.installOptions.useSsh')).to.equal(true);
+      });
+      it('should update controller.content.installOptions.manualInstall', function () {
+        v.set('controller.content.installOptions.manualInstall', true);
+        v.click();
+        expect(v.get('controller.content.installOptions.manualInstall')).to.equal(false);
+      });
+    });
+
+  });
+
+  describe('#manualRegistrationRadioButton', function() {
+    var v;
+
+    beforeEach(function() {
+      v = view.get('manualRegistrationRadioButton').create({
+        controller: Em.Object.create({
+          content: {
+            installOptions: {
+              useSsh: true,
+              manualInstall: true
+            }
+          }
+        })
+      });
+    });
+
+    describe('#checked', function() {
+      it('should be equal to controller.content.installOptions.manualInstall', function () {
+        v.set('controller.content.installOptions.manualInstall', false);
+        expect(v.get('checked')).to.equal(false);
+        v.set('controller.content.installOptions.manualInstall', true);
+        expect(v.get('checked')).to.equal(true);
+      });
+    });
+
+    describe('#click', function() {
+      it('should update controller.content.installOptions.useSsh', function () {
+        v.set('controller.content.installOptions.useSsh', true);
+        v.click();
+        expect(v.get('controller.content.installOptions.useSsh')).to.equal(false);
+      });
+      it('should update controller.content.installOptions.manualInstall', function () {
+        v.set('controller.content.installOptions.manualInstall', false);
+        v.click();
+        expect(v.get('controller.content.installOptions.manualInstall')).to.equal(true);
+      });
+    });
+
+  });
+
+  describe('#textFieldView', function() {
+    var v;
+
+    beforeEach(function() {
+      v = view.get('textFieldView').create();
+    });
+
+    describe('#disabled', function() {
+      it('should be inverted to isEnabled', function () {
+        v.set('isEnabled', false);
+        expect(v.get('disabled')).to.equal(true);
+        v.set('isEnabled', true);
+        expect(v.get('disabled')).to.equal(false);
+      });
+    });
+
+  });
+
+});
+
+describe('App.SshKeyFileUploader', function() {
+
+  beforeEach(function() {
+    view = App.SshKeyFileUploader.create();
+  });
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/test/views/wizard/step3_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step3_view_test.js b/ambari-web/test/views/wizard/step3_view_test.js
index 4f5d473..e5fb996 100644
--- a/ambari-web/test/views/wizard/step3_view_test.js
+++ b/ambari-web/test/views/wizard/step3_view_test.js
@@ -443,6 +443,52 @@ describe('App.WizardStep3View', function () {
     });
   });
 
+  describe('#didInsertElement', function() {
+    beforeEach(function() {
+      v = App.WizardStep3View.create({
+        controller: Em.Object.create({
+          loadStep: Em.K
+        })
+      });
+      sinon.spy(v.get('controller'), 'loadStep');
+    });
+    afterEach(function() {
+      v.get('controller').loadStep.restore();
+    });
+    it('should call loadStep', function() {
+      v.didInsertElement();
+      expect(v.get('controller').loadStep.calledOnce).to.equal(true);
+    });
+  });
+
+  describe('#categoryObject', function() {
+    var o;
+    beforeEach(function() {
+      v = App.WizardStep3View.create();
+      o = v.get('categoryObject').create();
+    });
+
+    describe('#label', function() {
+      it('should use value and hostCount', function() {
+        o.setProperties({
+          value: 'abc',
+          hostsCount: 3
+        });
+        expect(o.get('label')).to.equal('abc (3)');
+      });
+    });
+
+    describe('#itemClass', function() {
+      it('should depends on isActive', function() {
+        o.set('isActive', true);
+        expect(o.get('itemClass')).to.equal('active');
+        o.set('isActive', false);
+        expect(o.get('itemClass')).to.equal('');
+      });
+    });
+
+  });
+
 });
 
 var wView;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e702b317/ambari-web/test/views/wizard/step5_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step5_view_test.js b/ambari-web/test/views/wizard/step5_view_test.js
index 973f188..d2e94ce 100644
--- a/ambari-web/test/views/wizard/step5_view_test.js
+++ b/ambari-web/test/views/wizard/step5_view_test.js
@@ -23,11 +23,13 @@ require('views/wizard/step5_view');
 var view;
 
 describe('App.WizardStep5View', function() {
+
   beforeEach(function() {
     view = App.WizardStep5View.create({
       controller: App.WizardStep5Controller.create({})
     });
   });
+
   describe('#didInsertElement', function() {
     it('should call controller.loadStep', function() {
       sinon.stub(view.get('controller'), 'loadStep', Em.K);
@@ -36,9 +38,11 @@ describe('App.WizardStep5View', function() {
       view.get('controller').loadStep.restore();
     });
   });
+
 });
 
 describe('App.SelectHostView', function() {
+
   beforeEach(function() {
     view = App.SelectHostView.create({
       controller: App.WizardStep5Controller.create({})
@@ -252,9 +256,67 @@ describe('App.SelectHostView', function() {
     });
   });
 
+  describe('#click', function() {
+    beforeEach(function() {
+      sinon.stub(lazyloading, 'run', Em.K);
+    });
+    afterEach(function() {
+      lazyloading.run.restore();
+    });
+    Em.A([
+        {
+          isLoaded: true,
+          isLazyLoading: true,
+          e: false
+        },
+        {
+          isLoaded: true,
+          isLazyLoading: false,
+          e: false
+        },
+        {
+          isLoaded: false,
+          isLazyLoading: true,
+          e: true
+        },
+        {
+          isLoaded: false,
+          isLazyLoading: false,
+          e: false
+        }
+      ]).forEach(function(test) {
+      it('isLoaded = ' + test.isLoaded.toString() + ', isLazyLoading = ' + test.isLazyLoading.toString(), function() {
+        view.reopen({
+          isLazyLoading: test.isLazyLoading,
+          isLoaded: test.isLoaded
+        });
+        view.click();
+        if(test.e) {
+          expect(lazyloading.run.calledOnce).to.equal(true);
+        }
+        else {
+          expect(lazyloading.run.called).to.equal(false);
+        }
+      });
+    });
+    it('check lazyLoading parameters', function() {
+      view.reopen({
+        isLoaded: false,
+        isLazyLoading: true,
+        content: [{host_name: 'host1'}, {host_name: 'host2'}]
+      });
+      var availableHosts = d3.range(1, 100).map(function(i) {return {host_name: 'host' + i.toString()};});
+      sinon.stub(view, 'getAvailableHosts', function() {return availableHosts;});
+      view.click();
+      expect(lazyloading.run.args[0][0].source.length).to.equal(97); // 99-2
+      view.getAvailableHosts.restore();
+    });
+  });
+
 });
 
 describe('App.RemoveControlView', function() {
+
   beforeEach(function() {
     view = App.RemoveControlView.create({
       controller: App.WizardStep5Controller.create({})
@@ -275,9 +337,11 @@ describe('App.RemoveControlView', function() {
       expect(view.get('controller').removeComponent.calledWith('c1', 1)).to.equal(true);
     });
   });
+
 });
 
 describe('App.AddControlView', function() {
+
   beforeEach(function() {
     view = App.AddControlView.create({
       controller: App.WizardStep5Controller.create({})
@@ -285,16 +349,21 @@ describe('App.AddControlView', function() {
   });
 
   describe('#click', function() {
+
     beforeEach(function() {
       sinon.stub(view.get('controller'), 'addComponent', Em.K);
     });
+
     afterEach(function() {
       view.get('controller').addComponent.restore();
     });
+
     it('should call addComponent', function() {
       view.set('componentName', 'c1');
       view.click();
       expect(view.get('controller').addComponent.calledWith('c1')).to.equal(true);
     });
+
   });
+
 });
\ No newline at end of file