Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 66 additions & 1 deletion apps/backend/src/mutations/StatusActionsLogsMutations.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import { container } from 'tsyringe';

import StatusActionsLogsMutations from './StatusActionsLogsMutations';
import { Tokens } from '../config/Tokens';
import { dummyStatusActionsLog } from '../datasources/mockups/StatusActionsLogsDataSource';
import {
dummyStatusActionsLog,
dummyStatusActionsLogReplay,
} from '../datasources/mockups/StatusActionsLogsDataSource';
import { dummyUserOfficerWithRole } from '../datasources/mockups/UserDataSource';
import { StatusActionsDataSource } from '../datasources/StatusActionsDataSource';
import { Rejection } from '../models/Rejection';
Expand Down Expand Up @@ -39,4 +42,66 @@ describe('Test Status Actions Logs Mutations', () => {

getConnectionStatusActionSpy.mockRestore();
});

test('A logged in user officer should be able to replay multiple status actions logs successfully', async () => {
const result = await statusActionsLogsMutations.replayStatusActionsLogs(
dummyUserOfficerWithRole,
[
dummyStatusActionsLog.statusActionsLogId,
dummyStatusActionsLogReplay.statusActionsLogId,
]
);

expect(result.totalRequested).toBe(2);
expect(result.successful.sort()).toEqual(
[
dummyStatusActionsLog.statusActionsLogId,
dummyStatusActionsLogReplay.statusActionsLogId,
].sort()
);
expect(result.failed).toHaveLength(0);
});

test('Replaying multiple status actions logs should report partial failures without failing the whole request', async () => {
const statusActionsDataSource = container.resolve<StatusActionsDataSource>(
Tokens.StatusActionsDataSource
);
const getConnectionStatusActionSpy = jest
.spyOn(statusActionsDataSource, 'getConnectionStatusAction')
.mockResolvedValueOnce(null);

const result = await statusActionsLogsMutations.replayStatusActionsLogs(
dummyUserOfficerWithRole,
[
dummyStatusActionsLog.statusActionsLogId,
dummyStatusActionsLogReplay.statusActionsLogId,
]
);

expect(result.totalRequested).toBe(2);
expect(result.successful).toEqual([
dummyStatusActionsLogReplay.statusActionsLogId,
]);
expect(result.failed).toEqual([
{
logId: dummyStatusActionsLog.statusActionsLogId,
error: expect.any(String),
},
]);

getConnectionStatusActionSpy.mockRestore();
});

test('Replaying an empty list of status actions logs should return zero counts', async () => {
const result = await statusActionsLogsMutations.replayStatusActionsLogs(
dummyUserOfficerWithRole,
[]
);

expect(result).toEqual({
totalRequested: 0,
successful: [],
failed: [],
});
});
});
18 changes: 14 additions & 4 deletions apps/e2e/cypress/e2e/pregeneratedPdfs.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -718,11 +718,21 @@ context('Pregenerated PDF tests', () => {

cy.navigateToStatusActionLogsSubmenu('Proposal Download');

cy.get('[data-cy="replay_status_action_icon"]')
.last()
.click({ force: true });
cy.finishedLoading();

cy.contains('unexpected behaviour').should('exist');
cy.get('[data-cy="status-actions-logs-table"]')
.contains(proposalId1)
.parents('tr')
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="replay_all_status_action_icon"]').click({
force: true,
});

cy.contains(
'Any selected status action log(s) that can no longer be replayed will be skipped.'
).should('exist');

cy.get('[data-cy="confirm-ok"]').click();

Expand Down
156 changes: 144 additions & 12 deletions apps/e2e/cypress/e2e/statusActions.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -840,17 +840,26 @@ context('Status actions tests', () => {
cy.wait(2000); // wait until status actions are executed
});

it('User Officer should be able to view and replay email status actions', () => {
it('User Officer should be able to select and replay an email status action', () => {
cy.login('officer');
cy.visit('/');

cy.navigateToStatusActionLogsSubmenu('Email');

cy.get('[data-cy="replay_status_action_icon"]')
cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.click({ force: true });
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="replay_all_status_action_icon"]').click({
force: true,
});

cy.contains('duplicate emails').should('exist');
cy.contains(
'Any selected status action log(s) that can no longer be replayed will be skipped.'
).should('exist');

cy.get('[data-cy="confirm-ok"]').click();

Expand All @@ -860,17 +869,26 @@ context('Status actions tests', () => {
});
});

