Convert gr-change-status_test to Typescript
Change-Id: Ia497701eca4b2b8c1e5e1561d6bbe90068b93ae6
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
index 2869750..fa3c9c6 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
@@ -48,6 +48,7 @@
} from '../../../types/common';
import {hasOwnProperty} from '../../../utils/common-util';
import {pluralize} from '../../../utils/string-util';
+import {ChangeStates} from '../../shared/gr-change-status/gr-change-status';
enum ChangeSize {
XS = 10,
@@ -105,7 +106,7 @@
changeURL?: string;
@property({type: Array, computed: '_changeStatuses(change)'})
- statuses?: string[];
+ statuses?: ChangeStates[];
@property({type: Boolean})
showStar = false;
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index f3b746a8..659d5bd 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -429,7 +429,7 @@
type: String,
computed: '_computeChangeStatusChips(_change, _mergeable, _submitEnabled)',
})
- _changeStatuses?: string[];
+ _changeStatuses?: ChangeStates[];
/** If false, then the "Show more" button was used to expand. */
@property({type: Boolean})
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
index 3d51ac6..5128948 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
@@ -1222,7 +1222,7 @@
},
};
element._mergeable = true;
- const expectedStatuses = ['Merged', 'WIP'];
+ const expectedStatuses = [ChangeStates.MERGED, ChangeStates.WIP];
assert.deepEqual(element._changeStatuses, expectedStatuses);
flush();
const statusChips = element.shadowRoot!.querySelectorAll(
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.ts b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.ts
index a4f46db..12173d0 100644
--- a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.ts
+++ b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.ts
@@ -28,13 +28,15 @@
import {ParsedChangeInfo} from '../../../types/types';
export enum ChangeStates {
- MERGED = 'Merged',
ABANDONED = 'Abandoned',
+ ACTIVE = 'Active',
MERGE_CONFLICT = 'Merge Conflict',
- WIP = 'WIP',
+ MERGED = 'Merged',
PRIVATE = 'Private',
+ READY_TO_SUBMIT = 'Ready to submit',
REVERT_CREATED = 'Revert Created',
REVERT_SUBMITTED = 'Revert Submitted',
+ WIP = 'WIP',
}
const WIP_TOOLTIP =
@@ -52,7 +54,7 @@
'current reviewers (or anyone with "View Private Changes" permission).';
@customElement('gr-change-status')
-class GrChangeStatus extends PolymerElement {
+export class GrChangeStatus extends PolymerElement {
static get template() {
return htmlTemplate;
}
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.js b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.js
deleted file mode 100644
index 7bc2466..0000000
--- a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * @license
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed 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.
- */
-
-import sinon from 'sinon/pkg/sinon-esm';
-import '../../../test/common-test-setup-karma.js';
-import {createChange} from '../../../test/test-data-generators.js';
-import './gr-change-status.js';
-import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
-import {MERGE_CONFLICT_TOOLTIP} from './gr-change-status.js';
-
-const basicFixture = fixtureFromElement('gr-change-status');
-
-const WIP_TOOLTIP = 'This change isn\'t ready to be reviewed or submitted. ' +
- 'It will not appear on dashboards unless you are CC\'ed or assigned, ' +
- 'and email notifications will be silenced until the review is started.';
-
-const PRIVATE_TOOLTIP = 'This change is only visible to its owner and ' +
- 'current reviewers (or anyone with "View Private Changes" permission).';
-
-suite('gr-change-status tests', () => {
- let element;
-
- setup(() => {
- element = basicFixture.instantiate();
- });
-
- test('WIP', () => {
- element.status = 'WIP';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, 'Work in Progress');
- assert.equal(element.tooltipText, WIP_TOOLTIP);
- assert.isTrue(element.classList.contains('wip'));
- });
-
- test('WIP flat', () => {
- element.flat = true;
- element.status = 'WIP';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, 'WIP');
- assert.isDefined(element.tooltipText);
- assert.isTrue(element.classList.contains('wip'));
- assert.isTrue(element.hasAttribute('flat'));
- });
-
- test('merged', () => {
- element.status = 'Merged';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, '');
- assert.isTrue(element.classList.contains('merged'));
- assert.isFalse(
- element.showResolveIcon([{url: 'http://google.com'}], 'Merged'));
- });
-
- test('abandoned', () => {
- element.status = 'Abandoned';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, '');
- assert.isTrue(element.classList.contains('abandoned'));
- });
-
- test('merge conflict', () => {
- const status = 'Merge Conflict';
- element.status = status;
- flush();
-
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, MERGE_CONFLICT_TOOLTIP);
- assert.isTrue(element.classList.contains('merge-conflict'));
- assert.isFalse(element.hasStatusLink(undefined, [], status));
- assert.isFalse(element.showResolveIcon([], status));
- });
-
- test('merge conflict with resolve link', () => {
- const status = 'Merge Conflict';
- const url = 'http://google.com';
- const weblinks = [{url}];
-
- assert.isTrue(element.hasStatusLink(undefined, weblinks, status));
- assert.equal(element.getStatusLink(undefined, weblinks, status), url);
- assert.isTrue(element.showResolveIcon(weblinks, status));
- });
-
- test('reverted change', () => {
- const url = 'http://google.com';
- const status = 'Revert Submitted';
- const revertedChange = createChange();
- sinon.stub(GerritNav, 'getUrlForSearchQuery').returns(url);
-
- assert.isTrue(element.hasStatusLink(revertedChange, [], status));
- assert.equal(element.getStatusLink(revertedChange, [], status), url);
- });
-
- test('private', () => {
- element.status = 'Private';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, PRIVATE_TOOLTIP);
- assert.isTrue(element.classList.contains('private'));
- });
-
- test('active', () => {
- element.status = 'Active';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, '');
- assert.isTrue(element.classList.contains('active'));
- });
-
- test('ready to submit', () => {
- element.status = 'Ready to submit';
- flush();
- assert.equal(element.shadowRoot
- .querySelector('.chip').innerText, element.status);
- assert.equal(element.tooltipText, '');
- assert.isTrue(element.classList.contains('ready-to-submit'));
- });
-
- test('updating status removes the previous class', () => {
- element.status = 'Private';
- flush();
- assert.isTrue(element.classList.contains('private'));
- assert.isFalse(element.classList.contains('wip'));
-
- element.status = 'WIP';
- flush();
- assert.isFalse(element.classList.contains('private'));
- assert.isTrue(element.classList.contains('wip'));
- });
-});
-
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.ts b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.ts
new file mode 100644
index 0000000..a56f6f1
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.ts
@@ -0,0 +1,172 @@
+/**
+ * @license
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed 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.
+ */
+
+import sinon from 'sinon/pkg/sinon-esm';
+import '../../../test/common-test-setup-karma';
+import {createChange} from '../../../test/test-data-generators';
+import './gr-change-status';
+import {ChangeStates, GrChangeStatus} from './gr-change-status';
+import {GerritNav} from '../../core/gr-navigation/gr-navigation';
+import {MERGE_CONFLICT_TOOLTIP} from './gr-change-status';
+
+const basicFixture = fixtureFromElement('gr-change-status');
+
+const WIP_TOOLTIP =
+ "This change isn't ready to be reviewed or submitted. " +
+ "It will not appear on dashboards unless you are CC'ed or assigned, " +
+ 'and email notifications will be silenced until the review is started.';
+
+const PRIVATE_TOOLTIP =
+ 'This change is only visible to its owner and ' +
+ 'current reviewers (or anyone with "View Private Changes" permission).';
+
+suite('gr-change-status tests', () => {
+ let element: GrChangeStatus;
+
+ setup(() => {
+ element = basicFixture.instantiate();
+ });
+
+ test('WIP', () => {
+ element.status = ChangeStates.WIP;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Work in Progress'
+ );
+ assert.equal(element.tooltipText, WIP_TOOLTIP);
+ assert.isTrue(element.classList.contains('wip'));
+ });
+
+ test('WIP flat', () => {
+ element.flat = true;
+ element.status = ChangeStates.WIP;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'WIP'
+ );
+ assert.isDefined(element.tooltipText);
+ assert.isTrue(element.classList.contains('wip'));
+ assert.isTrue(element.hasAttribute('flat'));
+ });
+
+ test('merged', () => {
+ element.status = ChangeStates.MERGED;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Merged'
+ );
+ assert.equal(element.tooltipText, '');
+ assert.isTrue(element.classList.contains('merged'));
+ assert.isFalse(
+ element.showResolveIcon([{url: 'http://google.com'}], ChangeStates.MERGED)
+ );
+ });
+
+ test('abandoned', () => {
+ element.status = ChangeStates.ABANDONED;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Abandoned'
+ );
+ assert.equal(element.tooltipText, '');
+ assert.isTrue(element.classList.contains('abandoned'));
+ });
+
+ test('merge conflict', () => {
+ const status = ChangeStates.MERGE_CONFLICT;
+ element.status = status;
+ flush();
+
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Merge Conflict'
+ );
+ assert.equal(element.tooltipText, MERGE_CONFLICT_TOOLTIP);
+ assert.isTrue(element.classList.contains('merge-conflict'));
+ assert.isFalse(element.hasStatusLink(undefined, [], status));
+ assert.isFalse(element.showResolveIcon([], status));
+ });
+
+ test('merge conflict with resolve link', () => {
+ const status = ChangeStates.MERGE_CONFLICT;
+ const url = 'http://google.com';
+ const weblinks = [{url}];
+
+ assert.isTrue(element.hasStatusLink(undefined, weblinks, status));
+ assert.equal(element.getStatusLink(undefined, weblinks, status), url);
+ assert.isTrue(element.showResolveIcon(weblinks, status));
+ });
+
+ test('reverted change', () => {
+ const url = 'http://google.com';
+ const status = ChangeStates.REVERT_SUBMITTED;
+ const revertedChange = createChange();
+ sinon.stub(GerritNav, 'getUrlForSearchQuery').returns(url);
+
+ assert.isTrue(element.hasStatusLink(revertedChange, [], status));
+ assert.equal(element.getStatusLink(revertedChange, [], status), url);
+ });
+
+ test('private', () => {
+ element.status = ChangeStates.PRIVATE;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Private'
+ );
+ assert.equal(element.tooltipText, PRIVATE_TOOLTIP);
+ assert.isTrue(element.classList.contains('private'));
+ });
+
+ test('active', () => {
+ element.status = ChangeStates.ACTIVE;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Active'
+ );
+ assert.equal(element.tooltipText, '');
+ assert.isTrue(element.classList.contains('active'));
+ });
+
+ test('ready to submit', () => {
+ element.status = ChangeStates.READY_TO_SUBMIT;
+ flush();
+ assert.equal(
+ element.shadowRoot!.querySelector<HTMLDivElement>('.chip')!.innerText,
+ 'Ready to submit'
+ );
+ assert.equal(element.tooltipText, '');
+ assert.isTrue(element.classList.contains('ready-to-submit'));
+ });
+
+ test('updating status removes the previous class', () => {
+ element.status = ChangeStates.PRIVATE;
+ flush();
+ assert.isTrue(element.classList.contains('private'));
+ assert.isFalse(element.classList.contains('wip'));
+
+ element.status = ChangeStates.WIP;
+ flush();
+ assert.isFalse(element.classList.contains('private'));
+ assert.isTrue(element.classList.contains('wip'));
+ });
+});
diff --git a/polygerrit-ui/app/utils/change-util.ts b/polygerrit-ui/app/utils/change-util.ts
index dd91f7b..414a80c 100644
--- a/polygerrit-ui/app/utils/change-util.ts
+++ b/polygerrit-ui/app/utils/change-util.ts
@@ -24,6 +24,7 @@
RelatedChangeAndCommitInfo,
} from '../types/common';
import {ParsedChangeInfo} from '../types/types';
+import {ChangeStates} from '../elements/shared/gr-change-status/gr-change-status';
// This can be wrong! See WARNING above
interface ChangeStatusesOptions {
@@ -134,28 +135,27 @@
return change?.status === ChangeStatus.NEW;
}
-// TODO(TS): use enum ChangeStates in gr-change-status
export function changeStatuses(
change: ChangeInfo,
opt_options?: ChangeStatusesOptions
-) {
+): ChangeStates[] {
const states = [];
if (change.status === ChangeStatus.MERGED) {
- states.push('Merged');
+ states.push(ChangeStates.MERGED);
} else if (change.status === ChangeStatus.ABANDONED) {
- states.push('Abandoned');
+ states.push(ChangeStates.ABANDONED);
} else if (
change.mergeable === false ||
(opt_options && opt_options.mergeable === false)
) {
// 'mergeable' prop may not always exist (@see Issue 6819)
- states.push('Merge Conflict');
+ states.push(ChangeStates.MERGE_CONFLICT);
}
if (change.work_in_progress) {
- states.push('WIP');
+ states.push(ChangeStates.WIP);
}
if (change.is_private) {
- states.push('Private');
+ states.push(ChangeStates.PRIVATE);
}
// If there are any pre-defined statuses, only return those. Otherwise,
@@ -166,10 +166,10 @@
// If no missing requirements, either active or ready to submit.
if (change.submittable && opt_options.submitEnabled) {
- states.push('Ready to submit');
+ states.push(ChangeStates.READY_TO_SUBMIT);
} else {
// Otherwise it is active.
- states.push('Active');
+ states.push(ChangeStates.ACTIVE);
}
return states;
}
diff --git a/polygerrit-ui/app/utils/change-util_test.ts b/polygerrit-ui/app/utils/change-util_test.ts
index f18ae92..8232e56 100644
--- a/polygerrit-ui/app/utils/change-util_test.ts
+++ b/polygerrit-ui/app/utils/change-util_test.ts
@@ -16,6 +16,7 @@
*/
import {ChangeStatus} from '../constants/constants';
+import {ChangeStates} from '../elements/shared/gr-change-status/gr-change-status';
import '../test/common-test-setup-karma';
import {createChange, createRevisions} from '../test/test-data-generators';
import {
@@ -66,29 +67,29 @@
change.submittable = false;
statuses = changeStatuses(change, {mergeable: true, submitEnabled: false});
- assert.deepEqual(statuses, ['Active']);
+ assert.deepEqual(statuses, [ChangeStates.ACTIVE]);
// With no missing labels but no submitEnabled option.
change.submittable = true;
statuses = changeStatuses(change, {mergeable: true, submitEnabled: false});
- assert.deepEqual(statuses, ['Active']);
+ assert.deepEqual(statuses, [ChangeStates.ACTIVE]);
// Without missing labels and enabled submit
statuses = changeStatuses(change, {mergeable: true, submitEnabled: true});
- assert.deepEqual(statuses, ['Ready to submit']);
+ assert.deepEqual(statuses, [ChangeStates.READY_TO_SUBMIT]);
change.mergeable = false;
change.submittable = true;
statuses = changeStatuses(change, {mergeable: false, submitEnabled: false});
- assert.deepEqual(statuses, ['Merge Conflict']);
+ assert.deepEqual(statuses, [ChangeStates.MERGE_CONFLICT]);
change.mergeable = true;
statuses = changeStatuses(change, {mergeable: true, submitEnabled: true});
- assert.deepEqual(statuses, ['Ready to submit']);
+ assert.deepEqual(statuses, [ChangeStates.READY_TO_SUBMIT]);
change.submittable = true;
statuses = changeStatuses(change, {mergeable: false, submitEnabled: false});
- assert.deepEqual(statuses, ['Merge Conflict']);
+ assert.deepEqual(statuses, [ChangeStates.MERGE_CONFLICT]);
});
test('Merge conflict', () => {
@@ -100,7 +101,7 @@
mergeable: false,
};
const statuses = changeStatuses(change);
- assert.deepEqual(statuses, ['Merge Conflict']);
+ assert.deepEqual(statuses, [ChangeStates.MERGE_CONFLICT]);
});
test('mergeable prop undefined', () => {
@@ -122,7 +123,7 @@
status: ChangeStatus.MERGED,
};
const statuses = changeStatuses(change);
- assert.deepEqual(statuses, ['Merged']);
+ assert.deepEqual(statuses, [ChangeStates.MERGED]);
});
test('Abandoned status', () => {
@@ -134,7 +135,7 @@
mergeable: false,
};
const statuses = changeStatuses(change);
- assert.deepEqual(statuses, ['Abandoned']);
+ assert.deepEqual(statuses, [ChangeStates.ABANDONED]);
});
test('Open status with private and wip', () => {
@@ -149,7 +150,7 @@
labels: {},
};
const statuses = changeStatuses(change);
- assert.deepEqual(statuses, ['WIP', 'Private']);
+ assert.deepEqual(statuses, [ChangeStates.WIP, ChangeStates.PRIVATE]);
});
test('Merge conflict with private and wip', () => {
@@ -164,7 +165,11 @@
labels: {},
};
const statuses = changeStatuses(change);
- assert.deepEqual(statuses, ['Merge Conflict', 'WIP', 'Private']);
+ assert.deepEqual(statuses, [
+ ChangeStates.MERGE_CONFLICT,
+ ChangeStates.WIP,
+ ChangeStates.PRIVATE,
+ ]);
});
test('isRemovableReviewer', () => {