Convert gr-group_test.js to typescript

Change-Id: I9f0ef814da5ef8bbc7b84815750340219bc6edb1
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
index 774be57..9fde66c 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
@@ -21,8 +21,13 @@
 import '../../../styles/gr-subpage-styles';
 import '../../../styles/shared-styles';
 import '../../shared/gr-autocomplete/gr-autocomplete';
+import '../../shared/gr-button/gr-button';
 import '../../shared/gr-copy-clipboard/gr-copy-clipboard';
 import '../../shared/gr-select/gr-select';
+import {GrAutocomplete} from '../../shared/gr-autocomplete/gr-autocomplete';
+import {GrButton} from '../../shared/gr-button/gr-button';
+import {GrCopyClipboard} from '../../shared/gr-copy-clipboard/gr-copy-clipboard';
+import {GrSelect} from '../../shared/gr-select/gr-select';
 import {PolymerElement} from '@polymer/polymer/polymer-element';
 import {htmlTemplate} from './gr-group_html';
 import {customElement, property, observe} from '@polymer/decorators';
@@ -57,6 +62,16 @@
 export interface GrGroup {
   $: {
     loading: HTMLDivElement;
+    loadedContent: HTMLDivElement;
+    visibleToAll: GrSelect;
+    inputUpdateNameBtn: GrButton;
+    Title: HTMLHeadingElement;
+    groupNameInput: GrAutocomplete;
+    groupName: HTMLHeadingElement;
+    groupOwnerInput: GrAutocomplete;
+    groupOwner: HTMLHeadingElement;
+    inputUpdateOwnerBtn: GrButton;
+    uuid: GrCopyClipboard;
   };
 }
 
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.ts
similarity index 66%
rename from polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js
rename to polygerrit-ui/app/elements/admin/gr-group/gr-group_test.ts
index e390ac5..74e2364 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.ts
@@ -15,29 +15,34 @@
  * limitations under the License.
  */
 
