/tests/test_generate_index.py
import tempfile
import unittest
from pathlib import Path

import generate_index


class GenerateIndexTests(unittest.TestCase):
    def setUp(self) -> None:
        self.temp_dir = tempfile.TemporaryDirectory()
        self.root = Path(self.temp_dir.name)

    def tearDown(self) -> None:
        self.temp_dir.cleanup()

    def test_text_file_has_preview_and_download_actions(self) -> None:
        (self.root / "note.txt").write_text("hello preview", encoding="utf-8")

        generate_index.generate_indexes(self.root)

        index_html = (self.root / "index.html").read_text(encoding="utf-8")
        self.assertIn('.preview/note.txt.html', index_html)
        self.assertIn('href="note.txt" download', index_html)

        preview_html = (self.root / ".preview" / "note.txt.html").read_text(encoding="utf-8")
        self.assertIn("hello preview", preview_html)
        self.assertIn('href="../note.txt" download', preview_html)

    def test_directory_entry_remains_open_action(self) -> None:
        (self.root / "docs").mkdir()
        (self.root / "docs" / "guide.md").write_text("# guide", encoding="utf-8")

        generate_index.generate_indexes(self.root)

        index_html = (self.root / "index.html").read_text(encoding="utf-8")
        self.assertIn('href="docs/"', index_html)

    def test_binary_file_only_has_download_action(self) -> None:
        (self.root / "archive.zip").write_bytes(b"PK\x03\x04")

        generate_index.generate_indexes(self.root)

        index_html = (self.root / "index.html").read_text(encoding="utf-8")
        self.assertNotIn('.preview/archive.zip.html', index_html)
        self.assertIn('href="archive.zip" download', index_html)
        self.assertFalse((self.root / ".preview" / "archive.zip.html").exists())

    def test_root_generates_not_found_and_redirect_rules(self) -> None:
        (self.root / "hello.txt").write_text("world", encoding="utf-8")

        generate_index.generate_indexes(self.root)

        not_found_html = (self.root / "404.html").read_text(encoding="utf-8")
        redirects = (self.root / "_redirects").read_text(encoding="utf-8")

        self.assertIn("404", not_found_html)
        self.assertEqual("/* /404.html 404\n", redirects)

    def test_userlogs_directory_is_hidden_from_index(self) -> None:
        (self.root / ".userlogs").mkdir()
        (self.root / ".userlogs" / "trace.log").write_text("secret", encoding="utf-8")
        (self.root / "visible").mkdir()

        generate_index.generate_indexes(self.root)

        index_html = (self.root / "index.html").read_text(encoding="utf-8")
        self.assertNotIn(".userlogs/", index_html)
        self.assertIn('href="visible/"', index_html)
        self.assertFalse((self.root / ".userlogs" / "index.html").exists())


if __name__ == "__main__":
    unittest.main()