From 9f70a124e0aebec7c29d13bef43d50c811dad133 Mon Sep 17 00:00:00 2001 From: rong-xyz Date: Mon, 21 Apr 2025 08:15:53 +0000 Subject: [PATCH] del test files --- packages/markitup/tests/__init__.py | 3 - packages/markitup/tests/_test_vectors.py | 279 ------------ packages/markitup/tests/test_cli_misc.py | 35 -- packages/markitup/tests/test_cli_vectors.py | 227 ---------- packages/markitup/tests/test_module_misc.py | 419 ------------------ .../markitup/tests/test_module_vectors.py | 239 ---------- 6 files changed, 1202 deletions(-) delete mode 100644 packages/markitup/tests/__init__.py delete mode 100644 packages/markitup/tests/_test_vectors.py delete mode 100644 packages/markitup/tests/test_cli_misc.py delete mode 100644 packages/markitup/tests/test_cli_vectors.py delete mode 100644 packages/markitup/tests/test_module_misc.py delete mode 100644 packages/markitup/tests/test_module_vectors.py diff --git a/packages/markitup/tests/__init__.py b/packages/markitup/tests/__init__.py deleted file mode 100644 index 44af7d7..0000000 --- a/packages/markitup/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-FileCopyrightText: 2024-present Adam Fourney -# -# SPDX-License-Identifier: MIT diff --git a/packages/markitup/tests/_test_vectors.py b/packages/markitup/tests/_test_vectors.py deleted file mode 100644 index f46cd23..0000000 --- a/packages/markitup/tests/_test_vectors.py +++ /dev/null @@ -1,279 +0,0 @@ -import dataclasses -from typing import List - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class FileTestVector(object): - filename: str - mimetype: str | None - charset: str | None - url: str | None - must_include: List[str] - must_not_include: List[str] - - -GENERAL_TEST_VECTORS = [ - FileTestVector( - filename="test.docx", - mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document", - charset=None, - url=None, - must_include=[ - "314b0a30-5b04-470b-b9f7-eed2c2bec74a", - "49e168b7-d2ae-407f-a055-2167576f39a1", - "## d666f1f7-46cb-42bd-9a39-9a39cf2a509f", - "# Abstract", - "# Introduction", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "data:image/png;base64...", - ], - must_not_include=[ - "data:image/png;base64,iVBORw0KGgoAAAANSU", - ], - ), - FileTestVector( - filename="test.xlsx", - mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - charset=None, - url=None, - must_include=[ - "## 09060124-b5e7-4717-9d07-3c046eb", - "6ff4173b-42a5-4784-9b19-f49caff4d93d", - "affc7dad-52dc-4b98-9b5d-51e65d8a8ad0", - ], - must_not_include=[], - ), - FileTestVector( - filename="test.xls", - mimetype="application/vnd.ms-excel", - charset=None, - url=None, - must_include=[ - "## 09060124-b5e7-4717-9d07-3c046eb", - "6ff4173b-42a5-4784-9b19-f49caff4d93d", - "affc7dad-52dc-4b98-9b5d-51e65d8a8ad0", - ], - must_not_include=[], - ), - FileTestVector( - filename="test.pptx", - mimetype="application/vnd.openxmlformats-officedocument.presentationml.presentation", - charset=None, - url=None, - must_include=[ - "2cdda5c8-e50e-4db4-b5f0-9722a649f455", - "04191ea8-5c73-4215-a1d3-1cfb43aaaf12", - "44bf7d06-5e7a-4a40-a2e1-a2e42ef28c8a", - "1b92870d-e3b5-4e65-8153-919f4ff45592", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "a3f6004b-6f4f-4ea8-bee3-3741f4dc385f", # chart title - "2003", # chart value - "![This phrase of the caption is Human-written.](Picture4.jpg)", - ], - must_not_include=["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE"], - ), - FileTestVector( - filename="test_outlook_msg.msg", - mimetype="application/vnd.ms-outlook", - charset=None, - url=None, - must_include=[ - "# Email Message", - "**From:** test.sender@example.com", - "**To:** test.recipient@example.com", - "**Subject:** Test Email Message", - "## Content", - "This is the body of the test email message", - ], - must_not_include=[], - ), - FileTestVector( - filename="test.pdf", - mimetype="application/pdf", - charset=None, - url=None, - must_include=[ - "While there is contemporaneous exploration of multi-agent approaches" - ], - must_not_include=[], - ), - FileTestVector( - filename="test_blog.html", - mimetype="text/html", - charset="utf-8", - url="https://microsoft.github.io/autogen/blog/2023/04/21/LLM-tuning-math", - must_include=[ - "Large language models (LLMs) are powerful tools that can generate natural language texts for various applications, such as chatbots, summarization, translation, and more. GPT-4 is currently the state of the art LLM in the world. Is model selection irrelevant? What about inference parameters?", - "an example where high cost can easily prevent a generic complex", - ], - must_not_include=[], - ), - FileTestVector( - filename="test_wikipedia.html", - mimetype="text/html", - charset="utf-8", - url="https://en.wikipedia.org/wiki/Microsoft", - must_include=[ - "Microsoft entered the operating system (OS) business in 1980 with its own version of [Unix]", - 'Microsoft was founded by [Bill Gates](/wiki/Bill_Gates "Bill Gates")', - ], - must_not_include=[ - "You are encouraged to create an account and log in", - "154 languages", - "move to sidebar", - ], - ), - FileTestVector( - filename="test_serp.html", - mimetype="text/html", - charset="utf-8", - url="https://www.bing.com/search?q=microsoft+wikipedia", - must_include=[ - "](https://en.wikipedia.org/wiki/Microsoft", - "Microsoft Corporation is **an American multinational corporation and technology company headquartered** in Redmond", - "1995–2007: Foray into the Web, Windows 95, Windows XP, and Xbox", - ], - must_not_include=[ - "https://www.bing.com/ck/a?!&&p=", - "data:image/svg+xml,%3Csvg%20width%3D", - ], - ), - FileTestVector( - filename="test_mskanji.csv", - mimetype="text/csv", - charset="cp932", - url=None, - must_include=[ - "| 名前 | 年齢 | 住所 |", - "| --- | --- | --- |", - "| 佐藤太郎 | 30 | 東京 |", - "| 三木英子 | 25 | 大阪 |", - "| 髙橋淳 | 35 | 名古屋 |", - ], - must_not_include=[], - ), - FileTestVector( - filename="test.json", - mimetype="application/json", - charset="ascii", - url=None, - must_include=[ - "5b64c88c-b3c3-4510-bcb8-da0b200602d8", - "9700dc99-6685-40b4-9a3a-5e406dcb37f3", - ], - must_not_include=[], - ), - FileTestVector( - filename="test_rss.xml", - mimetype="text/xml", - charset="utf-8", - url=None, - must_include=[ - "# The Official Microsoft Blog", - "## Ignite 2024: Why nearly 70% of the Fortune 500 now use Microsoft 365 Copilot", - "In the case of AI, it is absolutely true that the industry is moving incredibly fast", - ], - must_not_include=[" This is a blockquote for testing", - ], - must_not_include=[], - ), -] - - -DATA_URI_TEST_VECTORS = [ - FileTestVector( - filename="test.docx", - mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document", - charset=None, - url=None, - must_include=[ - "314b0a30-5b04-470b-b9f7-eed2c2bec74a", - "49e168b7-d2ae-407f-a055-2167576f39a1", - "## d666f1f7-46cb-42bd-9a39-9a39cf2a509f", - "# Abstract", - "# Introduction", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "data:image/png;base64,iVBORw0KGgoAAAANSU", - ], - must_not_include=[ - "data:image/png;base64...", - ], - ), - FileTestVector( - filename="test.pptx", - mimetype="application/vnd.openxmlformats-officedocument.presentationml.presentation", - charset=None, - url=None, - must_include=[ - "2cdda5c8-e50e-4db4-b5f0-9722a649f455", - "04191ea8-5c73-4215-a1d3-1cfb43aaaf12", - "44bf7d06-5e7a-4a40-a2e1-a2e42ef28c8a", - "1b92870d-e3b5-4e65-8153-919f4ff45592", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "a3f6004b-6f4f-4ea8-bee3-3741f4dc385f", # chart title - "2003", # chart value - "![This phrase of the caption is Human-written.]", # image caption - "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE", - ], - must_not_include=[ - "![This phrase of the caption is Human-written.](Picture4.jpg)", - ], - ), -] diff --git a/packages/markitup/tests/test_cli_misc.py b/packages/markitup/tests/test_cli_misc.py deleted file mode 100644 index 3e22fec..0000000 --- a/packages/markitup/tests/test_cli_misc.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -m pytest -import subprocess -import pytest -from markitup import __version__ - -# This file contains CLI tests that are not directly tested by the FileTestVectors. -# This includes things like help messages, version numbers, and invalid flags. - - -def test_version() -> None: - result = subprocess.run( - ["python", "-m", "markitup", "--version"], capture_output=True, text=True - ) - - assert result.returncode == 0, f"CLI exited with error: {result.stderr}" - assert __version__ in result.stdout, f"Version not found in output: {result.stdout}" - - -def test_invalid_flag() -> None: - result = subprocess.run( - ["python", "-m", "markitup", "--foobar"], capture_output=True, text=True - ) - - assert result.returncode != 0, f"CLI exited with error: {result.stderr}" - assert ( - "unrecognized arguments" in result.stderr - ), f"Expected 'unrecognized arguments' to appear in STDERR" - assert "SYNTAX" in result.stderr, f"Expected 'SYNTAX' to appear in STDERR" - - -if __name__ == "__main__": - """Runs this file's tests from the command line.""" - test_version() - test_invalid_flag() - print("All tests passed!") diff --git a/packages/markitup/tests/test_cli_vectors.py b/packages/markitup/tests/test_cli_vectors.py deleted file mode 100644 index d24ad61..0000000 --- a/packages/markitup/tests/test_cli_vectors.py +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/env python3 -m pytest -import os -import time -import pytest -import subprocess -import locale -from typing import List - -if __name__ == "__main__": - from _test_vectors import ( - GENERAL_TEST_VECTORS, - DATA_URI_TEST_VECTORS, - FileTestVector, - ) -else: - from ._test_vectors import ( - GENERAL_TEST_VECTORS, - DATA_URI_TEST_VECTORS, - FileTestVector, - ) - -from markitup import ( - MarkItUp, - UnsupportedFormatException, - FileConversionException, - StreamInfo, -) - -skip_remote = ( - True if os.environ.get("GITHUB_ACTIONS") else False -) # Don't run these tests in CI - -TEST_FILES_DIR = os.path.join(os.path.dirname(__file__), "test_files") -TEST_FILES_URL = "https://raw.githubusercontent.com/microsoft/markitup/refs/heads/main/packages/markitup/tests/test_files" - - -# Prepare CLI test vectors (remove vectors that require mockig the url) -CLI_TEST_VECTORS: List[FileTestVector] = [] -for test_vector in GENERAL_TEST_VECTORS: - if test_vector.url is not None: - continue - CLI_TEST_VECTORS.append(test_vector) - - -@pytest.fixture(scope="session") -def shared_tmp_dir(tmp_path_factory): - return tmp_path_factory.mktemp("pytest_tmp") - - -@pytest.mark.parametrize("test_vector", CLI_TEST_VECTORS) -def test_output_to_stdout(shared_tmp_dir, test_vector) -> None: - """Test that the CLI outputs to stdout correctly.""" - - result = subprocess.run( - [ - "python", - "-m", - "markitup", - os.path.join(TEST_FILES_DIR, test_vector.filename), - ], - capture_output=True, - text=True, - ) - - assert result.returncode == 0, f"CLI exited with error: {result.stderr}" - for test_string in test_vector.must_include: - assert test_string in result.stdout - for test_string in test_vector.must_not_include: - assert test_string not in result.stdout - - -@pytest.mark.parametrize("test_vector", CLI_TEST_VECTORS) -def test_output_to_file(shared_tmp_dir, test_vector) -> None: - """Test that the CLI outputs to a file correctly.""" - - output_file = os.path.join(shared_tmp_dir, test_vector.filename + ".output") - result = subprocess.run( - [ - "python", - "-m", - "markitup", - "-o", - output_file, - os.path.join(TEST_FILES_DIR, test_vector.filename), - ], - capture_output=True, - text=True, - ) - - assert result.returncode == 0, f"CLI exited with error: {result.stderr}" - assert os.path.exists(output_file), f"Output file not created: {output_file}" - - with open(output_file, "r") as f: - output_data = f.read() - for test_string in test_vector.must_include: - assert test_string in output_data - for test_string in test_vector.must_not_include: - assert test_string not in output_data - - os.remove(output_file) - assert not os.path.exists(output_file), f"Output file not deleted: {output_file}" - - -@pytest.mark.parametrize("test_vector", CLI_TEST_VECTORS) -def test_input_from_stdin_without_hints(shared_tmp_dir, test_vector) -> None: - """Test that the CLI readds from stdin correctly.""" - - test_input = b"" - with open(os.path.join(TEST_FILES_DIR, test_vector.filename), "rb") as stream: - test_input = stream.read() - - result = subprocess.run( - [ - "python", - "-m", - "markitup", - os.path.join(TEST_FILES_DIR, test_vector.filename), - ], - input=test_input, - capture_output=True, - text=False, - ) - - stdout = result.stdout.decode(locale.getpreferredencoding()) - assert ( - result.returncode == 0 - ), f"CLI exited with error: {result.stderr.decode('utf-8')}" - for test_string in test_vector.must_include: - assert test_string in stdout - for test_string in test_vector.must_not_include: - assert test_string not in stdout - - -@pytest.mark.skipif( - skip_remote, - reason="do not run tests that query external urls", -) -@pytest.mark.parametrize("test_vector", CLI_TEST_VECTORS) -def test_convert_url(shared_tmp_dir, test_vector): - """Test the conversion of a stream with no stream info.""" - # Note: tmp_dir is not used here, but is needed to match the signature - - markitup = MarkItUp() - - time.sleep(1) # Ensure we don't hit rate limits - result = subprocess.run( - ["python", "-m", "markitup", TEST_FILES_URL + "/" + test_vector.filename], - capture_output=True, - text=False, - ) - - stdout = result.stdout.decode(locale.getpreferredencoding()) - assert result.returncode == 0, f"CLI exited with error: {result.stderr}" - for test_string in test_vector.must_include: - assert test_string in stdout - for test_string in test_vector.must_not_include: - assert test_string not in stdout - - -@pytest.mark.parametrize("test_vector", DATA_URI_TEST_VECTORS) -def test_output_to_file_with_data_uris(shared_tmp_dir, test_vector) -> None: - """Test CLI functionality when keep_data_uris is enabled""" - - output_file = os.path.join(shared_tmp_dir, test_vector.filename + ".output") - result = subprocess.run( - [ - "python", - "-m", - "markitup", - "--keep-data-uris", - "-o", - output_file, - os.path.join(TEST_FILES_DIR, test_vector.filename), - ], - capture_output=True, - text=True, - ) - - assert result.returncode == 0, f"CLI exited with error: {result.stderr}" - assert os.path.exists(output_file), f"Output file not created: {output_file}" - - with open(output_file, "r") as f: - output_data = f.read() - for test_string in test_vector.must_include: - assert test_string in output_data - for test_string in test_vector.must_not_include: - assert test_string not in output_data - - os.remove(output_file) - assert not os.path.exists(output_file), f"Output file not deleted: {output_file}" - - -if __name__ == "__main__": - import sys - import tempfile - - """Runs this file's tests from the command line.""" - - with tempfile.TemporaryDirectory() as tmp_dir: - # General tests - for test_function in [ - test_output_to_stdout, - test_output_to_file, - test_input_from_stdin_without_hints, - test_convert_url, - ]: - for test_vector in CLI_TEST_VECTORS: - print( - f"Running {test_function.__name__} on {test_vector.filename}...", - end="", - ) - test_function(tmp_dir, test_vector) - print("OK") - - # Data URI tests - for test_function in [ - test_output_to_file_with_data_uris, - ]: - for test_vector in DATA_URI_TEST_VECTORS: - print( - f"Running {test_function.__name__} on {test_vector.filename}...", - end="", - ) - test_function(tmp_dir, test_vector) - print("OK") - - print("All tests passed!") diff --git a/packages/markitup/tests/test_module_misc.py b/packages/markitup/tests/test_module_misc.py deleted file mode 100644 index 5e50c03..0000000 --- a/packages/markitup/tests/test_module_misc.py +++ /dev/null @@ -1,419 +0,0 @@ -#!/usr/bin/env python3 -m pytest -import io -import os -import re -import shutil -import openai -import pytest - -from markitup._uri_utils import parse_data_uri, file_uri_to_path - -from markitup import ( - MarkItUp, - UnsupportedFormatException, - FileConversionException, - StreamInfo, -) - -# This file contains module tests that are not directly tested by the FileTestVectors. -# This includes things like helper functions and runtime conversion options -# (e.g., LLM clients, exiftool path, transcription services, etc.) - -skip_remote = ( - True if os.environ.get("GITHUB_ACTIONS") else False -) # Don't run these tests in CI - - -# Don't run the llm tests without a key and the client library -skip_llm = False if os.environ.get("OPENAI_API_KEY") else True -try: - import openai -except ModuleNotFoundError: - skip_llm = True - -# Skip exiftool tests if not installed -skip_exiftool = shutil.which("exiftool") is None - -TEST_FILES_DIR = os.path.join(os.path.dirname(__file__), "test_files") - -JPG_TEST_EXIFTOOL = { - "Author": "AutoGen Authors", - "Title": "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "Description": "AutoGen enables diverse LLM-based applications", - "ImageSize": "1615x1967", - "DateTimeOriginal": "2024:03:14 22:10:00", -} - -MP3_TEST_EXIFTOOL = { - "Title": "f67a499e-a7d0-4ca3-a49b-358bd934ae3e", - "Artist": "Artist Name Test String", - "Album": "Album Name Test String", - "SampleRate": "48000", -} - -PDF_TEST_URL = "https://arxiv.org/pdf/2308.08155v2.pdf" -PDF_TEST_STRINGS = [ - "While there is contemporaneous exploration of multi-agent approaches" -] - -YOUTUBE_TEST_URL = "https://www.youtube.com/watch?v=V2qZ_lgxTzg" -YOUTUBE_TEST_STRINGS = [ - "## AutoGen FULL Tutorial with Python (Step-By-Step)", - "This is an intermediate tutorial for installing and using AutoGen locally", - "PT15M4S", - "the model we're going to be using today is GPT 3.5 turbo", # From the transcript -] - -DOCX_COMMENT_TEST_STRINGS = [ - "314b0a30-5b04-470b-b9f7-eed2c2bec74a", - "49e168b7-d2ae-407f-a055-2167576f39a1", - "## d666f1f7-46cb-42bd-9a39-9a39cf2a509f", - "# Abstract", - "# Introduction", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "This is a test comment. 12df-321a", - "Yet another comment in the doc. 55yiyi-asd09", -] - -BLOG_TEST_URL = "https://microsoft.github.io/autogen/blog/2023/04/21/LLM-tuning-math" -BLOG_TEST_STRINGS = [ - "Large language models (LLMs) are powerful tools that can generate natural language texts for various applications, such as chatbots, summarization, translation, and more. GPT-4 is currently the state of the art LLM in the world. Is model selection irrelevant? What about inference parameters?", - "an example where high cost can easily prevent a generic complex", -] - -LLM_TEST_STRINGS = [ - "5bda1dd6", -] - -PPTX_TEST_STRINGS = [ - "2cdda5c8-e50e-4db4-b5f0-9722a649f455", - "04191ea8-5c73-4215-a1d3-1cfb43aaaf12", - "44bf7d06-5e7a-4a40-a2e1-a2e42ef28c8a", - "1b92870d-e3b5-4e65-8153-919f4ff45592", - "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation", - "a3f6004b-6f4f-4ea8-bee3-3741f4dc385f", # chart title - "2003", # chart value -] - - -# --- Helper Functions --- -def validate_strings(result, expected_strings, exclude_strings=None): - """Validate presence or absence of specific strings.""" - text_content = result.text_content.replace("\\", "") - for string in expected_strings: - assert string in text_content - if exclude_strings: - for string in exclude_strings: - assert string not in text_content - - -def test_stream_info_operations() -> None: - """Test operations performed on StreamInfo objects.""" - - stream_info_original = StreamInfo( - mimetype="mimetype.1", - extension="extension.1", - charset="charset.1", - filename="filename.1", - local_path="local_path.1", - url="url.1", - ) - - # Check updating all attributes by keyword - keywords = ["mimetype", "extension", "charset", "filename", "local_path", "url"] - for keyword in keywords: - updated_stream_info = stream_info_original.copy_and_update( - **{keyword: f"{keyword}.2"} - ) - - # Make sure the targted attribute is updated - assert getattr(updated_stream_info, keyword) == f"{keyword}.2" - - # Make sure the other attributes are unchanged - for k in keywords: - if k != keyword: - assert getattr(stream_info_original, k) == getattr( - updated_stream_info, k - ) - - # Check updating all attributes by passing a new StreamInfo object - keywords = ["mimetype", "extension", "charset", "filename", "local_path", "url"] - for keyword in keywords: - updated_stream_info = stream_info_original.copy_and_update( - StreamInfo(**{keyword: f"{keyword}.2"}) - ) - - # Make sure the targted attribute is updated - assert getattr(updated_stream_info, keyword) == f"{keyword}.2" - - # Make sure the other attributes are unchanged - for k in keywords: - if k != keyword: - assert getattr(stream_info_original, k) == getattr( - updated_stream_info, k - ) - - # Check mixing and matching - updated_stream_info = stream_info_original.copy_and_update( - StreamInfo(extension="extension.2", filename="filename.2"), - mimetype="mimetype.3", - charset="charset.3", - ) - assert updated_stream_info.extension == "extension.2" - assert updated_stream_info.filename == "filename.2" - assert updated_stream_info.mimetype == "mimetype.3" - assert updated_stream_info.charset == "charset.3" - assert updated_stream_info.local_path == "local_path.1" - assert updated_stream_info.url == "url.1" - - # Check multiple StreamInfo objects - updated_stream_info = stream_info_original.copy_and_update( - StreamInfo(extension="extension.4", filename="filename.5"), - StreamInfo(mimetype="mimetype.6", charset="charset.7"), - ) - assert updated_stream_info.extension == "extension.4" - assert updated_stream_info.filename == "filename.5" - assert updated_stream_info.mimetype == "mimetype.6" - assert updated_stream_info.charset == "charset.7" - assert updated_stream_info.local_path == "local_path.1" - assert updated_stream_info.url == "url.1" - - -def test_data_uris() -> None: - # Test basic parsing of data URIs - data_uri = "data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type == "text/plain" - assert len(attributes) == 0 - assert data == b"Hello, World!" - - data_uri = "data:base64,SGVsbG8sIFdvcmxkIQ==" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type is None - assert len(attributes) == 0 - assert data == b"Hello, World!" - - data_uri = "data:text/plain;charset=utf-8;base64,SGVsbG8sIFdvcmxkIQ==" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type == "text/plain" - assert len(attributes) == 1 - assert attributes["charset"] == "utf-8" - assert data == b"Hello, World!" - - data_uri = "data:,Hello%2C%20World%21" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type is None - assert len(attributes) == 0 - assert data == b"Hello, World!" - - data_uri = "data:text/plain,Hello%2C%20World%21" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type == "text/plain" - assert len(attributes) == 0 - assert data == b"Hello, World!" - - data_uri = "data:text/plain;charset=utf-8,Hello%2C%20World%21" - mime_type, attributes, data = parse_data_uri(data_uri) - assert mime_type == "text/plain" - assert len(attributes) == 1 - assert attributes["charset"] == "utf-8" - assert data == b"Hello, World!" - - -def test_file_uris() -> None: - # Test file URI with an empty host - file_uri = "file:///path/to/file.txt" - netloc, path = file_uri_to_path(file_uri) - assert netloc is None - assert path == "/path/to/file.txt" - - # Test file URI with no host - file_uri = "file:/path/to/file.txt" - netloc, path = file_uri_to_path(file_uri) - assert netloc is None - assert path == "/path/to/file.txt" - - # Test file URI with localhost - file_uri = "file://localhost/path/to/file.txt" - netloc, path = file_uri_to_path(file_uri) - assert netloc == "localhost" - assert path == "/path/to/file.txt" - - # Test file URI with query parameters - file_uri = "file:///path/to/file.txt?param=value" - netloc, path = file_uri_to_path(file_uri) - assert netloc is None - assert path == "/path/to/file.txt" - - # Test file URI with fragment - file_uri = "file:///path/to/file.txt#fragment" - netloc, path = file_uri_to_path(file_uri) - assert netloc is None - assert path == "/path/to/file.txt" - - -def test_docx_comments() -> None: - markitup = MarkItUp() - - # Test DOCX processing, with comments and setting style_map on init - markitup_with_style_map = MarkItUp(style_map="comment-reference => ") - result = markitup_with_style_map.convert( - os.path.join(TEST_FILES_DIR, "test_with_comment.docx") - ) - validate_strings(result, DOCX_COMMENT_TEST_STRINGS) - - -def test_docx_equations() -> None: - markitup = MarkItUp() - docx_file = os.path.join(TEST_FILES_DIR, "equations.docx") - result = markitup.convert(docx_file) - - # Check for inline equation m=1 (wrapped with single $) is present - assert "$m=1$" in result.text_content, "Inline equation $m=1$ not found" - - # Find block equations wrapped with double $$ and check if they are present - block_equations = re.findall(r"\$\$(.+?)\$\$", result.text_content) - assert block_equations, "No block equations found in the document." - - -def test_input_as_strings() -> None: - markitup = MarkItUp() - - # Test input from a stream - input_data = b"

