Skip to content

Commit 1b55c28

Browse files
committed
pkp/pkp-lib#1660 added e2e test
1 parent 0b1b989 commit 1b55c28

File tree

5 files changed

+251
-13
lines changed

5 files changed

+251
-13
lines changed

classes/components/listPanels/ReviewerRecommendationsListPanel.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,6 @@ public function getConfig()
6363
$config = array_merge(
6464
$config,
6565
[
66-
'addRecommendationLabel' => __('grid.action.addReviewerRecommendation'),
67-
'confirmDeleteMessage' => __('manager.reviewerRecommendations.confirmDelete'),
68-
'deleteRecommendationLabel' => __('common.delete'),
69-
'editRecommendationLabel' => __('common.edit'),
70-
'activateTitle' => __('manager.reviewerRecommendations.activate.title'),
71-
'confirmActivateMessage' => __('manager.reviewerRecommendations.confirmActivate'),
72-
'deactivateTitle' => __('manager.reviewerRecommendations.deactivate.title'),
73-
'confirmDeactivateMessage' => __('manager.reviewerRecommendations.confirmDeactivate'),
74-
'recommendationNameTitle' => __('manager.reviewerRecommendations.list.name.title'),
75-
'recommendationStatusTitle' => __('manager.reviewerRecommendations.list.status.title'),
76-
'apiUrl' => $this->getReviewerRecommendationsApiUrl(),
7766
'form' => $this->getLocalizedForm(),
7867
'items' => $this->items,
7968
]

classes/security/authorization/RecommendationRequiredPolicy.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515

1616
namespace APP\security\authorization;
1717

18+
use Illuminate\Http\Response;
1819
use PKP\security\authorization\AuthorizationPolicy;
1920
use PKP\submission\reviewer\recommendation\ReviewerRecommendation;
21+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2022

2123
class RecommendationRequiredPolicy extends AuthorizationPolicy
2224
{
@@ -36,9 +38,9 @@ public function __construct(int $reviewerRecommendationId, string $message = 'ap
3638
public function effect(): int
3739
{
3840
if (!ReviewerRecommendation::find($this->reviewerRecommendationId)) {
39-
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException(
41+
throw new NotFoundHttpException(
4042
message: __($this->message),
41-
code: 404
43+
code: Response::HTTP_NOT_FOUND
4244
);
4345
}
4446

cypress/support/commands.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,9 @@ Cypress.Commands.add('createSubmissionWithApi', (data, csrfToken) => {
5858
.addSubmissionAuthorsWithApi(api, data, csrfToken);
5959
});
6060

61+
Cypress.Commands.add('accessReviewerRecommendations', (username, password, contextPath) => {
62+
cy.login(username, password, contextPath);
63+
cy.visit('/index.php/' + contextPath + '/en/management/settings/workflow#review');
64+
cy.get('button').contains('Reviewer Recommendations').click();
65+
});
66+
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
/**
2+
* @file cypress/tests/integration/ReviewerRecommendation.cy.js
3+
*
4+
* Copyright (c) 2025 Simon Fraser University
5+
* Copyright (c) 2025 John Willinsky
6+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
7+
*
8+
*/
9+
10+
describe('Customize reviewer recommendations test', () => {
11+
let defaultRecommendations = [
12+
'Accept Submission',
13+
'Revisions Required',
14+
'Resubmit for Review',
15+
'Resubmit Elsewhere',
16+
'Decline Submission',
17+
'See Comments',
18+
];
19+
20+
it('Access the reviewer recommendations page', () => {
21+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
22+
23+
cy.get('[data-cy="reviewer-recommendation-manager"]')
24+
.find('tbody > tr')
25+
.should('have.length', defaultRecommendations.length);
26+
27+
defaultRecommendations.forEach((recommendation) => {
28+
cy.get('[data-cy="reviewer-recommendation-manager"]')
29+
.find('tr:contains("' + recommendation + '")')
30+
.should('exist');
31+
});
32+
});
33+
34+
it('Add, edit, and delete reviewer recommendations', () => {
35+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
36+
37+
// Add a new recommendation
38+
cy.get('[data-cy="reviewer-recommendation-manager"]')
39+
.find('button:contains("Add Recommendation")')
40+
.should('exist')
41+
.click();
42+
cy.wait(200);
43+
44+
cy.get('div[role=dialog]:contains("Add Recommendation")')
45+
.find('button:contains("French")')
46+
.click();
47+
cy.get('div[role=dialog]:contains("Add Recommendation")')
48+
.find('input#reviewerRecommendation-title-control-en')
49+
.type('Test Recommendation');
50+
cy.get('div[role=dialog]:contains("Add Recommendation")')
51+
.find('input#reviewerRecommendation-title-control-fr_CA')
52+
.type('Recommandation de test');
53+
54+
cy.get('div[role=dialog]:contains("Add Recommendation")')
55+
.find('button:contains("Save")')
56+
.click();
57+
cy.wait(500);
58+
59+
cy.get('[data-cy="reviewer-recommendation-manager"]')
60+
.find('tbody > tr')
61+
.should('have.length', defaultRecommendations.length + 1);
62+
cy.get('[data-cy="reviewer-recommendation-manager"]')
63+
.find('tbody > tr')
64+
.contains('Test Recommendation');
65+
66+
// Edit the recommendation
67+
cy.get('[data-cy="reviewer-recommendation-manager"]')
68+
.find('tr:contains("Test Recommendation")')
69+
.find('button[aria-label*="More Actions"]')
70+
.should('exist')
71+
.click();
72+
cy.get('[data-cy="reviewer-recommendation-manager"]')
73+
.find('button:contains("Edit")')
74+
.click();
75+
cy.get('div[role=dialog]:contains("Edit Recommendation")')
76+
.find('input#reviewerRecommendation-title-control-en')
77+
.clear()
78+
.type('Edited Recommendation');
79+
cy.get('div[role=dialog]:contains("Edit Recommendation")')
80+
.find('button:contains("Save")')
81+
.click();
82+
cy.wait(500);
83+
cy.get('[data-cy="reviewer-recommendation-manager"]')
84+
.find('tbody > tr')
85+
.contains('Edited Recommendation');
86+
87+
// Delete the recommendation
88+
cy.get('[data-cy="reviewer-recommendation-manager"]')
89+
.find('tr:contains("Edited Recommendation")')
90+
.find('button[aria-label*="More Actions"]')
91+
.should('exist')
92+
.click();
93+
cy.get('[data-cy="reviewer-recommendation-manager"]')
94+
.find('button:contains("Delete")')
95+
.click();
96+
cy.get('div[role=dialog]:contains("Delete Recommendation")')
97+
.find('button:contains("No")')
98+
.click();
99+
cy.get('[data-cy="reviewer-recommendation-manager"]')
100+
.find('tbody > tr')
101+
.contains('Edited Recommendation');
102+
cy.get('[data-cy="reviewer-recommendation-manager"]')
103+
.find('tr:contains("Edited Recommendation")')
104+
.find('button[aria-label*="More Actions"]')
105+
.should('exist')
106+
.click();
107+
cy.get('[data-cy="reviewer-recommendation-manager"]')
108+
.find('button:contains("Delete")')
109+
.click();
110+
cy.get('div[role=dialog]:contains("Delete Recommendation")')
111+
.find('button:contains("Yes")')
112+
.click();
113+
cy.wait(500);
114+
cy.get('[data-cy="reviewer-recommendation-manager"]')
115+
.find('tr:contains("Edited Recommendation")')
116+
.should('not.exist');
117+
cy.get('[data-cy="reviewer-recommendation-manager"]')
118+
.find('tbody > tr')
119+
.should('have.length', defaultRecommendations.length);
120+
121+
});
122+
123+
it('Enable/disable reviewer recommendations', () => {
124+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
125+
126+
cy.get('[data-cy="reviewer-recommendation-manager"]')
127+
.find('tr:contains("See Comments")')
128+
.find('input[type="checkbox"]')
129+
.should('be.checked');
130+
131+
// Deactivate the recommendation
132+
cy.get('[data-cy="reviewer-recommendation-manager"]')
133+
.find('tr:contains("See Comments")')
134+
.find('input[type="checkbox"]')
135+
.click();
136+
cy.get('div[role=dialog]:contains("Deactivate Reviewer Recommendation")')
137+
.find('button:contains("No")')
138+
.click();
139+
cy.get('[data-cy="reviewer-recommendation-manager"]')
140+
.find('tr:contains("See Comments")')
141+
.find('input[type="checkbox"]')
142+
.should('be.checked');
143+
cy.get('[data-cy="reviewer-recommendation-manager"]')
144+
.find('tr:contains("See Comments")')
145+
.find('input[type="checkbox"]')
146+
.click();
147+
cy.get('div[role=dialog]:contains("Deactivate Reviewer Recommendation")')
148+
.find('button:contains("Yes")')
149+
.click();
150+
cy.get('[data-cy="reviewer-recommendation-manager"]')
151+
.find('tr:contains("See Comments")')
152+
.find('input[type="checkbox"]')
153+
.should('not.be.checked');
154+
155+
// Activate the recommendation
156+
cy.get('[data-cy="reviewer-recommendation-manager"]')
157+
.find('tr:contains("See Comments")')
158+
.find('input[type="checkbox"]')
159+
.click();
160+
cy.get('div[role=dialog]:contains("Activate Reviewer Recommendation")')
161+
.find('button:contains("No")')
162+
.click();
163+
cy.get('[data-cy="reviewer-recommendation-manager"]')
164+
.find('tr:contains("See Comments")')
165+
.find('input[type="checkbox"]')
166+
.should('not.be.checked');
167+
cy.get('[data-cy="reviewer-recommendation-manager"]')
168+
.find('tr:contains("See Comments")')
169+
.find('input[type="checkbox"]')
170+
.click();
171+
cy.get('div[role=dialog]:contains("Activate Reviewer Recommendation")')
172+
.find('button:contains("Yes")')
173+
.click();
174+
cy.get('[data-cy="reviewer-recommendation-manager"]')
175+
.find('tr:contains("See Comments")')
176+
.find('input[type="checkbox"]')
177+
.should('be.checked');
178+
});
179+
180+
it('Not allow to edit or delete a recommendation aleady used', () => {
181+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
182+
183+
cy.get('[data-cy="reviewer-recommendation-manager"]')
184+
.find('tr:contains("Decline Submission")')
185+
.find('button[aria-label*="More Actions"]')
186+
.should('have.length', 0);
187+
});
188+
189+
it('Inactive recommendation not available in review assignment for selection', () => {
190+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
191+
192+
cy.get('[data-cy="reviewer-recommendation-manager"]')
193+
.find('tr:contains("Resubmit Elsewhere")')
194+
.find('input[type="checkbox"]')
195+
.click();
196+
cy.get('div[role=dialog]:contains("Deactivate Reviewer Recommendation")')
197+
.find('button:contains("Yes")')
198+
.click();
199+
cy.logout();
200+
201+
cy.findSubmissionAsEditor('dbarnes', null, 'Sokoloff');
202+
cy.get('[data-cy="reviewer-manager"]')
203+
.find('button:contains("Read Review")')
204+
.click();
205+
cy.wait(1000)
206+
cy.get('div[role=dialog]:contains("Recommendation")')
207+
.last()
208+
.find('select#reviewerRecommendationId option:contains("Resubmit Elsewhere")')
209+
.should('not.exist');
210+
cy.logout
211+
212+
cy.accessReviewerRecommendations('dbarnes', null, 'publicknowledge');
213+
214+
cy.get('[data-cy="reviewer-recommendation-manager"]')
215+
.find('tr:contains("Resubmit Elsewhere")')
216+
.find('input[type="checkbox"]')
217+
.click();
218+
cy.get('div[role=dialog]:contains("Activate Reviewer Recommendation")')
219+
.find('button:contains("Yes")')
220+
.click();
221+
cy.logout();
222+
223+
cy.findSubmissionAsEditor('dbarnes', null, 'Sokoloff');
224+
cy.get('[data-cy="reviewer-manager"]')
225+
.find('button:contains("Read Review")')
226+
.click();
227+
cy.wait(1000)
228+
cy.get('div[role=dialog]:contains("Recommendation")')
229+
.last()
230+
.find('select#reviewerRecommendationId option:contains("Resubmit Elsewhere")')
231+
.should('exist');
232+
233+
cy.logout();
234+
});
235+
});

locale/en/editor.po

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,12 @@ msgstr "Remove Article From Issue"
420420
msgid "grid.action.addReviewerRecommendation"
421421
msgstr "Add Recommendation"
422422

423+
msgid "grid.action.editReviewerRecommendation"
424+
msgstr "Edit Recommendation"
425+
426+
msgid "grid.action.deleteReviewerRecommendation"
427+
msgstr "Delete Recommendation"
428+
423429
msgid "editor.article.remove"
424430
msgstr "Remove"
425431

0 commit comments

Comments
 (0)