Files
SIA/test/single_entry_test.py
2024-11-11 14:23:08 +01:00

139 lines
5.2 KiB
Python

import unittest
from datetime import datetime
import os
from sia.single_entry import SingleEntry
class SingleEntryTest(unittest.TestCase):
def setUp(self):
"""Set up test cases with fixed id and timestamp"""
self.test_id = "test-id-1234"
self.test_timestamp = datetime(2024, 10, 31, 12, 0, 0)
# Create a temporary file for testing
self.test_filename = "test_output.txt"
self.cleanup_files()
def tearDown(self):
"""Clean up any test files"""
self.cleanup_files()
def cleanup_files(self):
"""Helper to remove test files"""
if os.path.exists(self.test_filename):
os.remove(self.test_filename)
def test_initialization(self):
"""Test entry initialization"""
script = "echo test"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
self.assertEqual(entry.script, script)
self.assertEqual(entry.stdout, "")
self.assertEqual(entry.stderr, "")
self.assertIsNone(entry.exit_code)
self.assertEqual(entry.id, self.test_id)
self.assertEqual(entry.timestamp, self.test_timestamp)
self.assertFalse(entry._executed)
def test_successful_execution(self):
"""Test successful script execution"""
script = "echo 'test'"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
entry.update()
# Verify entry state
self.assertEqual(entry.stdout.strip(), "test")
self.assertEqual(entry.stderr, "")
self.assertEqual(entry.exit_code, 0)
self.assertTrue(entry._executed)
def test_failed_execution(self):
"""Test failed script execution with invalid command"""
entry = SingleEntry("nonexistentcommand", self.test_id, self.test_timestamp)
entry.update()
# Verify entry state
self.assertEqual(entry.stdout, "")
self.assertTrue(len(entry.stderr) > 0) # Error message will vary by OS
self.assertNotEqual(entry.exit_code, 0) # Exit code will be non-zero
self.assertTrue(entry._executed)
def test_file_creation(self):
"""Test script that creates a file"""
script = f"echo 'test' > {self.test_filename}"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
entry.update()
# Verify file was created and contains expected content
self.assertTrue(os.path.exists(self.test_filename))
with open(self.test_filename, 'r') as f:
content = f.read().strip()
self.assertEqual(content, "test")
def test_single_execution(self):
"""Test that script only executes once"""
script = f"echo 'test' >> {self.test_filename}"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
# Run update multiple times
entry.update()
entry.update()
entry.update()
# Verify file only contains one line
with open(self.test_filename, 'r') as f:
lines = f.readlines()
self.assertEqual(len(lines), 1)
self.assertEqual(lines[0].strip(), "test")
def test_generate_context_before_execution(self):
"""Test XML context generation before execution"""
entry = SingleEntry("echo test", self.test_id, self.test_timestamp)
element = entry.generate_context()
# Verify XML structure
self.assertEqual(element.tag, "single")
self.assertEqual(element.get("id"), self.test_id)
self.assertEqual(element.text, "echo test")
# Verify no output elements exist
self.assertIsNone(element.find("stdout"))
self.assertIsNone(element.find("stderr"))
self.assertIsNone(element.get("exit_code"))
def test_generate_context_after_execution(self):
"""Test XML context generation after execution"""
script = "echo 'test'"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
entry.update()
element = entry.generate_context()
# Verify XML structure
self.assertEqual(element.tag, "single")
self.assertEqual(element.get("id"), self.test_id)
self.assertEqual(element.text, f"{script}")
# Get stdout and remove trailing newline for comparison
stdout_text = element.find("stdout").text
self.assertEqual(stdout_text, "test\n")
self.assertEqual(element.find("stderr").text, "")
self.assertEqual(element.get("exit_code"), "0")
def test_multiple_commands(self):
"""Test executing multiple commands in one script"""
script = f"echo 'first' > {self.test_filename} && echo 'second' >> {self.test_filename}"
entry = SingleEntry(script, self.test_id, self.test_timestamp)
entry.update()
# Verify file contains both lines
with open(self.test_filename, 'r') as f:
lines = f.readlines()
self.assertEqual(len(lines), 2)
self.assertEqual(lines[0].strip(), "first")
self.assertEqual(lines[1].strip(), "second")