* test_registratura_adaugare.prg * Test headless: fluxul de ADAUGARE document in registratura + salvarea datelor generale. * Reproduce si bugul cunoscut: modifica_reg_dg cu partener NULL (P2 din * docs\analiza_registratura_adaugare_editare.md). Dupa implementarea gardei (M1), * pasul 3 trebuie sa devina un refuz elegant (mesaj + return), nu eroare de executie. * Rulare: vfp9.exe -A -T "D:\ROA\ROAREGISTRATURA\Teste\test_registratura_adaugare.prg" * Log: D:\ROA\ROAREGISTRATURA\Teste\log_test_adaugare.txt * ATENTIE: ruleaza DOAR pe schema de test (CENTRAL/MARIUSM_AUTO). Documentul de test * este sters (soft-delete) la final prin pack_registratura.sterge_registratura. SET SAFETY OFF SET TALK OFF * mock amessagebox PRIMUL in lista de proceduri (la nume duplicat castiga PRIMUL - testare-ui-vfp.md cap. j) SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE PUBLIC gnMockRaspuns gnMockRaspuns = 6 PUBLIC gcTestLog gcTestLog = 'D:\ROA\ROAREGISTRATURA\Teste\log_test_adaugare.txt' STRTOFILE('=== test_registratura_adaugare ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO tlog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ; ' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO()) DO tlog WITH 'Init mediu...' DO D:\ROA\ROAREGISTRATURA\Teste\test_init_env_registratura.prg IF TYPE('gnHandle') # 'N' OR gnHandle <= 0 DO tlog WITH 'ESEC conectare - STOP' DO tfinal ENDIF DO tlog WITH 'Conectat, schema=' + gcS * 0) cursorul listei + goRegistratura DO viz_registratura IN oproceduri_roaregistratura.prg IF !USED('cRegistratura') DO tlog WITH 'ESEC: nu exista cursorul cRegistratura - STOP' DO tfinal ENDIF SELECT cRegistratura LOCAL lnInregInitial lnInregInitial = RECCOUNT() SCATTER NAME goRegistratura MEMO BLANK DO tlog WITH 'Inregistrari initiale: ' + TRANSFORM(lnInregInitial) * 1) alocare numar intern (seria 10, ca in ct_registratura.do_adauga) DO tlog WITH '--- Pas 1: alocare numar intern (seria 10)' LOCAL loGeneratorNumere, lcNumarIntern loGeneratorNumere = CREATEOBJECT('oGeneratorNumere') loGeneratorNumere.creeaza_cursor_serii(10) lcNumarIntern = ALLTRIM(STR(loGeneratorNumere.aloca_numar(10))) DO tlog WITH 'Numar intern alocat: ' + lcNumarIntern * 2) adaugare document gol (pack_registratura.adauga_registratura) DO tlog WITH '--- Pas 2: adauga_registratura' LOCAL lnId_reg lnId_reg = 0 lnId_reg = adauga_registratura('cRegistratura', lcNumarIntern) IF EMPTY(lnId_reg) DO tlog WITH 'ESEC: adauga_registratura a intors ' + TRANSFORM(lnId_reg) + ; ' (pack_registratura lipseste din schema de test?) - STOP curat, nimic de sters' DO tfinal ENDIF DO tlog WITH 'OK document adaugat, id_reg=' + TRANSFORM(lnId_reg) * pozitionare pe documentul nou + goRegistratura DO viz_registratura IN oproceduri_roaregistratura.prg SELECT cRegistratura LOCATE FOR id_reg = lnId_reg IF !FOUND() DO tlog WITH 'ESEC: documentul nou nu apare in vregistratura' ELSE SCATTER NAME goRegistratura MEMO DO tlog WITH 'Document nou gasit: nr_intern=' + TRANSFORM(NVL(numar_intern,'')) + ; ' id_part=' + TRANSFORM(goRegistratura.id_part) ENDIF * 3) salvare cu partener NULL - reproduce bugul P2 * (astazi: eroare "Invalid use of NULL"/sql NULL; dupa fix M1: mesaj + refuz) DO tlog WITH '--- Pas 3: modifica_reg_dg cu id_part NULL (se asteapta refuz/eroare)' goRegistratura.descriere = 'TEST AUTOMAT - nu folositi' DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg DO tlog WITH 'Pas 3 incheiat (vezi mai sus daca a fost eroare de executie = bug P2 nereparat)' * 4) salvare cu partener valid (refolosesc un partener din alt document existent) DO tlog WITH '--- Pas 4: modifica_reg_dg cu partener valid' LOCAL llSucces llSucces = goExecutor.oExecuta( ; "select id_part, denumire from vregistratura where id_part is not null and rownum = 1", 'cPartTest') IF llSucces AND USED('cPartTest') AND RECCOUNT('cPartTest') > 0 SELECT cPartTest goRegistratura.id_part = id_part goRegistratura.denumire = denumire USE IN cPartTest goRegistratura.data = DATE() goRegistratura.numar = 'TST-' + lcNumarIntern goRegistratura.ie = 1 goRegistratura.nr_pag = 1 DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg * verificare: datele au ajuns in baza DO viz_registratura IN oproceduri_roaregistratura.prg SELECT cRegistratura LOCATE FOR id_reg = lnId_reg IF FOUND() AND !ISNULL(id_part) AND ALLTRIM(NVL(numar,'')) == 'TST-' + lcNumarIntern DO tlog WITH 'OK salvare reusita: partener=' + TRANSFORM(NVL(denumire,'')) + ; ' numar=' + TRANSFORM(NVL(numar,'')) ELSE DO tlog WITH 'ESEC verificare: documentul nu are datele asteptate dupa salvare' ENDIF ELSE DO tlog WITH 'SKIP Pas 4: nu exista niciun partener in vregistratura pe schema de test' ENDIF * 5) EDITAREA documentului (fluxul Modifica -> Salveaza): modific campuri si re-salvez DO tlog WITH '--- Pas 5: editare document (modificare descriere/nr_pag/data + re-salvare)' SELECT cRegistratura LOCATE FOR id_reg = lnId_reg IF FOUND() AND !ISNULL(id_part) SCATTER NAME goRegistratura MEMO goRegistratura.descriere = 'TEST AUTOMAT - EDITAT' goRegistratura.nr_pag = 5 goRegistratura.data = DATE() - 1 goRegistratura.ie = 2 DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg * verificare: modificarile au ajuns in baza DO viz_registratura IN oproceduri_roaregistratura.prg SELECT cRegistratura LOCATE FOR id_reg = lnId_reg IF FOUND() AND ALLTRIM(NVL(descriere,'')) == 'TEST AUTOMAT - EDITAT' ; AND NVL(nr_pag,0) = 5 AND ie = 2 DO tlog WITH 'OK editare reusita: descriere=' + TRANSFORM(NVL(descriere,'')) + ; ' nr_pag=' + TRANSFORM(NVL(nr_pag,0)) + ' ie=' + TRANSFORM(ie) + ; ' data=' + TRANSFORM(data) ELSE DO tlog WITH 'ESEC verificare editare: documentul nu are valorile modificate' ENDIF ELSE DO tlog WITH 'SKIP Pas 5: documentul de test nu are partener (Pas 4 esuat/sarit)' ENDIF * 6) curatenie: soft-delete documentul de test DO tlog WITH '--- Pas 6: stergere document de test' LOCAL lcSql, lnSucces lcSql = [begin pack_registratura.sterge_registratura(] + ALLTRIM(STR(lnId_reg)) + ; [,] + ALLTRIM(STR(gnIdUtil)) + [); end;] lnSucces = goExecutor.oExecute(lcSql) IF lnSucces < 0 DO tlog WITH 'ATENTIE: stergerea a esuat: ' + TRANSFORM(goExecutor.cEroare) + ; ' - stergeti manual id_reg=' + TRANSFORM(lnId_reg) ELSE DO tlog WITH 'OK document de test sters (soft-delete), id_reg=' + TRANSFORM(lnId_reg) ENDIF DO tlog WITH '=== FINAL test_registratura_adaugare' DO tfinal PROCEDURE tlog LPARAMETERS tcMsg STRTOFILE(TRANSFORM(tcMsg) + CHR(13)+CHR(10), gcTestLog, 1) ENDPROC PROCEDURE tfinal ON ERROR CLOSE ALL QUIT ENDPROC