Skip to main content

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