[ 
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)

Reply via email to