From 4c00486ba656705741a6faa52cf581862e6e3660 Mon Sep 17 00:00:00 2001 From: Futa Ikeda Date: Thu, 14 Oct 2021 14:39:01 -0400 Subject: [PATCH 1/2] Restructure moderation tab + tests --- .../registration-list/card/template.hbs | 2 +- .../branded/moderation/pending/controller.ts | 21 ++ .../addon/branded/moderation/pending/route.ts | 38 ++++ .../{submissions => pending}/styles.scss | 0 .../branded/moderation/pending/template.hbs | 52 +++++ .../moderation/submissions/controller.ts | 16 -- .../moderation/submitted/controller.ts | 22 ++ .../{submissions => submitted}/route.ts | 12 +- .../branded/moderation/submitted/styles.scss | 50 ++++ .../{submissions => submitted}/template.hbs | 32 --- .../addon/branded/moderation/template.hbs | 18 +- lib/registries/addon/routes.ts | 3 +- .../branded/moderation/pending-test.ts | 213 ++++++++++++++++++ ...{submissions-test.ts => submitted-test.ts} | 119 +++------- .../registration-list/card/component-test.ts | 4 +- translations/en-us.yml | 8 +- 16 files changed, 454 insertions(+), 156 deletions(-) create mode 100644 lib/registries/addon/branded/moderation/pending/controller.ts create mode 100644 lib/registries/addon/branded/moderation/pending/route.ts rename lib/registries/addon/branded/moderation/{submissions => pending}/styles.scss (100%) create mode 100644 lib/registries/addon/branded/moderation/pending/template.hbs delete mode 100644 lib/registries/addon/branded/moderation/submissions/controller.ts create mode 100644 lib/registries/addon/branded/moderation/submitted/controller.ts rename lib/registries/addon/branded/moderation/{submissions => submitted}/route.ts (70%) create mode 100644 lib/registries/addon/branded/moderation/submitted/styles.scss rename lib/registries/addon/branded/moderation/{submissions => submitted}/template.hbs (61%) create mode 100644 tests/engines/registries/acceptance/branded/moderation/pending-test.ts rename tests/engines/registries/acceptance/branded/moderation/{submissions-test.ts => submitted-test.ts} (64%) diff --git a/lib/osf-components/addon/components/registries/registration-list/card/template.hbs b/lib/osf-components/addon/components/registries/registration-list/card/template.hbs index ec436cb47aa..b8b6b93fbf0 100644 --- a/lib/osf-components/addon/components/registries/registration-list/card/template.hbs +++ b/lib/osf-components/addon/components/registries/registration-list/card/template.hbs @@ -32,7 +32,7 @@ {{/if}} - {{#if (eq @state 'revision_pending_moderation')}} + {{#if (eq @state 'pending_moderation')}} {{else}} diff --git a/lib/registries/addon/branded/moderation/pending/controller.ts b/lib/registries/addon/branded/moderation/pending/controller.ts new file mode 100644 index 00000000000..8d0fc566e54 --- /dev/null +++ b/lib/registries/addon/branded/moderation/pending/controller.ts @@ -0,0 +1,21 @@ +import Controller from '@ember/controller'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; + +import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; +import { RevisionReviewStates } from 'ember-osf-web/models/schema-response'; + +type PendingStates = + RegistrationReviewStates.Pending | + RegistrationReviewStates.PendingWithdrawRequest | + RevisionReviewStates.RevisionPendingModeration; +export default class RegistriesModerationPendingController extends Controller { + queryParams = ['state']; + + @tracked state?: PendingStates; + + @action + changeTab(tab: PendingStates) { + this.state = tab; + } +} diff --git a/lib/registries/addon/branded/moderation/pending/route.ts b/lib/registries/addon/branded/moderation/pending/route.ts new file mode 100644 index 00000000000..db72890e7e0 --- /dev/null +++ b/lib/registries/addon/branded/moderation/pending/route.ts @@ -0,0 +1,38 @@ +import { action } from '@ember/object'; +import Transition from '@ember/routing/-private/transition'; +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; + +import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; +import RegistrationProviderModel from 'ember-osf-web/models/registration-provider'; +import { RevisionReviewStates } from 'ember-osf-web/models/schema-response'; +import Analytics from 'ember-osf-web/services/analytics'; + +import RegistriesModerationPendingController from './controller'; + +export default class BrandedModerationPendingRoute extends Route { + @service analytics!: Analytics; + + setupController( + controller: RegistriesModerationPendingController, + model: RegistrationProviderModel, + transition: Transition, + ) { + super.setupController(controller, model, transition); + const { state } = controller; + if (!state + || ![ + RegistrationReviewStates.Pending, + RegistrationReviewStates.PendingWithdraw, + RevisionReviewStates.RevisionPendingModeration, + ].includes(state!)) { + controller.set('state', 'pending'); + this.replaceWith('branded.moderation.pending'); + } + } + + @action + didTransition() { + this.analytics.trackPage(); + } +} diff --git a/lib/registries/addon/branded/moderation/submissions/styles.scss b/lib/registries/addon/branded/moderation/pending/styles.scss similarity index 100% rename from lib/registries/addon/branded/moderation/submissions/styles.scss rename to lib/registries/addon/branded/moderation/pending/styles.scss diff --git a/lib/registries/addon/branded/moderation/pending/template.hbs b/lib/registries/addon/branded/moderation/pending/template.hbs new file mode 100644 index 00000000000..76552fe05c4 --- /dev/null +++ b/lib/registries/addon/branded/moderation/pending/template.hbs @@ -0,0 +1,52 @@ +{{page-title (t 'registries.moderation.submissions.title') prepend=false}} +{{!-- TODO: Add number of registrations in each state in tab --}} + +
+
+ + {{#if this.model.allowUpdates}} + + {{/if}} + +
+ +
+ +
diff --git a/lib/registries/addon/branded/moderation/submissions/controller.ts b/lib/registries/addon/branded/moderation/submissions/controller.ts deleted file mode 100644 index a7144dc391f..00000000000 --- a/lib/registries/addon/branded/moderation/submissions/controller.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Controller from '@ember/controller'; -import { action } from '@ember/object'; -import { tracked } from '@glimmer/tracking'; - -import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; - -export default class RegistriesModerationSubmissionController extends Controller { - queryParams = ['state']; - - @tracked state?: RegistrationReviewStates; - - @action - changeTab(tab: RegistrationReviewStates) { - this.state = tab; - } -} diff --git a/lib/registries/addon/branded/moderation/submitted/controller.ts b/lib/registries/addon/branded/moderation/submitted/controller.ts new file mode 100644 index 00000000000..e5d858ca493 --- /dev/null +++ b/lib/registries/addon/branded/moderation/submitted/controller.ts @@ -0,0 +1,22 @@ +import Controller from '@ember/controller'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; + +import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; + +type SubmittedStates = + RegistrationReviewStates.Accepted | + RegistrationReviewStates.Embargo | + RegistrationReviewStates.Withdrawn | + RegistrationReviewStates.Rejected; + +export default class RegistriesModerationSubmittedController extends Controller { + queryParams = ['state']; + + @tracked state?: SubmittedStates; + + @action + changeTab(tab: SubmittedStates) { + this.state = tab; + } +} diff --git a/lib/registries/addon/branded/moderation/submissions/route.ts b/lib/registries/addon/branded/moderation/submitted/route.ts similarity index 70% rename from lib/registries/addon/branded/moderation/submissions/route.ts rename to lib/registries/addon/branded/moderation/submitted/route.ts index ea92a82337b..9a7a87293a6 100644 --- a/lib/registries/addon/branded/moderation/submissions/route.ts +++ b/lib/registries/addon/branded/moderation/submitted/route.ts @@ -7,13 +7,13 @@ import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; import RegistrationProviderModel from 'ember-osf-web/models/registration-provider'; import Analytics from 'ember-osf-web/services/analytics'; -import RegistriesModerationSubmissionController from './controller'; +import RegistriesModerationSubmittedController from './controller'; -export default class BrandedModerationSubmissionsRoute extends Route { +export default class BrandedModerationSubmittedRoute extends Route { @service analytics!: Analytics; setupController( - controller: RegistriesModerationSubmissionController, + controller: RegistriesModerationSubmittedController, model: RegistrationProviderModel, transition: Transition, ) { @@ -21,15 +21,13 @@ export default class BrandedModerationSubmissionsRoute extends Route { const { state } = controller; if (!state || ![ - RegistrationReviewStates.Pending, RegistrationReviewStates.Accepted, RegistrationReviewStates.Embargo, RegistrationReviewStates.Rejected, RegistrationReviewStates.Withdrawn, - RegistrationReviewStates.PendingWithdraw, ].includes(state!)) { - controller.set('state', 'pending'); - this.replaceWith('branded.moderation.submissions'); + controller.set('state', RegistrationReviewStates.Accepted); + this.replaceWith('branded.moderation.submitted'); } } diff --git a/lib/registries/addon/branded/moderation/submitted/styles.scss b/lib/registries/addon/branded/moderation/submitted/styles.scss new file mode 100644 index 00000000000..2d4adc5ee86 --- /dev/null +++ b/lib/registries/addon/branded/moderation/submitted/styles.scss @@ -0,0 +1,50 @@ +.contentBorder { + composes: childNav from '../styles.scss'; +} + +.registrationListContainer { + ul { + margin: 0; + border: 1px solid $color-border-gray; + } + + li { + background-color: initial; + border-left: 0; + border-right: 0; + border-top: 0; + } + + li:last-of-type { + border-bottom: 0; + } +} + +.tabSortingWrapper { + display: flex; + flex-direction: row; + justify-content: space-between; + font-size: 15px; + background-color: $color-bg-gray-light; + border-bottom: 1px solid $color-border-gray; + padding: 10px 20px; +} + +.tabs { + position: relative; +} + +.tab { + height: 30px; + border: 0; + background: none; + + &.selected { + font-weight: 700; + position: relative; + } +} + +.sortButton { + margin-right: 15px; +} diff --git a/lib/registries/addon/branded/moderation/submissions/template.hbs b/lib/registries/addon/branded/moderation/submitted/template.hbs similarity index 61% rename from lib/registries/addon/branded/moderation/submissions/template.hbs rename to lib/registries/addon/branded/moderation/submitted/template.hbs index 4f407d2441c..d90a5c51ac0 100644 --- a/lib/registries/addon/branded/moderation/submissions/template.hbs +++ b/lib/registries/addon/branded/moderation/submitted/template.hbs @@ -8,28 +8,6 @@ >
- - {{#if this.model.allowUpdates}} - - {{/if}} -
{{!-- TODO: add pending count in Submissions and Withdrawals tab --}} - {{#let 'registries.branded.moderation.submissions' as |submissionsRoute|}} - + {{#let 'registries.branded.moderation.submitted' as |submittedRoute|}} + - {{t 'registries.moderation.submissions.title'}} + {{t 'registries.moderation.submitted.title'}} + + + {{/let}} + {{#let 'registries.branded.moderation.pending' as |pendingRoute|}} + + + {{t 'registries.moderation.pending.title'}} {{/let}} diff --git a/lib/registries/addon/routes.ts b/lib/registries/addon/routes.ts index 13ee8b1b0b5..2b90429f7f0 100644 --- a/lib/registries/addon/routes.ts +++ b/lib/registries/addon/routes.ts @@ -7,7 +7,8 @@ export default buildRoutes(function() { this.route('discover'); this.route('new'); this.route('moderation', function() { - this.route('submissions'); + this.route('submitted'); + this.route('pending'); this.route('moderators'); this.route('settings'); }); diff --git a/tests/engines/registries/acceptance/branded/moderation/pending-test.ts b/tests/engines/registries/acceptance/branded/moderation/pending-test.ts new file mode 100644 index 00000000000..ddbe7509387 --- /dev/null +++ b/tests/engines/registries/acceptance/branded/moderation/pending-test.ts @@ -0,0 +1,213 @@ +import { click, currentRouteName, currentURL } from '@ember/test-helpers'; +import { ModelInstance } from 'ember-cli-mirage'; +import { setupMirage } from 'ember-cli-mirage/test-support'; +import { percySnapshot } from 'ember-percy'; +import { TestContext } from 'ember-test-helpers'; +import { module, test } from 'qunit'; + +import { RegistrationReviewStates } from 'ember-osf-web/models/registration'; +import RegistrationProviderModel from 'ember-osf-web/models/registration-provider'; +import { visit } from 'ember-osf-web/tests/helpers'; +import { setupEngineApplicationTest } from 'ember-osf-web/tests/helpers/engines'; +import { RevisionReviewStates } from 'ember-osf-web/models/schema-response'; + +interface ModerationPendingTestContext extends TestContext { + registrationProvider: ModelInstance; +} + +module('Registries | Acceptance | branded.moderation | pending', hooks => { + setupEngineApplicationTest(hooks, 'registries'); + setupMirage(hooks); + + hooks.beforeEach(function(this: ModerationPendingTestContext) { + this.registrationProvider = server.create('registration-provider', { id: 'sbmit' }); + }); + + test('logged out users are rerouted', async assert => { + await visit('/registries/sbmit/moderation/pending'); + assert.equal(currentRouteName(), 'registries.page-not-found', 'Logged out users are rerouted'); + }); + + test('logged in, non-moderators are rerouted', async assert => { + server.create('user', 'loggedIn'); + await visit('/registries/sbmit/moderation/pending'); + assert.equal(currentRouteName(), 'registries.page-not-found', 'Non-moderators are rerouted'); + }); + + test('Pending: no updates allowed', async function(this: ModerationPendingTestContext, assert) { + this.registrationProvider.update({ allowUpdates: false, permissions: ['view_submissions'] }); + const currentUser = server.create('user', 'loggedIn'); + server.create('moderator', { + id: currentUser.id, + user: currentUser, + provider: this.registrationProvider, + }, 'asModerator'); + await visit('/registries/sbmit/moderation/pending'); + await percySnapshot('moderation pending page: updates not allowed'); + assert.equal(currentRouteName(), 'registries.branded.moderation.pending', + 'On the pending page of registries reviews'); + + assert.dom('[data-test-submissions-type="pending"]').exists('pending tab shown'); + assert.dom('[data-test-submissions-type="pending-withdraw"]').exists('pending withdraw tab shown'); + assert.dom('[data-test-submissions-type="revision-pending"]') + .doesNotExist('pending revisions tab not shown'); + }); + + test('Pending: no registrations', async function(this: ModerationPendingTestContext, assert) { + this.registrationProvider.update({ permissions: ['view_submissions'] }); + const currentUser = server.create('user', 'loggedIn'); + server.create('moderator', { + id: currentUser.id, + user: currentUser, + provider: this.registrationProvider, + }, 'asModerator'); + await visit('/registries/sbmit/moderation/pending'); + await percySnapshot('moderation pending page: no registrations'); + assert.equal(currentRouteName(), 'registries.branded.moderation.pending', + 'On the pending page of registries reviews'); + + // Pending tab + assert.ok(currentURL().includes('state=pending'), 'Default state is pending'); + assert.dom('[data-test-submissions-type="pending"][data-test-is-selected="true"]') + .exists('Pending is selected by default for submissions page'); + assert.dom('[data-test-registration-list-card]') + .doesNotExist('No cards shown for pending submissions'); + assert.dom('[data-test-registration-list-none]').containsText( + 'No registrations pending approval have been found', + 'Proper message is shown when no pending registrations found', + ); + + // Pending revision tab + await click('[data-test-submissions-type="revision-pending"]'); + assert.ok(currentURL().includes('state=pending_moderation'), 'query param set to pending revision'); + assert.dom('[data-test-submissions-type="pending_moderation"][data-test-is-selected="true"]') + .exists('Pending is selected by default for submissions page'); + assert.dom('[data-test-registration-list-card]') + .doesNotExist('No cards shown for pending revisions'); + assert.dom('[data-test-registration-list-none]').containsText( + 'No registrations found with updates pending', + 'Proper message is shown when no pending revisions found', + ); + + // Pending Withdrawal tab + await click('[data-test-submissions-type="pending-withdraw"]'); + assert.ok(currentURL().includes('state=pending_withdraw'), 'query param set to pending withdraw'); + assert.dom('[data-test-submissions-type="pending-withdraw"][data-test-is-selected="true"]') + .exists('Pending withdraw tab has been selected'); + assert.dom('[data-test-registration-list-card]') + .doesNotExist('No cards shown for pending withdrawal submissions'); + assert.dom('[data-test-registration-list-none]').containsText('No registrations found pending withdrawal', + 'Proper message is shown when no registrations pending withdrawal found'); + }); + + test('Pending: many registrations', async function(this: ModerationPendingTestContext, assert) { + server.createList( + 'registration', 12, { + reviewsState: RegistrationReviewStates.Pending, provider: this.registrationProvider, + }, 'withReviewActions', + ); + server.createList( + 'registration', 2, { + reviewsState: RegistrationReviewStates.Accepted, + revisionState: RevisionReviewStates.RevisionPendingModeration, + provider: this.registrationProvider, + }, 'withSingleReviewAction', + ); + server.createList( + 'registration', 2, { + reviewsState: RegistrationReviewStates.PendingWithdraw, provider: this.registrationProvider, + }, + ); + this.registrationProvider.update({ permissions: ['view_submissions'] }); + const currentUser = server.create('user', 'loggedIn'); + server.create('moderator', { + id: currentUser.id, + user: currentUser, + provider: this.registrationProvider, + }, 'asAdmin'); + await visit('/registries/sbmit/moderation/pending'); + await percySnapshot('moderation pending page: many registrations'); + assert.equal(currentRouteName(), 'registries.branded.moderation.pending', + 'On the pending page of registries reviews'); + + // Pending tab + assert.ok(currentURL().includes('state=pending'), 'Default state is pending'); + assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); + assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); + assert.dom('[data-test-registration-list-card]').exists({ count: 10 }, '10 pending registrations shown'); + assert.dom('[data-test-registration-list-card-icon="pending"]').exists({ count: 10 }, 'Proper icons shown'); + assert.dom('[data-test-registration-list-card-title]').exists({ count: 10 }, 'Title shown'); + assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 10 }, 'Latest action shown'); + assert.dom('[data-test-next-page-button]').exists('Pagination shown'); + await click('[data-test-next-page-button]'); + assert.dom('[data-test-next-page-button]').hasAttribute('disabled'); + assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 more pending registrations shown'); + assert.dom('[data-test-registration-card-toggle-actions]') + .exists({ count: 2 }, 'Toggle to show more review actions'); + const toggleActions = this.element.querySelectorAll('[data-test-registration-card-toggle-actions]'); + await click(toggleActions[0]); + assert.dom('[data-test-registration-list-card-more-actions]') + .exists({ count: 2 }, 'More actions shown after clicking the toggler'); + + // Pending revision tab + await click('[data-test-submissions-type="revision-pending"]'); + assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); + assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); + assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 pending revision registrations shown'); + assert.dom('[data-test-registration-list-card-icon="pending_moderation"]') + .exists({ count: 2 }, 'Proper icons shown'); + assert.dom('[data-test-registration-list-card-title]').exists({ count: 2 }, 'Title shown'); + assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 2 }, 'Latest action shown'); + assert.dom('[data-test-registration-card-toggle-actions]') + .doesNotExist('No toggle to show more review actions'); + assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); + + // Pending Withdrawal tab + await click('[data-test-submissions-type="pending-withdraw"]'); + assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); + assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); + assert.dom('[data-test-registration-list-card]') + .exists({ count: 2 }, '2 registrations pending withdrawal shown'); + assert.dom('[data-test-registration-list-card-icon="pending_withdraw"]') + .exists({ count: 2 }, 'Proper icons shown'); + assert.dom('[data-test-registration-list-card-title]').exists({ count: 2 }, 'Title shown'); + assert.dom('[data-test-no-actions-found]').exists({ count: 2 }, 'No actions found'); + assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); + await click('[data-test-registration-list-card-title]>a'); + assert.equal(currentRouteName(), 'registries.overview.index', + 'Clicking the registration title from moderation takes moderators to the overview page'); + assert.ok(currentURL().includes('mode=moderator'), 'Mode query param set to moderator'); + }); + + test('Submissions page: queryParams', async function(this: ModerationPendingTestContext, assert) { + this.registrationProvider.update({ permissions: ['view_submissions'] }); + const currentUser = server.create('user', 'loggedIn'); + server.create('moderator', { + id: currentUser.id, + user: currentUser, + provider: this.registrationProvider, + }, 'asModerator'); + await visit('/registries/sbmit/moderation/pending?state=pending_moderation'); + assert.equal(currentRouteName(), 'registries.branded.moderation.pending', + 'On the submissions page of registries reviews'); + assert.ok(currentURL() + .includes('state=pending_moderation'), 'current URL contains the state query param set'); + assert.dom('[data-test-is-selected="true"]').hasText('Pending Updates', 'Updates tab selected'); + }); + + test('Submissions page: invalid queryParam', async function(this: ModerationPendingTestContext, assert) { + this.registrationProvider.update({ permissions: ['view_submissions'] }); + const currentUser = server.create('user', 'loggedIn'); + server.create('moderator', { + id: currentUser.id, + user: currentUser, + provider: this.registrationProvider, + }, 'asModerator'); + await visit('/registries/sbmit/moderation/pending?state=donkey_kong'); + assert.equal(currentRouteName(), 'registries.branded.moderation.pending', + 'On the submissions page of registries reviews'); + assert.notOk(currentURL().includes('state=donkey_kong'), 'Invalid query param is gone'); + assert.ok(currentURL().includes('state=pending'), 'Invalid query param replaced with pending'); + assert.dom('[data-test-is-selected="true"]').hasText('Pending', 'Pending tab selected'); + }); +}); diff --git a/tests/engines/registries/acceptance/branded/moderation/submissions-test.ts b/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts similarity index 64% rename from tests/engines/registries/acceptance/branded/moderation/submissions-test.ts rename to tests/engines/registries/acceptance/branded/moderation/submitted-test.ts index 1b755950299..75e064ed91e 100644 --- a/tests/engines/registries/acceptance/branded/moderation/submissions-test.ts +++ b/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts @@ -10,30 +10,30 @@ import RegistrationProviderModel from 'ember-osf-web/models/registration-provide import { visit } from 'ember-osf-web/tests/helpers'; import { setupEngineApplicationTest } from 'ember-osf-web/tests/helpers/engines'; -interface ModerationSubmissionsTestContext extends TestContext { +interface ModerationSubmittedTestContext extends TestContext { registrationProvider: ModelInstance; } -module('Registries | Acceptance | branded.moderation | submissions', hooks => { +module('Registries | Acceptance | branded.moderation | submitted', hooks => { setupEngineApplicationTest(hooks, 'registries'); setupMirage(hooks); - hooks.beforeEach(function(this: ModerationSubmissionsTestContext) { + hooks.beforeEach(function(this: ModerationSubmittedTestContext) { this.registrationProvider = server.create('registration-provider', { id: 'sbmit' }); }); test('logged out users are rerouted', async assert => { - await visit('/registries/sbmit/moderation/submissions'); + await visit('/registries/sbmit/moderation/submitted'); assert.equal(currentRouteName(), 'registries.page-not-found', 'Logged out users are rerouted'); }); test('logged in, non-moderators are rerouted', async assert => { server.create('user', 'loggedIn'); - await visit('/registries/sbmit/moderation/submissions'); + await visit('/registries/sbmit/moderation/submitted'); assert.equal(currentRouteName(), 'registries.page-not-found', 'Non-moderators are rerouted'); }); - test('Submissions pending: no registrations', async function(this: ModerationSubmissionsTestContext, assert) { + test('Submitted: no registrations', async function(this: ModerationSubmittedTestContext, assert) { this.registrationProvider.update({ permissions: ['view_submissions'] }); const currentUser = server.create('user', 'loggedIn'); server.create('moderator', { @@ -41,24 +41,13 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { user: currentUser, provider: this.registrationProvider, }, 'asModerator'); - await visit('/registries/sbmit/moderation/submissions'); - await percySnapshot('moderation submissions page: no registrations'); - assert.equal(currentRouteName(), 'registries.branded.moderation.submissions', - 'On the submissions page of registries reviews'); - - // Pending tab - assert.ok(currentURL().includes('state=pending'), 'Default state is pending'); - assert.dom('[data-test-submissions-type="pending"][data-test-is-selected="true"]') - .exists('Pending is selected by default for submissions page'); - assert.dom('[data-test-registration-list-card]') - .doesNotExist('No cards shown for pending submissions'); - assert.dom('[data-test-registration-list-none]').containsText( - 'No registrations pending approval have been found', - 'Proper message is shown when no pending registrations found', - ); + await visit('/registries/sbmit/moderation/submitted'); + await percySnapshot('moderation submitted page: no registrations'); + assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', + 'On the submitted page of registries reviews'); // Accepted tab - await click('[data-test-submissions-type="accepted"]'); + assert.ok(currentURL().includes('state=accepted'), 'Default state is accepted'); assert.ok(currentURL().includes('state=accepted'), 'query param set to accepted'); assert.dom('[data-test-submissions-type="accepted"][data-test-is-selected="true"]') .exists('Accepted tab has been selected'); @@ -96,29 +85,14 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { .doesNotExist('No cards shown for withdrawn submissions'); assert.dom('[data-test-registration-list-none]').containsText('No withdrawn registrations have been found', 'Proper message is shown when no withdrawn registrations found'); - - // Pending Withdrawal tab - await click('[data-test-submissions-type="pending-withdraw"]'); - assert.ok(currentURL().includes('state=pending_withdraw'), 'query param set to pending withdraw'); - assert.dom('[data-test-submissions-type="pending-withdraw"][data-test-is-selected="true"]') - .exists('Pending withdraw tab has been selected'); - assert.dom('[data-test-registration-list-card]') - .doesNotExist('No cards shown for pending withdrawal submissions'); - assert.dom('[data-test-registration-list-none]').containsText('No registrations found pending withdrawal', - 'Proper message is shown when no registrations pending withdrawal found'); }); - test('Submissions pending: many registrations', async function(this: ModerationSubmissionsTestContext, assert) { + test('Submitted: many registrations', async function(this: ModerationSubmittedTestContext, assert) { server.createList( 'registration', 12, { - reviewsState: RegistrationReviewStates.Pending, provider: this.registrationProvider, - }, 'withReviewActions', - ); - server.createList( - 'registration', 2, { reviewsState: RegistrationReviewStates.Accepted, provider: this.registrationProvider, - }, 'withSingleReviewAction', + }, 'withReviewActions', ); server.createList( 'registration', 5, { @@ -135,11 +109,6 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { reviewsState: RegistrationReviewStates.Withdrawn, provider: this.registrationProvider, }, ); - server.createList( - 'registration', 2, { - reviewsState: RegistrationReviewStates.PendingWithdraw, provider: this.registrationProvider, - }, - ); this.registrationProvider.update({ permissions: ['view_submissions'] }); const currentUser = server.create('user', 'loggedIn'); server.create('moderator', { @@ -147,23 +116,23 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { user: currentUser, provider: this.registrationProvider, }, 'asAdmin'); - await visit('/registries/sbmit/moderation/submissions'); - await percySnapshot('moderation submissions page: many registrations'); - assert.equal(currentRouteName(), 'registries.branded.moderation.submissions', + await visit('/registries/sbmit/moderation/submitted'); + await percySnapshot('moderation submitted page: many registrations'); + assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', 'On the submissions page of registries reviews'); - // Pending tab - assert.ok(currentURL().includes('state=pending'), 'Default state is pending'); + // Accepted tab + assert.ok(currentURL().includes('state=accepted'), 'Default state is accepted'); assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); - assert.dom('[data-test-registration-list-card]').exists({ count: 10 }, '10 pending registrations shown'); - assert.dom('[data-test-registration-list-card-icon="pending"]').exists({ count: 10 }, 'Proper icons shown'); + assert.dom('[data-test-registration-list-card]').exists({ count: 10 }, '10 accepted registrations shown'); + assert.dom('[data-test-registration-list-card-icon="accepted"]').exists({ count: 10 }, 'Proper icons shown'); assert.dom('[data-test-registration-list-card-title]').exists({ count: 10 }, 'Title shown'); assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 10 }, 'Latest action shown'); assert.dom('[data-test-next-page-button]').exists('Pagination shown'); await click('[data-test-next-page-button]'); assert.dom('[data-test-next-page-button]').hasAttribute('disabled'); - assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 more pending registrations shown'); + assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 more accepted registrations shown'); assert.dom('[data-test-registration-card-toggle-actions]') .exists({ count: 2 }, 'Toggle to show more review actions'); const toggleActions = this.element.querySelectorAll('[data-test-registration-card-toggle-actions]'); @@ -171,18 +140,6 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { assert.dom('[data-test-registration-list-card-more-actions]') .exists({ count: 2 }, 'More actions shown after clicking the toggler'); - // Accepted tab - await click('[data-test-submissions-type="accepted"]'); - assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); - assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); - assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 accepted registrations shown'); - assert.dom('[data-test-registration-list-card-icon="accepted"]').exists({ count: 2 }, 'Proper icons shown'); - assert.dom('[data-test-registration-list-card-title]').exists({ count: 2 }, 'Title shown'); - assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 2 }, 'Latest action shown'); - assert.dom('[data-test-registration-card-toggle-actions]') - .doesNotExist('No toggle to show more review actions'); - assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); - // Embargo tab await click('[data-test-submissions-type="embargo"]'); assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); @@ -214,25 +171,9 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { assert.dom('[data-test-registration-list-card-title]').exists({ count: 4 }, 'Title shown'); assert.dom('[data-test-no-actions-found]').exists({ count: 4 }, 'No actions found'); assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); - - // Pending Withdrawal tab - await click('[data-test-submissions-type="pending-withdraw"]'); - assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); - assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); - assert.dom('[data-test-registration-list-card]') - .exists({ count: 2 }, '2 registrations pending withdrawal shown'); - assert.dom('[data-test-registration-list-card-icon="pending_withdraw"]') - .exists({ count: 2 }, 'Proper icons shown'); - assert.dom('[data-test-registration-list-card-title]').exists({ count: 2 }, 'Title shown'); - assert.dom('[data-test-no-actions-found]').exists({ count: 2 }, 'No actions found'); - assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); - await click('[data-test-registration-list-card-title]>a'); - assert.equal(currentRouteName(), 'registries.overview.index', - 'Clicking the registration title from moderation takes moderators to the overview page'); - assert.ok(currentURL().includes('mode=moderator'), 'Mode query param set to moderator'); }); - test('Submissions page: queryParams', async function(this: ModerationSubmissionsTestContext, assert) { + test('Submitted page: queryParams', async function(this: ModerationSubmittedTestContext, assert) { this.registrationProvider.update({ permissions: ['view_submissions'] }); const currentUser = server.create('user', 'loggedIn'); server.create('moderator', { @@ -240,14 +181,14 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { user: currentUser, provider: this.registrationProvider, }, 'asModerator'); - await visit('/registries/sbmit/moderation/submissions?state=embargo'); - assert.equal(currentRouteName(), 'registries.branded.moderation.submissions', + await visit('/registries/sbmit/moderation/submitted?state=embargo'); + assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', 'On the submissions page of registries reviews'); assert.ok(currentURL().includes('state=embargo'), 'current URL contains the state query param set'); assert.dom('[data-test-is-selected="true"]').hasText('Embargo', 'embargo tab selected'); }); - test('Submissions page: invalid queryParam', async function(this: ModerationSubmissionsTestContext, assert) { + test('Submitted page: invalid queryParam', async function(this: ModerationSubmittedTestContext, assert) { this.registrationProvider.update({ permissions: ['view_submissions'] }); const currentUser = server.create('user', 'loggedIn'); server.create('moderator', { @@ -255,13 +196,11 @@ module('Registries | Acceptance | branded.moderation | submissions', hooks => { user: currentUser, provider: this.registrationProvider, }, 'asModerator'); - await visit('/registries/sbmit/moderation/submissions?state=embargooooo'); - assert.equal(currentRouteName(), 'registries.branded.moderation.submissions', + await visit('/registries/sbmit/moderation/submitted?state=embargooooo'); + assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', 'On the submissions page of registries reviews'); assert.notOk(currentURL().includes('state=embargooooo'), 'Invalid query param is gone'); - assert.ok(currentURL().includes('state=pending'), 'Invalid query param replaced with pending'); - assert.dom('[data-test-is-selected="true"]').hasText('Pending', 'Pending tab selected'); + assert.ok(currentURL().includes('state=accepted'), 'Invalid query param replaced with accepted'); + assert.dom('[data-test-is-selected="true"]').hasText('Public', 'Accepted tab selected'); }); - - // TODO: Update with new tabs }); diff --git a/tests/integration/components/registries/registration-list/card/component-test.ts b/tests/integration/components/registries/registration-list/card/component-test.ts index 593886b10a5..5eee2338542 100644 --- a/tests/integration/components/registries/registration-list/card/component-test.ts +++ b/tests/integration/components/registries/registration-list/card/component-test.ts @@ -130,11 +130,11 @@ module('Registries | Integration | Component | registration-list-card', hooks => await render(hbs` `); await a11yAudit(this.element); assert.dom('[data-test-registration-list-card]').isVisible(); - assert.dom('[data-test-registration-list-card-icon="revision_pending_moderation"]').exists(); + assert.dom('[data-test-registration-list-card-icon="pending_moderation"]').exists(); assert.dom('[data-test-registration-title-link]').exists(); assert.dom('[data-test-registration-list-card-title]').hasText(this.registration.title); }); diff --git a/translations/en-us.yml b/translations/en-us.yml index e357914e971..8a3d5f01d66 100644 --- a/translations/en-us.yml +++ b/translations/en-us.yml @@ -1011,8 +1011,10 @@ registries: withdrawn: Withdrawn pendingWithdraw: 'Pending Withdrawal' revisionPending: 'Pending Updates' - submissions: - title: Submissions + submitted: + title: Submitted + pending: + title: Pending withdrawals: title: 'Withdrawal Requests' moderators: @@ -1466,7 +1468,7 @@ registries: rejected: 'No rejected registrations have been found' withdrawn: 'No withdrawn registrations have been found' pending_withdraw: 'No registrations found pending withdrawal' - revision_pending_moderation: 'No registrations found with updates pending' + pending_moderation: 'No registrations found with updates pending' reviewActionsList: failedToLoadActions: 'Failed to load registration moderation history' noActionsFound: 'No moderation history found for this registration' From f1170167356dc259265a30e8fddf8748510c99ff Mon Sep 17 00:00:00 2001 From: Futa Ikeda Date: Thu, 14 Oct 2021 16:39:10 -0400 Subject: [PATCH 2/2] Fix tests and other borken bits --- .../addon/branded/moderation/index/route.ts | 2 +- .../branded/moderation/pending/template.hbs | 2 +- .../branded/moderation/submitted/template.hbs | 2 +- .../make-decision-dropdown/component.ts | 2 +- .../branded/moderation/pending-test.ts | 34 ++++++++++--------- .../branded/moderation/submitted-test.ts | 6 ++-- .../overview/moderator-mode-test.ts | 4 +-- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lib/registries/addon/branded/moderation/index/route.ts b/lib/registries/addon/branded/moderation/index/route.ts index 086652e440f..207310d8938 100644 --- a/lib/registries/addon/branded/moderation/index/route.ts +++ b/lib/registries/addon/branded/moderation/index/route.ts @@ -2,6 +2,6 @@ import Route from '@ember/routing/route'; export default class BrandedModerationIndexRoute extends Route { beforeModel() { - this.replaceWith('branded.moderation.submissions'); + this.replaceWith('branded.moderation.pending'); } } diff --git a/lib/registries/addon/branded/moderation/pending/template.hbs b/lib/registries/addon/branded/moderation/pending/template.hbs index 76552fe05c4..80cdd9c219f 100644 --- a/lib/registries/addon/branded/moderation/pending/template.hbs +++ b/lib/registries/addon/branded/moderation/pending/template.hbs @@ -1,4 +1,4 @@ -{{page-title (t 'registries.moderation.submissions.title') prepend=false}} +{{page-title (t 'registries.moderation.pending.title') prepend=false}} {{!-- TODO: Add number of registrations in each state in tab --}} { this.toast.success(this.intl.t('registries.makeDecisionDropdown.success')); if (this.decisionTrigger === ReviewActionTrigger.RejectSubmission) { this.router.transitionTo( - 'registries.branded.moderation.submissions', + 'registries.branded.moderation.submitted', this.args.registration.provider.get('id'), { queryParams: { state: RegistrationReviewStates.Rejected } }, ); diff --git a/tests/engines/registries/acceptance/branded/moderation/pending-test.ts b/tests/engines/registries/acceptance/branded/moderation/pending-test.ts index ddbe7509387..c6bfb2f5800 100644 --- a/tests/engines/registries/acceptance/branded/moderation/pending-test.ts +++ b/tests/engines/registries/acceptance/branded/moderation/pending-test.ts @@ -69,9 +69,9 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { // Pending tab assert.ok(currentURL().includes('state=pending'), 'Default state is pending'); assert.dom('[data-test-submissions-type="pending"][data-test-is-selected="true"]') - .exists('Pending is selected by default for submissions page'); + .exists('Pending is selected by default for pending page'); assert.dom('[data-test-registration-list-card]') - .doesNotExist('No cards shown for pending submissions'); + .doesNotExist('No cards shown for pending registrations'); assert.dom('[data-test-registration-list-none]').containsText( 'No registrations pending approval have been found', 'Proper message is shown when no pending registrations found', @@ -80,8 +80,8 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { // Pending revision tab await click('[data-test-submissions-type="revision-pending"]'); assert.ok(currentURL().includes('state=pending_moderation'), 'query param set to pending revision'); - assert.dom('[data-test-submissions-type="pending_moderation"][data-test-is-selected="true"]') - .exists('Pending is selected by default for submissions page'); + assert.dom('[data-test-submissions-type="revision-pending"][data-test-is-selected="true"]') + .exists('Pending revisions has been selected'); assert.dom('[data-test-registration-list-card]') .doesNotExist('No cards shown for pending revisions'); assert.dom('[data-test-registration-list-none]').containsText( @@ -95,7 +95,7 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { assert.dom('[data-test-submissions-type="pending-withdraw"][data-test-is-selected="true"]') .exists('Pending withdraw tab has been selected'); assert.dom('[data-test-registration-list-card]') - .doesNotExist('No cards shown for pending withdrawal submissions'); + .doesNotExist('No cards shown for pending withdrawals'); assert.dom('[data-test-registration-list-none]').containsText('No registrations found pending withdrawal', 'Proper message is shown when no registrations pending withdrawal found'); }); @@ -106,13 +106,14 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { reviewsState: RegistrationReviewStates.Pending, provider: this.registrationProvider, }, 'withReviewActions', ); - server.createList( - 'registration', 2, { + const acceptedReg = server.create( + 'registration', { reviewsState: RegistrationReviewStates.Accepted, revisionState: RevisionReviewStates.RevisionPendingModeration, provider: this.registrationProvider, - }, 'withSingleReviewAction', + }, ); + server.create('schemaResponse', { registration: acceptedReg }, 'withSchemaResponseActions'); server.createList( 'registration', 2, { reviewsState: RegistrationReviewStates.PendingWithdraw, provider: this.registrationProvider, @@ -137,7 +138,7 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { assert.dom('[data-test-registration-list-card]').exists({ count: 10 }, '10 pending registrations shown'); assert.dom('[data-test-registration-list-card-icon="pending"]').exists({ count: 10 }, 'Proper icons shown'); assert.dom('[data-test-registration-list-card-title]').exists({ count: 10 }, 'Title shown'); - assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 10 }, 'Latest action shown'); + assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 10 }, 'Latest actions shown'); assert.dom('[data-test-next-page-button]').exists('Pagination shown'); await click('[data-test-next-page-button]'); assert.dom('[data-test-next-page-button]').hasAttribute('disabled'); @@ -153,13 +154,14 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { await click('[data-test-submissions-type="revision-pending"]'); assert.dom('[data-test-ascending-sort]').exists({ count: 1 }, 'Ascending sort button exists'); assert.dom('[data-test-descending-sort]').exists({ count: 1 }, 'Descending sort button exists'); - assert.dom('[data-test-registration-list-card]').exists({ count: 2 }, '2 pending revision registrations shown'); + assert.dom('[data-test-registration-list-card]').exists({ count: 1 }, '1 pending revision registrations shown'); assert.dom('[data-test-registration-list-card-icon="pending_moderation"]') - .exists({ count: 2 }, 'Proper icons shown'); - assert.dom('[data-test-registration-list-card-title]').exists({ count: 2 }, 'Title shown'); - assert.dom('[data-test-registration-list-card-latest-action]').exists({ count: 2 }, 'Latest action shown'); + .exists({ count: 1 }, 'Proper icons shown'); + assert.dom('[data-test-registration-list-card-title]').exists({ count: 1 }, 'Title shown'); + assert.dom('[data-test-registration-list-card-latest-action]') + .exists({ count: 1 }, 'Latest schema response action shown'); assert.dom('[data-test-registration-card-toggle-actions]') - .doesNotExist('No toggle to show more review actions'); + .exists({ count: 1}, 'Toggle to show more revision actions'); assert.dom('[data-test-next-page-button]').doesNotExist('No pagination shown'); // Pending Withdrawal tab @@ -189,7 +191,7 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { }, 'asModerator'); await visit('/registries/sbmit/moderation/pending?state=pending_moderation'); assert.equal(currentRouteName(), 'registries.branded.moderation.pending', - 'On the submissions page of registries reviews'); + 'On the pending page of registries reviews'); assert.ok(currentURL() .includes('state=pending_moderation'), 'current URL contains the state query param set'); assert.dom('[data-test-is-selected="true"]').hasText('Pending Updates', 'Updates tab selected'); @@ -205,7 +207,7 @@ module('Registries | Acceptance | branded.moderation | pending', hooks => { }, 'asModerator'); await visit('/registries/sbmit/moderation/pending?state=donkey_kong'); assert.equal(currentRouteName(), 'registries.branded.moderation.pending', - 'On the submissions page of registries reviews'); + 'On the pending page of registries reviews'); assert.notOk(currentURL().includes('state=donkey_kong'), 'Invalid query param is gone'); assert.ok(currentURL().includes('state=pending'), 'Invalid query param replaced with pending'); assert.dom('[data-test-is-selected="true"]').hasText('Pending', 'Pending tab selected'); diff --git a/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts b/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts index 75e064ed91e..77c747cba1c 100644 --- a/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts +++ b/tests/engines/registries/acceptance/branded/moderation/submitted-test.ts @@ -119,7 +119,7 @@ module('Registries | Acceptance | branded.moderation | submitted', hooks => { await visit('/registries/sbmit/moderation/submitted'); await percySnapshot('moderation submitted page: many registrations'); assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', - 'On the submissions page of registries reviews'); + 'On the submitted page of registries reviews'); // Accepted tab assert.ok(currentURL().includes('state=accepted'), 'Default state is accepted'); @@ -183,7 +183,7 @@ module('Registries | Acceptance | branded.moderation | submitted', hooks => { }, 'asModerator'); await visit('/registries/sbmit/moderation/submitted?state=embargo'); assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', - 'On the submissions page of registries reviews'); + 'On the submitted page of registries reviews'); assert.ok(currentURL().includes('state=embargo'), 'current URL contains the state query param set'); assert.dom('[data-test-is-selected="true"]').hasText('Embargo', 'embargo tab selected'); }); @@ -198,7 +198,7 @@ module('Registries | Acceptance | branded.moderation | submitted', hooks => { }, 'asModerator'); await visit('/registries/sbmit/moderation/submitted?state=embargooooo'); assert.equal(currentRouteName(), 'registries.branded.moderation.submitted', - 'On the submissions page of registries reviews'); + 'On the submitted page of registries reviews'); assert.notOk(currentURL().includes('state=embargooooo'), 'Invalid query param is gone'); assert.ok(currentURL().includes('state=accepted'), 'Invalid query param replaced with accepted'); assert.dom('[data-test-is-selected="true"]').hasText('Public', 'Accepted tab selected'); diff --git a/tests/engines/registries/acceptance/overview/moderator-mode-test.ts b/tests/engines/registries/acceptance/overview/moderator-mode-test.ts index f0b4ea8f065..4c4eadf7853 100644 --- a/tests/engines/registries/acceptance/overview/moderator-mode-test.ts +++ b/tests/engines/registries/acceptance/overview/moderator-mode-test.ts @@ -95,8 +95,8 @@ module('Registries | Acceptance | overview.moderator-mode', hooks => { await click('[data-test-moderation-dropdown-submit]'); assert.equal( currentRouteName(), - 'registries.branded.moderation.submissions', - 'Redirected to the submissions page', + 'registries.branded.moderation.submitted', + 'Redirected to the submitted page', ); assert.dom( '[data-test-submissions-type="rejected"][data-test-is-selected="true"]',