import io import tempfile import unittest from contextlib import redirect_stderr from pathlib import Path import pandas as pd # Adjust if your package name/import path differs. from baudolo.backup.dumps import load_databases_df EXPECTED_COLUMNS = ["instance", "database", "username", "password"] class TestLoadDatabasesDf(unittest.TestCase): def test_missing_csv_is_handled_with_warning_and_empty_df(self) -> None: with tempfile.TemporaryDirectory() as td: missing_path = str(Path(td) / "does-not-exist.csv") buf = io.StringIO() with redirect_stderr(buf): df = load_databases_df(missing_path) stderr = buf.getvalue() self.assertIn("WARNING:", stderr) self.assertIn("databases.csv not found", stderr) self.assertIsInstance(df, pd.DataFrame) self.assertListEqual(list(df.columns), EXPECTED_COLUMNS) self.assertTrue(df.empty) def test_empty_csv_is_handled_with_warning_and_empty_df(self) -> None: with tempfile.TemporaryDirectory() as td: empty_path = Path(td) / "databases.csv" with empty_path.open("w", encoding="utf-8") as f: f.write("") buf = io.StringIO() with redirect_stderr(buf): df = load_databases_df(empty_path) stderr = buf.getvalue() self.assertIn("WARNING:", stderr) self.assertIn("exists but is empty", stderr) self.assertIsInstance(df, pd.DataFrame) self.assertListEqual(list(df.columns), EXPECTED_COLUMNS) self.assertTrue(df.empty) def test_valid_csv_loads_without_warning(self) -> None: with tempfile.TemporaryDirectory() as td: csv_path = Path(td) / "databases.csv" content = "instance;database;username;password\nmyapp;*;dbuser;secret\n" with csv_path.open("w", encoding="utf-8") as f: f.write(content) buf = io.StringIO() with redirect_stderr(buf): df = load_databases_df(csv_path) stderr = buf.getvalue() self.assertEqual(stderr, "") # no warning expected self.assertIsInstance(df, pd.DataFrame) self.assertListEqual(list(df.columns), EXPECTED_COLUMNS) self.assertEqual(len(df), 1) self.assertEqual(df.loc[0, "instance"], "myapp") self.assertEqual(df.loc[0, "database"], "*") self.assertEqual(df.loc[0, "username"], "dbuser") self.assertEqual(df.loc[0, "password"], "secret") if __name__ == "__main__": unittest.main()