| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- #!/usr/bin/env python3
- """
- Tests for cli/estimate_pages.py functionality
- """
- import unittest
- import tempfile
- import json
- from pathlib import Path
- import sys
- from skill_seekers.cli.estimate_pages import estimate_pages
- class TestEstimatePages(unittest.TestCase):
- """Test estimate_pages function"""
- def test_estimate_pages_with_minimal_config(self):
- """Test estimation with minimal configuration"""
- config = {
- 'name': 'test',
- 'base_url': 'https://example.com/',
- 'rate_limit': 0.1
- }
- # This will make real HTTP request to example.com
- # We use low max_discovery to keep test fast
- result = estimate_pages(config, max_discovery=2, timeout=5)
- # Check result structure
- self.assertIsInstance(result, dict)
- self.assertIn('discovered', result)
- self.assertIn('estimated_total', result)
- # Actual key is elapsed_seconds, not time_elapsed
- self.assertIn('elapsed_seconds', result)
- def test_estimate_pages_returns_discovered_count(self):
- """Test that result contains discovered page count"""
- config = {
- 'name': 'test',
- 'base_url': 'https://example.com/',
- 'rate_limit': 0.1
- }
- result = estimate_pages(config, max_discovery=1, timeout=5)
- self.assertGreaterEqual(result['discovered'], 0)
- self.assertIsInstance(result['discovered'], int)
- def test_estimate_pages_respects_max_discovery(self):
- """Test that estimation respects max_discovery limit"""
- config = {
- 'name': 'test',
- 'base_url': 'https://example.com/',
- 'rate_limit': 0.1
- }
- result = estimate_pages(config, max_discovery=3, timeout=5)
- # Should not discover more than max_discovery
- self.assertLessEqual(result['discovered'], 3)
- def test_estimate_pages_with_start_urls(self):
- """Test estimation with custom start_urls"""
- config = {
- 'name': 'test',
- 'base_url': 'https://example.com/',
- 'start_urls': ['https://example.com/'],
- 'rate_limit': 0.1
- }
- result = estimate_pages(config, max_discovery=2, timeout=5)
- self.assertIsInstance(result, dict)
- self.assertIn('discovered', result)
- class TestEstimatePagesCLI(unittest.TestCase):
- """Test estimate_pages command-line interface (via entry point)"""
- def test_cli_help_output(self):
- """Test that skill-seekers estimate --help works"""
- import subprocess
- try:
- result = subprocess.run(
- ['skill-seekers', 'estimate', '--help'],
- capture_output=True,
- text=True,
- timeout=5
- )
- # Should return successfully (0 or 2 for argparse)
- self.assertIn(result.returncode, [0, 2])
- output = result.stdout + result.stderr
- self.assertTrue('usage:' in output.lower() or 'estimate' in output.lower())
- except FileNotFoundError:
- self.skipTest("skill-seekers command not installed")
- def test_cli_executes_with_help_flag(self):
- """Test that skill-seekers-estimate entry point works"""
- import subprocess
- try:
- result = subprocess.run(
- ['skill-seekers-estimate', '--help'],
- capture_output=True,
- text=True,
- timeout=5
- )
- # Should return successfully
- self.assertIn(result.returncode, [0, 2])
- except FileNotFoundError:
- self.skipTest("skill-seekers-estimate command not installed")
- def test_cli_requires_config_argument(self):
- """Test that CLI requires config file argument"""
- import subprocess
- try:
- # Run without config argument
- result = subprocess.run(
- ['skill-seekers', 'estimate'],
- capture_output=True,
- text=True,
- timeout=5
- )
- # Should fail (non-zero exit code) or show usage
- self.assertTrue(
- result.returncode != 0 or 'usage' in result.stderr.lower() or 'usage' in result.stdout.lower()
- )
- except FileNotFoundError:
- self.skipTest("skill-seekers command not installed")
- class TestEstimatePagesWithRealConfig(unittest.TestCase):
- """Test estimation with real config files (if available)"""
- def test_estimate_with_real_config_file(self):
- """Test estimation using a real config file (if exists)"""
- config_path = Path('configs/react.json')
- if not config_path.exists():
- self.skipTest("configs/react.json not found")
- with open(config_path, 'r') as f:
- config = json.load(f)
- # Use very low max_discovery to keep test fast
- result = estimate_pages(config, max_discovery=3, timeout=5)
- self.assertIsInstance(result, dict)
- self.assertIn('discovered', result)
- self.assertGreater(result['discovered'], 0)
- if __name__ == '__main__':
- unittest.main()
|