Files
skill-seekers-reference/tests/test_adaptors/test_markdown_adaptor.py
yusyus 1a2f268316 feat: Phase 4 - Implement MarkdownAdaptor for generic export
- Add MarkdownAdaptor for universal markdown export
- Pure markdown format (no platform-specific features)
- ZIP packaging with README.md, references/, DOCUMENTATION.md
- No upload capability (manual use only)
- No AI enhancement support
- Combines all references into single DOCUMENTATION.md
- Add 12 unit tests (all passing)

Test Results:
- 12 MarkdownAdaptor tests passing
- 45 total adaptor tests passing (4 skipped)

Phase 4 Complete 

Related to #179
2025-12-28 20:34:21 +03:00

229 lines
8.6 KiB
Python

#!/usr/bin/env python3
"""
Tests for Markdown adaptor
"""
import unittest
from pathlib import Path
import tempfile
import zipfile
from skill_seekers.cli.adaptors import get_adaptor
from skill_seekers.cli.adaptors.base import SkillMetadata
class TestMarkdownAdaptor(unittest.TestCase):
"""Test Markdown adaptor functionality"""
def setUp(self):
"""Set up test adaptor"""
self.adaptor = get_adaptor('markdown')
def test_platform_info(self):
"""Test platform identifiers"""
self.assertEqual(self.adaptor.PLATFORM, 'markdown')
self.assertEqual(self.adaptor.PLATFORM_NAME, 'Generic Markdown (Universal)')
self.assertIsNone(self.adaptor.DEFAULT_API_ENDPOINT)
def test_validate_api_key(self):
"""Test that markdown export doesn't use API keys"""
# Any key should return False (no keys needed)
self.assertFalse(self.adaptor.validate_api_key('sk-ant-123'))
self.assertFalse(self.adaptor.validate_api_key('AIzaSyABC123'))
self.assertFalse(self.adaptor.validate_api_key('any-key'))
self.assertFalse(self.adaptor.validate_api_key(''))
def test_get_env_var_name(self):
"""Test environment variable name"""
self.assertEqual(self.adaptor.get_env_var_name(), '')
def test_supports_enhancement(self):
"""Test enhancement support"""
self.assertFalse(self.adaptor.supports_enhancement())
def test_enhance_returns_false(self):
"""Test that enhance always returns False"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir)
refs_dir = skill_dir / "references"
refs_dir.mkdir()
(refs_dir / "test.md").write_text("Test content")
success = self.adaptor.enhance(skill_dir, 'not-used')
self.assertFalse(success)
def test_format_skill_md_no_frontmatter(self):
"""Test that markdown format has no YAML frontmatter"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir)
# Create minimal skill structure
(skill_dir / "references").mkdir()
(skill_dir / "references" / "test.md").write_text("# Test content")
metadata = SkillMetadata(
name="test-skill",
description="Test skill description"
)
formatted = self.adaptor.format_skill_md(skill_dir, metadata)
# Should NOT start with YAML frontmatter
self.assertFalse(formatted.startswith('---'))
# Should contain the skill name and description
self.assertIn('test-skill', formatted.lower())
self.assertIn('Test skill description', formatted)
def test_package_creates_zip(self):
"""Test that package creates ZIP file with correct structure"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "test-skill"
skill_dir.mkdir()
# Create minimal skill structure
(skill_dir / "SKILL.md").write_text("# Test Skill Documentation")
(skill_dir / "references").mkdir()
(skill_dir / "references" / "guide.md").write_text("# User Guide")
(skill_dir / "references" / "api.md").write_text("# API Reference")
output_dir = Path(temp_dir) / "output"
output_dir.mkdir()
# Package skill
package_path = self.adaptor.package(skill_dir, output_dir)
# Verify package was created
self.assertTrue(package_path.exists())
self.assertTrue(str(package_path).endswith('.zip'))
self.assertIn('markdown', package_path.name)
# Verify package contents
with zipfile.ZipFile(package_path, 'r') as zf:
names = zf.namelist()
# Should have README.md (from SKILL.md)
self.assertIn('README.md', names)
# Should have metadata.json
self.assertIn('metadata.json', names)
# Should have DOCUMENTATION.md (combined)
self.assertIn('DOCUMENTATION.md', names)
# Should have reference files
self.assertIn('references/guide.md', names)
self.assertIn('references/api.md', names)
def test_package_readme_content(self):
"""Test that README.md contains SKILL.md content"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "test-skill"
skill_dir.mkdir()
skill_md_content = "# Test Skill\n\nThis is test documentation."
(skill_dir / "SKILL.md").write_text(skill_md_content)
(skill_dir / "references").mkdir()
output_dir = Path(temp_dir) / "output"
output_dir.mkdir()
package_path = self.adaptor.package(skill_dir, output_dir)
# Verify README.md content
with zipfile.ZipFile(package_path, 'r') as zf:
readme_content = zf.read('README.md').decode('utf-8')
self.assertEqual(readme_content, skill_md_content)
def test_package_combined_documentation(self):
"""Test that DOCUMENTATION.md combines all references"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "test-skill"
skill_dir.mkdir()
# Create SKILL.md
(skill_dir / "SKILL.md").write_text("# Main Skill")
# Create references
refs_dir = skill_dir / "references"
refs_dir.mkdir()
(refs_dir / "guide.md").write_text("# Guide Content")
(refs_dir / "api.md").write_text("# API Content")
output_dir = Path(temp_dir) / "output"
output_dir.mkdir()
package_path = self.adaptor.package(skill_dir, output_dir)
# Verify DOCUMENTATION.md contains combined content
with zipfile.ZipFile(package_path, 'r') as zf:
doc_content = zf.read('DOCUMENTATION.md').decode('utf-8')
# Should contain main skill content
self.assertIn('Main Skill', doc_content)
# Should contain reference content
self.assertIn('Guide Content', doc_content)
self.assertIn('API Content', doc_content)
# Should have separators
self.assertIn('---', doc_content)
def test_package_metadata(self):
"""Test that metadata.json is correct"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "test-skill"
skill_dir.mkdir()
(skill_dir / "SKILL.md").write_text("# Test")
(skill_dir / "references").mkdir()
output_dir = Path(temp_dir) / "output"
output_dir.mkdir()
package_path = self.adaptor.package(skill_dir, output_dir)
# Verify metadata
with zipfile.ZipFile(package_path, 'r') as zf:
import json
metadata_content = zf.read('metadata.json').decode('utf-8')
metadata = json.loads(metadata_content)
self.assertEqual(metadata['platform'], 'markdown')
self.assertEqual(metadata['name'], 'test-skill')
self.assertEqual(metadata['format'], 'universal_markdown')
self.assertIn('created_with', metadata)
def test_upload_not_supported(self):
"""Test that upload returns appropriate message"""
with tempfile.NamedTemporaryFile(suffix='.zip') as tmp:
result = self.adaptor.upload(Path(tmp.name), 'not-used')
self.assertFalse(result['success'])
self.assertIsNone(result['skill_id'])
self.assertIn('not support', result['message'].lower())
# URL should point to local file
self.assertIn(tmp.name, result['url'])
def test_package_output_filename(self):
"""Test that package creates correct filename"""
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "my-framework"
skill_dir.mkdir()
(skill_dir / "SKILL.md").write_text("# Test")
(skill_dir / "references").mkdir()
output_dir = Path(temp_dir) / "output"
output_dir.mkdir()
package_path = self.adaptor.package(skill_dir, output_dir)
# Should include skill name and 'markdown' suffix
self.assertTrue(package_path.name.startswith('my-framework'))
self.assertIn('markdown', package_path.name)
self.assertTrue(package_path.name.endswith('.zip'))
if __name__ == '__main__':
unittest.main()