mirror of
https://github.com/BoPeng/ai-marketplace-monitor.git
synced 2025-12-23 22:28:18 -05:00
* Fix premature keyword filtering in Facebook marketplace scraping Addresses a critical bug where listings were incorrectly rejected during keyword filtering before their descriptions had been extracted from Facebook's detail pages. ## Problem The dual-check workflow was failing: 1. First check_listing() call: On search results with empty descriptions 2. Second check_listing() call: After get_listing_details() populates descriptions Listings with keywords only in descriptions were being rejected prematurely, causing false negatives for valid matches. ## Solution - Add description_available parameter to check_listing() to control filtering - Skip keyword filtering when descriptions haven't been fetched yet - Maintain antikeyword filtering on available text (title-only or title+description) - Add warning logs when description extraction fails ## Changes - facebook.py: Add description_available parameter and conditional filtering logic - monitor.py: Add defensive tuple unpacking for get_listing_details() return value - Add comprehensive test suite for keyword filtering edge cases - Fix minor formatting inconsistencies throughout codebase ## Testing - New test suite demonstrates the bug and validates the fix - Tests cover keyword filtering with/without descriptions - Antikeyword filtering verified to work correctly in all cases - All existing tests continue to pass Fixes: #247 * Apply minor code improvements from PR feedback - Remove redundant description_available=True parameter (uses default) - Move self.logger check to outer if condition to avoid nested checks These changes improve code clarity and efficiency.
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
import pytest
|
|
|
|
from ai_marketplace_monitor.ai import OllamaBackend, OllamaConfig
|
|
from ai_marketplace_monitor.facebook import FacebookItemConfig, FacebookMarketplaceConfig
|
|
from ai_marketplace_monitor.listing import Listing
|
|
|
|
|
|
@pytest.mark.skipif(True, reason="Condition met, skipping this test")
|
|
def test_ai(
|
|
ollama_config: OllamaConfig,
|
|
item_config: FacebookItemConfig,
|
|
marketplace_config: FacebookMarketplaceConfig,
|
|
listing: Listing,
|
|
) -> None:
|
|
ai = OllamaBackend(ollama_config)
|
|
# ai.config = ollama_config
|
|
res = ai.evaluate(listing, item_config, marketplace_config)
|
|
assert res.score >= 1 and res.score <= 5
|
|
|
|
|
|
def test_prompt(
|
|
ollama: OllamaBackend,
|
|
listing: Listing,
|
|
item_config: FacebookItemConfig,
|
|
marketplace_config: FacebookMarketplaceConfig,
|
|
) -> None:
|
|
prompt = ollama.get_prompt(listing, item_config, marketplace_config)
|
|
assert item_config.name in prompt
|
|
assert (item_config.description or "something weird") in prompt
|
|
assert str(item_config.min_price) in prompt
|
|
assert str(item_config.max_price) in prompt
|
|
|
|
assert listing.title in prompt
|
|
assert listing.condition in prompt
|
|
assert listing.price in prompt
|
|
assert listing.post_url in prompt
|
|
|
|
|
|
def test_extra_prompt(
|
|
ollama: OllamaBackend,
|
|
listing: Listing,
|
|
item_config: FacebookItemConfig,
|
|
marketplace_config: FacebookMarketplaceConfig,
|
|
) -> None:
|
|
marketplace_config.extra_prompt = "This is an extra prompt"
|
|
prompt = ollama.get_prompt(listing, item_config, marketplace_config)
|
|
assert "extra prompt" in prompt
|
|
#
|
|
item_config.extra_prompt = "This overrides marketplace prompt"
|
|
prompt = ollama.get_prompt(listing, item_config, marketplace_config)
|
|
assert "extra prompt" not in prompt
|
|
assert "overrides marketplace prompt" in prompt
|
|
#
|
|
assert "Great deal: Fully matches" in prompt
|
|
item_config.rating_prompt = "something else"
|
|
prompt = ollama.get_prompt(listing, item_config, marketplace_config)
|
|
assert "Great deal: Fully matches" not in prompt
|
|
assert "something else" in prompt
|
|
#
|
|
assert "Evaluate how well this listing" in prompt
|
|
marketplace_config.prompt = "myprompt"
|
|
prompt = ollama.get_prompt(listing, item_config, marketplace_config)
|
|
assert "Evaluate how well this listing" not in prompt
|
|
assert "myprompt" in prompt
|