diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32560a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Python bytecode +__pycache__/ +*.pyc + +# Pytest +.pytest_cache/ + +# Distribution / packaging +dist/ +build/ +*.egg-info/ diff --git a/hello.py b/hello.py new file mode 100644 index 0000000..7df869a --- /dev/null +++ b/hello.py @@ -0,0 +1 @@ +print("Hello, World!") diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..c342023 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests package for hello.py.""" diff --git a/tests/test_hello.py b/tests/test_hello.py new file mode 100644 index 0000000..f47ee8c --- /dev/null +++ b/tests/test_hello.py @@ -0,0 +1,69 @@ +"""Tests for hello.py module using pytest.""" + +import subprocess +from pathlib import Path + +# Module-level constants to avoid duplication across test functions +HELLO_SCRIPT = Path(__file__).parent.parent / "hello.py" +WORKING_DIR = Path(__file__).parent.parent + + +def run_hello(): + """Run hello.py and return the subprocess result.""" + return subprocess.run( + ["python3", str(HELLO_SCRIPT)], + capture_output=True, + text=True, + cwd=WORKING_DIR, + ) + + +class TestHelloOutput: + """Tests for hello.py output behavior.""" + + def test_hello_prints_expected_message(self): + """Test that hello.py prints 'Hello, World!' to stdout.""" + result = run_hello() + assert "Hello, World!" in result.stdout + + def test_hello_exact_output(self): + """Test that hello.py output matches exactly (with newline).""" + result = run_hello() + assert result.stdout.strip() == "Hello, World!" + + def test_hello_exit_code_zero(self): + """Test that hello.py exits with code 0.""" + result = run_hello() + assert result.returncode == 0 + + def test_hello_no_stderr(self): + """Test that hello.py produces no stderr output.""" + result = run_hello() + assert result.stderr == "" + + def test_hello_stdout_not_empty(self): + """Test that hello.py produces non-empty stdout.""" + result = run_hello() + assert len(result.stdout) > 0 + + +class TestHelloFile: + """Tests for hello.py file existence and content.""" + + def test_hello_file_exists(self): + """Test that hello.py file exists.""" + assert HELLO_SCRIPT.exists() + + def test_hello_file_is_python(self): + """Test that hello.py has .py extension.""" + assert HELLO_SCRIPT.suffix == ".py" + + def test_hello_file_contains_print(self): + """Test that hello.py contains a print statement.""" + content = HELLO_SCRIPT.read_text() + assert "print" in content + + def test_hello_file_contains_hello_world(self): + """Test that hello.py contains 'Hello, World!' string.""" + content = HELLO_SCRIPT.read_text() + assert "Hello, World!" in content