Files
wehub-resource-sync 2860fb5d18
Security / Dependency review (push) Has been skipped
Scorecard / Scorecard analysis (push) Failing after 0s
Validate / eval (push) Failing after 0s
Security / Dependency audit (push) Failing after 1s
Security / Secret scan (push) Failing after 1s
Validate / tests (push) Failing after 0s
Validate / mcp-tests (push) Failing after 1s
GitHub Actions Security Analysis with zizmor 🌈 / zizmor (push) Failing after 1s
Security / SAST scan (push) Failing after 13m52s
chore: import upstream snapshot with attribution
2026-07-13 12:05:33 +08:00

73 lines
2.8 KiB
Python

"""Tests for pinterest.py — ScrapeCreators Pinterest search module."""
import unittest
from unittest.mock import patch
from lib import pinterest
class TestSearchPinterestRequest(unittest.TestCase):
"""Pin the ScrapeCreators request contract.
Regression guard: the SC Pinterest endpoint requires a `query` param.
A prior version sent `keyword`, which the API rejects with
400 bad_request ("You must provide a 'query' param"), making every
Pinterest search silently return zero pins.
"""
def test_uses_query_param_not_keyword(self):
from lib import http as http_module
with patch.object(http_module, "get") as mock_http_get:
mock_http_get.return_value = {"pins": []}
pinterest.search_pinterest(
"robot vacuum", "2026-05-01", "2026-06-01",
depth="default", token="fake-token",
)
self.assertEqual(mock_http_get.call_count, 1)
params = mock_http_get.call_args.kwargs["params"]
# The fix this test guards is the param *name* — SC requires `query`,
# not `keyword`. Assert the contract only; the exact value is derived
# from _extract_core_subject() and is that function's concern, not ours.
self.assertIn("query", params)
self.assertNotIn("keyword", params)
self.assertTrue(params["query"])
def test_no_token_skips_http_call(self):
from lib import http as http_module
with patch.object(http_module, "get") as mock_http_get:
result = pinterest.search_pinterest(
"robot vacuum", "2026-05-01", "2026-06-01", token=None,
)
mock_http_get.assert_not_called()
self.assertEqual(result["items"], [])
self.assertIn("error", result)
def test_parses_pins_response_shape(self):
from lib import http as http_module
payload = {
"pins": [
{
"id": "123",
"description": "Robot vacuum that handles pet hair",
"link": "https://example.com/p/123",
"save_count": 42,
"pinner": {"username": "petowner"},
},
],
}
with patch.object(http_module, "get") as mock_http_get:
mock_http_get.return_value = payload
result = pinterest.search_pinterest(
"robot vacuum pet hair", "2026-05-01", "2026-06-01",
depth="default", token="fake-token",
)
self.assertEqual(len(result["items"]), 1)
item = result["items"][0]
self.assertEqual(item["pin_id"], "123")
self.assertEqual(item["engagement"]["saves"], 42)
self.assertEqual(item["url"], "https://example.com/p/123")
if __name__ == "__main__":
unittest.main()