Bläddra i källkod

AMBARI-5777 UI unit tests for Admin->Users page view. (atkach)

atkach 11 år sedan
förälder
incheckning
bb387b231c

+ 2 - 0
ambari-web/app/assets/test/tests.js

@@ -125,6 +125,8 @@ require('test/views/common/filter_view_test');
 require('test/views/common/table_view_test');
 require('test/views/common/quick_link_view_test');
 require('test/views/common/rolling_restart_view_test');
+require('test/views/main/admin/user/create_test');
+require('test/views/main/admin/user/edit_test');
 require('test/views/main/dashboard_test');
 require('test/views/main/dashboard/widget_test');
 require('test/views/main/dashboard/widgets_test');

+ 16 - 20
ambari-web/app/models/form.js

@@ -49,14 +49,13 @@ App.Form = Em.View.extend({
     this._super();
   },
 
-  getField:function (name) {
-    var field = false;
-    $.each(this.fields, function () {
-      if (this.get('name') == name) {
-        return field = this;
-      }
-    });
-    return field;
+  /**
+   * get field of form by name
+   * @param name
+   * @return {Object}
+   */
+  getField: function (name) {
+    return this.get('fields').findProperty('name', name);
   },
 
   isValid:function () {
@@ -84,21 +83,18 @@ App.Form = Em.View.extend({
 
   }.observes("object"),
 
-  clearValues:function () {
-    $.each(this.fields, function () {
-      this.set('value', '');
-    });
+  /**
+   * reset values to default of every field in the form
+   */
+  clearValues: function () {
+    this.get('fields').forEach(function (field) {
+      var value = (field.get('defaultValue') === undefined) ? '' : field.get('defaultValue');
+      field.set('value', value);
+    }, this);
   },
 
   visibleFields:function () {
-    var fields = this.get('fields');
-    var visible = [];
-    fields.forEach(function (field) {
-      if (!field.get('isHiddenField')) {
-        visible.push(field);
-      }
-    });
-    return visible;
+    return this.get('fields').filterProperty('isHiddenField', false);
   }.property('fields'),
 
   resultText:function () {

+ 1 - 1
ambari-web/app/models/user.js

@@ -116,7 +116,7 @@ App.CreateUserForm = App.Form.extend({
     { name:"userName", displayName:"Username", toLowerCase: function(){var v = this.get('value'); this.set('value', v.toLowerCase())}.observes('value') },
     { name:"password", displayName:"Password", displayType:"password", isRequired: true },
     { name:"passwordRetype", displayName:"Retype Password", displayType:"password", validator:"passwordRetype", isRequired: true },
-    { name:"admin", displayName:"Admin", displayType:"checkbox", isRequired:false },
+    { name:"admin", displayName:"Admin", displayType:"checkbox", isRequired:false, defaultValue: true},
     { name:"roles", displayName:"Role", isRequired:false, isHidden:true }
   ],
   fields:[],

+ 28 - 25
ambari-web/app/views/main/admin/user/create.js

@@ -40,37 +40,40 @@ App.MainAdminUserCreateView = Em.View.extend({
 
   /**
    * Create new user
-   * @method create
+   * @return {Boolean}
    */
   create: function () {
     var form = this.get("userForm");
-    if (form.isValid()) {
-      form.getField("userName").set('value', form.getField("userName").get('value').toLowerCase());
-      if (form.getField("admin").get('value') === "" || form.getField("admin").get('value') == true) {
-        form.getField("roles").set("value", "admin,user");
-        form.getField("admin").set("value", "true");
-      }
-      else {
-        form.getField("roles").set("value", "user");
-      }
+    if (!form.isValid())  return false;
 
-      App.ajax.send({
-        name: 'admin.user.create',
-        sender: this,
+    this.identifyRoles(form);
+
+    return !!App.ajax.send({
+      name: 'admin.user.create',
+      sender: this,
+      data: {
+        user: form.getField("userName").get('value'),
+        form: form,
         data: {
-          user: form.getField("userName").get('value'),
-          form: form,
-          data: {
-            Users: {
-              password: form.getField("password").get('value'),
-              roles: form.getField("roles").get('value')
-            }
+          Users: {
+            password: form.getField("password").get('value'),
+            roles: form.getField("roles").get('value')
           }
-        },
-        success: 'createUserSuccessCallback',
-        error: 'createUserErrorCallback'
-      });
-    }
+        }
+      },
+      success: 'createUserSuccessCallback',
+      error: 'createUserErrorCallback'
+    });
+  },
+
+  /**
+   * identify roles of user by admin checkbox
+   * @param form
+   */
+  identifyRoles: function (form) {
+    var roles = (form.getField("admin").get('value') === true) ? 'admin,user' : 'user';
+    form.getField("roles").set("value", roles);
+    return roles;
   },
 
   /**

+ 49 - 29
ambari-web/app/views/main/admin/user/edit.js

@@ -36,28 +36,19 @@ App.MainAdminUserEditView = Em.View.extend({
   /**
    * Edit existing user
    * @method edit
+   * @return {Boolean}
    */
   edit: function () {
     var form = this.get("userForm");
-    if (!form.isValid()) return;
+    if (!form.isValid()) return false;
 
-    var Users = {};
-    if (form.getField("admin").get('value') === "" || form.getField("admin").get('value') == true) {
-      form.getField("roles").set("value", "admin,user");
-      form.getField("admin").set("value", true);
-    }
-    else {
-      form.getField("roles").set("value", "user");
-    }
-
-    Users.roles = form.getField("roles").get('value');
+    var Users = {
+      roles: this.identifyRoles(form)
+    };
 
-    if (form.getField("new_password").get('value') != "" && form.getField("old_password").get('value') != "") {
-      Users.password = form.getField("new_password").get('value');
-      Users.old_password = form.getField("old_password").get('value');
-    }
+    this.setPassword(Users, form);
 
-    App.ajax.send({
+    return !!App.ajax.send({
       name: 'admin.user.edit',
       sender: this,
       data: {
@@ -72,6 +63,32 @@ App.MainAdminUserEditView = Em.View.extend({
     });
   },
 
+  /**
+   * set password to query data if it's not empty string
+   * @param Users
+   * @param form
+   * @return {Boolean}
+   */
+  setPassword: function (Users, form) {
+    if (form.getField("new_password").get('value') != "" && form.getField("old_password").get('value') != "") {
+      Users.password = form.getField("new_password").get('value');
+      Users.old_password = form.getField("old_password").get('value');
+      return true;
+    }
+    return false;
+  },
+
+  /**
+   * identify roles of user by admin checkbox
+   * @param form
+   * @return {String}
+   */
+  identifyRoles: function (form) {
+    var roles = (form.getField("admin").get('value') === true) ? 'admin,user' : 'user';
+    form.getField("roles").set("value", roles);
+    return roles;
+  },
+
   /**
    * Success callback for edit user request
    * @param {object} data
@@ -90,14 +107,22 @@ App.MainAdminUserEditView = Em.View.extend({
    * @method editUserErrorCallback
    */
   editUserErrorCallback: function (request) {
-    var message = $.parseJSON(request.responseText).message;
-    message = message.substr(message.lastIndexOf(':') + 1);
     App.ModalPopup.show({
       header: Em.I18n.t('admin.users.editButton'),
-      body: message,
+      body: this.parseErrorMessage(request),
       secondary: null
     });
-    console.log(message);
+  },
+
+  /**
+   * derive only valuable info from response,
+   * return content after last ":"
+   * @param request
+   * @return {String}
+   */
+  parseErrorMessage: function (request) {
+    var message = JSON.parse(request.responseText).message;
+    return message.substr(message.lastIndexOf(':') + 1);
   },
 
   /**
@@ -116,15 +141,10 @@ App.MainAdminUserEditView = Em.View.extend({
 
   didInsertElement: function () {
     var form = this.get('userForm');
-    if (form.getField("isLdap").get("value")) {
-      form.getField("old_password").set("disabled", true);
-      form.getField("new_password").set("disabled", true);
-      form.getField("new_passwordRetype").set("disabled", true);
-    } else {
-      form.getField("old_password").set("disabled", false);
-      form.getField("new_password").set("disabled", false);
-      form.getField("new_passwordRetype").set("disabled", false);
-    }
+    var isLdapValue = form.getField("isLdap").get("value");
+    form.getField("old_password").set("disabled", isLdapValue);
+    form.getField("new_password").set("disabled", isLdapValue);
+    form.getField("new_passwordRetype").set("disabled", isLdapValue);
     form.propertyDidChange('object');
   }
 });

+ 208 - 0
ambari-web/test/views/main/admin/user/create_test.js

@@ -0,0 +1,208 @@
+/**
+ * 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.
+ */
+
+
+var App = require('app');
+require('views/main/admin/user/create');
+
+describe('App.MainAdminUserCreateView', function () {
+
+  var view = App.MainAdminUserCreateView.create({
+    userForm: Em.Object.create({
+      isValid: function () {
+        return this.get('mockIsValid');
+      },
+      getField: function () {
+        return Em.Object.create();
+      },
+      isWarn: Em.K,
+      propertyDidChange: Em.K,
+      mockIsValid: false
+    })
+  });
+
+  describe('#create()', function () {
+
+    it('form is invalid', function () {
+      view.set('userForm.mockIsValid', false);
+      expect(view.create()).to.be.false;
+    });
+    it('form is valid', function () {
+      view.set('userForm.mockIsValid', true);
+      sinon.stub(view, 'identifyRoles', Em.K);
+      sinon.stub(App.ajax, 'send', Em.K);
+
+      expect(view.create()).to.be.true;
+      expect(view.identifyRoles.calledOnce).to.be.true;
+      expect(App.ajax.send.calledOnce).to.be.true;
+
+      view.identifyRoles.restore();
+      App.ajax.send.restore();
+    });
+  });
+
+  describe('#identifyRoles()', function () {
+    var mock = Em.Object.create();
+    var form = Em.Object.create({
+      getField: function () {
+        return mock;
+      }
+    });
+
+    it('admin is false', function () {
+      mock.set('value', false);
+
+      expect(view.identifyRoles(form)).to.equal('user');
+      expect(mock.get('value')).to.equal('user');
+    });
+    it('admin is true', function () {
+      mock.set('value', true);
+
+      expect(view.identifyRoles(form)).to.equal('admin,user');
+      expect(mock.get('value')).to.equal('admin,user');
+    });
+  });
+
+  describe('#createUserSuccessCallback()', function () {
+
+    it('', function () {
+      var mock = {
+        persistKey: function () {
+          return 'persists';
+        },
+        postUserPref: Em.K
+      };
+      var params = {
+        form: {
+          getField: function () {
+            return Em.Object.create({
+              value: 'user_name_value'
+            })
+          },
+          save: Em.K
+        }
+      };
+      sinon.stub(App.ModalPopup, 'show', Em.K);
+      sinon.stub(App.router, 'get', function () {
+        return mock;
+      });
+      sinon.spy(mock, 'persistKey');
+      sinon.spy(mock, 'postUserPref');
+      sinon.spy(params.form, 'save');
+      sinon.stub(App.router, 'transitionTo', Em.K);
+
+      view.createUserSuccessCallback({}, {}, params);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      expect(mock.persistKey.calledWith('user_name_value')).to.be.true;
+      expect(mock.postUserPref.calledWith('persists', true)).to.be.true;
+      expect(params.form.save.calledOnce).to.be.true;
+      expect(App.router.transitionTo.calledWith('allUsers')).to.be.true;
+
+      App.ModalPopup.show.restore();
+      App.router.get.restore();
+      App.router.transitionTo.restore();
+    });
+  });
+
+  describe('#createUserErrorCallback()', function () {
+
+    it('', function () {
+      sinon.stub(App.ModalPopup, 'show', Em.K);
+
+      view.createUserErrorCallback();
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+
+      App.ModalPopup.show.restore();
+    });
+  });
+
+  describe('#keyPress()', function () {
+
+    beforeEach(function () {
+      sinon.stub(view, 'create', Em.K);
+    });
+    afterEach(function () {
+      view.create.restore();
+    });
+
+    it('not "Enter" button pressed', function () {
+      expect(view.keyPress({keyCode: 99})).to.be.true;
+      expect(view.create.called).to.be.false;
+    });
+    it('"Enter" button pressed', function () {
+      expect(view.keyPress({keyCode: 13})).to.be.false;
+      expect(view.create.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#passwordValidation()', function () {
+    var mock = Em.Object.create();
+
+    beforeEach(function () {
+      sinon.stub(view.get('userForm'), 'getField', function () {
+        return mock;
+      });
+      sinon.stub(view.get('userForm'), 'isValid', Em.K);
+      sinon.stub(view.get('userForm'), 'isWarn', Em.K);
+    });
+    afterEach(function () {
+      view.get('userForm').getField.restore();
+      view.get('userForm').isValid.restore();
+      view.get('userForm').isWarn.restore();
+    });
+
+    it('passwordValue is null, isPasswordDirty = false', function () {
+      mock.set('value', null);
+      view.set('isPasswordDirty', false);
+
+      view.passwordValidation();
+      expect(view.get('isPasswordDirty')).to.be.false;
+      expect(view.get('userForm').isValid.called).to.be.false;
+      expect(view.get('userForm').isWarn.called).to.be.false;
+    });
+    it('passwordValue is correct, isPasswordDirty = true', function () {
+      mock.set('value', 'pass');
+      view.set('isPasswordDirty', true);
+
+      view.passwordValidation();
+      expect(view.get('isPasswordDirty')).to.be.true;
+      expect(view.get('userForm').isValid.calledOnce).to.be.true;
+      expect(view.get('userForm').isWarn.calledOnce).to.be.true;
+    });
+    it('passwordValue is correct, isPasswordDirty = false', function () {
+      mock.set('value', 'pass');
+      view.set('isPasswordDirty', false);
+
+      view.passwordValidation();
+      expect(view.get('isPasswordDirty')).to.be.true;
+      expect(view.get('userForm').isValid.calledOnce).to.be.true;
+      expect(view.get('userForm').isWarn.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#didInsertElement()', function () {
+    it('propertyDidChange function should be called', function () {
+      sinon.spy(view.get('userForm'), 'propertyDidChange');
+
+      view.didInsertElement();
+      expect(view.get('userForm').propertyDidChange.calledWith('object')).to.be.true;
+
+      view.get('userForm').propertyDidChange.restore();
+    });
+  });
+});

+ 249 - 0
ambari-web/test/views/main/admin/user/edit_test.js

@@ -0,0 +1,249 @@
+/**
+ * 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.
+ */
+
+
+var App = require('app');
+require('views/main/admin/user/edit');
+
+describe('App.MainAdminUserEditView', function () {
+
+  var view = App.MainAdminUserEditView.create({
+    userForm: Em.Object.create({
+      getField: function (property) {
+        return this.get(property) || Em.Object.create();
+      },
+      isValid: Em.K,
+      isWarn: Em.K,
+      propertyDidChange: Em.K
+    })
+  });
+
+  describe('#edit()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, 'send', Em.K);
+    });
+    afterEach(function () {
+      view.get('userForm').isValid.restore();
+      App.ajax.send.restore();
+    });
+
+    it('form is invalid', function () {
+      sinon.stub(view.get('userForm'), 'isValid', function () {
+        return false;
+      });
+
+      expect(view.edit()).to.be.false;
+      expect(App.ajax.send.called).to.be.false;
+    });
+    it('form is valid', function () {
+      sinon.stub(view.get('userForm'), 'isValid', function () {
+        return true;
+      });
+      sinon.stub(view, 'identifyRoles', Em.K);
+      sinon.stub(view, 'setPassword', Em.K);
+
+
+      expect(view.edit()).to.be.true;
+      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(view.identifyRoles.calledOnce).to.be.true;
+      expect(view.setPassword.calledOnce).to.be.true;
+
+      view.identifyRoles.restore();
+      view.setPassword.restore();
+    });
+  });
+
+  describe('#setPassword()', function () {
+    var form = Em.Object.create({
+      getField: function (property) {
+        return this.get(property);
+      },
+      new_password: Em.Object.create({
+        value: 'pass'
+      }),
+      old_password: Em.Object.create({
+        value: 'pass'
+      })
+    });
+
+    it('new_password value is empty', function () {
+      var Users = {};
+      form.set('new_password.value', "");
+
+      expect(view.setPassword(Users, form)).to.be.false;
+      expect(Users.password).to.be.undefined;
+      expect(Users.old_password).to.be.undefined;
+    });
+    it('old_password value is empty', function () {
+      var Users = {};
+      form.set('old_password.value', "");
+
+      expect(view.setPassword(Users, form)).to.be.false;
+      expect(Users.password).to.be.undefined;
+      expect(Users.old_password).to.be.undefined;
+    });
+    it('old_password and new_password values are correct', function () {
+      var Users = {};
+      form.set('old_password.value', "old_pass");
+      form.set('new_password.value', "pass");
+
+      expect(view.setPassword(Users, form)).to.be.true;
+      expect(Users.password).to.equal('pass');
+      expect(Users.old_password).to.equal('old_pass');
+    });
+  });
+
+  describe('#identifyRoles()', function () {
+    var mock = Em.Object.create();
+    var form = Em.Object.create({
+      getField: function () {
+        return mock;
+      }
+    });
+
+    it('admin is false', function () {
+      mock.set('value', false);
+
+      expect(view.identifyRoles(form)).to.equal('user');
+      expect(mock.get('value')).to.equal('user');
+    });
+    it('admin is true', function () {
+      mock.set('value', true);
+
+      expect(view.identifyRoles(form)).to.equal('admin,user');
+      expect(mock.get('value')).to.equal('admin,user');
+    });
+  });
+
+  describe('#editUserSuccessCallback()', function () {
+    it('', function () {
+      var params = {
+        form: {
+          save: Em.K
+        }
+      };
+      sinon.spy(params.form, 'save');
+      sinon.stub(App.router, 'transitionTo', Em.K);
+
+      view.editUserSuccessCallback({}, {}, params);
+      expect(params.form.save.calledOnce).to.be.true;
+      expect(App.router.transitionTo.calledWith('allUsers')).to.be.true;
+
+      App.router.transitionTo.restore();
+    });
+  });
+
+  describe('#editUserErrorCallback()', function () {
+    it('show popup', function () {
+      sinon.stub(App.ModalPopup, 'show', Em.K);
+      sinon.stub(view, 'parseErrorMessage', Em.K);
+
+      view.editUserErrorCallback({});
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+
+      App.ModalPopup.show.restore();
+      view.parseErrorMessage.restore();
+    });
+  });
+
+  describe('#parseErrorMessage()', function () {
+    it('":" is not present in response', function () {
+      var request = {
+        responseText: JSON.stringify({
+          message: 'content'
+        })
+      };
+
+      expect(view.parseErrorMessage(request)).to.equal('content');
+    });
+    it('one ":" is  present in response', function () {
+      var request = {
+        responseText: JSON.stringify({
+          message: 'content : b'
+        })
+      };
+
+      expect(view.parseErrorMessage(request)).to.equal(' b');
+    });
+    it('several ":" are  present in response', function () {
+      var request = {
+        responseText: JSON.stringify({
+          message: 'content : b: a'
+        })
+      };
+
+      expect(view.parseErrorMessage(request)).to.equal(' a');
+    });
+  });
+
+  describe('#keyPress()', function () {
+
+    beforeEach(function () {
+      sinon.stub(view, 'edit', Em.K);
+    });
+    afterEach(function () {
+      view.edit.restore();
+    });
+
+    it('not "Enter" button pressed', function () {
+      expect(view.keyPress({keyCode: 99})).to.be.true;
+      expect(view.edit.called).to.be.false;
+    });
+    it('"Enter" button pressed', function () {
+      expect(view.keyPress({keyCode: 13})).to.be.false;
+      expect(view.edit.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#didInsertElement()', function () {
+
+    beforeEach(function () {
+      sinon.stub(view.get('userForm'), 'propertyDidChange', Em.K);
+    });
+    afterEach(function () {
+      view.get('userForm').propertyDidChange.restore();
+    });
+    view.set('userForm.old_password', Em.Object.create());
+    view.set('userForm.new_password', Em.Object.create());
+    view.set('userForm.new_passwordRetype', Em.Object.create());
+
+    it('isLdap value is true', function () {
+      view.set('userForm.isLdap', Em.Object.create({
+        value: true
+      }));
+
+      view.didInsertElement();
+      expect(view.get('userForm').propertyDidChange.calledWith('object')).to.be.true;
+      expect(view.get('userForm.old_password.disabled')).to.be.true;
+      expect(view.get('userForm.new_password.disabled')).to.be.true;
+      expect(view.get('userForm.new_passwordRetype.disabled')).to.be.true;
+    });
+    it('isLdap value is false', function () {
+      view.set('userForm.isLdap', Em.Object.create({
+        value: false
+      }));
+
+      view.didInsertElement();
+      expect(view.get('userForm').propertyDidChange.calledWith('object')).to.be.true;
+      expect(view.get('userForm.old_password.disabled')).to.be.false;
+      expect(view.get('userForm.new_password.disabled')).to.be.false;
+      expect(view.get('userForm.new_passwordRetype.disabled')).to.be.false;
+    });
+  });
+});