Ako to funguje vnútri
Celá automatizácia je Maven projekt s TestNG testami. Jenkins job nerobí nič iné, než že spustí test s parametrami — a test potom kombinuje tri veci: Selenium (preklikanie Spinj), API volania (ESB) a databázu (generovanie údajov). Selenium časť je v jadre „find element + click“ — dôležité je pochopiť tok dát okolo nej.
Celý tok od Buildu po e-mail
Jenkins odovzdá parametre testu
Polia z „Build with Parameters“ sa do JVM dostanú ako system properties (-Demail=…, -Dsegment=…). Test si ich číta cez System.getProperty s rozumnými defaultmi.
Validácia vstupov (fail-fast)
E-mail regexom, telefón presne 12 číslic, suma musí byť číslo — a ak je nad 50 000, potichu sa zníži na 50 000. Zlý vstup zhodí beh hneď na začiatku, nie po piatich minútach klikania.
Príprava dát: IČO, meno firmy, majiteľ
IČO sa vygeneruje (8-miestne číslo); pre municipality sa berie náhodné reálne IČO zo súboru mun_ico.csv. Unikátne meno firmy sa skladá cez DB + BeastMachine. Majiteľ (fyzická osoba) sa vytvorí vopred cez SOAP — nie klikaním.
Selenium: založenie klienta v Spinj (NE64)
Page objecty prekliknú NE64: údaje, sektor, kategória a segment (podľa segment/templates.json), pridanie majiteľa, KYC, marketingové súhlasy, uloženie, podpis, archív dokumentov. Na konci sa vyčíta nové CIS_ID.
Reštart prehliadača, potom účet (IN03 → IN19)
Browser sa zavrie a otvorí nanovo (Edge, 1920×1080), aby nezhavaroval celý proces. Nové prihlásenie, otvorenie účtu cez IN03 na existujúce CIS_ID, dohľadanie cez IN19 — výsledkom je IBAN.
API cez ESB: platba nefunguje · podpis funguje
Nadotovanie = vygenerovanie payment document ID + vytvorenie platby cez ESB — táto časť aktuálne padá. Podpisový vzor a oprávnenia k účtu sa nastavia API volaním v poriadku. Voliteľne nasleduje úver (createLoan) a kontokorent (createOverdraft).
Zápis CSV a e-mail
Po dobehnutí všetkých klientov (@AfterSuite) sa zapíše results/<názov>.csv so zoznamom vytvorených klientov a Jenkins ho pošle e-mailom.
Kde kód žije
Balík sk.vub.autotests.SPINJ; Finstat časť má vlastný balík sk.vub.autotests.FINSTAT.
| Trieda / miesto | Rola | Poznámka |
|---|---|---|
| tests.LEClientAndAccountTest | TestNG test — vstupný bod | Číta parametre, validuje, volá helper, zbiera výsledky a zapisuje CSV. |
| helper…selenium.LegalEntityAndAccountHelper | Orchestrácia celého scenára | Poradie krokov: klient → účet → dotácia → podpis → úver/kontokorent. |
| pages.* | Selenium page objecty | LoginPage, SpinjMainPage, SearchingClientPage, NE64PravnickaOsobaPage, NE64PSektorPage, NE64PMajitelPage, NE64PdotaznikKYCPage, IN03Page, PV01ShowPage, IN19Page. Vnútri „find element + click / fill“. |
| providers.* | Generátory dát | LegalEntityDataProvider (dataProvider testu), NameProvider (meno firmy), CompanyNumbersProvider (IČO). |
| objects.* | Dátové objekty | NewClient, Account, Customer, NewClientOwner, DatabaseConnection… |
| helper.requests.* | API helpery (ESB) | ExecutePaymentRequestHelper (platba), AccountRequestHelper (podpisový vzor), LoanServiceHelper, OverdraftServiceHelper. |
| resources/segment/templates.json | Mapa segmentov | Segment → sektor / kategória / právna forma; pre corporate a sme_retail vnorené podľa businessType. |
| FINSTAT.tests.FinstatTest | Finstat AUTO job | insertFinancialStatementOnLegalEntity — vloženie výkazu (rok 2024) a final ratingu vo Finstat Viewer. |
Kľúčové miesta v kóde
LEClientAndAccountTest — parametre prichádzajú z Jenkinsu ako system properties
String amountParam = System.getProperty("amount", "10000").replace(" ", "");
String userEmail = System.getProperty("email", "jantal@vub.sk").replace(" ", "");
String phoneNumber = System.getProperty("phoneNumber", "421915558385").replace(" ", "");
String segmentChoice = System.getProperty("segment", "default").replace(" ", ""); // načítanie z Jenkins
String businessType = System.getProperty("businessType", "sro").replace(" ", "");
String finalRating = System.getProperty("finalRating", "").replace(" ", "");
Validácia vstupov — zlý vstup zhodí beh hneď na začiatku
if (!newClient.getEmail().matches("^(.+)@(\\S+)$")) {
throw new AssertionError("Zadaj platny email do userEmail…");
}
else if (!newClient.getPhoneNumber().matches("^\\d{12}$")) {
throw new AssertionError("Zadaj cislo na mobile vo formate: 421905123456…");
}
// suma musí byť číslo („veľa“ ani „sto“ neprejde) a viac než 50 000 sa zníži:
if (amountNumber > 50000) { account.setAmount("50000"); }
LegalEntityAndAccountHelper — odkiaľ sú IČO, meno firmy a nastavenie segmentu
// IČO: municipalita berie reálne IČO zo súboru, ostatné segmenty generované 8-miestne číslo
if (!newClient.getSegment().equals(municipality)) {
companyNumber = generateEightDigitNumber();
} else {
companyNumber = getRandomNumberFromFile(); // mun_ico.csv
}
// unikátne meno firmy: databáza + BeastMachine
DatabaseConnection db = new DatabaseConnection(urlDB, schemaDB, usernameDB, passwordDB);
String companyName = generateFiveDigitAndWordCompanyName(db, beastMachineHelper);
// segment → právna forma/sektor: resources/segment/templates.json;
// pre corporate a sme_retail sa šablóna vyberá ešte podľa businessType
JsonNode segment = json.get(newClient.getSegment());
JsonNode resultSegment = (corporate || sme_retail) ? segment.get(businessType) : segment;
Nadotovanie účtu — presne toto je miesto, ktoré teraz nefunguje
public void legalEntityTopUpAccount(NewClient newClient, Account account) throws Exception {
ExecutePaymentRequestHelper paymentRequestHelper = new ExecutePaymentRequestHelper();
if (!account.getAmount().equals("0")) {
String generatedPaymentId = paymentRequestHelper.vygenerujPaymentDocumentId(endpointESB);
String pgwId = paymentRequestHelper.vytvorPlatbu(newClient, account, endpointESB, generatedPaymentId);
logInfo("PgwId platby: " + pgwId); // aktuálne: PgwId platby: null
}
}
Výstupné CSV — @AfterSuite pozbiera všetkých vytvorených klientov
legalEntityData = legalEntityArray.stream().map(n -> counter.getAndIncrement()
+ ". Cis_id: " + n.getId()
+ ", Ucet: " + n.getIban()
+ ", Majitel/Staturar: " + n.getCustomer().getCustomerId()
+ ", Segment: " + n.getSegment()
+ ", Pobocka: " + n.getBranch()
+ ", FinalRating: " + n.getFinalRating())
.collect(Collectors.toList());
File file = new File("./results/" + legalEntityCsv + ".csv"); // Jenkins ho pošle e-mailom
Známe problémy a kam siahnuť
| Problém | Prejav | Kde hľadať |
|---|---|---|
| Nadotovanie účtu | V extent reporte „Nepodarilo sa nadotovat ucet: Index 0 out of bounds for length 0“ a „PgwId platby: null“. Job aj tak skončí Pass, účet má nulový zostatok. | ExecutePaymentRequestHelper.vytvorPlatbu — spracovanie odpovede ESB platobnej služby vracia prázdne pole (index 0 na prázdnom zozname). Chyba je chytená, beh pokračuje. Rieši sa prechodom na ACE: odpovede z ACE už chodia, dolaďujú sa detaily — po dokončení pôjde nadotovanie cez ACE aj pre PO. |
| Účelový úver (createLoan) | V poslednom behu SOAP volanie createLoan/1.0 vrátilo CRL-TECHNICAL : null → „Commercial loan creation failed“. |
LoanServiceHelper.createCommercialLoan. Môže súvisieť s prázdnym účtom (nefunkčné nadotovanie) — úver sa čerpá voči účtu. |
| Kontokorent — limity | Kontokorent sa zriadi, ale limity sa nenastavujú. | Zámerne vypnuté: volanie setOverdraftLoanLimits je v kóde zakomentované („podľa dohody zatiaľ neprestavujeme limity“). |
Data Forge obsahuje šablónu „Nadotovanie účtu (data_nadotovanie_uctu.csv)“ — môže poslúžiť ako náhrada, kým sa platba cez ESB neopraví. Funkčnosť si najprv over na jednom účte.
Detaily, ktoré sa oplatí vedieť
- Prečo sa medzi klientom a účtom reštartuje prehliadač: nová inštancia Edge (1920×1080) chráni beh pred zamrznutím Spinj po dokončení NE64 — je to zámer, nie chyba.
- Vstupné parametre sa menia: podľa požiadaviek používateľov pribúdajú polia (napr.
naceCode,legalForm). Ak formulár vyzerá inak než screenshoty, riadiš sa popismi pri poliach — validačné hlášky ťa navedú. - Viac klientov na jeden build:
newClientCountvytvára klientov sekvenčne — každý ďalší klient pridá k behu ďalších cca 7 minút. - Prihlasovacie údaje a endpointy (Spinj login, DB, ESB) žijú v property súbore per prostredie — job (T) a (W) sa líšia práve týmto súborom, kód je rovnaký.
- Čistý klient bez účtu: odškrtnutý
createAccountpreskočí celú druhú polovicu flow — vrátane úveru a kontokorentu (sú závislé na účte).