Plugin Testing
Best practices for testing your plugins.
Test Structure
plugins/my_plugin/
└── tests/
├── __init__.py
├── conftest.py # Fixtures
├── test_models.py # Model tests
├── test_services.py # Service tests
└── test_resolvers.py # API tests
Fixtures
# conftest.py
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from core.database import Base
@pytest.fixture
def db_session():
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
yield session
session.close()
@pytest.fixture
def sample_item(db_session):
from my_plugin.models import MyItem
item = MyItem(id="1", name="Test", value=100)
db_session.add(item)
db_session.commit()
return item
Unit Tests
# test_services.py
from my_plugin.services import create_item, get_item
def test_create_item(db_session):
item = create_item(db_session, "Test", 100)
assert item.name == "Test"
assert item.value == 100
def test_get_item(db_session, sample_item):
item = get_item(db_session, "1")
assert item.id == "1"
API Tests
# test_resolvers.py
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_list_items(auth_headers):
response = client.post(
"/graphql",
json={"query": "{ myPluginItems { id name } }"},
headers=auth_headers
)
assert response.status_code == 200
assert "myPluginItems" in response.json()["data"]
Running Tests
# Run all plugin tests
pytest plugins/my_plugin/tests/
# Run with coverage
pytest plugins/my_plugin/tests/ --cov=plugins/my_plugin
# Run specific test
pytest plugins/my_plugin/tests/test_services.py::test_create_item