Files
ai-marketplace-monitor/tests/test_ai.py
adawalli eb8763226f Fix premature keyword filtering in Facebook marketplace scraping (#248)
* 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.
2025-08-09 20:28:14 -05:00

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