]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Fix for incorrect validation in rgw user form 39117/head
authorNizamudeen A <nia@redhat.com>
Sun, 17 Jan 2021 06:56:15 +0000 (12:26 +0530)
committerNizamudeen A <nia@redhat.com>
Thu, 28 Jan 2021 07:30:47 +0000 (13:00 +0530)
The rgw users create form doesnt validate the username correctly if the username is a tenated one. For eg. Consider there is a user called tenate$sample. Now I am trying to create another user and I entered tenate$sample as username. But it doesn't async validate the username as existing. Instead it just shows the green tick and once the submit button is clicked it'll show the user as existing.

Fixes: https://tracker.ceph.com/issues/48907
Signed-off-by: Nizamudeen A <nia@redhat.com>
(cherry picked from commit 3c2e8e4f9a7645c20b5766b2c052063ce38c5650)

src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-user.service.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-user.service.ts

index 85632651ff4d59d8230791328addde42cc0ccb97..4eb8c2783a10eb03fc863fd6959728b2cb2ab8bb 100644 (file)
@@ -7,7 +7,7 @@ import { RouterTestingModule } from '@angular/router/testing';
 import { BsModalService } from 'ngx-bootstrap/modal';
 import { TooltipModule } from 'ngx-bootstrap/tooltip';
 import { ToastrModule } from 'ngx-toastr';
-import { of as observableOf } from 'rxjs';
+import { of as observableOf, throwError } from 'rxjs';
 
 import { configureTestBed, FormHelper, i18nProviders } from '../../../../testing/unit-test-helper';
 import { RgwUserService } from '../../../shared/api/rgw-user.service';
@@ -155,21 +155,19 @@ describe('RgwUserFormComponent', () => {
   });
 
   describe('username validation', () => {
-    beforeEach(() => {
-      spyOn(rgwUserService, 'enumerate').and.returnValue(observableOf(['abc', 'xyz']));
-    });
-
     it('should validate that username is required', () => {
       formHelper.expectErrorChange('uid', '', 'required', true);
     });
 
     it('should validate that username is valid', fakeAsync(() => {
+      spyOn(rgwUserService, 'get').and.returnValue(throwError('foo'));
       formHelper.setValue('uid', 'ab', true);
       tick(500);
       formHelper.expectValid('uid');
     }));
 
     it('should validate that username is invalid', fakeAsync(() => {
+      spyOn(rgwUserService, 'get').and.returnValue(observableOf({}));
       formHelper.setValue('uid', 'abc', true);
       tick(500);
       formHelper.expectError('uid', 'notUnique');
index 85aef0d07def4123b32387d205523184bcd87f60..b33c201163460c4187d6ee2f181bacfef7673a1c 100644 (file)
@@ -1,7 +1,7 @@
 import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
 import { TestBed } from '@angular/core/testing';
 
-import { of as observableOf } from 'rxjs';
+import { of as observableOf, throwError } from 'rxjs';
 
 import { configureTestBed } from '../../../testing/unit-test-helper';
 import { RgwUserService } from './rgw-user.service';
@@ -138,21 +138,19 @@ describe('RgwUserService', () => {
     expect(req.request.method).toBe('DELETE');
   });
 
-  it('should call exists with an existent uid', () => {
-    spyOn(service, 'enumerate').and.returnValue(observableOf(['foo', 'bar']));
-    let result;
+  it('should call exists with an existent uid', (done) => {
+    spyOn(service, 'get').and.returnValue(observableOf({}));
     service.exists('foo').subscribe((res) => {
-      result = res;
+      expect(res).toBe(true);
+      done();
     });
-    expect(result).toBe(true);
   });
 
-  it('should call exists with a non existent uid', () => {
-    spyOn(service, 'enumerate').and.returnValue(observableOf(['foo', 'bar']));
-    let result;
+  it('should call exists with a non existent uid', (done) => {
+    spyOn(service, 'get').and.returnValue(throwError('bar'));
     service.exists('baz').subscribe((res) => {
-      result = res;
+      expect(res).toBe(false);
+      done();
     });
-    expect(result).toBe(false);
   });
 });
index 6b0ebab77ace1392097382c1e8594144740d2f67..322aa503be94c6f4add71668fcbe0b37f5b8cf98 100644 (file)
@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
 
 import * as _ from 'lodash';
 import { forkJoin as observableForkJoin, Observable, of as observableOf } from 'rxjs';
-import { mergeMap } from 'rxjs/operators';
+import { catchError, mapTo, mergeMap } from 'rxjs/operators';
 
 import { cdEncode } from '../decorators/cd-encode';
 import { ApiModule } from './api.module';
@@ -132,10 +132,13 @@ export class RgwUserService {
    * @return {Observable<boolean>}
    */
   exists(uid: string): Observable<boolean> {
-    return this.enumerate().pipe(
-      mergeMap((resp: string[]) => {
-        const index = _.indexOf(resp, uid);
-        return observableOf(-1 !== index);
+    return this.get(uid).pipe(
+      mapTo(true),
+      catchError((error: Event) => {
+        if (_.isFunction(error.preventDefault)) {
+          error.preventDefault();
+        }
+        return observableOf(false);
       })
     );
   }