Test

" - result = markitup.convert_stream(io.BytesIO(input_data)) - assert "# Test" in result.text_content - - # Test input with leading blank characters - input_data = b" \n\n\n

Test

" - result = markitup.convert_stream(io.BytesIO(input_data)) - assert "# Test" in result.text_content - - -@pytest.mark.skipif( - skip_remote, - reason="do not run tests that query external urls", -) -def test_markitup_remote() -> None: - markitup = MarkItUp() - - # By URL - result = markitup.convert(PDF_TEST_URL) - for test_string in PDF_TEST_STRINGS: - assert test_string in result.text_content - - # Youtube - result = markitup.convert(YOUTUBE_TEST_URL) - for test_string in YOUTUBE_TEST_STRINGS: - assert test_string in result.text_content - - -@pytest.mark.skipif( - skip_remote, - reason="do not run remotely run speech transcription tests", -) -def test_speech_transcription() -> None: - markitup = MarkItUp() - - # Test WAV files, MP3 and M4A files - for file_name in ["test.wav", "test.mp3", "test.m4a"]: - result = markitup.convert(os.path.join(TEST_FILES_DIR, file_name)) - result_lower = result.text_content.lower() - assert ( - ("1" in result_lower or "one" in result_lower) - and ("2" in result_lower or "two" in result_lower) - and ("3" in result_lower or "three" in result_lower) - and ("4" in result_lower or "four" in result_lower) - and ("5" in result_lower or "five" in result_lower) - ) - - -def test_exceptions() -> None: - # Check that an exception is raised when trying to convert an unsupported format - markitup = MarkItUp() - with pytest.raises(UnsupportedFormatException): - markitup.convert(os.path.join(TEST_FILES_DIR, "random.bin")) - - # Check that an exception is raised when trying to convert a file that is corrupted - with pytest.raises(FileConversionException) as exc_info: - markitup.convert( - os.path.join(TEST_FILES_DIR, "random.bin"), file_extension=".pptx" - ) - assert len(exc_info.value.attempts) == 1 - assert type(exc_info.value.attempts[0].converter).__name__ == "PptxConverter" - - -@pytest.mark.skipif( - skip_exiftool, - reason="do not run if exiftool is not installed", -) -def test_markitup_exiftool() -> None: - which_exiftool = shutil.which("exiftool") - assert which_exiftool is not None - - # Test explicitly setting the location of exiftool - markitup = MarkItUp(exiftool_path=which_exiftool) - result = markitup.convert(os.path.join(TEST_FILES_DIR, "test.jpg")) - for key in JPG_TEST_EXIFTOOL: - target = f"{key}: {JPG_TEST_EXIFTOOL[key]}" - assert target in result.text_content - - # Test setting the exiftool path through an environment variable - os.environ["EXIFTOOL_PATH"] = which_exiftool - markitup = MarkItUp() - result = markitup.convert(os.path.join(TEST_FILES_DIR, "test.jpg")) - for key in JPG_TEST_EXIFTOOL: - target = f"{key}: {JPG_TEST_EXIFTOOL[key]}" - assert target in result.text_content - - # Test some other media types - result = markitup.convert(os.path.join(TEST_FILES_DIR, "test.mp3")) - for key in MP3_TEST_EXIFTOOL: - target = f"{key}: {MP3_TEST_EXIFTOOL[key]}" - assert target in result.text_content - - -@pytest.mark.skipif( - skip_llm, - reason="do not run llm tests without a key", -) -def test_markitup_llm() -> None: - client = openai.OpenAI() - markitup = MarkItUp(llm_client=client, llm_model="gpt-4o") - - result = markitup.convert(os.path.join(TEST_FILES_DIR, "test_llm.jpg")) - for test_string in LLM_TEST_STRINGS: - assert test_string in result.text_content - - # This is not super precise. It would also accept "red square", "blue circle", - # "the square is not blue", etc. But it's sufficient for this test. - for test_string in ["red", "circle", "blue", "square"]: - assert test_string in result.text_content.lower() - - # Images embedded in PPTX files - result = markitup.convert(os.path.join(TEST_FILES_DIR, "test.pptx")) - # LLM Captions are included - for test_string in LLM_TEST_STRINGS: - assert test_string in result.text_content - # Standard alt text is included - validate_strings(result, PPTX_TEST_STRINGS) - - -if __name__ == "__main__": - """Runs this file's tests from the command line.""" - for test in [ - test_stream_info_operations, - test_data_uris, - test_file_uris, - test_docx_comments, - test_input_as_strings, - test_markitup_remote, - test_speech_transcription, - test_exceptions, - test_markitup_exiftool, - test_markitup_llm, - ]: - print(f"Running {test.__name__}...", end="") - test() - print("OK") - print("All tests passed!") diff --git a/packages/markitup/tests/test_module_vectors.py b/packages/markitup/tests/test_module_vectors.py deleted file mode 100644 index 1c38985..0000000 --- a/packages/markitup/tests/test_module_vectors.py +++ /dev/null @@ -1,239 +0,0 @@ -#!/usr/bin/env python3 -m pytest -import os -import time -import pytest -import codecs -import base64 - -from pathlib import Path - -if __name__ == "__main__": - from _test_vectors import GENERAL_TEST_VECTORS, DATA_URI_TEST_VECTORS -else: - from ._test_vectors import GENERAL_TEST_VECTORS, DATA_URI_TEST_VECTORS - -from markitup import ( - MarkItUp, - UnsupportedFormatException, - FileConversionException, - StreamInfo, -) - -skip_remote = ( - True if os.environ.get("GITHUB_ACTIONS") else False -) # Don't run these tests in CI - -TEST_FILES_DIR = os.path.join(os.path.dirname(__file__), "test_files") -TEST_FILES_URL = "https://raw.githubusercontent.com/microsoft/markitup/refs/heads/main/packages/markitup/tests/test_files" - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_guess_stream_info(test_vector): - """Test the ability to guess stream info.""" - markitup = MarkItUp() - - local_path = os.path.join(TEST_FILES_DIR, test_vector.filename) - expected_extension = os.path.splitext(test_vector.filename)[1] - - with open(local_path, "rb") as stream: - guesses = markitup._get_stream_info_guesses( - stream, - base_guess=StreamInfo( - filename=os.path.basename(test_vector.filename), - local_path=local_path, - extension=expected_extension, - ), - ) - - # For some limited exceptions, we can't guarantee the exact - # mimetype or extension, so we'll special-case them here. - if test_vector.filename in [ - "test_outlook_msg.msg", - ]: - return - - assert guesses[0].mimetype == test_vector.mimetype - assert guesses[0].extension == expected_extension - assert guesses[0].charset == test_vector.charset - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_local(test_vector): - """Test the conversion of a local file.""" - markitup = MarkItUp() - - result = markitup.convert( - os.path.join(TEST_FILES_DIR, test_vector.filename), url=test_vector.url - ) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_stream_with_hints(test_vector): - """Test the conversion of a stream with full stream info.""" - markitup = MarkItUp() - - stream_info = StreamInfo( - extension=os.path.splitext(test_vector.filename)[1], - mimetype=test_vector.mimetype, - charset=test_vector.charset, - ) - - with open(os.path.join(TEST_FILES_DIR, test_vector.filename), "rb") as stream: - result = markitup.convert( - stream, stream_info=stream_info, url=test_vector.url - ) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_stream_without_hints(test_vector): - """Test the conversion of a stream with no stream info.""" - markitup = MarkItUp() - - with open(os.path.join(TEST_FILES_DIR, test_vector.filename), "rb") as stream: - result = markitup.convert(stream, url=test_vector.url) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.skipif( - skip_remote, - reason="do not run tests that query external urls", -) -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_http_uri(test_vector): - """Test the conversion of an HTTP:// or HTTPS:// URI.""" - markitup = MarkItUp() - - time.sleep(1) # Ensure we don't hit rate limits - - result = markitup.convert( - TEST_FILES_URL + "/" + test_vector.filename, - url=test_vector.url, # Mock where this file would be found - ) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_file_uri(test_vector): - """Test the conversion of a file:// URI.""" - markitup = MarkItUp() - - result = markitup.convert( - Path(os.path.join(TEST_FILES_DIR, test_vector.filename)).as_uri(), - url=test_vector.url, - ) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", GENERAL_TEST_VECTORS) -def test_convert_data_uri(test_vector): - """Test the conversion of a data URI.""" - markitup = MarkItUp() - - data = "" - with open(os.path.join(TEST_FILES_DIR, test_vector.filename), "rb") as stream: - data = base64.b64encode(stream.read()).decode("utf-8") - mimetype = test_vector.mimetype - data_uri = f"data:{mimetype};base64,{data}" - - result = markitup.convert( - data_uri, - url=test_vector.url, - ) - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", DATA_URI_TEST_VECTORS) -def test_convert_keep_data_uris(test_vector): - """Test API functionality when keep_data_uris is enabled""" - markitup = MarkItUp() - - # Test local file conversion - result = markitup.convert( - os.path.join(TEST_FILES_DIR, test_vector.filename), - keep_data_uris=True, - url=test_vector.url, - ) - - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -@pytest.mark.parametrize("test_vector", DATA_URI_TEST_VECTORS) -def test_convert_stream_keep_data_uris(test_vector): - """Test the conversion of a stream with no stream info.""" - markitup = MarkItUp() - - stream_info = StreamInfo( - extension=os.path.splitext(test_vector.filename)[1], - mimetype=test_vector.mimetype, - charset=test_vector.charset, - ) - - with open(os.path.join(TEST_FILES_DIR, test_vector.filename), "rb") as stream: - result = markitup.convert( - stream, stream_info=stream_info, keep_data_uris=True, url=test_vector.url - ) - - for string in test_vector.must_include: - assert string in result.markdown - for string in test_vector.must_not_include: - assert string not in result.markdown - - -if __name__ == "__main__": - import sys - - """Runs this file's tests from the command line.""" - - # General tests - for test_function in [ - test_guess_stream_info, - test_convert_local, - test_convert_stream_with_hints, - test_convert_stream_without_hints, - test_convert_http_uri, - test_convert_file_uri, - test_convert_data_uri, - ]: - for test_vector in GENERAL_TEST_VECTORS: - print( - f"Running {test_function.__name__} on {test_vector.filename}...", end="" - ) - test_function(test_vector) - print("OK") - - # Data URI tests - for test_function in [ - test_convert_keep_data_uris, - test_convert_stream_keep_data_uris, - ]: - for test_vector in DATA_URI_TEST_VECTORS: - print( - f"Running {test_function.__name__} on {test_vector.filename}...", end="" - ) - test_function(test_vector) - print("OK") - - print("All tests passed!")