Skip to content

Commit 30d5e2d

Browse files
authored
Merge pull request #1103 from fabmiz/make-decision-dd-component-tests
[ENG-2391] Add make-decision-dropdown component tests
2 parents 6f89219 + 626c5cb commit 30d5e2d

File tree

8 files changed

+227
-89
lines changed

8 files changed

+227
-89
lines changed

app/models/registration.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { buildValidations, validator } from 'ember-cp-validations';
22
import DS from 'ember-data';
33

44
import DraftRegistrationModel from 'ember-osf-web/models/draft-registration';
5-
import ReviewActionModel from 'ember-osf-web/models/review-action';
5+
import ReviewActionModel, { ReviewActionTrigger } from 'ember-osf-web/models/review-action';
66
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';
77

88
import CommentModel from './comment';
@@ -27,6 +27,21 @@ export enum RegistrationReviewStates {
2727
PendingWithdraw = 'pending_withdraw',
2828
}
2929

30+
type NonActionableStates = RegistrationReviewStates.Initial
31+
| RegistrationReviewStates.Withdrawn | RegistrationReviewStates.Rejected;
32+
33+
export type ReviewsStateToDecisionMap = Exclude<RegistrationReviewStates, NonActionableStates>;
34+
export const reviewsStateToDecisionMap: { [index in ReviewsStateToDecisionMap]: ReviewActionTrigger[] } = {
35+
[RegistrationReviewStates.Accepted]: [ReviewActionTrigger.ForceWithdraw],
36+
[RegistrationReviewStates.Embargo]: [ReviewActionTrigger.ForceWithdraw],
37+
[RegistrationReviewStates.Pending]:
38+
[ReviewActionTrigger.AcceptSubmission, ReviewActionTrigger.RejectSubmission],
39+
[RegistrationReviewStates.PendingWithdraw]:
40+
[ReviewActionTrigger.AcceptWithdrawal, ReviewActionTrigger.RejectWithdrawal],
41+
[RegistrationReviewStates.PendingWithdrawRequest]: [ReviewActionTrigger.ForceWithdraw],
42+
[RegistrationReviewStates.PendingEmbargoTermination]: [ReviewActionTrigger.ForceWithdraw],
43+
};
44+
3045
const Validations = buildValidations({
3146
license: [
3247
validator('presence', {

lib/osf-components/addon/components/registries/review-actions-list/component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { A } from '@ember/array';
12
import { action } from '@ember/object';
23
import { inject as service } from '@ember/service';
34
import Component from '@glimmer/component';
@@ -28,14 +29,13 @@ export default class ReviewActionsList extends Component<Args> {
2829

2930
get latestAction() {
3031
const { reviewActions } = this;
31-
return (reviewActions || [])[0];
32+
return A(reviewActions || []).objectAt(0);
3233
}
3334

3435
@task({ withTestWaiter: true })
3536
fetchActions = task(function *(this: ReviewActionsList) {
3637
try {
37-
const reviewActions = yield this.args.registration.reviewActions;
38-
this.reviewActions = reviewActions.toArray();
38+
this.reviewActions = yield this.args.registration.reviewActions;
3939
} catch (e) {
4040
captureException(e);
4141
this.toast.error(getApiErrorMessage(e));

lib/registries/addon/components/make-decision-dropdown/component.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import Intl from 'ember-intl/services/intl';
99
import Toast from 'ember-toastr/services/toast';
1010

1111
import RouterService from '@ember/routing/router-service';
12-
import RegistrationModel, { RegistrationReviewStates } from 'ember-osf-web/models/registration';
12+
import RegistrationModel,
13+
{ RegistrationReviewStates, reviewsStateToDecisionMap } from 'ember-osf-web/models/registration';
1314
import { ReviewActionTrigger } from 'ember-osf-web/models/review-action';
1415
import captureException, { getApiErrorMessage } from 'ember-osf-web/utils/capture-exception';
1516

@@ -26,18 +27,8 @@ export default class MakeDecisionDropdown extends Component<Args> {
2627
@tracked decisionTrigger?: ReviewActionTrigger;
2728
@tracked comment?: string;
2829

29-
reviewsStateDecisionMap = {
30-
[RegistrationReviewStates.Accepted]: [ReviewActionTrigger.ForceWithdraw],
31-
[RegistrationReviewStates.Embargo]: [ReviewActionTrigger.ForceWithdraw],
32-
[RegistrationReviewStates.Pending]:
33-
[ReviewActionTrigger.AcceptSubmission, ReviewActionTrigger.RejectSubmission],
34-
[RegistrationReviewStates.PendingWithdraw]:
35-
[ReviewActionTrigger.AcceptWithdrawal, ReviewActionTrigger.RejectWithdrawal],
36-
[RegistrationReviewStates.PendingWithdrawRequest]: [ReviewActionTrigger.ForceWithdraw],
37-
[RegistrationReviewStates.PendingEmbargoTermination]: [ReviewActionTrigger.ForceWithdraw],
38-
};
39-
40-
decisionDescriptionMap = {
30+
reviewsStateToDecisionMap = reviewsStateToDecisionMap;
31+
actionTriggerToDescriptionMap = {
4132
[ReviewActionTrigger.ForceWithdraw]: this.intl.t('registries.makeDecisionDropdown.forceWithdrawDescription'),
4233
[ReviewActionTrigger.AcceptSubmission]:
4334
this.intl.t('registries.makeDecisionDropdown.acceptSubmissionDescription'),
@@ -49,6 +40,14 @@ export default class MakeDecisionDropdown extends Component<Args> {
4940
this.intl.t('registries.makeDecisionDropdown.rejectWithdrawalDescription'),
5041
};
5142

43+
actionTriggerToTextMap = {
44+
[ReviewActionTrigger.ForceWithdraw]: this.intl.t('registries.makeDecisionDropdown.forceWithdraw'),
45+
[ReviewActionTrigger.AcceptSubmission]: this.intl.t('registries.makeDecisionDropdown.acceptSubmission'),
46+
[ReviewActionTrigger.RejectSubmission]: this.intl.t('registries.makeDecisionDropdown.rejectSubmission'),
47+
[ReviewActionTrigger.AcceptWithdrawal]: this.intl.t('registries.makeDecisionDropdown.acceptWithdrawal'),
48+
[ReviewActionTrigger.RejectWithdrawal]: this.intl.t('registries.makeDecisionDropdown.rejectWithdrawal'),
49+
};
50+
5251
get commentTextArea() {
5352
if ([RegistrationReviewStates.Pending, RegistrationReviewStates.PendingWithdraw]
5453
.includes(this.args.registration.reviewsState)) {
@@ -64,6 +63,14 @@ export default class MakeDecisionDropdown extends Component<Args> {
6463
};
6564
}
6665

66+
get hasModeratorActions() {
67+
return ![
68+
RegistrationReviewStates.Initial,
69+
RegistrationReviewStates.Withdrawn,
70+
RegistrationReviewStates.Rejected,
71+
].includes(this.args.registration.reviewsState);
72+
}
73+
6774
@task({ withTestWaiter: true })
6875
submitDecision = task(function *(this: MakeDecisionDropdown) {
6976
if (this.decisionTrigger) {

lib/registries/addon/components/make-decision-dropdown/template.hbs

Lines changed: 56 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,53 +14,62 @@
1414
</Button>
1515
</dd.trigger>
1616
<dd.content @class={{local-class 'Dropdown'}}>
17-
<Registries::ReviewActionsList @registration={{@registration}} />
18-
{{#each (get this.reviewsStateDecisionMap @registration.reviewsState) as |option|}}
19-
<div>
20-
{{#let (unique-id 'radio' option) as |uniqueId|}}
21-
<Input
22-
data-test-moderation-dropdown-decision-checkbox={{option}}
23-
data-analytics-name={{concat 'clicking checkbox for' option}}
24-
@type='radio'
25-
@id={{uniqueId}}
26-
@value={{option}}
27-
checked={{if (eq this.decisionTrigger option) true false}}
28-
{{on 'click' (fn this.updateDecisionTrigger option)}}
29-
/>
30-
<label
31-
data-test-moderation-dropdown-decision-label={{option}}
32-
for={{uniqueId}}
33-
>
34-
{{humanize option}}
35-
</label>
36-
<p
37-
data-test-moderation-dropdown-decision-description={{option}}
38-
local-class='Description'
39-
>
40-
{{get this.decisionDescriptionMap option}}
41-
</p>
42-
{{/let}}
17+
<Registries::ReviewActionsList data-test-review-actions-list @registration={{@registration}} />
18+
{{#if this.hasModeratorActions}}
19+
{{#each (get this.reviewsStateToDecisionMap @registration.reviewsState) as |option|}}
20+
<div>
21+
{{#let (unique-id 'radio' option) as |uniqueId|}}
22+
<Input
23+
data-test-moderation-dropdown-decision-checkbox={{option}}
24+
data-analytics-name='Select checkbox for {{option}}'
25+
@type='radio'
26+
@id={{uniqueId}}
27+
@value={{option}}
28+
checked={{if (eq this.decisionTrigger option) true false}}
29+
{{on 'click' (fn this.updateDecisionTrigger option)}}
30+
/>
31+
<label
32+
data-test-moderation-dropdown-decision-label={{option}}
33+
for={{uniqueId}}
34+
>
35+
{{get this.actionTriggerToTextMap option}}
36+
</label>
37+
<p
38+
data-test-moderation-dropdown-decision-description={{option}}
39+
local-class='Description'
40+
>
41+
{{get this.actionTriggerToDescriptionMap option}}
42+
</p>
43+
{{/let}}
44+
</div>
45+
{{/each}}
46+
<label
47+
data-test-moderation-dropdown-action-label
48+
for='moderator-comment'
49+
>
50+
{{this.commentTextArea.label}}
51+
</label>
52+
<Textarea
53+
data-test-moderation-dropdown-comment
54+
@id='moderator-comment'
55+
@value={{this.comment}}
56+
placeholder={{this.commentTextArea.placeholder}}
57+
local-class='Comment'
58+
/>
59+
<Button
60+
data-test-moderation-dropdown-submit
61+
data-analytics-name='Submit decision'
62+
@type='create'
63+
disabled={{or (not this.decisionTrigger) this.submitDecision.isRunning}}
64+
local-class='SubmitButton'
65+
{{on 'click' (queue (perform this.submitDecision) dd.close)}}
66+
>
67+
{{t 'registries.makeDecisionDropdown.submit'}}
68+
</Button>
69+
{{else}}
70+
<div data-test-no-moderator-actions>
71+
{{t 'registries.makeDecisionDropdown.noModeratorActions'}}
4372
</div>
44-
{{/each}}
45-
<label for='moderator-comment'>
46-
{{this.commentTextArea.label}}
47-
</label>
48-
<Textarea
49-
data-test-moderation-dropdown-comment
50-
@id='moderator-comment'
51-
@value={{this.comment}}
52-
placeholder={{this.commentTextArea.placeholder}}
53-
local-class='Comment'
54-
/>
55-
<Button
56-
data-test-moderation-dropdown-submit
57-
data-analytics-name='Submit decision'
58-
@type='create'
59-
disabled={{or (not this.decisionTrigger) this.submitDecision.isRunning}}
60-
local-class='SubmitButton'
61-
{{on 'click' (queue (perform this.submitDecision) dd.close)}}
62-
>
63-
{{t 'registries.makeDecisionDropdown.submit'}}
64-
</Button>
73+
{{/if}}
6574
</dd.content>
6675
</ResponsiveDropdown>

mirage/config.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,6 @@ export default function(this: Server) {
242242
relatedModelName: 'registration',
243243
});
244244
this.get('/providers/registrations/:parentID/registrations/', getProviderRegistrations);
245-
osfNestedResource(this, 'registration-provider', 'actions', {
246-
path: '/providers/registrations/:parentID/actions/',
247-
relatedModelName: 'review-action',
248-
});
249245
osfNestedResource(this, 'registration-provider', 'licensesAcceptable', {
250246
only: ['index'],
251247
path: '/providers/registrations/:parentID/licenses/',

tests/engines/registries/acceptance/overview/moderator-mode-test.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
4141
await visit(`/${registration.id}?mode=moderator`);
4242
assert.dom('[data-test-state-description-short]').exists('Short description for pending status exists');
4343
assert.dom('[data-test-state-description-short]').hasText(
44-
t('registries.overview.pending.short_description').toString(),
44+
t('registries.overview.pending.short_description'),
4545
'The registration is pending',
4646
);
4747
assert.dom('[data-test-state-description-long]').hasText(
@@ -54,14 +54,14 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
5454
'Option to accept submission exists',
5555
);
5656
assert.dom('[data-test-moderation-dropdown-decision-label="accept_submission"]').hasText(
57-
'Accept submission',
57+
t('registries.makeDecisionDropdown.acceptSubmission'),
5858
'Accept submission option has correct text',
5959
);
6060
assert.dom('[data-test-moderation-dropdown-decision-label="reject_submission"]').exists(
6161
'Option to reject submission exists',
6262
);
6363
assert.dom('[data-test-moderation-dropdown-decision-label="reject_submission"]').hasText(
64-
'Reject submission',
64+
t('registries.makeDecisionDropdown.rejectSubmission'),
6565
'Reject submission option has correct text',
6666
);
6767
await percySnapshot(assert);
@@ -70,7 +70,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
7070
await click('[data-test-state-button]');
7171
assert.dom('[data-test-state-description-short]').exists('Short description for accepted status exists');
7272
assert.dom('[data-test-state-description-short]').hasText(
73-
t('registries.overview.accepted.short_description').toString(),
73+
t('registries.overview.accepted.short_description'),
7474
'The registration is now accepted',
7575
);
7676
assert.dom('[data-test-state-description-long]').hasText(
@@ -112,7 +112,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
112112
'Short description for pending_withdraw_request status exists',
113113
);
114114
assert.dom('[data-test-state-description-short]').hasText(
115-
t('registries.overview.pendingWithdrawRequest.short_description').toString(),
115+
t('registries.overview.pendingWithdrawRequest.short_description'),
116116
'The registration is pending withdraw request',
117117
);
118118
assert.dom('[data-test-state-description-long]').hasText(
@@ -128,7 +128,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
128128
'Option to force withdraw exists',
129129
);
130130
assert.dom('[data-test-moderation-dropdown-decision-label="force_withdraw"]').hasText(
131-
'Force withdraw',
131+
t('registries.makeDecisionDropdown.forceWithdraw'),
132132
'Force withdraw option has correct text',
133133
);
134134
await percySnapshot(assert);
@@ -149,7 +149,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
149149
'Short description for pending_withdraw status exists',
150150
);
151151
assert.dom('[data-test-state-description-short]').hasText(
152-
t('registries.overview.pendingWithdraw.short_description').toString(),
152+
t('registries.overview.pendingWithdraw.short_description'),
153153
'The registration is pending withdraw',
154154
);
155155
assert.dom('[data-test-state-description-long]').hasText(
@@ -162,14 +162,14 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
162162
'Option to accept withdraw exists',
163163
);
164164
assert.dom('[data-test-moderation-dropdown-decision-label="accept_withdrawal"]').hasText(
165-
'Accept withdrawal',
165+
t('registries.makeDecisionDropdown.acceptWithdrawal'),
166166
'Accept withdrawal option has correct text',
167167
);
168168
assert.dom('[data-test-moderation-dropdown-decision-label="reject_withdrawal"]').exists(
169169
'Option to reject withdraw exists',
170170
);
171171
assert.dom('[data-test-moderation-dropdown-decision-label="reject_withdrawal"]').hasText(
172-
'Reject withdrawal',
172+
t('registries.makeDecisionDropdown.rejectWithdrawal'),
173173
'Reject withdrawal option has correct text',
174174
);
175175
await percySnapshot(assert);
@@ -193,7 +193,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
193193
await click('[data-test-state-button]');
194194
assert.dom('[data-test-state-description-short]').exists('Short description for accepted status exists');
195195
assert.dom('[data-test-state-description-short]').hasText(
196-
t('registries.overview.accepted.short_description').toString(),
196+
t('registries.overview.accepted.short_description'),
197197
'The registration is now accepted',
198198
);
199199
assert.dom('[data-test-state-description-long]').hasText(
@@ -215,7 +215,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
215215
'Short description for accepted status exists',
216216
);
217217
assert.dom('[data-test-state-description-short]').hasText(
218-
t('registries.overview.accepted.short_description').toString(),
218+
t('registries.overview.accepted.short_description'),
219219
'The registration is accepted',
220220
);
221221
assert.dom('[data-test-state-description-long]').hasText(
@@ -231,7 +231,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
231231
'Option to force withdraw exists',
232232
);
233233
assert.dom('[data-test-moderation-dropdown-decision-label="force_withdraw"]').hasText(
234-
'Force withdraw',
234+
t('registries.makeDecisionDropdown.forceWithdraw'),
235235
'Force withdraw option has correct text',
236236
);
237237
await percySnapshot(assert);
@@ -253,7 +253,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
253253
'Short description for embargo status exists',
254254
);
255255
assert.dom('[data-test-state-description-short]').hasText(
256-
t('registries.overview.embargo.short_description').toString(),
256+
t('registries.overview.embargo.short_description'),
257257
'The registration is in embargo',
258258
);
259259
assert.dom('[data-test-state-description-long]').hasText(
@@ -273,7 +273,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
273273
'Option to force withdraw exists',
274274
);
275275
assert.dom('[data-test-moderation-dropdown-decision-label="force_withdraw"]').hasText(
276-
'Force withdraw',
276+
t('registries.makeDecisionDropdown.forceWithdraw'),
277277
'Force withdraw option has correct text',
278278
);
279279
await percySnapshot(assert);
@@ -294,7 +294,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
294294
'Short description for pending_embargo_termination status exists',
295295
);
296296
assert.dom('[data-test-state-description-short]').hasText(
297-
t('registries.overview.pendingEmbargoTermination.short_description').toString(),
297+
t('registries.overview.pendingEmbargoTermination.short_description'),
298298
'The registration is pending embargo termination',
299299
);
300300
assert.dom('[data-test-state-description-long]').hasText(
@@ -314,7 +314,7 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => {
314314
'Option to force withdraw exists',
315315
);
316316
assert.dom('[data-test-moderation-dropdown-decision-label="force_withdraw"]').hasText(
317-
'Force withdraw',
317+
t('registries.makeDecisionDropdown.forceWithdraw'),
318318
'Force withdraw option has correct text',
319319
);
320320
await percySnapshot(assert);

0 commit comments

Comments
 (0)