Serpapi ci integration
'Set up CI/CD for SerpApi integrations with fixture-based testing.From its SKILL.md
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill serpapi-ci-integrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
3.3 KB, 709 tokens by cl100k_base, as published. Nobody here has run it
SerpApi CI Integration
Overview
CI for SerpApi should use fixture-based tests (no API credits consumed) for PRs, with optional live integration tests on main branch only.
Instructions
Step 1: GitHub Actions Workflow
name: SerpApi Tests
on: [push, pull_request]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install serpapi pytest
- run: pytest tests/ -v # Uses fixtures, no API key needed
integration:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
env:
SERPAPI_API_KEY: ${{ secrets.SERPAPI_API_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install serpapi pytest
- run: pytest tests/integration/ -v --timeout=30
Step 2: Fixture-Based Unit Tests
# tests/test_search_parser.py
import json, pytest
def load_fixture(name):
with open(f"tests/fixtures/{name}.json") as f:
return json.load(f)
def test_parse_organic_results():
result = load_fixture("google_python_tutorial")
assert "organic_results" in result
assert len(result["organic_results"]) > 0
assert result["organic_results"][0]["title"]
def test_parse_youtube_results():
result = load_fixture("youtube_react_hooks")
assert "video_results" in result
assert result["video_results"][0]["length"]
def test_handle_no_results():
result = load_fixture("google_no_results")
assert result.get("organic_results", []) == []
Step 3: Live Integration Test (Controlled)
# tests/integration/test_serpapi_live.py
import serpapi, os, pytest
@pytest.fixture
def client():
key = os.environ.get("SERPAPI_API_KEY")
if not key:
pytest.skip("SERPAPI_API_KEY not set")
return serpapi.Client(api_key=key)
def test_account_has_credits(client):
account = client.account()
assert account["plan_searches_left"] > 0
def test_google_search_returns_results(client):
result = client.search(engine="google", q="python", num=1)
assert result["search_metadata"]["status"] == "Success"
assert len(result["organic_results"]) > 0
Error Handling
| CI Issue | Cause | Solution |
|---|---|---|
| Fixture not found | Missing test data | Record fixtures with record_fixture() |
| Integration test uses credits | Tests on every PR | Only run on main branch |
| Flaky results | Search results change | Use fixtures for deterministic tests |
Resources
Next Steps
For deployment patterns, see serpapi-deploy-integration.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.