* test_todo21_e2e_verificare.prg * TODO #21 - test END-TO-END al verificarii codurilor fiscale. * * Spre deosebire de celelalte teste (care instantiaza direct frm_verificare_parteneri), acesta * intra prin punctul de intrare REAL folosit de toti apelantii - verificare_parteneri() * (COMUN\programe\oproceduri_comune.prg:4525) - cu lista in formatul sir * "cod***denumire***atribut***ales***id_part***data|...", si merge pana la capat: * sir -> crsXMLParteneriVerificare -> crsVerificareParteneri -> formular modal -> * Activate -> do_verifica -> serviciul web ANAF REAL -> perioade + atentie -> cursor final. * * Formularul se deschide cu Show(1) (modal), deci headless-ul s-ar agata. Deblocarea se face cu * un obiect Timer independent (clasa tmrE2EDeblocare, la finalul fisierului), care asteapta ca * verificarea sa PORNEASCA (lblVerifica.Visible = .T., pus la inceputul lui do_verifica) si abia * apoi ca ea sa se TERMINE (lblVerifica.Visible = .F., pus la final), inainte sa dea Release. * Fara cele doua faze, timer-ul ar putea elibera formularul in mijlocul verificarii - do_verifica * apeleaza Inkey(1), moment in care evenimentele de timer chiar se executa. * * Cursorul se pastreaza dupa inchidere (tlDontCloseCursor = .T.), iar asertiunile se fac pe el. * * Datele de test: coduri fiscale REALE alese dinamic din istoric_coduri_fiscale si un partener * REAL din nom_parteneri (id_part nenul), plus un cod invalid fabricat si un duplicat - nimic * hardcodat, deci testul nu depinde de starea unei anumite firme. * * Nu scrie nimic in Oracle (doar SELECT-uri) si nu modifica nomenclatorul. * * Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_e2e_verificare.prg" * Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i). SET SAFETY OFF SET TALK OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET NULLDISPLAY TO '' CLOSE DATABASES PUBLIC gcLog gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_e2e_verificare_log.txt" STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) PUBLIC gnEsecuri gnEsecuri = 0 ON ERROR DO PrErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns gcMockUltimMesaj = '' gnMockUltimTip = 0 gnMockRaspuns = 6 PUBLIC goTmrE2E, gnE2EFazaTimer, gnE2ETicks, glE2EEliberat gnE2EFazaTimer = 0 gnE2ETicks = 0 glE2EEliberat = .F. TRY SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE DO PrLog WITH 'mock-uri incarcate' DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF gnHandle <= 0 DO PrLog WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')' gnEsecuri = gnEsecuri + 1 DO PrLog WITH 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)' QUIT ENDIF DO PrLog WITH 'mediu OK, schema=' + gcS *===================================================================== * Date de test reale, alese dinamic *===================================================================== LOCAL lcSql, lcCod1, lcCod2 TEXT TO lcSql NOSHOW select cod_fiscal_n from ( select cod_fiscal_n from istoric_coduri_fiscale where cod_fiscal_n is not null and data_inceput_scptva is not null order by dataorav_anaf desc) where rownum <= 2 ENDTEXT lcCod1 = '' lcCod2 = '' IF goExecutor.oExecuta(lcSql, 'crsE1') AND USED('crsE1') AND RECCOUNT('crsE1') > 0 SELECT crsE1 GO TOP lcCod1 = ALLTRIM(TRANSFORM(NVL(crsE1.cod_fiscal_n, 0))) IF RECCOUNT('crsE1') > 1 SKIP lcCod2 = ALLTRIM(TRANSFORM(NVL(crsE1.cod_fiscal_n, 0))) ENDIF ENDIF USE IN (SELECT('crsE1')) LOCAL lnIdPart, lcCodPart, lcDenPart TEXT TO lcSql NOSHOW select id_part, cod_fiscal, denumire from ( select id_part, cod_fiscal, denumire from nom_parteneri where nvl(inactiv,0) = 0 and nvl(sters,0) = 0 and not cod_fiscal is null order by id_part desc) where rownum <= 1 ENDTEXT lnIdPart = 0 lcCodPart = '' lcDenPart = '' IF goExecutor.oExecuta(lcSql, 'crsE2') AND USED('crsE2') AND RECCOUNT('crsE2') > 0 lnIdPart = NVL(crsE2.id_part, 0) lcCodPart = ALLTRIM(NVL(crsE2.cod_fiscal, '')) lcDenPart = ALLTRIM(NVL(crsE2.denumire, '')) ENDIF USE IN (SELECT('crsE2')) DO PrLog WITH 'coduri ANAF de test: [' + lcCod1 + '] [' + lcCod2 + ']; partener: id_part=' + ; TRANSFORM(lnIdPart) + ' cod=[' + lcCodPart + ']' IF EMPTY(lcCod1) OR lnIdPart = 0 DO PrLog WITH 'FAIL: nu s-au gasit date de test in Oracle' gnEsecuri = gnEsecuri + 1 DO PrLog WITH 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)' QUIT ENDIF *===================================================================== * Lista de intrare, construita EXACT ca la apelantii reali (D394, jurnale TVA): un cursor cu * id_part / cod_fiscal / denumire / atribut_fiscal / ales / data, trecut prin Cursortoxml * (vezi Clase/ovanzcump.vc2:19608-19618). * 5 randuri: cod real 1 de doua ori (-> DUPLICAT), cod real 2, partener real cu id_part, * cod fabricat invalid (-> INVALID). *===================================================================== LOCAL lcLista, ldData ldData = DATE(YEAR(DATE()), MONTH(DATE()), 1) CREATE CURSOR crsE2ELista (id_part N(16), cod_fiscal C(30), denumire C(100), atribut_fiscal C(2), ; ales L, IsCIF L, Data D) INSERT INTO crsE2ELista VALUES (0, lcCod1, 'E2E DUPLICAT A', 'RO', .F., .T., ldData) INSERT INTO crsE2ELista VALUES (0, lcCod1, 'E2E DUPLICAT B', 'RO', .F., .T., ldData) IF !EMPTY(lcCod2) INSERT INTO crsE2ELista VALUES (0, lcCod2, 'E2E COD ANAF 2', 'RO', .F., .T., ldData) ENDIF INSERT INTO crsE2ELista VALUES (lnIdPart, lcCodPart, lcDenPart, ; IIF(LEFT(UPPER(lcCodPart), 2) == 'RO', 'RO', ' '), .F., .T., ldData) INSERT INTO crsE2ELista VALUES (0, '123', 'E2E COD INVALID', 'RO', .F., .T., ldData) lcLista = '' CURSORTOXML('crsE2ELista', 'lcLista', 1, 0, 0, '1') USE IN (SELECT('crsE2ELista')) *===================================================================== * Timer de deblocare + apelul REAL (modal) *===================================================================== goTmrE2E = CREATEOBJECT('tmrE2EDeblocare') goTmrE2E.Enabled = .T. LOCAL lcCursor, ltStart ltStart = DATETIME() DO PrLog WITH 'apelez verificare_parteneri (modal) ...' lcCursor = verificare_parteneri(m.lcLista, .T., .T., .F., .T., .T., .F., .T.) goTmrE2E.Enabled = .F. DO PrLog WITH 'verificare_parteneri s-a intors dupa ' + TRANSFORM(INT(DATETIME() - ltStart)) + ; ' s, cursor=[' + TRANSFORM(lcCursor) + '], timer: faza=' + TRANSFORM(gnE2EFazaTimer) + ; ' ticks=' + TRANSFORM(gnE2ETicks) + ' eliberat=' + TRANSFORM(glE2EEliberat) *===================================================================== * E1: cursorul supravietuieste (tlDontCloseCursor = .T.) si are toate randurile *===================================================================== LOCAL lnAsteptate lnAsteptate = IIF(EMPTY(lcCod2), 4, 5) IF USED('crsVerificareParteneri') AND RECCOUNT('crsVerificareParteneri') = lnAsteptate DO PrLog WITH 'OK E1: cursorul crsVerificareParteneri a ramas deschis, ' + ; TRANSFORM(lnAsteptate) + ' randuri' ELSE DO PrLog WITH 'FAIL E1: cursor deschis=' + TRANSFORM(USED('crsVerificareParteneri')) + ; ' randuri=' + TRANSFORM(IIF(USED('crsVerificareParteneri'), RECCOUNT('crsVerificareParteneri'), -1)) + ; ' asteptat ' + TRANSFORM(lnAsteptate) gnEsecuri = gnEsecuri + 1 DO PrLog WITH 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)' QUIT ENDIF *===================================================================== * E2: id_part si data au traversat parsarea sirului (fix-ul C4 din TODO 21) *===================================================================== SELECT crsVerificareParteneri LOCATE FOR ALLTRIM(NVL(denumire, '')) == lcDenPart IF FOUND() AND NVL(crsVerificareParteneri.id_part, 0) = lnIdPart AND crsVerificareParteneri.Data = ldData DO PrLog WITH 'OK E2: id_part=' + TRANSFORM(lnIdPart) + ' si data=' + DTOC(ldData) + ' au ajuns in cursor' ELSE DO PrLog WITH 'FAIL E2: id_part=' + TRANSFORM(IIF(FOUND(), NVL(crsVerificareParteneri.id_part, 0), -1)) + ; ' data=' + IIF(FOUND(), DTOC(crsVerificareParteneri.Data), '?') + ' asteptat ' + ; TRANSFORM(lnIdPart) + ' / ' + DTOC(ldData) gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E3: codul invalid e marcat Valid = .F. si primeste eticheta INVALID *===================================================================== SELECT crsVerificareParteneri LOCATE FOR ALLTRIM(NVL(denumire, '')) == 'E2E COD INVALID' IF FOUND() AND NVL(crsVerificareParteneri.Valid, .T.) = .F. AND 'INVALID' $ crsVerificareParteneri.atentie DO PrLog WITH 'OK E3: cod invalid -> Valid=.F., atentie=[' + ALLTRIM(crsVerificareParteneri.atentie) + ']' ELSE DO PrLog WITH 'FAIL E3: cod invalid -> Valid=' + TRANSFORM(IIF(FOUND(), crsVerificareParteneri.Valid, .NULL.)) + ; ' atentie=[' + IIF(FOUND(), ALLTRIM(crsVerificareParteneri.atentie), '?') + ']' gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E4: cele doua randuri cu acelasi cod fiscal sunt marcate DUPLICAT *===================================================================== LOCAL lnDupl SELECT crsVerificareParteneri COUNT FOR ALLTRIM(NVL(cod_fiscal, '')) == lcCod1 AND 'DUPLICAT' $ atentie TO lnDupl IF lnDupl = 2 DO PrLog WITH 'OK E4: ambele randuri cu codul ' + lcCod1 + ' au eticheta DUPLICAT' ELSE DO PrLog WITH 'FAIL E4: randuri DUPLICAT pentru ' + lcCod1 + ' = ' + TRANSFORM(lnDupl) + ' (asteptat 2)' gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E5: ANAF a raspuns pe traseul real - cel putin un rand cu firma completata * si cel putin o perioada de TVA completata (coloanele noi din TODO 21) *===================================================================== LOCAL lnCuFirma, lnCuPerioada SELECT crsVerificareParteneri COUNT FOR !EMPTY(NVL(firma, '')) TO lnCuFirma COUNT FOR !EMPTY(NVL(data_inceput_scptva, {})) OR !EMPTY(NVL(data_inceput_tvainc, {})) ; OR !EMPTY(NVL(data_inactivare, {})) TO lnCuPerioada IF lnCuFirma > 0 AND lnCuPerioada > 0 DO PrLog WITH 'OK E5: ANAF a raspuns real - ' + TRANSFORM(lnCuFirma) + ' rand(uri) cu firma, ' + ; TRANSFORM(lnCuPerioada) + ' cu perioade completate' ELSE DO PrLog WITH 'FAIL E5: firma=' + TRANSFORM(lnCuFirma) + ' perioade=' + TRANSFORM(lnCuPerioada) + ' (asteptat > 0)' gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E6: textul venit de la ANAF nu contine '?' (decodarea UTF-8 prin * AnafDecodeResponseText - COMUN\programe\validare.prg) *===================================================================== LOCAL lnSemn, lcExemplu lnSemn = 0 lcExemplu = '' SELECT crsVerificareParteneri SCAN FOR !EMPTY(NVL(firma, '')) IF '?' $ NVL(firma, '') OR '?' $ NVL(adresa, '') OR '?' $ NVL(stare, '') OR '?' $ NVL(judet, '') lnSemn = lnSemn + 1 lcExemplu = ALLTRIM(NVL(firma, '')) + ' / ' + ALLTRIM(NVL(adresa, '')) ENDIF ENDSCAN IF lnSemn = 0 DO PrLog WITH 'OK E6: niciun "?" in textele ANAF (firma/adresa/judet/stare)' ELSE DO PrLog WITH 'FAIL E6: ' + TRANSFORM(lnSemn) + ' rand(uri) cu "?" in text, ex: [' + lcExemplu + ']' gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E7: atentie contine numai etichetele definite, in ordinea gravitatii, * si nu are text trunchiat (regresie: concatenarea pe camp padded) *===================================================================== LOCAL lcAtn, llOrdineOK, lnPozI, lnPozD, lnPozN, lnPozR, llRauOK llOrdineOK = .T. llRauOK = .T. SELECT crsVerificareParteneri SCAN lcAtn = ALLTRIM(NVL(atentie, '')) IF EMPTY(lcAtn) LOOP ENDIF *-- fara spatii duble (semn ca s-a concatenat peste padding) IF ' ' $ lcAtn llRauOK = .F. DO PrLog WITH ' atentie cu spatii duble pe randul ' + TRANSFORM(RECNO()) + ': [' + lcAtn + ']' ENDIF lnPozI = AT('INVALID', lcAtn) lnPozD = AT('DUPLICAT', lcAtn) lnPozN = AT('INACTIV', lcAtn) lnPozR = AT('FARA RO', lcAtn) IF (lnPozI > 0 AND lnPozD > 0 AND lnPozI > lnPozD) OR ; (lnPozD > 0 AND lnPozN > 0 AND lnPozD > lnPozN) OR ; (lnPozN > 0 AND lnPozR > 0 AND lnPozN > lnPozR) llOrdineOK = .F. DO PrLog WITH ' ordine gresita in atentie pe randul ' + TRANSFORM(RECNO()) + ': [' + lcAtn + ']' ENDIF ENDSCAN IF llOrdineOK AND llRauOK DO PrLog WITH 'OK E7: coloana atentie e coerenta (ordine INVALID/DUPLICAT/INACTIV/FARA RO, fara spatii duble)' ELSE DO PrLog WITH 'FAIL E7: coloana atentie incoerenta' gnEsecuri = gnEsecuri + 1 ENDIF *===================================================================== * E8: formularul a fost inchis de timer, nu a ramas deschis *===================================================================== IF glE2EEliberat AND gnE2EFazaTimer >= 2 DO PrLog WITH 'OK E8: verificarea a pornit si s-a terminat, formularul a fost eliberat normal' ELSE DO PrLog WITH 'FAIL E8: faza timer=' + TRANSFORM(gnE2EFazaTimer) + ' eliberat=' + TRANSFORM(glE2EEliberat) + ; ' (formularul nu a parcurs ciclul complet de verificare)' gnEsecuri = gnEsecuri + 1 ENDIF *-- rezumat pe randuri, pentru diagnostic SELECT crsVerificareParteneri SCAN DO PrLog WITH ' ' + PADR(ALLTRIM(NVL(denumire, '')), 24) + ' cod=' + PADR(ALLTRIM(NVL(cod_fiscal, '')), 14) + ; ' valid=' + TRANSFORM(NVL(Valid, .NULL.)) + ' dupl=' + TRANSFORM(duplicat) + ; ' firma=[' + LEFT(ALLTRIM(NVL(firma, '')), 30) + ']' + ' atentie=[' + ALLTRIM(NVL(atentie, '')) + ']' ENDSCAN USE IN (SELECT('crsVerificareParteneri')) DO PrLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)') CATCH TO loEx DO PrLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure DO PrLog WITH 'TOTAL FAIL: exceptie neasteptata' ENDTRY QUIT ********************************************************** PROCEDURE PrLog LPARAMETERS tcMsg LOCAL lcL SET SAFETY OFF lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '') STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog) ENDPROC ********************************************************** PROCEDURE PrErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO PrLog WITH 'EROARE ' + TRANSFORM(tnErr) + ': ' + TRANSFORM(tcMsg) + ' in ' + ; TRANSFORM(tcProg) + ' linia ' + TRANSFORM(tnLine) gnEsecuri = gnEsecuri + 1 DO PrLog WITH 'TOTAL FAIL: eroare neasteptata' QUIT ENDPROC ********************************************************** * Deblocarea formularului modal, in doua faze: * faza 0 -> asteapta ca do_verifica sa PORNEASCA (lblVerifica.Visible = .T.) * faza 1 -> asteapta ca do_verifica sa TERMINE (lblVerifica.Visible = .F.) si da Release * Plasa de siguranta: dupa 240 de ticks (~8 minute) elibereaza oricum, ca sa nu agate testul. ********************************************************** DEFINE CLASS tmrE2EDeblocare AS Timer Interval = 2000 Enabled = .F. PROCEDURE Timer LOCAL lnI, loF, llVaz gnE2ETicks = gnE2ETicks + 1 IF gnE2ETicks <= 3 OR MOD(gnE2ETicks, 15) = 0 DO PrLog WITH ' timer tick ' + TRANSFORM(gnE2ETicks) + ' forme=' + TRANSFORM(_SCREEN.FormCount) + ' faza=' + TRANSFORM(gnE2EFazaTimer) ENDIF FOR lnI = 1 TO _SCREEN.FormCount loF = _SCREEN.Forms(lnI) IF !PEMSTATUS(loF, 'lblVerifica', 5) OR !PEMSTATUS(loF, 'do_verifica', 5) LOOP ENDIF llVaz = loF.lblVerifica.Visible DO CASE CASE loF.lAutoverificare OR llVaz *-- verificarea nu a pornit inca sau e in curs (lblVerifica vizibil) gnE2EFazaTimer = IIF(llVaz, 1, gnE2EFazaTimer) CASE gnE2ETicks > 240 glE2EEliberat = .F. loF.Release() OTHERWISE *-- Activate a rulat (lAutoverificare = .F.) si do_verifica s-a terminat gnE2EFazaTimer = 2 glE2EEliberat = .T. loF.Release() ENDCASE EXIT ENDFOR ENDPROC ENDDEFINE