[
https://issues.apache.org/jira/browse/FINERACT-2609?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Krishna Mewara updated FINERACT-2609:
-------------------------------------
Description:
h2. What this is
Moving Fineract's integration tests off raw RestAssured HTTP and onto the
generated Feign client ({{{}fineract-client-feign{}}}). I'm doing this
Strangler Fig style: the new Feign helpers sit alongside the existing
RestAssured ones and tests move over in batches, so nothing breaks in one go.
The reason is simple. RestAssured tests build JSON by hand, so a broken API
contract only shows up when CI runs. Feign is generated from the OpenAPI spec,
so the same mistake won't compile.
This is the umbrella issue. To close: FINERACT-2454
h2. Scope note
The 50 Retrofit-based tests are out of scope here. They're already type-safe,
so they're well behind the 148 RestAssured ones in priority.
{{IntegrationTest}} stays until someone picks them up in a follow-up.
h2. Where I started — 2026-05-28
Frozen so we can see the distance travelled. I won't edit this table again.
||Metric||Count||
|Helper files in {{common/}}|123|
|Helpers using RestAssured only|53|
|Helpers using both RestAssured and Retrofit|18|
|Helpers already on Retrofit ({{{}Calls.ok{}}})|35|
|Helpers with no RestAssured (pure utility)|51|
|Test files (excluding {{common/}} and Feign)|312|
|Test files importing RestAssured|197 of 312 (63%)|
|Feign test files|10|
|Feign helpers|17|
|Feign modules|7|
|Wrapper interfaces|4|
h2. Where it stands now — 2026-07-31
||Metric||Start||Now||Left||
|Tests on Feign|10|*135* (869 test methods)|—|
|Tests on RestAssured|197|*148* (1,050 methods, ~82k lines)|148|
|Tests on Retrofit (neither RA nor Feign)|—|*50*|out of scope|
|Total test classes|312|333|—|
|Feign helpers|17|*30*|—|
|Feign modules|7|*12*|—|
|{{common/}} helpers still on RestAssured|53|*52*|52|
|{{Utils.java}} methods marked {{@Deprecated}}|0|*24 of 64*|—|
49 test files have come off RestAssured so far. The helper layer is more or
less built at this point; the bulk of what's left is moving the test files
themselves.
If anyone wants to check these numbers, this is how I count them:
{code:bash}
cd integration-tests/src/test/java/org/apache/fineract/integrationtests
RA='io\.restassured|RequestSpecification|Utils\.performServer'
FG='client\.feign|Feign[A-Z][A-Za-z]*Helper|FeignLoanTestBase|FeignIntegrationTest'
grep -rl "@Test" . --include=*.java | wc -l
# total
grep -rl "@Test" . --include=*.java | xargs grep -lE "$RA" | wc -l
# on RestAssured
grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -lE
"$FG" | wc -l # on Feign
grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -LE
"$FG" | wc -l # on Retrofit
grep -rlE "$RA" ./common --include=*.java | wc -l
# RA helpers
{code}
h2. What's left, by area
||Area||Classes||Tests||Blocked on||
|Loan|57|470|nothing|
|Savings and deposits|19|199|deposit helpers not written yet|
|Organisation and misc|37|181|nothing|
|Jobs and batch|5|69|nothing|
|Client|9|55|nothing|
|Accounting|11|40|nothing|
|Datatable and entity|4|22|nothing|
|Reporting, shares, bulkimport, group|10|36|nothing|
|*Total*|*148*|*1,050*| |
These six are big enough that each one needs its own PR:
||Class||Tests||Lines||
|{{AdvancedPaymentAllocationLoanRepaymentScheduleTest}}|86|6,625|
|{{ClientLoanIntegrationTest}}|66|8,354|
|{{FixedDepositTest}}|47|3,200|
|{{ClientSavingsIntegrationTest}}|45|3,662|
|{{BatchApiTest}}|40|2,750|
|{{RecurringDepositTest}}|38|3,128|
h2. Old classes on the way out
||Class||Start||Now||Blocked on||
|{{BaseLoanIntegrationTest}}|121|*53* (52 subclasses)|nothing|
|{{BaseSavingsIntegrationTest}}|—|*3 subclasses*|savings batch|
|{{ClientHelper}}|216|*170*|client batch|
|{{LoanTransactionHelper}}|118|*125*|loan batch|
|{{SavingsAccountHelper}}|37|*35*|savings batch|
|{{Utils.java}}|309|*345*|everything else|
|RestAssured-only helpers in {{common/}}|53|*52*|per-area Feign helpers|
Worth flagging: {{Utils.java}} and {{LoanTransactionHelper}} both went
{*}up{*}, not down. New tests are still being written against the old layer
while I'm migrating the old ones off it.
h2. Things I know are still open
A few gaps I'd record:
* {{FeignLoanHelper}} still has a handful of methods that take a JSON string
and post it through the old RestAssured utility. Any test going down those
paths isn't genuinely off RestAssured, so the 135 figure above is slightly
generous. Separate ticket for it.
* One test living under the Feign folder still builds a RestAssured request
spec itself.
* {{FeignLoanTestBase}} is now 1,562 lines, 224 methods and 99 subclasses.
It's drifting towards being the same kind of god class I'm trying to delete.
I'd rather split it once the area batches have landed than churn it
mid-migration.
h2. How the Feign side is put together
Helpers live under {{client/feign/helpers/}} (30 of them so far). Each takes
{{FineractFeignClient}} in the constructor, calls the API through {{ok(...)}} /
{{{}fail(...) }}from \{{{}FeignCalls{}}}, and returns the whole response object
rather than just an ID.
Request building lives in {{client/feign/modules/}} (12 files: the
{{{}*RequestBuilders{}}}, {{{}LoanProductTemplates{}}},
{{{}LoanTestValidators{}}}, test data holders). Tests extend
{{{}FeignIntegrationTest{}}}, {{FeignLoanTestBase}} or
{{{}FeignSavingsTestBase{}}}.
Both clients are on the classpath at the same time. The {{exclude}} in
\{{dependencies.gradle }}keeps the duplicate model classes apart.
Conventions I've settled on as I've gone:
* Feign helpers are new classes, not extra methods bolted onto the old helpers
* Wrapper interfaces only where the generated name is unreadable
({{{}create6(){}}} → {{{}createClient(){}}})
* New shared code goes in a helper or a module, never on the test base.
One-off methods stay {{private}} in the test that needs them.
* Where the generated model genuinely can't express a call, I drop to a small
raw-HTTP helper and leave a comment explaining why. Never RestAssured. If the
gap is only a field or two, I fix the Swagger DTO and regenerate instead. I
keep a running list of every one of these so none of them get forgotten.
* Coexistence was the right call for the first phase. It ends when criterion
#4 lands.
h2. PR roadmap
I'm keeping the PR count deliberately low and putting the detail into commits
instead. Each remaining PR is one area, broken into commits that each build and
pass on their own, so they can be reviewed one at a time without the PR itself
becoming unreviewable.
PRs 1 to 8 are what I'm doing in GSoC. Everything from 9 down is stretch,
listed in the order
I'd pick it up. Rows 11, 12 and 13 came off that stretch list early. Rows with
a letter were split off after the plan was written, so the numbers of the
others stay stable.
||PR||What||Files||Tests||Ticket||GitHub||Status||
|1|Savings helper, test base, Swagger fields|—|—|FINERACT-2620, 2626|#5907,
#5934|Merged|
|2|Client helper build-out, Swagger fields|—|—|FINERACT-2631, 2632|#5954,
#5955|Merged|
|3|Charges and delinquency helpers|—|—|FINERACT-2635|#5978|Merged|
|4|Loan helper: charges, transitions,
disbursement|—|—|FINERACT-2640|#5997|Merged|
|5|Loan tests, 4 tiers|—|—|FINERACT-2649|#6005, #6050, #6084, #6158|Merged|
|6|Group and centre|3|16|FINERACT-2718|#6194|Merged|
|7|Loan helper RestAssured leak, plus the two biggest loan
files|—|—|FINERACT-2779|#6321|Merged|
|8|Guardrail and contributor guide|—|—|FINERACT-2781|#6324|Merged|
|8b|Guardrail widened to every integration test, with a shrinking
baseline|—|—|FINERACT-2858|#6513|Merged|
|9|Rest of loan money movement|23|98|FINERACT-2793|#6355|Merged|
|10|Savings and deposits|9|178|FINERACT-2732|#6241, #6419, 1 more planned|Tier
1 merged, Tier 2 merged|
|11|Loan lifecycle and product|11|28|FINERACT-2824|#6433|Merged|
|12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
|13|Organisation, users, jobs, batch, config, datatables|29|140|FINERACT-2746,
2883|#6246, #6559|Part merged, #6559 in review|
|13b|Organisation stragglers: teller, email and credit bureau (each needs a
Swagger fix first), scheduler job results|5|35|FINERACT-2883|to raise|Next|
|12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
|13|Organisation, users, jobs, batch, config, datatables|29|140|FINERACT-2746,
2883|#6246, #6559|Part merged, #6559 in review|
|13b|Organisation stragglers: teller, email and credit bureau (each needs a
Swagger fix first), scheduler job results|5|35|to raise|to raise|Next|
|14|Closeout: delete the old base classes and helpers|—|—|to raise|—|Stretch|
|15|Bulk import, shares, reporting, smoke tests|20|50|to raise|—|Stretch|
|16|Split {{FeignLoanTestBase}}|—|—|to raise|—|Stretch|
|17|The Retrofit tests|13|65|to raise|—|Stretch|
Outstanding work in rows 10, 13 and 13b is 30 files and 167 tests, of which 24
files and 131 tests are in review as #6559. Row 15 covers 20 files and 50
tests, and row 17 the last 13 files and 65 tests.
h2. Log
One line per merge. I don't edit old entries, only add to the bottom.
||Date||PR||Ticket||What went in||
|2026-06-04|[#5934|https://github.com/apache/fineract/pull/5934]|FINERACT-2626|Added
{{rejectedOnDate}} and {{withdrawnOnDate}} to the savings Swagger spec. The
generated model was missing them, so a reject call was rejected with a 400
rather than doing what the test asked. Needed before #5907 could land.|
|2026-06-07|[#5907|https://github.comFINERACT-2620|First area done end to|
h2. PR roadmap
I'm keeping the PR count deliberately low and putting the detail into commits
instead. Each remaining
PR is one area, broken into commits their own, so they can be reviewed oneat a
time without the PR itself becoming unreviewable.
PRs 1 to 8 are what I'm doing in GSoCstretch, listed in the order
I'd pick it up. Rows 11, 12 and 13 came off that stretch list early.
||PR||What||Files||Tests||Ticket||Git||
|1|Savings helper, test base, Swagger fields|—|—|FINERACT-2620, 2626|#5907,
#5934|Merged|
|2|Client helper build-out, Swagger fields|—|—|FINERACT-2631, 2632|#5954,
#5955|Merged|
|3|Charges and delinquency helpers|—|—|FINERACT-2635|#5978|Merged|
|4|Loan helper: charges, transitions,
disbursement|—|—|FINERACT-2640|#5997|Merged|
|5|Loan tests, 4 tiers|—|—|FINERACT-2649|#6005, #6050, #6084, #6158|Merged|
|6|Group and centre|3|16|FINERACT-2718|#6194|Merged|
|7|Loan helper RestAssured leak, plus the two biggest loan
files|—|—|FINERACT-2779|#6321|Merged|
|8|Guardrail and contributor guide|—|—|FINERACT-2781, 2858|#6324, #6513|Merged|
|9|Rest of loan money movement|23|98|FINERACT-2793|#6355|Merged|
|10|Savings and deposits|9|178|FINERACT-2732|#6241, #6419, 1 more planned|Tier
1 merged, Tier 2 merged|
|11|Loan lifecycle and product|11|28|FINERACT-2824|#6433|Merged|
|12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
|13|Organisation, jobs, batch, config|34|175|FINERACT-2746, 2883|#6246, #6559,
1 more planned|Part merged, #6559 in review|
|14|Closeout: delete the old base classes and helpers|—|—|to raise|—|Stretch|
|15|Bulk import, shares, reporting, stretch|20|65|to raise|—|Stretch|
|16|Split {{FeignLoanTestBase}}|—|—|to raise|—|Stretch|
|17|The Retrofit tests|13|65|to raise|—|Stretch|
Outstanding work in rows 10 and 13 is 30 files and 167 tests, of which 24 files
and 131 tests are in review as #6559. Row 15 covers the last 13 files and 65
tests.
h2. Log
One line per merge. I don't edit old tombs.
||Date||PR||Ticket||What went in||
|2026-06-04|#5934|FINERACT-2626|Added {{rejectedOnDate}} and
{{withdrawnOnDate}} to the savings Swagger spec. The generated model was
missing them, so a reject call was rejected with a 400 rather than doing what
the test asked. Needed before #5907 could land.|
|2026-06-07|#5907|FINERACT-2620|First area done end to end. 10 new files:
savings helper, test base, lifecycle extension, request builders, and an 8-test
lifecycle test to prove the pattern.|
|2026-06-09|#5955|FINERACT-2632|Client Swagger fields the server accepts but
the model didn't: the withdrawal fields, and {{{}firstname{}}}/{{{}lastname{}}}
on PUT.|
|2026-06-09|#5954|FINERACT-2631|{{FeignClientHelper}} from 4 methods to 16,
plus {{ClientRelient}} lifecycle test.|
|2026-06-11|#5978|FINERACT-2635|Charges and delinquency: {{FeignChargesHelper}}
(14 methods), {{{}ChargeRequestBuilders{}}}, and a 7-test delinquency
lifecycle. Also fixed 4 fields missing from {{PostChargesRequest}} that were
sending nulls on PUT.|
|2026-06-21|#5997|FINERACT-2640|Loan helper grew charge management, state
transitions, disbursement: 11 charge methods, 6 transitions, 4 disbursement
methods.|
|2026-06-26|4 PRs|FINERACT-2649|Loan tests in four tiers. Tier 4 is the big one
at 92 files. Per-PR detail and review notes are on that ticket rather than
duplicated here. Final tier merged 2026-08-17, see the line below.|
|2026-07-28|#6194|FINERACT-2718|Group and centre. New helpers for group,
centre, staff and GLIM. Migrated {{{}CenterIntegrationTest{}}}, {{GroupTest}}
and {{GroupLoanIntegrationTest}} (16 tests), plus a stopgap helper that was
Feign in name only. No changes to the shared loan test base. Merged 2026-08-13.|
|2026-08-11|#6246|FINERACT-2746|Organisation area, taken out of order because
it was self-contained: migrated {{{}OfficeIntegrationTest{}}},
{{{}RatesTest{}}}, {{{}ProductMixIntegrationTest{}}}, {{HookIntegrationTest}}
and {{ExternalEventConfigurationIntegrationTest}} — onto five new helpers, plus
{{RateRequestBuilders}} and {{{}ExternalEventConfigurationTestDates{}}}, no
production code touched.|
|2026-08-17|#6158|FINERACT-2649|Tier 4, the last and largest loan tier: 99
files over 26 commits, closing out the loan test migration. Every Swagger gap
fixed at source rather than worked around: due dates on
{{{}LoansApiResourceSwagger{}}}, the client charge {{amount}} retyped from
{{Integer}} to {{{}BigDecimal{}}}, and a request body on
{{{}InteropApiResource{}}}. The retype trips swagger-brake R010; that was
accepted on the ruling that the server parses gets corrected even when the gate
goes red.|
|2026-08-28|#6241|FINERACT-2732|Savings and deposits, tier 1. All 14 small
savings classes onto {{{}FeignSavingsTestBase{}}}, 34 files. Six Swagger
commits for shapes the endpoints already accepted:
{{{}isInterestManualOrAutomatic{}}}, datatable {{{}transactionId{}}}, the
transaction-search {{Set}} to {{{}List{}}}, the adjust response retyped to
{{{}CommandProcessingResult{}}}, {{note}} and
{{{}withdrawalFeeForTransfers{}}}, plus an {{@ApiResponse}} on the four
transactions. Tiers 2 and 3 are row 10.|
|2026-08-28|#6321|FINERACT-2779|RestAssured out of {{FeignLoanHelper}} itself:
the {{*FromJson}} methods that built raw JSON and parsed raw responses
underneath a Feign surface are gone. 45 files, 37 of them test classes
repointed at the typed signatures, plus {{LoansApiResourceSwagger}} and
{{{}RescheduleLoansApiResourceSwagger{}}}. Loan product and loan ids retyped
from {{Integer}} to {{{}Long{}}}, which surfaced a private
{{applyForLoanApplication}} overload in
{{ClientLoanChargeExternalIntegrationTest}} colliding with the base method.
Clears the checkstyle rule.|
|2026-08-31|#6324|FINERACT-2781|The guardrail: a checkstyle rule forbidding
REST Assured in the test package, plus the contributor guide chapter describing
the conventions. 4 files. Deliberately red against its own rule until #6321
removed the last offender, so the two had to merge in that order.|
|2026-09-04|#6355|FINERACT-2793|The rest of loan money movement: 23 test
classes over 15 commits, 44 files. Charge-off, overpaid, refunds, down payment,
disbursement and amortization, group meeting driven schedules, guarantors,
tranche and variable installments. New Feign helpers for guarantors and
variable installments, user creation added to the Feign user helper, and the
post dated checks a disbursement carries now modelled. Ends by retiring the
RestAssured loan test base class.|
|2026-09-25|#6433|FINERACT-2824|Loan lifecycle and product, row 11: 11 test
classes (28 files). The loan product configuration, loan application, auditing
and concurrency tests, plus REST Assured out of
{{{}WorkingCapitalLoanOriginatorsTest{}}}, and fixing {{externalId}} on the
loan product response. {{DisallowBackdatedTransactionsIntegrationTest}} moved
to row 10, as it is a pure savings test.|
|2026-09-25|#6419|FINERACT-2732|Savings and deposits, tier 2: 15 commits, 58
files. {{{}FixedDepositTest{}}}, {{{}RecurringDepositTest{}}},
{{{}ClientSavingsIntegrationTest{}}}, {{{}AccountTransferTest{}}},
{{{}AccountTransferOverdraftTest{}}}, {{GroupSavingsIntegrationTest}} and
{{ShareAccountChargeRoundingTest}} migrated, along with the ordered savings
account tests, with a new {{FeignDepositTestBase}} for the deposit, savings,
group savings and share account payloads, and the savings charge
{{feeOnMonthDay}} type corrected. Retires {{{}BaseSavingsIntegrationTest{}}}.|
|2026-10-01|#6513|FINERACT-2858|The #6324 guardrail widened from the Feign
package to everywhere: a REST Assured import now fails checkstyle anywhere
except the files listed in {{{}restassured-baseline.xml{}}}, a list that only
shrinks as migrations land. Also moved the centre {{orderBy}} validation tests
onto Feign. 6 files.|
|2026-10-01|#6516|FINERACT-2859|Client, charges and accounting, row 12 in one
PR: 17 test classes (96 tests) over 10 commits, 53 files. Client lifecycle,
search, identifiers, charges, transactions, collateral and notes; the charge
tests; and the accounting rule, financial activity, provisioning and accounting
scenario tests. Ten Swagger fixes at source, among them the internal client
audit shape as an array, the identifier update {{changes}} schema, and the
charge {{feeOnMonthDay}} shape. Removes the recurring deposit and tax helpers
left without callers.|
was:
h2. What this is
Moving Fineract's integration tests off raw RestAssured HTTP and onto the
generated Feign client ({{{}fineract-client-feign{}}}). I'm doing this
Strangler Fig style: the new Feign helpers sit alongside the existing
RestAssured ones and tests move over in batches, so nothing breaks in one go.
The reason is simple. RestAssured tests build JSON by hand, so a broken API
contract only shows up when CI runs. Feign is generated from the OpenAPI spec,
so the same mistake won't compile.
This is the umbrella issue. To close: FINERACT-2454
h2. Scope note
The 50 Retrofit-based tests are out of scope here. They're already type-safe,
so they're well behind the 148 RestAssured ones in priority.
{{IntegrationTest}} stays until someone picks them up in a follow-up.
h2. Where I started — 2026-05-28
Frozen so we can see the distance travelled. I won't edit this table again.
||Metric||Count||
|Helper files in {{common/}}|123|
|Helpers using RestAssured only|53|
|Helpers using both RestAssured and Retrofit|18|
|Helpers already on Retrofit ({{{}Calls.ok{}}})|35|
|Helpers with no RestAssured (pure utility)|51|
|Test files (excluding {{common/}} and Feign)|312|
|Test files importing RestAssured|197 of 312 (63%)|
|Feign test files|10|
|Feign helpers|17|
|Feign modules|7|
|Wrapper interfaces|4|
h2. Where it stands now — 2026-07-31
||Metric||Start||Now||Left||
|Tests on Feign|10|*135* (869 test methods)|—|
|Tests on RestAssured|197|*148* (1,050 methods, ~82k lines)|148|
|Tests on Retrofit (neither RA nor Feign)|—|*50*|out of scope|
|Total test classes|312|333|—|
|Feign helpers|17|*30*|—|
|Feign modules|7|*12*|—|
|{{common/}} helpers still on RestAssured|53|*52*|52|
|{{Utils.java}} methods marked {{@Deprecated}}|0|*24 of 64*|—|
49 test files have come off RestAssured so far. The helper layer is more or
less built at this point; the bulk of what's left is moving the test files
themselves.
If anyone wants to check these numbers, this is how I count them:
{code:bash}
cd integration-tests/src/test/java/org/apache/fineract/integrationtests
RA='io\.restassured|RequestSpecification|Utils\.performServer'
FG='client\.feign|Feign[A-Z][A-Za-z]*Helper|FeignLoanTestBase|FeignIntegrationTest'
grep -rl "@Test" . --include=*.java | wc -l
# total
grep -rl "@Test" . --include=*.java | xargs grep -lE "$RA" | wc -l
# on RestAssured
grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -lE
"$FG" | wc -l # on Feign
grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -LE
"$FG" | wc -l # on Retrofit
grep -rlE "$RA" ./common --include=*.java | wc -l
# RA helpers
{code}
h2. What's left, by area
||Area||Classes||Tests||Blocked on||
|Loan|57|470|nothing|
|Savings and deposits|19|199|deposit helpers not written yet|
|Organisation and misc|37|181|nothing|
|Jobs and batch|5|69|nothing|
|Client|9|55|nothing|
|Accounting|11|40|nothing|
|Datatable and entity|4|22|nothing|
|Reporting, shares, bulkimport, group|10|36|nothing|
|*Total*|*148*|*1,050*| |
These six are big enough that each one needs its own PR:
||Class||Tests||Lines||
|{{AdvancedPaymentAllocationLoanRepaymentScheduleTest}}|86|6,625|
|{{ClientLoanIntegrationTest}}|66|8,354|
|{{FixedDepositTest}}|47|3,200|
|{{ClientSavingsIntegrationTest}}|45|3,662|
|{{BatchApiTest}}|40|2,750|
|{{RecurringDepositTest}}|38|3,128|
h2. Old classes on the way out
||Class||Start||Now||Blocked on||
|{{BaseLoanIntegrationTest}}|121|*53* (52 subclasses)|nothing|
|{{BaseSavingsIntegrationTest}}|—|*3 subclasses*|savings batch|
|{{ClientHelper}}|216|*170*|client batch|
|{{LoanTransactionHelper}}|118|*125*|loan batch|
|{{SavingsAccountHelper}}|37|*35*|savings batch|
|{{Utils.java}}|309|*345*|everything else|
|RestAssured-only helpers in {{common/}}|53|*52*|per-area Feign helpers|
Worth flagging: {{Utils.java}} and {{LoanTransactionHelper}} both went
{*}up{*}, not down. New tests are still being written against the old layer
while I'm migrating the old ones off it.
h2. Things I know are still open
A few gaps I'd record:
* {{FeignLoanHelper}} still has a handful of methods that take a JSON string
and post it through the old RestAssured utility. Any test going down those
paths isn't genuinely off RestAssured, so the 135 figure above is slightly
generous. Separate ticket for it.
* One test living under the Feign folder still builds a RestAssured request
spec itself.
* {{FeignLoanTestBase}} is now 1,562 lines, 224 methods and 99 subclasses.
It's drifting towards being the same kind of god class I'm trying to delete.
I'd rather split it once the area batches have landed than churn it
mid-migration.
h2. How the Feign side is put together
Helpers live under {{client/feign/helpers/}} (30 of them so far). Each takes
{{FineractFeignClient}} in the constructor, calls the API through {{ok(...)}} /
{{{}fail(...) }}from \{{{}FeignCalls{}}}, and returns the whole response object
rather than just an ID.
Request building lives in {{client/feign/modules/}} (12 files: the
{{{}*RequestBuilders{}}}, {{{}LoanProductTemplates{}}},
{{{}LoanTestValidators{}}}, test data holders). Tests extend
{{{}FeignIntegrationTest{}}}, {{FeignLoanTestBase}} or
{{{}FeignSavingsTestBase{}}}.
Both clients are on the classpath at the same time. The {{exclude}} in
\{{dependencies.gradle }}keeps the duplicate model classes apart.
Conventions I've settled on as I've gone:
* Feign helpers are new classes, not extra methods bolted onto the old helpers
* Wrapper interfaces only where the generated name is unreadable
({{{}create6(){}}} → {{{}createClient(){}}})
* New shared code goes in a helper or a module, never on the test base.
One-off methods stay {{private}} in the test that needs them.
* Where the generated model genuinely can't express a call, I drop to a small
raw-HTTP helper and leave a comment explaining why. Never RestAssured. If the
gap is only a field or two, I fix the Swagger DTO and regenerate instead. I
keep a running list of every one of these so none of them get forgotten.
* Coexistence was the right call for the first phase. It ends when criterion
#4 lands.
h2. PR roadmap
I'm keeping the PR count deliberately low and putting the detail into commits
instead. Each remaining PR is one area, broken into commits that each build and
pass on their own, so they can be reviewed one at a time without the PR itself
becoming unreviewable.
PRs 1 to 8 are what I'm doing in GSoC. Everything from 9 down is stretch,
listed in the order
I'd pick it up. Rows 11 and 13 came off that stretch list early.
||PR||What||Files||Tests||Ticket||GitHub||Status||
|1|Savings helper, test base, Swagger fields|—|—|FINERACT-2620, 2626|#5907,
#5934|Merged|
|2|Client helper build-out, Swagger fields|—|—|FINERACT-2631, 2632|#5954,
#5955|Merged|
|3|Charges and delinquency helpers|—|—|FINERACT-2635|#5978|Merged|
|4|Loan helper: charges, transitions,
disbursement|—|—|FINERACT-2640|#5997|Merged|
|5|Loan tests, 4 tiers|—|—|FINERACT-2649|#6005, #6050, #6084, #6158|Merged|
|6|Group and centre|3|16|FINERACT-2718|#6194|Merged|
|7|Loan helper RestAssured leak, plus the two biggest loan
files|—|—|FINERACT-2779|#6321|Merged|
|8|Guardrail and contributor guide|—|—|FINERACT-2781|#6324|Merged|
|9|Rest of loan money movement|23|98|FINERACT-2793|#6355|Merged|
|10|Savings and deposits|9|178|FINERACT-2732|#6241, #6419, 1 more planned|Tier
1 merged, Tier 2 merged|
|11|Loan lifecycle and product|11|28|FINERACT-2824|—|Merged|
|12|Client, charges, accounting|15|91|to raise|—|Stretch|
|13|Organisation, jobs, batch, config|25|135|FINERACT-2746|#6246, more to
raise|Part merged|
|14|Closeout: delete the old base classes and helpers|—|—|to raise|—|Stretch|
|15|Bulk import, shares, reporting, smoke tests|20|50|to raise|—|Stretch|
|16|Split {{FeignLoanTestBase}}|—|—|to raise|—|Stretch|
|17|The Retrofit tests|13|65|to raise|—|Stretch|
Outstanding work in rows 10 to 13 is 60 files and 432 tests. Row 15 covers 20
files and 50 tests, and row 17 the last 13 files and 65 tests.
h2. Log
One line per merge. I don't edit old entries, only add to the bottom.
||Date||PR||Ticket||What went in||
|2026-06-04|[#5934|https://github.com/apache/fineract/pull/5934]|FINERACT-2626|Added
{{rejectedOnDate}} and {{withdrawnOnDate}} to the savings Swagger spec. The
generated model was missing them, so a reject call was rejected with a 400
rather than doing what the test asked. Needed before #5907 could land.|
|2026-06-07|[#5907|https://github.com/apache/fineract/pull/5907]|FINERACT-2620|First
area done end to end. 10 new files: savings helper, test base, lifecycle
extension, request builders, and an 8-test lifecycle test to prove the pattern
works.|
|2026-06-09|[#5955|https://github.com/apache/fineract/pull/5955]|FINERACT-2632|Client
Swagger fields the server accepts but the model didn't have:
{{{}submittedOnDate{}}}, the withdrawal fields, and
{{{}firstname{}}}/{{{}lastname{}}} on PUT.|
|2026-06-09|[#5954|https://github.com/apache/fineract/pull/5954]|FINERACT-2631|{{FeignClientHelper}}
from 4 methods to 16, plus {{ClientRequestBuilders}} and a full client
lifecycle test.|
|2026-06-11|[#5978|https://github.com/apache/fineract/pull/5978]|FINERACT-2635|Charges
and delinquency: {{FeignChargesHelper}} (14 methods),
{{{}ChargeRequestBuilders{}}}, and a 7-test delinquency lifecycle. Also fixed 4
fields missing from {{PostChargesRequest}} that were sending nulls on PUT.|
|2026-06-21|[#5997|https://github.com/apache/fineract/pull/5997]|FINERACT-2640|Loan
helper grew charge management, state transitions, disbursement details and
reschedule: 11 charge methods, 6 transitions, 4 disbursement methods.|
|from 2026-06-26|4 PRs|FINERACT-2649|The loan test migration, done in four
tiers. Tier 4 is the big one at 92 files. Per-PR detail and review notes are on
that ticket rather than duplicated here. Final tier merged 2026-08-17, see the
line below.|
|2026-07-28|[#6194|https://github.com/apache/fineract/pull/6194]|FINERACT-2718|Group
and centre. New helpers for group, centre, staff and GLIM. Migrated
{{{}CenterIntegrationTest{}}}, {{GroupTest}} and {{GroupLoanIntegrationTest}}
(16 tests) and retired a raw-HTTP stopgap helper that was Feign in name only.
No changes to the shared loan test base. Merged 2026-08-13.|
|2026-08-11|[#6246|https://github.com/apache/fineract/pull/6246]|FINERACT-2746|Organisation
area, taken out of order because it was self-contained. Five test classes —
{{{}OfficeIntegrationTest{}}}, {{{}RatesTest{}}},
{{{}ProductMixIntegrationTest{}}}, {{HookIntegrationTest}} and
{{ExternalEventConfigurationIntegrationTest}} — onto five new helpers, plus
{{RateRequestBuilders}} and {{{}ExternalEventConfigurationTestData{}}}. Three
commits, 15 files, no production code touched.|
|2026-08-17|[#6158|https://github.com/apache/fineract/pull/6158]|FINERACT-2649|Tier
4, the last and largest loan tier: 99 files over 26 commits, closing out the
loan test migration. Every Swagger gap fixed at source rather than worked
around — collateral and charge due dates on {{{}LoansApiResourceSwagger{}}},
the client charge {{amount}} retyped from {{Integer}} to {{{}BigDecimal{}}},
and a request body on {{{}InteropApiResource{}}}. The retype trips
swagger-brake R010; that was accepted on the ruling that a schema lying about
what the server parses gets corrected even when the gate goes red.|
|2026-08-28|[#6241|https://github.com/apache/fineract/pull/6241]|FINERACT-2732|Savings
and deposits, tier 1. All 14 small savings classes onto
{{{}FeignSavingsTestBase{}}}, 34 files. Six Swagger commits for shapes the
endpoints already accepted or returned: {{{}postInterestManualOrAutomatic{}}},
datatable {{{}transactionId{}}}, the transaction-search {{Set}} to
{{{}List{}}}, the adjust response retyped to {{{}CommandProcessingResult{}}},
{{note}} and {{{}withdrawalFeeForTransfers{}}}, plus an {{@ApiResponse}} on the
four transaction {{retrieveOne}} overloads. Tiers 2 and 3 are row 10.|
|2026-08-28|[#6321|https://github.com/apache/fineract/pull/6321]|FINERACT-2779|RestAssured
out of {{FeignLoanHelper}} itself: the {{*FromJson}} methods that built raw
JSON and parsed raw responses underneath a Feign surface are gone. 45 files, 37
of them test classes repointed at the typed signatures, plus
{{LoansApiResourceSwagger}} and {{{}RescheduleLoansApiResourceSwagger{}}}. Loan
product and loan ids retyped from {{Integer}} to {{{}Long{}}}, which surfaced a
private {{applyForLoanApplication}} overload in
{{ClientLoanChargeExternalIntegrationTest}} colliding with the base method.
Clears the checkstyle rule shipped in #6324.|
|2026-08-31|[#6324|https://github.com/apache/fineract/pull/6324]|FINERACT-2781|The
guardrail: a checkstyle rule forbidding REST Assured inside the Feign
integration test package, plus the contributor guide chapter describing the
conventions. 4 files. Deliberately red against its own rule until #6321 removed
the last offender, so the two had to merge in that order.|
|2026-09-04|[#6355|https://github.com/apache/fineract/pull/6355]|FINERACT-2793|The
rest of loan money movement: 23 test classes over 15 commits, 44 files.
Charge-off, overpaid, refunds, down payment, disbursement and amortization,
group meeting driven schedules, guarantors, tranche and variable installments.
New Feign helpers for guarantors and variable installments, user creation added
to the Feign user helper, and the post dated checks a disbursement carries now
modelled. Ends by retiring the RestAssured loan test base class.|
> Migrate integration test helpers from RestAssured to Feign client
> -----------------------------------------------------------------
>
> Key: FINERACT-2609
> URL: https://issues.apache.org/jira/browse/FINERACT-2609
> Project: Apache Fineract
> Issue Type: Improvement
> Components: Test
> Affects Versions: 1.15.0
> Reporter: Krishna Mewara
> Assignee: Krishna Mewara
> Priority: Trivial
> Labels: beginner-friendly, feign-migration, gsoc2026,
> test-infrastructure
>
> h2. What this is
> Moving Fineract's integration tests off raw RestAssured HTTP and onto the
> generated Feign client ({{{}fineract-client-feign{}}}). I'm doing this
> Strangler Fig style: the new Feign helpers sit alongside the existing
> RestAssured ones and tests move over in batches, so nothing breaks in one go.
> The reason is simple. RestAssured tests build JSON by hand, so a broken API
> contract only shows up when CI runs. Feign is generated from the OpenAPI
> spec, so the same mistake won't compile.
> This is the umbrella issue. To close: FINERACT-2454
> h2. Scope note
> The 50 Retrofit-based tests are out of scope here. They're already type-safe,
> so they're well behind the 148 RestAssured ones in priority.
> {{IntegrationTest}} stays until someone picks them up in a follow-up.
> h2. Where I started — 2026-05-28
> Frozen so we can see the distance travelled. I won't edit this table again.
> ||Metric||Count||
> |Helper files in {{common/}}|123|
> |Helpers using RestAssured only|53|
> |Helpers using both RestAssured and Retrofit|18|
> |Helpers already on Retrofit ({{{}Calls.ok{}}})|35|
> |Helpers with no RestAssured (pure utility)|51|
> |Test files (excluding {{common/}} and Feign)|312|
> |Test files importing RestAssured|197 of 312 (63%)|
> |Feign test files|10|
> |Feign helpers|17|
> |Feign modules|7|
> |Wrapper interfaces|4|
> h2. Where it stands now — 2026-07-31
> ||Metric||Start||Now||Left||
> |Tests on Feign|10|*135* (869 test methods)|—|
> |Tests on RestAssured|197|*148* (1,050 methods, ~82k lines)|148|
> |Tests on Retrofit (neither RA nor Feign)|—|*50*|out of scope|
> |Total test classes|312|333|—|
> |Feign helpers|17|*30*|—|
> |Feign modules|7|*12*|—|
> |{{common/}} helpers still on RestAssured|53|*52*|52|
> |{{Utils.java}} methods marked {{@Deprecated}}|0|*24 of 64*|—|
> 49 test files have come off RestAssured so far. The helper layer is more or
> less built at this point; the bulk of what's left is moving the test files
> themselves.
> If anyone wants to check these numbers, this is how I count them:
> {code:bash}
> cd integration-tests/src/test/java/org/apache/fineract/integrationtests
> RA='io\.restassured|RequestSpecification|Utils\.performServer'
> FG='client\.feign|Feign[A-Z][A-Za-z]*Helper|FeignLoanTestBase|FeignIntegrationTest'
> grep -rl "@Test" . --include=*.java | wc -l
> # total
> grep -rl "@Test" . --include=*.java | xargs grep -lE "$RA" | wc -l
> # on RestAssured
> grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -lE
> "$FG" | wc -l # on Feign
> grep -rl "@Test" . --include=*.java | xargs grep -LE "$RA" | xargs grep -LE
> "$FG" | wc -l # on Retrofit
> grep -rlE "$RA" ./common --include=*.java | wc -l
> # RA helpers
> {code}
> h2. What's left, by area
> ||Area||Classes||Tests||Blocked on||
> |Loan|57|470|nothing|
> |Savings and deposits|19|199|deposit helpers not written yet|
> |Organisation and misc|37|181|nothing|
> |Jobs and batch|5|69|nothing|
> |Client|9|55|nothing|
> |Accounting|11|40|nothing|
> |Datatable and entity|4|22|nothing|
> |Reporting, shares, bulkimport, group|10|36|nothing|
> |*Total*|*148*|*1,050*| |
> These six are big enough that each one needs its own PR:
> ||Class||Tests||Lines||
> |{{AdvancedPaymentAllocationLoanRepaymentScheduleTest}}|86|6,625|
> |{{ClientLoanIntegrationTest}}|66|8,354|
> |{{FixedDepositTest}}|47|3,200|
> |{{ClientSavingsIntegrationTest}}|45|3,662|
> |{{BatchApiTest}}|40|2,750|
> |{{RecurringDepositTest}}|38|3,128|
> h2. Old classes on the way out
> ||Class||Start||Now||Blocked on||
> |{{BaseLoanIntegrationTest}}|121|*53* (52 subclasses)|nothing|
> |{{BaseSavingsIntegrationTest}}|—|*3 subclasses*|savings batch|
> |{{ClientHelper}}|216|*170*|client batch|
> |{{LoanTransactionHelper}}|118|*125*|loan batch|
> |{{SavingsAccountHelper}}|37|*35*|savings batch|
> |{{Utils.java}}|309|*345*|everything else|
> |RestAssured-only helpers in {{common/}}|53|*52*|per-area Feign helpers|
> Worth flagging: {{Utils.java}} and {{LoanTransactionHelper}} both went
> {*}up{*}, not down. New tests are still being written against the old layer
> while I'm migrating the old ones off it.
> h2. Things I know are still open
> A few gaps I'd record:
> * {{FeignLoanHelper}} still has a handful of methods that take a JSON string
> and post it through the old RestAssured utility. Any test going down those
> paths isn't genuinely off RestAssured, so the 135 figure above is slightly
> generous. Separate ticket for it.
> * One test living under the Feign folder still builds a RestAssured request
> spec itself.
> * {{FeignLoanTestBase}} is now 1,562 lines, 224 methods and 99 subclasses.
> It's drifting towards being the same kind of god class I'm trying to delete.
> I'd rather split it once the area batches have landed than churn it
> mid-migration.
> h2. How the Feign side is put together
> Helpers live under {{client/feign/helpers/}} (30 of them so far). Each takes
> {{FineractFeignClient}} in the constructor, calls the API through {{ok(...)}}
> / {{{}fail(...) }}from \{{{}FeignCalls{}}}, and returns the whole response
> object rather than just an ID.
> Request building lives in {{client/feign/modules/}} (12 files: the
> {{{}*RequestBuilders{}}}, {{{}LoanProductTemplates{}}},
> {{{}LoanTestValidators{}}}, test data holders). Tests extend
> {{{}FeignIntegrationTest{}}}, {{FeignLoanTestBase}} or
> {{{}FeignSavingsTestBase{}}}.
> Both clients are on the classpath at the same time. The {{exclude}} in
> \{{dependencies.gradle }}keeps the duplicate model classes apart.
> Conventions I've settled on as I've gone:
> * Feign helpers are new classes, not extra methods bolted onto the old
> helpers
> * Wrapper interfaces only where the generated name is unreadable
> ({{{}create6(){}}} → {{{}createClient(){}}})
> * New shared code goes in a helper or a module, never on the test base.
> One-off methods stay {{private}} in the test that needs them.
> * Where the generated model genuinely can't express a call, I drop to a
> small raw-HTTP helper and leave a comment explaining why. Never RestAssured.
> If the gap is only a field or two, I fix the Swagger DTO and regenerate
> instead. I keep a running list of every one of these so none of them get
> forgotten.
> * Coexistence was the right call for the first phase. It ends when criterion
> #4 lands.
> h2. PR roadmap
> I'm keeping the PR count deliberately low and putting the detail into commits
> instead. Each remaining PR is one area, broken into commits that each build
> and pass on their own, so they can be reviewed one at a time without the PR
> itself becoming unreviewable.
> PRs 1 to 8 are what I'm doing in GSoC. Everything from 9 down is stretch,
> listed in the order
> I'd pick it up. Rows 11, 12 and 13 came off that stretch list early. Rows
> with a letter were split off after the plan was written, so the numbers of
> the others stay stable.
> ||PR||What||Files||Tests||Ticket||GitHub||Status||
> |1|Savings helper, test base, Swagger fields|—|—|FINERACT-2620, 2626|#5907,
> #5934|Merged|
> |2|Client helper build-out, Swagger fields|—|—|FINERACT-2631, 2632|#5954,
> #5955|Merged|
> |3|Charges and delinquency helpers|—|—|FINERACT-2635|#5978|Merged|
> |4|Loan helper: charges, transitions,
> disbursement|—|—|FINERACT-2640|#5997|Merged|
> |5|Loan tests, 4 tiers|—|—|FINERACT-2649|#6005, #6050, #6084, #6158|Merged|
> |6|Group and centre|3|16|FINERACT-2718|#6194|Merged|
> |7|Loan helper RestAssured leak, plus the two biggest loan
> files|—|—|FINERACT-2779|#6321|Merged|
> |8|Guardrail and contributor guide|—|—|FINERACT-2781|#6324|Merged|
> |8b|Guardrail widened to every integration test, with a shrinking
> baseline|—|—|FINERACT-2858|#6513|Merged|
> |9|Rest of loan money movement|23|98|FINERACT-2793|#6355|Merged|
> |10|Savings and deposits|9|178|FINERACT-2732|#6241, #6419, 1 more
> planned|Tier 1 merged, Tier 2 merged|
> |11|Loan lifecycle and product|11|28|FINERACT-2824|#6433|Merged|
> |12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
> |13|Organisation, users, jobs, batch, config,
> datatables|29|140|FINERACT-2746, 2883|#6246, #6559|Part merged, #6559 in
> review|
> |13b|Organisation stragglers: teller, email and credit bureau (each needs a
> Swagger fix first), scheduler job results|5|35|FINERACT-2883|to raise|Next|
> |12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
> |13|Organisation, users, jobs, batch, config,
> datatables|29|140|FINERACT-2746, 2883|#6246, #6559|Part merged, #6559 in
> review|
> |13b|Organisation stragglers: teller, email and credit bureau (each needs a
> Swagger fix first), scheduler job results|5|35|to raise|to raise|Next|
> |14|Closeout: delete the old base classes and helpers|—|—|to raise|—|Stretch|
> |15|Bulk import, shares, reporting, smoke tests|20|50|to raise|—|Stretch|
> |16|Split {{FeignLoanTestBase}}|—|—|to raise|—|Stretch|
> |17|The Retrofit tests|13|65|to raise|—|Stretch|
> Outstanding work in rows 10, 13 and 13b is 30 files and 167 tests, of which
> 24 files and 131 tests are in review as #6559. Row 15 covers 20 files and 50
> tests, and row 17 the last 13 files and 65 tests.
> h2. Log
> One line per merge. I don't edit old entries, only add to the bottom.
> ||Date||PR||Ticket||What went in||
> |2026-06-04|[#5934|https://github.com/apache/fineract/pull/5934]|FINERACT-2626|Added
> {{rejectedOnDate}} and {{withdrawnOnDate}} to the savings Swagger spec. The
> generated model was missing them, so a reject call was rejected with a 400
> rather than doing what the test asked. Needed before #5907 could land.|
> |2026-06-07|[#5907|https://github.comFINERACT-2620|First area done end to|
> h2. PR roadmap
> I'm keeping the PR count deliberately low and putting the detail into commits
> instead. Each remaining
> PR is one area, broken into commits their own, so they can be reviewed oneat
> a time without the PR itself becoming unreviewable.
> PRs 1 to 8 are what I'm doing in GSoCstretch, listed in the order
> I'd pick it up. Rows 11, 12 and 13 came off that stretch list early.
> ||PR||What||Files||Tests||Ticket||Git||
> |1|Savings helper, test base, Swagger fields|—|—|FINERACT-2620, 2626|#5907,
> #5934|Merged|
> |2|Client helper build-out, Swagger fields|—|—|FINERACT-2631, 2632|#5954,
> #5955|Merged|
> |3|Charges and delinquency helpers|—|—|FINERACT-2635|#5978|Merged|
> |4|Loan helper: charges, transitions,
> disbursement|—|—|FINERACT-2640|#5997|Merged|
> |5|Loan tests, 4 tiers|—|—|FINERACT-2649|#6005, #6050, #6084, #6158|Merged|
> |6|Group and centre|3|16|FINERACT-2718|#6194|Merged|
> |7|Loan helper RestAssured leak, plus the two biggest loan
> files|—|—|FINERACT-2779|#6321|Merged|
> |8|Guardrail and contributor guide|—|—|FINERACT-2781, 2858|#6324,
> #6513|Merged|
> |9|Rest of loan money movement|23|98|FINERACT-2793|#6355|Merged|
> |10|Savings and deposits|9|178|FINERACT-2732|#6241, #6419, 1 more
> planned|Tier 1 merged, Tier 2 merged|
> |11|Loan lifecycle and product|11|28|FINERACT-2824|#6433|Merged|
> |12|Client, charges, accounting|17|96|FINERACT-2859|#6516|Merged|
> |13|Organisation, jobs, batch, config|34|175|FINERACT-2746, 2883|#6246,
> #6559, 1 more planned|Part merged, #6559 in review|
> |14|Closeout: delete the old base classes and helpers|—|—|to raise|—|Stretch|
> |15|Bulk import, shares, reporting, stretch|20|65|to raise|—|Stretch|
> |16|Split {{FeignLoanTestBase}}|—|—|to raise|—|Stretch|
> |17|The Retrofit tests|13|65|to raise|—|Stretch|
> Outstanding work in rows 10 and 13 is 30 files and 167 tests, of which 24
> files and 131 tests are in review as #6559. Row 15 covers the last 13 files
> and 65 tests.
> h2. Log
> One line per merge. I don't edit old tombs.
> ||Date||PR||Ticket||What went in||
> |2026-06-04|#5934|FINERACT-2626|Added {{rejectedOnDate}} and
> {{withdrawnOnDate}} to the savings Swagger spec. The generated model was
> missing them, so a reject call was rejected with a 400 rather than doing what
> the test asked. Needed before #5907 could land.|
> |2026-06-07|#5907|FINERACT-2620|First area done end to end. 10 new files:
> savings helper, test base, lifecycle extension, request builders, and an
> 8-test lifecycle test to prove the pattern.|
> |2026-06-09|#5955|FINERACT-2632|Client Swagger fields the server accepts but
> the model didn't: the withdrawal fields, and
> {{{}firstname{}}}/{{{}lastname{}}} on PUT.|
> |2026-06-09|#5954|FINERACT-2631|{{FeignClientHelper}} from 4 methods to 16,
> plus {{ClientRelient}} lifecycle test.|
> |2026-06-11|#5978|FINERACT-2635|Charges and delinquency:
> {{FeignChargesHelper}} (14 methods), {{{}ChargeRequestBuilders{}}}, and a
> 7-test delinquency lifecycle. Also fixed 4 fields missing from
> {{PostChargesRequest}} that were sending nulls on PUT.|
> |2026-06-21|#5997|FINERACT-2640|Loan helper grew charge management, state
> transitions, disbursement: 11 charge methods, 6 transitions, 4 disbursement
> methods.|
> |2026-06-26|4 PRs|FINERACT-2649|Loan tests in four tiers. Tier 4 is the big
> one at 92 files. Per-PR detail and review notes are on that ticket rather
> than duplicated here. Final tier merged 2026-08-17, see the line below.|
> |2026-07-28|#6194|FINERACT-2718|Group and centre. New helpers for group,
> centre, staff and GLIM. Migrated {{{}CenterIntegrationTest{}}}, {{GroupTest}}
> and {{GroupLoanIntegrationTest}} (16 tests), plus a stopgap helper that was
> Feign in name only. No changes to the shared loan test base. Merged
> 2026-08-13.|
> |2026-08-11|#6246|FINERACT-2746|Organisation area, taken out of order because
> it was self-contained: migrated {{{}OfficeIntegrationTest{}}},
> {{{}RatesTest{}}}, {{{}ProductMixIntegrationTest{}}}, {{HookIntegrationTest}}
> and {{ExternalEventConfigurationIntegrationTest}} — onto five new helpers,
> plus {{RateRequestBuilders}} and {{{}ExternalEventConfigurationTestDates{}}},
> no production code touched.|
> |2026-08-17|#6158|FINERACT-2649|Tier 4, the last and largest loan tier: 99
> files over 26 commits, closing out the loan test migration. Every Swagger gap
> fixed at source rather than worked around: due dates on
> {{{}LoansApiResourceSwagger{}}}, the client charge {{amount}} retyped from
> {{Integer}} to {{{}BigDecimal{}}}, and a request body on
> {{{}InteropApiResource{}}}. The retype trips swagger-brake R010; that was
> accepted on the ruling that the server parses gets corrected even when the
> gate goes red.|
> |2026-08-28|#6241|FINERACT-2732|Savings and deposits, tier 1. All 14 small
> savings classes onto {{{}FeignSavingsTestBase{}}}, 34 files. Six Swagger
> commits for shapes the endpoints already accepted:
> {{{}isInterestManualOrAutomatic{}}}, datatable {{{}transactionId{}}}, the
> transaction-search {{Set}} to {{{}List{}}}, the adjust response retyped to
> {{{}CommandProcessingResult{}}}, {{note}} and
> {{{}withdrawalFeeForTransfers{}}}, plus an {{@ApiResponse}} on the four
> transactions. Tiers 2 and 3 are row 10.|
> |2026-08-28|#6321|FINERACT-2779|RestAssured out of {{FeignLoanHelper}}
> itself: the {{*FromJson}} methods that built raw JSON and parsed raw
> responses underneath a Feign surface are gone. 45 files, 37 of them test
> classes repointed at the typed signatures, plus {{LoansApiResourceSwagger}}
> and {{{}RescheduleLoansApiResourceSwagger{}}}. Loan product and loan ids
> retyped from {{Integer}} to {{{}Long{}}}, which surfaced a private
> {{applyForLoanApplication}} overload in
> {{ClientLoanChargeExternalIntegrationTest}} colliding with the base method.
> Clears the checkstyle rule.|
> |2026-08-31|#6324|FINERACT-2781|The guardrail: a checkstyle rule forbidding
> REST Assured in the test package, plus the contributor guide chapter
> describing the conventions. 4 files. Deliberately red against its own rule
> until #6321 removed the last offender, so the two had to merge in that order.|
> |2026-09-04|#6355|FINERACT-2793|The rest of loan money movement: 23 test
> classes over 15 commits, 44 files. Charge-off, overpaid, refunds, down
> payment, disbursement and amortization, group meeting driven schedules,
> guarantors, tranche and variable installments. New Feign helpers for
> guarantors and variable installments, user creation added to the Feign user
> helper, and the post dated checks a disbursement carries now modelled. Ends
> by retiring the RestAssured loan test base class.|
> |2026-09-25|#6433|FINERACT-2824|Loan lifecycle and product, row 11: 11 test
> classes (28 files). The loan product configuration, loan application,
> auditing and concurrency tests, plus REST Assured out of
> {{{}WorkingCapitalLoanOriginatorsTest{}}}, and fixing {{externalId}} on the
> loan product response. {{DisallowBackdatedTransactionsIntegrationTest}} moved
> to row 10, as it is a pure savings test.|
> |2026-09-25|#6419|FINERACT-2732|Savings and deposits, tier 2: 15 commits, 58
> files. {{{}FixedDepositTest{}}}, {{{}RecurringDepositTest{}}},
> {{{}ClientSavingsIntegrationTest{}}}, {{{}AccountTransferTest{}}},
> {{{}AccountTransferOverdraftTest{}}}, {{GroupSavingsIntegrationTest}} and
> {{ShareAccountChargeRoundingTest}} migrated, along with the ordered savings
> account tests, with a new {{FeignDepositTestBase}} for the deposit, savings,
> group savings and share account payloads, and the savings charge
> {{feeOnMonthDay}} type corrected. Retires {{{}BaseSavingsIntegrationTest{}}}.|
> |2026-10-01|#6513|FINERACT-2858|The #6324 guardrail widened from the Feign
> package to everywhere: a REST Assured import now fails checkstyle anywhere
> except the files listed in {{{}restassured-baseline.xml{}}}, a list that only
> shrinks as migrations land. Also moved the centre {{orderBy}} validation
> tests onto Feign. 6 files.|
> |2026-10-01|#6516|FINERACT-2859|Client, charges and accounting, row 12 in one
> PR: 17 test classes (96 tests) over 10 commits, 53 files. Client lifecycle,
> search, identifiers, charges, transactions, collateral and notes; the charge
> tests; and the accounting rule, financial activity, provisioning and
> accounting scenario tests. Ten Swagger fixes at source, among them the
> internal client audit shape as an array, the identifier update {{changes}}
> schema, and the charge {{feeOnMonthDay}} shape. Removes the recurring deposit
> and tax helpers left without callers.|
--
This message was sent by Atlassian Jira
(v8.20.10#820010)