"""Unit tests for teardown behavior.""" import os import sys from unittest.mock import patch, MagicMock import pytest sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import runner @pytest.fixture def r(): instance = runner.TestRunner(os.path.dirname(os.path.abspath(__file__))) instance.seed_data = { "account": [{"Id": "acc1", "Name": "Test Acct"}] } return instance def test_teardown_sql_error_does_not_fail_case(r: runner.TestRunner) -> None: """Teardown SQL failures should be logged but not fail the case.""" case = { "id": "test-case", "teardown": [ {"type": "sql", "sql": "DELETE FROM Quote WHERE Id = %s", "params": ["{quote_id}"]} ], "endpoint": "/test", "expects": {"status": 200}, } with patch.object(r, '_db_connect') as mock_connect: mock_conn = MagicMock() mock_connect.return_value = mock_conn with patch.object(r, '_execute_sql_step') as mock_sql: mock_sql.side_effect = Exception("SSL connection error: 2026 (HY000)") result = {"status": "PASS"} r._execute_teardown(case) assert result["status"] == "PASS" def test_teardown_sql_error_prints_warning(r: runner.TestRunner, capsys) -> None: """Teardown failures should print a warning.""" case = { "id": "test-case", "teardown": [ {"type": "sql", "sql": "DELETE FROM Quote WHERE Id = %s", "params": ["{quote_id}"]} ], } with patch.object(r, '_db_connect') as mock_connect: mock_conn = MagicMock() mock_connect.return_value = mock_conn with patch.object(r, '_execute_sql_step') as mock_sql: mock_sql.side_effect = Exception("SSL connection error") r._execute_teardown(case) captured = capsys.readouterr() assert "Teardown warning" in captured.out or "SSL" in captured.out def test_teardown_empty_returns_true(r: runner.TestRunner) -> None: """Teardown with no steps should return True (success).""" case = {"id": "test-case"} result = r._execute_teardown(case) assert result is True