Skip to content

Commit

Permalink
Merge branch 'staging' into devex-1122-24-hour-stream-issue
Browse files Browse the repository at this point in the history
  • Loading branch information
codyseibert committed Jun 22, 2023
2 parents eb7f38d + bf5624b commit fecb518
Show file tree
Hide file tree
Showing 22 changed files with 317 additions and 67 deletions.
14 changes: 14 additions & 0 deletions shared/src/business/entities/CaseDeadline.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,20 @@ describe('CaseDeadline', () => {
});

it('should be valid when all fields are present', () => {
const caseDeadline = new CaseDeadline(
{
associatedJudge: 'Judge Buch',
deadlineDate: '2019-03-01T21:42:29.073Z',
description: 'One small step',
docketNumber: DOCKET_NUMBER,
leadDocketNumber: DOCKET_NUMBER,
},
{ applicationContext },
);
expect(caseDeadline.getFormattedValidationErrors()).toEqual(null);
});

it('should be valid when all fields are present except for leadDocketNumber', () => {
const caseDeadline = new CaseDeadline(
{
associatedJudge: 'Judge Buch',
Expand Down
15 changes: 7 additions & 8 deletions shared/src/business/entities/CaseDeadline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ export class CaseDeadline extends JoiValidationEntity {
public deadlineDate: string;
public description: string;
public docketNumber: string;
public sortableDocketNumber: string;
public entityName: string;
public sortableDocketNumber: number;
public leadDocketNumber?: string;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
constructor(rawProps, { applicationContext }) {
Expand All @@ -29,12 +29,10 @@ export class CaseDeadline extends JoiValidationEntity {
this.deadlineDate = rawProps.deadlineDate;
this.description = rawProps.description;
this.docketNumber = rawProps.docketNumber;
// TODO: why is this if statement here
if (this.docketNumber) {
this.sortableDocketNumber = Case.getSortableDocketNumber(
this.docketNumber,
);
}
this.leadDocketNumber = rawProps.leadDocketNumber;
this.sortableDocketNumber =
rawProps.sortableDocketNumber ||
Case.getSortableDocketNumber(this.docketNumber);
}

static VALIDATION_ERROR_MESSAGES = {
Expand Down Expand Up @@ -81,6 +79,7 @@ export class CaseDeadline extends JoiValidationEntity {
),
entityName:
JoiValidationConstants.STRING.valid('CaseDeadline').required(),
leadDocketNumber: JoiValidationConstants.DOCKET_NUMBER.optional(),
sortableDocketNumber: joi
.number()
.required()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe('autoGenerateDeadline', () => {
subjectCaseEntity: {
associatedJudge: 'Laozi',
docketNumber: '101-01',
sortableDocketNumber: '101-01',
sortableDocketNumber: 2001000101,
},
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,6 @@ import {
} from '../../../authorization/authorizationClientService';
import { UnauthorizedError } from '../../../errors/errors';

/**
* createCaseDeadlineInteractor
*
* @param {object} applicationContext the application context
* @param {object} providers the providers object
* @param {object} providers.caseDeadline the case deadline data
* @returns {CaseDeadline} the created case deadline
*/
export const createCaseDeadlineInteractor = async (
applicationContext: IApplicationContext,
{ caseDeadline }: { caseDeadline: CaseDeadline },
Expand Down
21 changes: 1 addition & 20 deletions shared/src/business/useCases/getCaseDeadlinesInteractor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,6 @@ import {
import { UnauthorizedError } from '../../errors/errors';
import { pick } from 'lodash';

/**
* getCaseDeadlinesInteractor
*
* @param {object} applicationContext the application context
* @param {object} providers the providers object
* @param {string} providers.endDate the end date
* @param {string} providers.startDate the start date
* @param {number} providers.from the index to start from
* @param {string} providers.judge the judge
* @param {number} providers.pageSize the page size
* @returns {Promise} the promise of the getCaseDeadlinesByDateRange call
*/
export const getCaseDeadlinesInteractor = async (
applicationContext: IApplicationContext,
{
Expand Down Expand Up @@ -73,20 +61,13 @@ export const getCaseDeadlinesInteractor = async (
'docketNumber',
'docketNumberSuffix',
'docketNumberWithSuffix',
'leadDocketNumber',
]),
}));

return { deadlines: afterCaseMapping, totalCount };
};

/**
* Helper function to grab all of the cases from persistence; only return the valid cases
*
* @param {object} providers The providers
* @param {object} providers.applicationContext the application context
* @param {array} providers.docketNumbers an array of docket numbers to retrieve from persistence
* @returns {array} a validated array of cases
*/
const getCasesByDocketNumbers = async ({
applicationContext,
docketNumbers,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
import { put } from '../../dynamodbClientService';

/**
* createCaseDeadline
*
* @param {object} providers the providers object
* @param {object} providers.applicationContext the application context
* @param {object} providers.caseDeadline the case deadline data
* @returns {Promise} resolves upon creation of case deadline
*/
export const createCaseDeadline = ({
applicationContext,
caseDeadline,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const isCase = item => {
};

export const migrateItems = items => {
const itemsAfter = [];
const itemsAfter: any[] = [];

for (const item of items) {
if (isDocketEntry(item)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const isOutboxItem = item => {
};

export const migrateItems = async (items, documentClient) => {
const itemsAfter = [];
const itemsAfter: (RawWorkItem | RawOutboxItem)[] = [];

for (const item of items) {
if (isWorkItem(item) && item.caseStatus === CASE_STATUS_TYPES.calendared) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { CASE_STATUS_TYPES } from '../../../../../../shared/src/business/entities/EntityConstants';
import { aggregateCaseItems } from '../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems';
import { migrateItems } from './0010-add-lead-docket-number-to-case-deadline';
jest.mock(
'../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems',
);
import { queryFullCase } from '../utilities/queryFullCase';
jest.mock('../utilities/queryFullCase');

let documentClientMock;
const MOCK_CONSOLIDATED_CASE_RECORD = {
associatedJudge: 'Colvin',
docketNumber: '101-18',
docketNumberWithSuffix: '101-18',
entityName: 'Case',
leadDocketNumber: '101-18',
pk: 'case|101-18',
sk: 'case|101-18',
status: CASE_STATUS_TYPES.calendared,
trialDate: '2020-03-01T00:00:00.000Z',
trialLocation: 'Washington, District of Columbia',
trialSessionId: '7805d1ab-18d0-43ec-bafb-654e83405410',
};

const MOCK_CASE_RECORD = {
associatedJudge: 'Colvin',
docketNumber: '101-18',
docketNumberWithSuffix: '101-18',
entityName: 'Case',
pk: 'case|101-18',
sk: 'case|101-18',
status: CASE_STATUS_TYPES.calendared,
trialDate: '2020-03-01T00:00:00.000Z',
trialLocation: 'Washington, District of Columbia',
trialSessionId: '7805d1ab-18d0-43ec-bafb-654e83405410',
};

describe('migrateItems', () => {
it('should return and not modify records that do not have a leadDocketNUmber', async () => {
(queryFullCase as jest.Mock).mockResolvedValue({
pk: `case|${MOCK_CASE_RECORD.docketNumber}`,
sk: `case|${MOCK_CASE_RECORD.docketNumber}`,
});
(aggregateCaseItems as jest.Mock).mockReturnValue(MOCK_CASE_RECORD);

const mockNonConsolidatedCaseDeadlineItem = [
{
associatedJudge: MOCK_CASE_RECORD.associatedJudge,
caseDeadLineId: '97a214a0-437d-461b-80a9-1cfd3d669690',
createdAt: '2023-06-06T18:55:57.361Z',
deadlineDate: '2023-06-10T04:00:00.000Z',
description: 'test',
docketNumber: MOCK_CASE_RECORD.docketNumber,
entityName: 'CaseDeadline',
pk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690',
sk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690',
sortableDocketNumber: 2018000101,
},
];

const results = await migrateItems(
mockNonConsolidatedCaseDeadlineItem,
documentClientMock,
);

expect(results).toEqual(mockNonConsolidatedCaseDeadlineItem);
});

it('should modify CaseDeadline when the case has a leadDocketNumber, adding the case\'s property "leadDocketNumber" to the CaseDeadline', async () => {
(queryFullCase as jest.Mock).mockResolvedValue({
pk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`,
sk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`,
});
(aggregateCaseItems as jest.Mock).mockReturnValue(
MOCK_CONSOLIDATED_CASE_RECORD,
);

const mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber = [
{
associatedJudge: MOCK_CONSOLIDATED_CASE_RECORD.associatedJudge,
caseDeadLineId: '97a214a0-437d-461b-80a9-1cfd3d669690',
createdAt: '2023-06-06T18:55:57.361Z',
deadlineDate: '2023-06-10T04:00:00.000Z',
description: 'test',
docketNumber: MOCK_CONSOLIDATED_CASE_RECORD.docketNumber,
entityName: 'CaseDeadline',
pk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690',
sk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690',
sortableDocketNumber: 2018000101,
},
];

const mockConsolidatedCaseDeadlineItemWithLeadDocketNumber = [
{
...mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber[0],
leadDocketNumber: MOCK_CONSOLIDATED_CASE_RECORD.leadDocketNumber,
},
];

const results = await migrateItems(
mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber,
documentClientMock,
);

expect(results).toEqual(
mockConsolidatedCaseDeadlineItemWithLeadDocketNumber,
);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { CaseDeadline } from '../../../../../../shared/src/business/entities/CaseDeadline';
import { aggregateCaseItems } from '../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems';
import { createApplicationContext } from '../../../../../src/applicationContext';
import { queryFullCase } from '../utilities/queryFullCase';

const applicationContext = createApplicationContext({});

const isCaseDeadlineItem = item => {
return (
item.pk.startsWith('case-deadline|') && item.sk.startsWith('case-deadline|')
);
};

export const migrateItems = async (items, documentClient) => {
const itemsAfter: RawCaseDeadline[] = [];

for (const item of items) {
if (isCaseDeadlineItem(item)) {
const fullCase = await queryFullCase(documentClient, item.docketNumber);
const caseRecord = aggregateCaseItems(fullCase);

const theCaseDeadline = new CaseDeadline(
{
...item,
leadDocketNumber: caseRecord.leadDocketNumber,
},
{
applicationContext,
},
).validateWithLogging(applicationContext);

item.leadDocketNumber = theCaseDeadline.leadDocketNumber;
}

itemsAfter.push(item);
}

return itemsAfter;
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { migrateItems as migration0007 } from './migrations/0007-update-corporate-disclosure-document';
import { migrateItems as migration0008 } from './migrations/0008-add-assignee-id-gsi2pk-to-work-item';
import { migrateItems as migration0009 } from './migrations/0009-add-trial-location-field-to-work-item';
import { migrateItems as migration0010 } from './migrations/0010-add-lead-docket-number-to-case-deadline';

export const migrationsToRun = [
{
Expand All @@ -15,4 +16,8 @@ export const migrationsToRun = [
key: '0009-add-trial-location-field-to-work-item.ts',
script: migration0009,
},
{
key: '0010-add-lead-docket-number-to-case-deadline.ts',
script: migration0010,
},
];
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,38 @@ describe('getCaseDeadlineFromFormAction', () => {
caseDetail: {
associatedJudge: mockJudge,
docketNumber: mockDocketNumber,
leadDocketNumber: mockDocketNumber,
},
form: {
day: 5,
month: 2,
searchError: {},
year: 1993,
},
},
});

expect(result.output).toEqual({
associatedJudge: mockJudge,
deadlineDate: computedDateFromProps,
docketNumber: mockDocketNumber,
leadDocketNumber: mockDocketNumber,
});
});

it('returns a caseDeadline with props.computedDate and form values when props.computedDeadline is defined when case does not have a leadDocketNumber', async () => {
const result = await runAction(getCaseDeadlineFromFormAction, {
modules: {
presenter,
},
props: {
computedDate: computedDateFromProps,
},
state: {
caseDetail: {
associatedJudge: mockJudge,
docketNumber: mockDocketNumber,
leadDocketNumber: undefined,
},
form: {
day: 5,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,17 @@ export const getCaseDeadlineFromFormAction = ({
.createISODateString(props.computedDate);
}

const { associatedJudge, docketNumber } = get(state.caseDetail);
const { associatedJudge, docketNumber, leadDocketNumber } = get(
state.caseDetail,
);

const caseDeadline = omit(
{
...get(state.form),
associatedJudge,
deadlineDate,
docketNumber,
leadDocketNumber,
},
['day', 'month', 'year', 'searchError'],
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { state } from '@web-client/presenter/app.cerebral';

/**
* get case deadlines between start and end date
* get case deadlines between start and end date and can be filtered by judge
* @param {object} providers the providers object
* @param {object} providers.applicationContext the application context
* @param {function} providers.get the get function
* @returns {object} the case deadlines
* @returns {object} the case deadlines and total count of returned case deadlines
*/
export const getCaseDeadlinesAction = async ({
applicationContext,
Expand Down
Loading

0 comments on commit fecb518

Please sign in to comment.