mirror of
https://github.com/artagaz/bd-semestovaya.git
synced 2026-06-19 02:01:30 +07:00
219 lines
7.4 KiB
SQL
219 lines
7.4 KiB
SQL
-- 06_test.sql
|
|
-- Тесты
|
|
|
|
SET SERVEROUTPUT ON;
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 1. Тест CRUD + автологирование (suppliers)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_new_id suppliers.id%TYPE;
|
|
v_cursor SYS_REFCURSOR;
|
|
v_log_id operation_log.log_id%TYPE;
|
|
v_tn operation_log.table_name%TYPE;
|
|
v_ot operation_log.operation_type%TYPE;
|
|
v_pk operation_log.record_pk%TYPE;
|
|
v_und operation_log.is_undone%TYPE;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 1: CRUD suppliers + logging ===');
|
|
|
|
-- INSERT
|
|
pkg_entity_crud.add_supplier('Test Supplier', 'Diler', 'test@test.com', 'Y', 'CT-TEST-99', v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Inserted supplier id=' || v_new_id);
|
|
|
|
-- UPDATE
|
|
pkg_entity_crud.upd_supplier(v_new_id, 'Test Supplier Updated', 'Proizvoditel', 'new@test.com', 'N', NULL);
|
|
DBMS_OUTPUT.PUT_LINE('Updated supplier id=' || v_new_id);
|
|
|
|
-- DELETE
|
|
pkg_entity_crud.del_supplier(v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Deleted supplier id=' || v_new_id);
|
|
|
|
-- Проверим лог
|
|
OPEN v_cursor FOR
|
|
SELECT log_id, table_name, operation_type, record_pk, is_undone
|
|
FROM operation_log
|
|
WHERE table_name = 'SUPPLIERS'
|
|
ORDER BY log_id DESC
|
|
FETCH FIRST 3 ROWS ONLY;
|
|
|
|
LOOP
|
|
FETCH v_cursor INTO v_log_id, v_tn, v_ot, v_pk, v_und;
|
|
EXIT WHEN v_cursor%NOTFOUND;
|
|
DBMS_OUTPUT.PUT_LINE('LOG: id=' || v_log_id || ' table=' || v_tn ||
|
|
' op=' || v_ot || ' pk=' || v_pk || ' undone=' || v_und);
|
|
END LOOP;
|
|
CLOSE v_cursor;
|
|
END;
|
|
/
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 2. Тест CRUD + автологирование (products)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_new_id products.id%TYPE;
|
|
v_cursor SYS_REFCURSOR;
|
|
v_log_id operation_log.log_id%TYPE;
|
|
v_tn operation_log.table_name%TYPE;
|
|
v_ot operation_log.operation_type%TYPE;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 2: CRUD products + logging ===');
|
|
|
|
pkg_entity_crud.add_product('Test Product', 'TEST-ARTICLE-999', v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Inserted product id=' || v_new_id);
|
|
|
|
pkg_entity_crud.upd_product(v_new_id, 'Test Product Updated', 'TEST-ARTICLE-999-U');
|
|
DBMS_OUTPUT.PUT_LINE('Updated product id=' || v_new_id);
|
|
|
|
pkg_entity_crud.del_product(v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Deleted product id=' || v_new_id);
|
|
|
|
OPEN v_cursor FOR
|
|
SELECT log_id, table_name, operation_type
|
|
FROM operation_log
|
|
WHERE table_name = 'PRODUCTS'
|
|
ORDER BY log_id DESC
|
|
FETCH FIRST 3 ROWS ONLY;
|
|
|
|
LOOP
|
|
FETCH v_cursor INTO v_log_id, v_tn, v_ot;
|
|
EXIT WHEN v_cursor%NOTFOUND;
|
|
DBMS_OUTPUT.PUT_LINE('LOG: id=' || v_log_id || ' table=' || v_tn || ' op=' || v_ot);
|
|
END LOOP;
|
|
CLOSE v_cursor;
|
|
END;
|
|
/
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 3. Тест CRUD + автологирование (purchase_orders)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_new_id purchase_orders.id%TYPE;
|
|
v_cursor SYS_REFCURSOR;
|
|
v_log_id operation_log.log_id%TYPE;
|
|
v_tn operation_log.table_name%TYPE;
|
|
v_ot operation_log.operation_type%TYPE;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 3: CRUD purchase_orders + logging ===');
|
|
|
|
pkg_entity_crud.add_purchase_order(1, DATE '2025-12-20', v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Inserted order id=' || v_new_id);
|
|
|
|
pkg_entity_crud.upd_purchase_order(v_new_id, 2, DATE '2025-12-21');
|
|
DBMS_OUTPUT.PUT_LINE('Updated order id=' || v_new_id);
|
|
|
|
pkg_entity_crud.del_purchase_order(v_new_id);
|
|
DBMS_OUTPUT.PUT_LINE('Deleted order id=' || v_new_id);
|
|
|
|
OPEN v_cursor FOR
|
|
SELECT log_id, table_name, operation_type
|
|
FROM operation_log
|
|
WHERE table_name = 'PURCHASE_ORDERS'
|
|
ORDER BY log_id DESC
|
|
FETCH FIRST 3 ROWS ONLY;
|
|
|
|
LOOP
|
|
FETCH v_cursor INTO v_log_id, v_tn, v_ot;
|
|
EXIT WHEN v_cursor%NOTFOUND;
|
|
DBMS_OUTPUT.PUT_LINE('LOG: id=' || v_log_id || ' table=' || v_tn || ' op=' || v_ot);
|
|
END LOOP;
|
|
CLOSE v_cursor;
|
|
END;
|
|
/
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 4. Тест просмотра лога (view_log)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_cursor SYS_REFCURSOR;
|
|
v_log_id operation_log.log_id%TYPE;
|
|
v_tn operation_log.table_name%TYPE;
|
|
v_ot operation_log.operation_type%TYPE;
|
|
v_date operation_log.operation_date%TYPE;
|
|
v_pk operation_log.record_pk%TYPE;
|
|
v_old operation_log.old_data%TYPE;
|
|
v_new operation_log.new_data%TYPE;
|
|
v_und operation_log.is_undone%TYPE;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 4: view_log (last 10 rows) ===');
|
|
|
|
pkg_log_manager.view_log(
|
|
p_start_date => NULL,
|
|
p_end_date => NULL,
|
|
p_operation_type=> NULL,
|
|
p_cursor => v_cursor
|
|
);
|
|
|
|
LOOP
|
|
FETCH v_cursor INTO v_log_id, v_tn, v_ot, v_date, v_pk, v_old, v_new, v_und;
|
|
EXIT WHEN v_cursor%NOTFOUND;
|
|
DBMS_OUTPUT.PUT_LINE('LOG: id=' || v_log_id || ' table=' || v_tn ||
|
|
' op=' || v_ot || ' date=' || v_date ||
|
|
' pk=' || v_pk || ' undone=' || v_und);
|
|
END LOOP;
|
|
CLOSE v_cursor;
|
|
END;
|
|
/
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 5. Тест отмены операции (undo)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_sup_id suppliers.id%TYPE;
|
|
v_log_id operation_log.log_id%TYPE;
|
|
v_cnt NUMBER;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 5: undo_operation ===');
|
|
|
|
-- Создаём поставщика, запоминаем log_id INSERT
|
|
pkg_entity_crud.add_supplier('Undo Test', 'Diler', 'undo@test.com', 'Y', 'CT-UNDO-01', v_sup_id);
|
|
|
|
BEGIN
|
|
SELECT log_id INTO v_log_id
|
|
FROM operation_log
|
|
WHERE table_name = 'SUPPLIERS' AND operation_type = 'INSERT'
|
|
ORDER BY log_id DESC FETCH FIRST 1 ROW ONLY;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
DBMS_OUTPUT.PUT_LINE('ERROR: operation_log is empty — check triggers');
|
|
RAISE;
|
|
END;
|
|
|
|
DBMS_OUTPUT.PUT_LINE('Created supplier id=' || v_sup_id || ', log_id=' || v_log_id);
|
|
|
|
-- Проверяем, что он есть
|
|
SELECT COUNT(*) INTO v_cnt FROM suppliers WHERE id = v_sup_id;
|
|
DBMS_OUTPUT.PUT_LINE('Count before undo=' || v_cnt);
|
|
|
|
-- Отменяем INSERT → DELETE
|
|
pkg_log_manager.undo_operation(v_log_id);
|
|
|
|
SELECT COUNT(*) INTO v_cnt FROM suppliers WHERE id = v_sup_id;
|
|
DBMS_OUTPUT.PUT_LINE('Count after undo=' || v_cnt || ' (expected 0)');
|
|
END;
|
|
/
|
|
|
|
-- ------------------------------------------------------------
|
|
-- 6. Тест сводного отчёта (get_report)
|
|
-- ------------------------------------------------------------
|
|
DECLARE
|
|
v_cursor SYS_REFCURSOR;
|
|
v_tn operation_log.table_name%TYPE;
|
|
v_ot operation_log.operation_type%TYPE;
|
|
v_cnt NUMBER;
|
|
BEGIN
|
|
DBMS_OUTPUT.PUT_LINE('=== TEST 6: get_report (sort by table_name, then count) ===');
|
|
|
|
v_cursor := pkg_log_manager.get_report(p_sort1 => TRUE, p_sort2 => FALSE, p_sort3 => TRUE);
|
|
|
|
LOOP
|
|
FETCH v_cursor INTO v_tn, v_ot, v_cnt;
|
|
EXIT WHEN v_cursor%NOTFOUND;
|
|
DBMS_OUTPUT.PUT_LINE('REPORT: table=' || v_tn || ' op=' || v_ot || ' count=' || v_cnt);
|
|
END LOOP;
|
|
CLOSE v_cursor;
|
|
END;
|
|
/
|
|
|
|
COMMIT;
|