From 8de88cd7704e1d8262fbee2dac21fdc6beb13c3e Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Wed, 4 Oct 2023 14:06:36 -0400 Subject: [PATCH] Feature/1610.2 frontend parsing status (#2622) * saving state real quick * finishing merge with latest * Missed old test script * Added new test, more cleanup * Updating unit tests in DFS, preparing for 1610 * Merging in Jan's 1610 code for parserError useful-ness * Revert "Merging in Jan's 1610 code for parserError useful-ness" This reverts commit c5796da69d0e9a6d356057550378d536e2be5f8b. * update to test to use dfs fixture * saving state before new 1610 merge * Resolving merge conflicts with 1610. * Linting changes and comparing to 1610 * Some unit test linting but inherited 1610 issues * Re-ordering job to run tests vs lint first. * Updates to linting and unit tests. * Fixing linting. * Update tdrs-backend/setup.cfg * updates per PR. * Excluding trailers for rejection * VSCode merge resolution is garbage. * Fixing precheck for not implemented types * Updating to error-handle not implemented schema types * - Updated view to show latest datafiles - Added admin filter to show newest or all datafile records - Updated indices to allow easier elastic queries * - Updated search indices to have parent FK * - Fix lint errors * - Updated submission tests - Moved create_datafile to util * - fix lint errors * - removing frontend filtering * - addding datafile to admin model * Revert "- addding datafile to admin model" This reverts commit 35a6f24c36c3a4c00ddcfc40f20833530b0199f4. * - Fixed issue where datafile FK wasnt populating - Regenerated migration * - Readding datafile back to admin view now that the error is resolved * - adding datafile back * Revert "- Readding datafile back to admin view now that the error is resolved" This reverts commit 2807425059fd1b5b355edfb16d30d170cf869d7b. * - Removed unnecessary fields - Updated dependencies - Updated filter * - Updated document to include required fields * - Fixed failing test * add adminUrl to deployment cypress overrides * Adding "beta" banners to relevant error report sections (#2522) * Update views.py * Update views.py * Update SubmissionHistory.jsx * Update SubmissionHistory.test.js * Apply suggestions from code review Co-authored-by: Miles Reiter * lint fixes --------- Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: andrew-jameson * Create sprint-73-summary.md (#2565) * hotfix for large file sizes (#2542) * hotfix for large file sizes * apply timeouts/req limits to dev * filter identity pages from scan * IGNORE sql injection --------- Co-authored-by: Jan Timpe Co-authored-by: mo sohani Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> * updating validation error language * accidentally included coding challenge * rm comments * 2550 deactivation email link (#2557) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding url to email * - test code for sandbox * - using my email * Revert "Merge branch 'update-cf-os' into 2551-deactivation-email-link" This reverts commit e963b9df48dd1f72ca0c5b192c979bac11851d11, reversing changes made to cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- using my email" This reverts commit cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- test code for sandbox" This reverts commit 06037747197d17ed8e63b086fcfcf048ecb50dc4. --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update README.md (#2577) Add ATO Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Create 2023, Spring - Testing CSV & Excel-based error reports.md * Update README.md * Updating deliverable links (#2584) * User viewset not returning/duplicating users (#2573) * - Fixed issue not allowing pagination to work locally with nginx - Added ordering to user field to fix duplicates issue * - fix lint error * - Removing ID check since we cannot guarantee that the uuid that is generated per test run will be lexigraphically consistent --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update cf os (#2523) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding new dependencies * - adding package * - fixing broken install * - fixing libs * - using correct command * - gettign correct version of libc * - trying to upgrade libs * - testing * - Updated README and script * Revert "- Updated README and script" This reverts commit 92697b3e53d1fd87b8d3e7995abb9093aa26e307. * - Removed unnecessary circi stuff - Removed script - Updated docs to callout updating secondary apps * - Correct spelling error --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Item Number Mismatch (#2578) * - Updated schemas and models to reflect correct item numbers of fields * - Revert migration * - Updated header/trailer item numbers * - Fixed item numbers off by one errors --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * pipeline filtering (#2538) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md --------- Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Hotfix Devops/2457 path filtering for documentation (#2597) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md * build and test all on PRs even for documentation --------- Co-authored-by: George Hudson * Create sprint-74-summary.md (#2596) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * added URL filters (#2580) * added URL filters * allow github to trigger owasp and label deploys (#2601) Co-authored-by: George Hudson --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: George Hudson Co-authored-by: George Hudson * Create sprint-75-summary.md (#2608) * Create sprint-76-summary.md (#2609) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * - Resolved failing tests * - Corrected merge thrash * - Using randbits to generate pk to get around confilcting sequence pks * Revert "- Using randbits to generate pk to get around confilcting sequence pks" This reverts commit ac9b0659a62f64c4114c41faf0baa659a92be07c. * - Updating region in fixture instead of factory - letting django handle transaction for test * - Moved datafile reference to avoid confusion * pushing up incomplete codebase * Other unit tests now have passed w/ good error handling * Working tests, need to get setup for case aggregates populating via DB * - Updated queries - Added helper function - Need to merge in 2579 for queries to work * minor improvement to month2int * - Fixing most merge errors * - Fixing functions * - Updated queries based on generic relation * - Updated queries to count by case number instead of record number * - Added route - Updated task to create dfs * - updated tests to include dfs * Cleaning up most comments that are no longer necessary and fixed lint issues. * making minor updates, still broken tests. * updating pipfile.lock and rebuild image resolved test issues * Reorganizing tests, still failing in test_parse.py * deleted summary file, split into other test scripts. * Fixed missing self reference. * Linting fixes. * Found reference failure in deployed env. * Removing extra returns for missing record type. * lint fix * Addressed invocation of datafile for failing test * lint update for whitespace * Intermediary commit, broken test * add reverse relation * frontend summary status * new assignemnts in util * - updated rejected query to correctly count objs * - Fixing most tests * - Fixed user error. Swapped numbers by accident. * - make region None to avoid PK collision * - Fix lint errors * - Updating to avoid warning * add acceptance icon * add reverse relationship to summary model * vscode merge conflict resolution (#2623) * auto-create the external network * didn't stage commit properly * checking diffs, matching 1613.2 * doesn't work in pipeline. must be cached local * re-commenting in unit test * lint failures fixed --------- Co-authored-by: andrew-jameson * add a pending status * add acceptance status tests * update warning icon * rm old assert * update rejected icon * url change per me, want pipeline to run e2e * Upgraded to querysets, fix PR comments, PE str * missing : not caught locally * Feat/1613 merge 2 (#2650) * Create sprint-78-summary.md (#2645) * Missing/unsaved parser_error for record_type * removing redundant tests * Hopefully resolved on unit tests and lint --------- Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: andrew-jameson * icontains * tests * Changing dict structure per 1612. * fixed tests and lint issues, parse is too complex * schema_manager replaces schema check * Saving state prior to merge-conflict. * Adopting latest manager, removing old error style. * Commented out t6 line during Office hours * minor reference update * Acclimating to schemaManager * lint-fix isinstance * syntax mistake with isinstance * Apply suggestions from code review * reverting search_index merge artifacts. * adjusting for removing unused "get-schema()" * whitespace lint * Feedback from Jan * Ensuring tests run/work. * Ensure we have leading zero in rptmonthyear. * Minor lint fix for exception logging * fix migration * add backend partially accepted status * add frontend partially accepted status * add partially accepted test * rm accidental commit * rm unused variable * resolving merge conflict problems * fixing tests from merge conflicts. * dumb lint fix * Update tdrs-backend/tdpservice/parsers/migrations/0007_alter_datafilesummary_datafile.py * fix merge errors * fix name attr not populated for preparsing errors * include preparsing errors in row_precheck_errors status * make header precheck errors force rejected status * lint msg --------- Co-authored-by: Andrew Jameson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: andrew-jameson Co-authored-by: elipe17 Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: mo sohani Co-authored-by: Eric Lipe <125676261+elipe17@users.noreply.github.com> Co-authored-by: Lauren Frohlich <61251539+lfrohlich@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: George Hudson Co-authored-by: George Hudson Co-authored-by: raftmsohani <97037188+raftmsohani@users.noreply.github.com> --- .../tdpservice/data_files/serializers.py | 3 + .../0002_alter_parsererror_error_type.py | 2 +- .../0008_alter_datafilesummary_datafile.py | 20 ++++++ .../0009_alter_datafilesummary_status.py | 18 ++++++ tdrs-backend/tdpservice/parsers/models.py | 9 ++- tdrs-backend/tdpservice/parsers/parse.py | 2 +- .../tdpservice/parsers/test/test_parse.py | 2 +- tdrs-backend/tdpservice/parsers/util.py | 18 +++++- .../tdpservice/scheduling/parser_task.py | 3 +- .../SubmissionHistory/SubmissionHistory.jsx | 57 ++++++++++++++++- .../SubmissionHistory.test.js | 61 ++++++++++++++++++- tdrs-frontend/src/reducers/reports.js | 2 + 12 files changed, 186 insertions(+), 11 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py create mode 100644 tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py diff --git a/tdrs-backend/tdpservice/data_files/serializers.py b/tdrs-backend/tdpservice/data_files/serializers.py index 3e34bd421..4977f2ebd 100644 --- a/tdrs-backend/tdpservice/data_files/serializers.py +++ b/tdrs-backend/tdpservice/data_files/serializers.py @@ -12,6 +12,7 @@ from tdpservice.security.models import ClamAVFileScan from tdpservice.stts.models import STT from tdpservice.users.models import User +from tdpservice.parsers.serializers import DataFileSummarySerializer logger = logging.getLogger(__name__) class DataFileSerializer(serializers.ModelSerializer): @@ -22,6 +23,7 @@ class DataFileSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) ssp = serializers.BooleanField(write_only=True) has_error = serializers.SerializerMethodField() + summary = DataFileSummarySerializer(many=False, read_only=True) class Meta: """Metadata.""" @@ -45,6 +47,7 @@ class Meta: 's3_location', 's3_versioning_id', 'has_error', + 'summary' ] read_only_fields = ("version",) diff --git a/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py b/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py index e55c856ce..5236b5c29 100644 --- a/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py +++ b/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py @@ -14,5 +14,5 @@ class Migration(migrations.Migration): model_name='parsererror', name='error_type', field=models.TextField(choices=[('1', 'File pre-check'), ('2', 'Record value invalid'), ('3', 'Record value consistency'), ('4', 'Case consistency'), ('5', 'Section consistency'), ('6', 'Historical consistency')], max_length=128), - ) + ), ] diff --git a/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py b/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py new file mode 100644 index 000000000..dc9f0b2f6 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.15 on 2023-07-20 20:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_files', '0012_datafile_s3_versioning_id'), + ('parsers', '0007_datafilesummary'), + ] + + operations = [ + migrations.AlterField( + model_name='datafilesummary', + name='datafile', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='summary', to='data_files.datafile'), + ), + ] diff --git a/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py b/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py new file mode 100644 index 000000000..dd05c0f4f --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.15 on 2023-08-23 12:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parsers', '0008_alter_datafilesummary_datafile'), + ] + + operations = [ + migrations.AlterField( + model_name='datafilesummary', + name='status', + field=models.CharField(choices=[('Pending', 'Pending'), ('Accepted', 'Accepted'), ('Accepted with Errors', 'Accepted With Errors'), ('Partially Accepted with Errors', 'Partially Accepted'), ('Rejected', 'Rejected')], default='Pending', max_length=50), + ), + ] diff --git a/tdrs-backend/tdpservice/parsers/models.py b/tdrs-backend/tdpservice/parsers/models.py index 0c0ccdc50..12c70a2c0 100644 --- a/tdrs-backend/tdpservice/parsers/models.py +++ b/tdrs-backend/tdpservice/parsers/models.py @@ -77,6 +77,7 @@ class Status(models.TextChoices): PENDING = "Pending" # file has been uploaded, but not validated ACCEPTED = "Accepted" ACCEPTED_WITH_ERRORS = "Accepted with Errors" + PARTIALLY_ACCEPTED = "Partially Accepted with Errors" REJECTED = "Rejected" status = models.CharField( @@ -85,7 +86,7 @@ class Status(models.TextChoices): default=Status.PENDING, ) - datafile = models.ForeignKey(DataFile, on_delete=models.CASCADE) + datafile = models.OneToOneField(DataFile, on_delete=models.CASCADE, related_name="summary") case_aggregates = models.JSONField(null=True, blank=False) @@ -100,11 +101,17 @@ def get_status(self): .exclude(error_message__icontains="trailer")\ .exclude(error_message__icontains="Unknown Record_Type was found.") + row_precheck_errors = errors.filter(error_type=ParserErrorCategoryChoices.PRE_CHECK)\ + .filter(field_name="Record_Type")\ + .exclude(error_message__icontains="trailer") + if errors is None: return DataFileSummary.Status.PENDING elif errors.count() == 0: return DataFileSummary.Status.ACCEPTED elif precheck_errors.count() > 0: return DataFileSummary.Status.REJECTED + elif row_precheck_errors.count() > 0: + return DataFileSummary.Status.PARTIALLY_ACCEPTED else: return DataFileSummary.Status.ACCEPTED_WITH_ERRORS diff --git a/tdrs-backend/tdpservice/parsers/parse.py b/tdrs-backend/tdpservice/parsers/parse.py index 409d239b8..05c3da3ca 100644 --- a/tdrs-backend/tdpservice/parsers/parse.py +++ b/tdrs-backend/tdpservice/parsers/parse.py @@ -20,7 +20,7 @@ def parse_datafile(datafile): header_line = rawfile.readline().decode().strip() header, header_is_valid, header_errors = schema_defs.header.parse_and_validate( header_line, - util.make_generate_parser_error(datafile, 1) + util.make_generate_file_precheck_parser_error(datafile, 1) ) if not header_is_valid: logger.info(f"Preparser Error: {len(header_errors)} header errors encountered.") diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index 9c785f79f..f6962b1c4 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -608,7 +608,7 @@ def test_parse_bad_tfs1_missing_required(bad_tanf_s1__row_missing_required_field parse.parse_datafile(bad_tanf_s1__row_missing_required_field) - assert dfs.get_status() == DataFileSummary.Status.ACCEPTED_WITH_ERRORS + assert dfs.get_status() == DataFileSummary.Status.PARTIALLY_ACCEPTED parser_errors = ParserError.objects.filter(file=bad_tanf_s1__row_missing_required_field) assert parser_errors.count() == 4 diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 073b7b8d8..e3e13538c 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -35,7 +35,7 @@ def generate_parser_error(datafile, line_number, schema, error_category, error_m row_number=line_number, column_number=getattr(field, 'item', None), item_number=getattr(field, 'item', None), - field_name=getattr(field, 'name', None), + field_name=getattr(field, 'name', None) if hasattr(field, 'name') else field, rpt_month_year=getattr(record, 'RPT_MONTH_YEAR', None), case_number=getattr(record, 'CASE_NUMBER', None), error_message=error_message, @@ -64,6 +64,22 @@ def generate(schema, error_category, error_message, record=None, field=None): return generate +def make_generate_file_precheck_parser_error(datafile, line_number): + """Configure a generate_parser_error that acts as a file pre-check error.""" + def generate(schema, error_category, error_message, record=None, field=None): + return generate_parser_error( + datafile=datafile, + line_number=line_number, + schema=schema, + error_category=error_category, + error_message=error_message, + record=record, + field=None, # purposely overridden to force a "Rejected" status for certain file precheck errors + ) + + return generate + + class SchemaManager: """Manages one or more RowSchema's and runs all parsers and validators.""" diff --git a/tdrs-backend/tdpservice/scheduling/parser_task.py b/tdrs-backend/tdpservice/scheduling/parser_task.py index f9fab7f6f..be47703c5 100644 --- a/tdrs-backend/tdpservice/scheduling/parser_task.py +++ b/tdrs-backend/tdpservice/scheduling/parser_task.py @@ -19,7 +19,8 @@ def parse(data_file_id): # for undetermined amount of time. data_file = DataFile.objects.get(id=data_file_id) - logger.info(f"DataFile parsing started for file -> {repr(data_file)}") + logger.info(f"DataFile parsing started for file {data_file.filename}") + dfs = DataFileSummary.objects.create(datafile=data_file, status=DataFileSummary.Status.PENDING) errors = parse_datafile(data_file) dfs.status = dfs.get_status() diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx index 844b0c744..d7045e15d 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx @@ -3,6 +3,13 @@ import axios from 'axios' import PropTypes from 'prop-types' import { useDispatch, useSelector } from 'react-redux' import { fileUploadSections } from '../../reducers/reports' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { + faCheckCircle, + faExclamationCircle, + faXmarkCircle, + faClock, +} from '@fortawesome/free-solid-svg-icons' import Paginator from '../Paginator' import { getAvailableFileList, download } from '../../actions/reports' import { useEffect } from 'react' @@ -11,6 +18,39 @@ import { getParseErrors } from '../../actions/createXLSReport' const formatDate = (dateStr) => new Date(dateStr).toLocaleString() +const SubmissionSummaryStatusIcon = ({ status }) => { + let icon = null + let color = null + + switch (status) { + case 'Pending': + icon = faClock + color = '#005EA2' + break + case 'Accepted': + icon = faCheckCircle + color = '#40bb45' + break + case 'Partially Accepted with Errors': + icon = faExclamationCircle + color = '#ec4e11' + break + case 'Accepted with Errors': + icon = faExclamationCircle + color = '#ec4e11' + break + case 'Rejected': + icon = faXmarkCircle + color = '#bb0000' + break + default: + break + } + return ( + + ) +} + const SubmissionHistoryRow = ({ file }) => { const dispatch = useDispatch() @@ -41,14 +81,24 @@ const SubmissionHistoryRow = ({ file }) => { {file.fileName} + + {file.summary ? ( + <> + + {file.summary && file.summary.status + ? file.summary.status + : 'Pending'} + + ) : ( + 'N/A' + )} + {file.hasError > 0 ? ( - ) : ( - 'Currently Unavailable' - )} + ) : null} ) @@ -78,6 +128,7 @@ const SectionSubmissionHistory = ({ section, label, files }) => { Submitted On Submitted By File Name + Acceptance Status Error Reports (In development) diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js index 72f3e65f8..1926cce32 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js @@ -244,8 +244,6 @@ describe('SubmissionHistory', () => { expect( screen.queryByText('Error Reports (In development)') ).toBeInTheDocument() - - expect(screen.queryByText('Currently Unavailable')).toBeInTheDocument() }) it('Shows SSP results when SSP-MOE file type selected', () => { @@ -339,4 +337,63 @@ describe('SubmissionHistory', () => { expect(screen.queryByText('test5.txt')).toBeInTheDocument() expect(screen.queryByText('test6.txt')).not.toBeInTheDocument() }) + + it.each([ + 'Pending', + 'Accepted', + 'Accepted with Errors', + 'Partially Accepted with Errors', + 'Rejected', + null, + ])('Shows the submission acceptance status', (status) => { + const state = { + reports: { + files: [ + { + id: '123', + fileName: 'test1.txt', + fileType: 'TANF', + quarter: 'Q1', + section: 'Active Case Data', + uuid: '123-4-4-321', + year: '2023', + s3_version_id: '321-0-0-123', + createdAt: '12/12/2012 12:12', + submittedBy: 'test@teamraft.com', + summary: { + datafile: '123', + status: status, + case_aggregates: { + Oct: { + total: 0, + accepted: 0, + rejected: 0, + }, + Nov: { + total: 0, + accepted: 0, + rejected: 0, + }, + Dec: { + total: 0, + accepted: 0, + rejected: 0, + }, + }, + }, + }, + ], + }, + } + + const store = appConfigureStore(state) + const dispatch = jest.fn(store.dispatch) + store.dispatch = dispatch + + setup(store) + + expect(screen.queryByText('Acceptance Status')).toBeInTheDocument() + expect(screen.queryByText('test1.txt')).toBeInTheDocument() + expect(screen.queryByText(status || 'Pending')).toBeInTheDocument() + }) }) diff --git a/tdrs-frontend/src/reducers/reports.js b/tdrs-frontend/src/reducers/reports.js index fb8698889..66c912069 100644 --- a/tdrs-frontend/src/reducers/reports.js +++ b/tdrs-frontend/src/reducers/reports.js @@ -66,6 +66,7 @@ export const serializeApiDataFile = (dataFile) => ({ createdAt: dataFile.created_at, submittedBy: dataFile.submitted_by, hasError: dataFile.has_error, + summary: dataFile.summary, }) const initialState = { @@ -131,6 +132,7 @@ const reports = (state = initialState, action) => { created_at: null, submitted_by: null, has_error: null, + summary: null, }) }), }