-import '../../../test/common-test-setup-karma.js';
-import './gr-group.js';
+import '../../../test/common-test-setup-karma';
+import './gr-group';
+import {GrGroup} from './gr-group';
 import {
   addListenerForTest,
   mockPromise,
   stubRestApi,
-} from '../../../test/test-utils.js';
+} from '../../../test/test-utils';
+import {createGroupInfo} from '../../../test/test-data-generators.js';
+import {GroupId, GroupInfo, GroupName} from '../../../types/common';
 
 const basicFixture = fixtureFromElement('gr-group');
 
 suite('gr-group tests', () => {
-  let element;
+  let element: GrGroup;
+  let groupStub: sinon.SinonStub;
 
-  let groupStub;
-  const group = {
-    id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
+  const group: GroupInfo = {
+    ...createGroupInfo('6a1e70e1a88782771a91808c8af9bbb7a9871389'),
     url: '#/admin/groups/uuid-6a1e70e1a88782771a91808c8af9bbb7a9871389',
-    options: {},
+    options: {
+      visible_to_all: false,
+    },
     description: 'Gerrit Site Administrators',
     group_id: 1,
     owner: 'Administrators',
     owner_id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
-    name: 'Administrators',
+    name: 'Administrators' as GroupName,
   };
 
   setup(() => {
@@ -49,13 +54,12 @@
     assert.isTrue(element.$.loading.classList.contains('loading'));
     assert.isFalse(getComputedStyle(element.$.loading).display === 'none');
     assert.isTrue(element.$.loadedContent.classList.contains('loading'));
-    assert.isTrue(getComputedStyle(element.$.loadedContent)
-        .display === 'none');
+    assert.isTrue(getComputedStyle(element.$.loadedContent).display === 'none');
   });
 
   test('default values are populated with internal group', async () => {
     stubRestApi('getIsGroupOwner').returns(Promise.resolve(true));
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
     await element._loadGroup();
     assert.isTrue(element._groupIsInternal);
     assert.isFalse(element.$.visibleToAll.bindValue);
@@ -63,12 +67,13 @@
 
   test('default values with external group', async () => {
     const groupExternal = {...group};
-    groupExternal.id = 'external-group-id';
+    groupExternal.id = 'external-group-id' as GroupId;
     groupStub.restore();
     groupStub = stubRestApi('getGroupConfig').returns(
-        Promise.resolve(groupExternal));
+      Promise.resolve(groupExternal)
+    );
     stubRestApi('getIsGroupOwner').returns(Promise.resolve(true));
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
     await element._loadGroup();
     assert.isFalse(element._groupIsInternal);
     assert.isFalse(element.$.visibleToAll.bindValue);
@@ -77,14 +82,17 @@
   test('rename group', async () => {
     const groupName = 'test-group';
     const groupName2 = 'test-group2';
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
     element._groupConfig = {
-      name: groupName,
+      name: groupName as GroupName,
+      id: '1' as GroupId,
     };
-    element._groupName = groupName;
+    element._groupName = groupName as GroupName;
 
     stubRestApi('getIsGroupOwner').returns(Promise.resolve(true));
-    stubRestApi('saveGroupName').returns(Promise.resolve({status: 200}));
+    stubRestApi('saveGroupName').returns(
+      Promise.resolve({...new Response(), status: 200})
+    );
 
     const button = element.$.inputUpdateNameBtn;
 
@@ -106,14 +114,15 @@
 
   test('rename group owner', async () => {
     const groupName = 'test-group';
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
     element._groupConfig = {
-      name: groupName,
+      name: groupName as GroupName,
+      id: '1' as GroupId,
     };
     element._groupConfigOwner = 'testId';
     element._groupOwner = true;
 
-    stubRestApi('getIsGroupOwner').returns(Promise.resolve({status: 200}));
+    stubRestApi('getIsGroupOwner').returns(Promise.resolve(true));
 
     const button = element.$.inputUpdateOwnerBtn;
 
@@ -135,11 +144,11 @@
   test('test for undefined group name', async () => {
     groupStub.restore();
 
-    stubRestApi('getGroupConfig').returns(Promise.resolve({}));
+    stubRestApi('getGroupConfig').returns(Promise.resolve(undefined));
 
     assert.isUndefined(element.groupId);
 
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
 
     assert.isDefined(element.groupId);
 
@@ -153,10 +162,13 @@
 
   test('test fire event', async () => {
     element._groupConfig = {
-      name: 'test-group',
+      name: 'test-group' as GroupName,
+      id: '1' as GroupId,
     };
-    element.groupId = 'gg';
-    stubRestApi('saveGroupName').returns(Promise.resolve({status: 200}));
+    element.groupId = 'gg' as GroupId;
+    stubRestApi('saveGroupName').returns(
+      Promise.resolve({...new Response(), status: 200})
+    );
 
     const showStub = sinon.stub(element, 'dispatchEvent');
     await element._handleSaveName();
@@ -167,28 +179,40 @@
     let admin = true;
     let owner = false;
     let groupIsInternal = true;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), false);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      false
+    );
 
     admin = false;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), true);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      true
+    );
 
     owner = true;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), false);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      false
+    );
 
     owner = false;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), true);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      true
+    );
 
     groupIsInternal = false;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), true);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      true
+    );
 
     admin = true;
-    assert.equal(element._computeGroupDisabled(owner, admin,
-        groupIsInternal), true);
+    assert.equal(
+      element._computeGroupDisabled(owner, admin, groupIsInternal),
+      true
+    );
   });
 
   test('_computeLoadingClass', () => {
@@ -199,17 +223,21 @@
   test('fires page-error', async () => {
     groupStub.restore();
 
-    element.groupId = 1;
+    element.groupId = '1' as GroupId;
 
-    const response = {status: 404};
-    stubRestApi('getGroupConfig').callsFake((group, errFn) => {
-      errFn(response);
+    const response = {...new Response(), status: 404};
+    stubRestApi('getGroupConfig').callsFake((_, errFn) => {
+      if (errFn !== undefined) {
+        errFn(response);
+      } else {
+        assert.fail('errFn is undefined');
+      }
       return Promise.resolve(undefined);
     });
 
     const promise = mockPromise();
     addListenerForTest(document, 'page-error', e => {
-      assert.deepEqual(e.detail.response, response);
+      assert.deepEqual((e as CustomEvent).detail.response, response);
       promise.resolve();
     });
 
@@ -219,16 +247,15 @@
 
   test('uuid', () => {
     element._groupConfig = {
-      id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
+      id: '6a1e70e1a88782771a91808c8af9bbb7a9871389' as GroupId,
     };
 
     assert.equal(element._groupConfig.id, element.$.uuid.text);
 
     element._groupConfig = {
-      id: 'user%2Fgroup',
+      id: 'user%2Fgroup' as GroupId,
     };
 
     assert.equal('user/group', element.$.uuid.text);
   });
 });
-