Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Inbox showing GBR when there’s a report with RBR #51643

Merged
merged 19 commits into from
Nov 12, 2024
13 changes: 12 additions & 1 deletion src/libs/WorkspacesSettingsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,18 @@ const getBrickRoadForPolicy = (report: Report, altReportActions?: OnyxCollection
const oneTransactionThreadReportID = ReportActionsUtils.getOneTransactionThreadReportID(report.reportID, reportActions);
let doesReportContainErrors = Object.keys(reportErrors ?? {}).length !== 0 ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add line break


if (oneTransactionThreadReportID) {
if (!doesReportContainErrors) {
const parentReportActions = (altReportActions ?? allReportActions)?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report?.parentReportID}`];
const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];
const shouldDisplayViolations = ReportUtils.shouldDisplayTransactionThreadViolations(report, allTransactionViolations, parentReportAction);
const shouldDisplayReportViolations = ReportUtils.isReportOwner(report) && ReportUtils.hasReportViolations(report.reportID);
const hasViolations = shouldDisplayViolations || shouldDisplayReportViolations;
if (hasViolations) {
doesReportContainErrors = CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
}
}

if (oneTransactionThreadReportID && !doesReportContainErrors) {
const oneTransactionThreadReport = ReportUtils.getReport(oneTransactionThreadReportID);

if (
Expand Down
86 changes: 86 additions & 0 deletions tests/unit/WorkspaceSettingsUtilsTest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
{
"session": {
"accountID": 18634488
},
"reports": {
"report_4286515777714555": {
"type": "chat",
"isOwnPolicyExpenseChat": false,
"ownerAccountID": 0,
"parentReportActionID": "8722650843049927838",
"parentReportID": "6955627196303088",
"policyID": "57D0F454E0BCE54B",
"reportID": "4286515777714555",
"stateNum": 0,
"statusNum": 0
},
"report_6955627196303088": {
"reportID": "6955627196303088",
"chatReportID": "1699789757771388",
"policyID": "57D0F454E0BCE54B",
"type": "expense",
"ownerAccountID": 18634488,
"stateNum": 1,
"statusNum": 1,
"parentReportID": "1699789757771388",
"parentReportActionID": "7978085421707288417"
}
},
"transactionViolations": {
"transactionViolations_3106135972713435169": [
{
"name": "missingCategory",
"type": "violation"
}
],
"transactionViolations_3690687111940510713": [
{
"name": "missingCategory",
"type": "violation"
}
]
},
"reportActions": {
"reportActions_6955627196303088": {
"8722650843049927838": {
"actionName": "IOU",
"actorAccountID": 18634488,
"automatic": false,
"avatar": "https: //d2k5nsl2zxldvw.cloudfront.net/images/avatars/default-avatar_1.png",
"isAttachmentOnly": false,
"originalMessage": {
"amount": 12300,
"comment": "",
"currency": "VND",
"IOUTransactionID": "3106135972713435169",
"IOUReportID": "6955627196303088"
},
"message": [
{
"deleted": "",
"html": "₫123 expense",
"isDeletedParentAction": false,
"isEdited": false,
"text": "₫123 expense",
"type": "COMMENT",
"whisperedTo": []
}
],
"person": [
{
"style": "strong",
"text": "adasdasd",
"type": "TEXT"
}
],
"reportActionID": "8722650843049927838",
"shouldShow": true,
"created": "2024-11-05 11: 19: 18.706",
"childReportID": "4286515777714555",
"lastModified": "2024-11-05 11: 19: 18.706",
"childReportNotificationPreference": "hidden",
"childType": "chat"
}
}
}
}
69 changes: 69 additions & 0 deletions tests/unit/WorkspaceSettingsUtilsTest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import type {OnyxCollection} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import {getBrickRoadForPolicy} from '@libs/WorkspacesSettingsUtils';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Report, ReportActions, TransactionViolations} from '@src/types/onyx';
import type {ReportCollectionDataSet} from '@src/types/onyx/Report';
import * as TestHelper from '../utils/TestHelper';
import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
import mockData from './WorkspaceSettingsUtilsTest.json';

describe('WorkspacesSettingsUtils', () => {
beforeAll(() => {
Onyx.init({
keys: ONYXKEYS,
});
});

beforeEach(() => {
global.fetch = TestHelper.getGlobalFetchMock();
return Onyx.clear().then(waitForBatchedUpdates);
});
describe('getBrickRoadForPolicy', () => {
it('Should return "error"', async () => {
// Given mock data for reports, transaction violations, sessions, and report actions
const report = Object.values(mockData.reports)?.at(0);
const transactionViolations = mockData.transactionViolations;
const reports = mockData.reports;
const session = mockData.session;
const reportActions = mockData.reportActions;

await Onyx.multiSet({
...(reports as ReportCollectionDataSet),
...(reportActions as OnyxCollection<ReportActions>),
...(transactionViolations as OnyxCollection<TransactionViolations>),
truph01 marked this conversation as resolved.
Show resolved Hide resolved
session,
});

await waitForBatchedUpdates();

// When calling getBrickRoadForPolicy with a report and report actions
const result = getBrickRoadForPolicy(report as Report, reportActions as OnyxCollection<ReportActions>);

// Then the result should be 'error'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the result error in this case? What is it about the report and report actions that produce this result?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added 2nd test case, which will return undefined. The getBrickRoadForPolicy return error or undefined based on the transactionsViolation data.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the second test case. I still don't think I know the answer to my question though. Can you please update this code comment to explain why it's expected to be "error" and not anything else? Again, what is it about the report and report actions that produce this result?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@truph01 bump on this one. I'm still looking for some more contextual code comments for this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies, I missed that earlier. I've updated the comment. Let's aim to get this PR merged today.

expect(result).toBe('error');
});

it('Should return "undefined"', async () => {
// Given mock data for reports, transaction violations, sessions, and report actions
const report = Object.values(mockData.reports)?.at(0);
const reports = mockData.reports;
const session = mockData.session;
const reportActions = mockData.reportActions;

await Onyx.multiSet({
...(reports as ReportCollectionDataSet),
...(reportActions as OnyxCollection<ReportActions>),
session,
});

await waitForBatchedUpdates();

// When calling getBrickRoadForPolicy with a report and report actions
const result = getBrickRoadForPolicy(report as Report, reportActions as OnyxCollection<ReportActions>);

// Then the result should be 'error'
truph01 marked this conversation as resolved.
Show resolved Hide resolved
expect(result).toBe(undefined);
});
});
});
Loading