import io.swtc.networking.CameraConfig; import io.swtc.networking.CameraSettings; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import static org.junit.jupiter.api.Assertions.*; class CameraSettingsTest { // Must match the filename used in CameraSettings.java private final File TEST_FILE = new File("network_cameras.json"); @BeforeEach @AfterEach void cleanUp() { // Ensure we start and end with a clean slate to avoid side effects if (TEST_FILE.exists()) { TEST_FILE.delete(); } } @Test void testLoadReturnsEmptyListWhenNoFile() { // If the file doesn't exist, it should return an empty list (not null) List result = CameraSettings.load(); assertNotNull(result, "Load should never return null"); assertTrue(result.isEmpty(), "Should return empty list if file doesn't exist"); } @Test void testSaveAndLoad() { // 1. Create a config (Using your actual constructor) CameraConfig config = new CameraConfig("FrontDoor", "http://192.168.1.100/mjpeg"); // 2. Save it CameraSettings.save(config); // 3. Verify file creation assertTrue(TEST_FILE.exists(), "File should be created after save"); // 4. Load it back List loaded = CameraSettings.load(); // 5. Verify contents assertEquals(1, loaded.size()); assertEquals("FrontDoor", loaded.get(0).getName()); assertEquals("http://192.168.1.100/mjpeg", loaded.get(0).getUrl()); } @Test void testSaveMultiple() { // Save two distinct cameras CameraSettings.save(new CameraConfig("Cam1", "rtsp://10.0.0.1/stream")); CameraSettings.save(new CameraConfig("Cam2", "rtsp://10.0.0.2/stream")); List loaded = CameraSettings.load(); assertEquals(2, loaded.size()); assertEquals("Cam1", loaded.get(0).getName()); assertEquals("Cam2", loaded.get(1).getName()); } @Test void testDelete() { // Setup: Save two cameras CameraSettings.save(new CameraConfig("Garage", "http://1.1.1.1")); CameraSettings.save(new CameraConfig("Garden", "http://2.2.2.2")); // Action: Delete "Garage" CameraSettings.delete("Garage"); // Verify: Only "Garden" remains List result = CameraSettings.load(); assertEquals(1, result.size()); assertEquals("Garden", result.get(0).getName()); } @Test void testLoadCorruptFile() throws IOException { // Manually write broken JSON to the file try (FileWriter writer = new FileWriter(TEST_FILE)) { writer.write("{ \"this is broken json\": ... "); } // The code catches IOException and returns empty list List result = CameraSettings.load(); assertNotNull(result); assertTrue(result.isEmpty(), "Should handle corrupt JSON gracefully by returning empty list"); } }