it('User Officer should be able to view and replay proposal download status actions', () => {
it('User Officer should be able to select and replay a proposal download status action(s)', () => {
cy.login('officer');
cy.visit('/');

cy.navigateToStatusActionLogsSubmenu('Proposal Download');

cy.get('[data-cy="replay_status_action_icon"]')
cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.click({ force: true });
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="replay_all_status_action_icon"]').click({
force: true,
});

cy.contains('unexpected behaviour').should('exist');
cy.contains(
'Any selected status action log(s) that can no longer be replayed will be skipped.'
).should('exist');

cy.get('[data-cy="confirm-ok"]').click();

Expand All @@ -880,7 +898,7 @@ context('Status actions tests', () => {
});
});

it('User Officer should see status actions logs whose connection configuration was later removed, with replay disabled', () => {
it('User Officer should see status actions logs whose connection configuration was later removed, with selection disabled', () => {
cy.addConnectionStatusActions({
actions: [],
connectionId: statusActionsConnectionId,
Expand All @@ -899,11 +917,19 @@ context('Status actions tests', () => {
.filter(':contains("SUCCESSFUL")')
.should('have.length.greaterThan', 0);

cy.get('[data-cy="replay_status_action_icon"]')
cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.click({ force: true });
.find('input[type="checkbox"]')
.should('be.disabled');

cy.get('[data-cy="confirm-ok"]').should('not.exist');
cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('.MuiCheckbox-root')
.should(
'have.attr',
'title',
'This status action can no longer be replayed'
);
});

it('User Officer should be able to replay all email status actions in a call', () => {
Expand Down Expand Up @@ -1153,6 +1179,112 @@ context('Status actions tests', () => {
assertProposalPresentInTable(String(proposal2Id));
});

it('User Officer should be able to persist row selection across page changes', () => {
cy.login('officer');
cy.visit('/EmailStatusActionsLogs?pageSize=2');

cy.finishedLoading();

cy.get('[data-cy="replay_all_status_action_icon"]').should('not.exist');

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.should('be.checked');

cy.get('button[aria-label="Next Page"]').click();

cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.should('not.be.checked');

cy.get('[data-cy="replay_all_status_action_icon"]').should('exist');
cy.get('[data-cy="replay_selected_status_actions_count"]')
.find('.MuiBadge-badge')
.should('have.text', '1');

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="replay_selected_status_actions_count"]')
.find('.MuiBadge-badge')
.should('have.text', '2');

cy.get('button[aria-label="Previous Page"]').click();

cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.should('be.checked');

cy.get('[data-cy="replay_all_status_action_icon"]').should('exist');
cy.get('[data-cy="replay_selected_status_actions_count"]')
.find('.MuiBadge-badge')
.should('have.text', '2');

cy.get('button[aria-label="Next Page"]').click();

cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.first()
.find('input[type="checkbox"]')
.should('be.checked');
});

it('User Officer should be able to replay multiple selected email status actions', () => {
cy.login('officer');
cy.visit('/EmailStatusActionsLogs');

cy.finishedLoading();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.eq(0)
.find('input[type="checkbox"]')
.check();

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.eq(1)
.find('input[type="checkbox"]')
.check();

cy.contains('2 row(s) selected').should('exist');

cy.get('[data-cy="replay_all_status_action_icon"]').click({
force: true,
});

cy.contains(
'You are about to send a status action replay request for 2 selected status action log(s).'
).should('exist');

cy.get('[data-cy="confirm-ok"]').click();

cy.notification({
variant: 'success',
text: 'Status action replay successfully sent.',
});

cy.contains('row(s) selected').should('not.exist');

cy.get('[data-cy="status-actions-logs-table"] tbody tr')
.eq(0)
.find('input[type="checkbox"]')
.should('not.be.checked');
});

it('User Officer should be able to access the proposal from the link in status actions logs', () => {
cy.createProposal({ callId: initialDBData.call.id }).then((result) => {
const proposal = result.createProposal;
Expand Down
Loading
Loading