From 05fee9ce8b9f35b3c1b4d2d1a9d43c17d7f6a616 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 11:47:42 +0100 Subject: [PATCH 01/10] remove non-booked transactions from import --- src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js index 1de9f4848..0d4b535fe 100644 --- a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js +++ b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js @@ -7,6 +7,14 @@ export default { institutionIds: ['SSK_DUSSELDORF_DUSSDEDDXXX'], normalizeTransaction(transaction, _booked) { + // If the transaction is not booked yet by the bank, don't import it. + // Reason being that the transaction doesn't have the information yet + // to make the payee and notes field be of any use. It's filled with + // a placeholder text and wouldn't be corrected on the next sync. + if (!_booked) { + return null; + } + // Prioritize unstructured information, falling back to structured formats let remittanceInformationUnstructured = transaction.remittanceInformationUnstructured ?? From 1fa895f5a382d280b2056fd0bb251d74f9a2ca25 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 11:58:17 +0100 Subject: [PATCH 02/10] Add release notes --- upcoming-release-notes/553.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/553.md diff --git a/upcoming-release-notes/553.md b/upcoming-release-notes/553.md new file mode 100644 index 000000000..0f6ee353e --- /dev/null +++ b/upcoming-release-notes/553.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [DennaGherlyn] +--- + +Remove non-booked transactions from import of SSK_DUSSELDORF_DUSSDEDDXXX due to placeholder text in the payee and notes field \ No newline at end of file From 6fe19b1c045219eb277b578510ec9e233e3765b4 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 11:59:20 +0100 Subject: [PATCH 03/10] minor fix to please the linter --- src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js index 0d4b535fe..39780eacf 100644 --- a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js +++ b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js @@ -9,7 +9,7 @@ export default { normalizeTransaction(transaction, _booked) { // If the transaction is not booked yet by the bank, don't import it. // Reason being that the transaction doesn't have the information yet - // to make the payee and notes field be of any use. It's filled with + // to make the payee and notes field be of any use. It's filled with // a placeholder text and wouldn't be corrected on the next sync. if (!_booked) { return null; From 79dac07a690b0a8adb6a7cdda2f1b84f4a9c4f40 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 12:45:09 +0100 Subject: [PATCH 04/10] Add coderabbit suggestions --- .../banks/ssk_dusseldorf_dussdeddxxx.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js index 39780eacf..b196afe44 100644 --- a/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js +++ b/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.js @@ -12,6 +12,10 @@ export default { // to make the payee and notes field be of any use. It's filled with // a placeholder text and wouldn't be corrected on the next sync. if (!_booked) { + console.debug( + 'Skipping unbooked transaction:', + transaction.transactionId, + ); return null; } @@ -22,10 +26,12 @@ export default { transaction.remittanceInformationStructuredArray?.join(' '); if (transaction.additionalInformation) - remittanceInformationUnstructured = - (remittanceInformationUnstructured ?? '') + - ' ' + - transaction.additionalInformation; + remittanceInformationUnstructured = [ + remittanceInformationUnstructured, + transaction.additionalInformation, + ] + .filter(Boolean) + .join(' '); const usefulCreditorName = transaction.ultimateCreditor || From 847f456d17241f4c85f1d27d891aafd1d88e8a55 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 12:45:22 +0100 Subject: [PATCH 05/10] add test file --- .../tests/ssk_dusseldorf_dussdeddxxx.spec.js | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js new file mode 100644 index 000000000..52a581bdb --- /dev/null +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -0,0 +1,72 @@ +import SskDusseldorfDussdeddxxx from '../ssk_dusseldorf_dussdeddxxx.js'; + +describe('#normalizeTransaction', () => { + const bookedTransactionOne = { + transactionId: '2024102900000000-1', + bookingDate: '2024-10-29', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'a useful creditor name', + remittanceInformationStructured: 'structured information', + remittanceInformationUnstructured: 'unstructured information', + additionalInformation: 'some aditional information', + }; + + const bookedTransactionTwo = { + transactionId: '2024102900000000-2', + bookingDate: '2024-10-29', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'a useful creditor name', + ultimateCreditor: 'ultimate creditor', + remittanceInformationStructured: 'structured information', + additionalInformation: 'some aditional information', + }; + + it('properly combines remittance information', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) + .remittanceInformationUnstructured, + ).toEqual('unstructured information some aditional information'); + + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) + .remittanceInformationUnstructured, + ).toEqual('structured information some aditional information'); + }); + + it('prioritizes creditor names correctly', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) + .payeeName, + ).toEqual('a useful creditor name'); + + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) + .payeeName, + ).toEqual('ultimate creditor'); + }); + + const unbookedTransaction = { + transactionId: '2024102900000000-1', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'some nonsensical creditor', + remittanceInformationUnstructured: 'some nonsensical information', + }; + + it('returns null for unbooked transactions', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction(unbookedTransaction, false), + ).toBeNull; + }); +}); From d36d396b5cea94fe33b8b732dd527c363bd95b81 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 12:52:47 +0100 Subject: [PATCH 06/10] fix test --- .../banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js index 52a581bdb..e260bb614 100644 --- a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -45,12 +45,12 @@ describe('#normalizeTransaction', () => { expect( SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) .payeeName, - ).toEqual('a useful creditor name'); + ).toEqual('A Useful Creditor Name'); expect( SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) .payeeName, - ).toEqual('ultimate creditor'); + ).toEqual('Ultimate Creditor'); }); const unbookedTransaction = { From 41e4dbfd349db0269e84ad6f34e5d88076ad34f7 Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 12:57:21 +0100 Subject: [PATCH 07/10] add coderabbit fixes to test file --- .../tests/ssk_dusseldorf_dussdeddxxx.spec.js | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js index e260bb614..227419b65 100644 --- a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -1,5 +1,13 @@ import SskDusseldorfDussdeddxxx from '../ssk_dusseldorf_dussdeddxxx.js'; +beforeEach(() => { + jest.spyOn(console, 'debug').mockImplementation(); +}); + +afterEach(() => { + jest.restoreAllMocks(); +}); + describe('#normalizeTransaction', () => { const bookedTransactionOne = { transactionId: '2024102900000000-1', @@ -12,7 +20,7 @@ describe('#normalizeTransaction', () => { creditorName: 'a useful creditor name', remittanceInformationStructured: 'structured information', remittanceInformationUnstructured: 'unstructured information', - additionalInformation: 'some aditional information', + additionalInformation: 'some additional information', }; const bookedTransactionTwo = { @@ -26,19 +34,19 @@ describe('#normalizeTransaction', () => { creditorName: 'a useful creditor name', ultimateCreditor: 'ultimate creditor', remittanceInformationStructured: 'structured information', - additionalInformation: 'some aditional information', + additionalInformation: 'some additional information', }; it('properly combines remittance information', () => { expect( SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) .remittanceInformationUnstructured, - ).toEqual('unstructured information some aditional information'); + ).toEqual('unstructured information some additional information'); expect( SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) .remittanceInformationUnstructured, - ).toEqual('structured information some aditional information'); + ).toEqual('structured information some additional information'); }); it('prioritizes creditor names correctly', () => { @@ -67,6 +75,11 @@ describe('#normalizeTransaction', () => { it('returns null for unbooked transactions', () => { expect( SskDusseldorfDussdeddxxx.normalizeTransaction(unbookedTransaction, false), - ).toBeNull; + ).toBeNull(); + + expect(console.debug).toHaveBeenCalledWith( + 'Skipping unbooked transaction:', + unbookedTransaction.transactionId, + ); }); }); From dad0b5976556215a2b118f0ae00d5094524c6faf Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Thu, 16 Jan 2025 13:07:22 +0100 Subject: [PATCH 08/10] fix mock console --- .../banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js index 227419b65..9cc78105a 100644 --- a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -1,7 +1,8 @@ +import { jest } from '@jest/globals'; import SskDusseldorfDussdeddxxx from '../ssk_dusseldorf_dussdeddxxx.js'; beforeEach(() => { - jest.spyOn(console, 'debug').mockImplementation(); + jest.spyOn(console, 'debug').mockImplementation(() => {}); }); afterEach(() => { From f8a0cc3d70b3b459d162419ba0730ce0b532127b Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Mon, 27 Jan 2025 19:21:28 +0100 Subject: [PATCH 09/10] Correct consoleSpy to make linter happy --- .../tests/ssk_dusseldorf_dussdeddxxx.spec.js | 153 ++++++++++-------- 1 file changed, 82 insertions(+), 71 deletions(-) diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js index 9cc78105a..128895bb4 100644 --- a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -1,86 +1,97 @@ import { jest } from '@jest/globals'; import SskDusseldorfDussdeddxxx from '../ssk_dusseldorf_dussdeddxxx.js'; -beforeEach(() => { - jest.spyOn(console, 'debug').mockImplementation(() => {}); -}); +describe('ssk_dusseldorf_dussdeddxxx', () => { + let consoleSpy; -afterEach(() => { - jest.restoreAllMocks(); -}); + beforeEach(() => { + consoleSpy = jest.spyOn(console, 'debug'); + }); -describe('#normalizeTransaction', () => { - const bookedTransactionOne = { - transactionId: '2024102900000000-1', - bookingDate: '2024-10-29', - valueDate: '2024-10-29', - transactionAmount: { - amount: '-99.99', - currency: 'EUR', - }, - creditorName: 'a useful creditor name', - remittanceInformationStructured: 'structured information', - remittanceInformationUnstructured: 'unstructured information', - additionalInformation: 'some additional information', - }; + describe('#normalizeTransaction', () => { + const bookedTransactionOne = { + transactionId: '2024102900000000-1', + bookingDate: '2024-10-29', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'a useful creditor name', + remittanceInformationStructured: 'structured information', + remittanceInformationUnstructured: 'unstructured information', + additionalInformation: 'some additional information', + }; - const bookedTransactionTwo = { - transactionId: '2024102900000000-2', - bookingDate: '2024-10-29', - valueDate: '2024-10-29', - transactionAmount: { - amount: '-99.99', - currency: 'EUR', - }, - creditorName: 'a useful creditor name', - ultimateCreditor: 'ultimate creditor', - remittanceInformationStructured: 'structured information', - additionalInformation: 'some additional information', - }; + const bookedTransactionTwo = { + transactionId: '2024102900000000-2', + bookingDate: '2024-10-29', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'a useful creditor name', + ultimateCreditor: 'ultimate creditor', + remittanceInformationStructured: 'structured information', + additionalInformation: 'some additional information', + }; - it('properly combines remittance information', () => { - expect( - SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) - .remittanceInformationUnstructured, - ).toEqual('unstructured information some additional information'); + it('properly combines remittance information', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction( + bookedTransactionOne, + true, + ).remittanceInformationUnstructured, + ).toEqual('unstructured information some additional information'); - expect( - SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) - .remittanceInformationUnstructured, - ).toEqual('structured information some additional information'); - }); + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction( + bookedTransactionTwo, + true, + ).remittanceInformationUnstructured, + ).toEqual('structured information some additional information'); + }); - it('prioritizes creditor names correctly', () => { - expect( - SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionOne, true) - .payeeName, - ).toEqual('A Useful Creditor Name'); + it('prioritizes creditor names correctly', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction( + bookedTransactionOne, + true, + ).payeeName, + ).toEqual('A Useful Creditor Name'); - expect( - SskDusseldorfDussdeddxxx.normalizeTransaction(bookedTransactionTwo, true) - .payeeName, - ).toEqual('Ultimate Creditor'); - }); + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction( + bookedTransactionTwo, + true, + ).payeeName, + ).toEqual('Ultimate Creditor'); + }); - const unbookedTransaction = { - transactionId: '2024102900000000-1', - valueDate: '2024-10-29', - transactionAmount: { - amount: '-99.99', - currency: 'EUR', - }, - creditorName: 'some nonsensical creditor', - remittanceInformationUnstructured: 'some nonsensical information', - }; + const unbookedTransaction = { + transactionId: '2024102900000000-1', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-99.99', + currency: 'EUR', + }, + creditorName: 'some nonsensical creditor', + remittanceInformationUnstructured: 'some nonsensical information', + }; - it('returns null for unbooked transactions', () => { - expect( - SskDusseldorfDussdeddxxx.normalizeTransaction(unbookedTransaction, false), - ).toBeNull(); + it('returns null for unbooked transactions', () => { + expect( + SskDusseldorfDussdeddxxx.normalizeTransaction( + unbookedTransaction, + false, + ), + ).toBeNull(); - expect(console.debug).toHaveBeenCalledWith( - 'Skipping unbooked transaction:', - unbookedTransaction.transactionId, - ); + expect(consoleSpy).toHaveBeenCalledWith( + 'Skipping unbooked transaction:', + unbookedTransaction.transactionId, + ); + }); }); }); From d0fbedabc0a1fe0c58e340efbf17e6b3e3f0f5fa Mon Sep 17 00:00:00 2001 From: DennaGherlyn Date: Mon, 27 Jan 2025 19:37:41 +0100 Subject: [PATCH 10/10] Add mock cleanup --- .../banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js index 128895bb4..d04f8daea 100644 --- a/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js +++ b/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.js @@ -8,6 +8,10 @@ describe('ssk_dusseldorf_dussdeddxxx', () => { consoleSpy = jest.spyOn(console, 'debug'); }); + afterEach(() => { + consoleSpy.mockRestore(); + }); + describe('#normalizeTransaction', () => { const bookedTransactionOne = { transactionId: '2024102900000000-1',