getsentry/sentry

hybrid-cloud-test-gen

Generate hybrid cloud tests for the Sentry codebase.

First seen Feb 24, 2026

Installation

$ npx skills add getsentry/sentry --skill hybrid-cloud-test-gen

Summary

  • Generate hybrid cloud tests for the Sentry codebase.
  • Use when asked to "generate HC test", "create hybrid cloud test", "write HC test", "add HC test", "write RPC test", "test RPC service", "silo test", "cross-silo test", "outbox test", "API gateway test", or "endpoint silo test".
  • Covers RPC service tests, API gateway tests, outbox pattern tests, and API endpoint tests with silo decorators.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from getsentry/sentry · top by installs.

npx skills add getsentry/sentry

Browse all from getsentry/sentry

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 44.7K
License LICENSE.md
Default branch master
Open issues 1,795
Status Active

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 10,302 B
  • docs SUMMARY.md 421 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 64 installs

SKILL.md

Hybrid Cloud Test Generation

This skill generates tests for Sentry's hybrid cloud architecture. It covers RPC services, API gateway proxying, outbox patterns, and endpoint silo decorators.

Critical Constraints

ALWAYS use factory methods (self.createuser(), self.createorganization()) — never Model.objects.create().

NEVER wrap factory method calls in assumetestsilomode or assumetestsilomode_of. Factories are silo-aware and handle silo mode internally. Only use silo mode context managers for direct ORM queries (Model.objects.get/filter/count/exists/delete).

ALWAYS use pytest-style assertions (assert x == y) — never self.assertEqual().

ALWAYS add tests to existing test files rather than creating new ones, unless no file exists for that module.

For cross-silo ORM access: use assumetestsilomodeof(Model) when accessing a single model (auto-detects silo). Use assumetestsilo_mode(SiloMode.X) when the block covers multiple models or non-model operations.

Use TestCase for most tests, including those using outbox_runner(). Only use TransactionTestCase when tests need real committed transactions (threading, concurrency, multi-process scenarios).

NEVER use from future import annotations in test files that deal with RPC models.

Step 1: Identify Test Category

Determine which category of HC test to generate based on the user's request:

Signal Category Go To
RPC service, service method, serialization round-trip, dispatch RPC Service Tests Step 3
API gateway, proxy, middleware, forwarding API Gateway Tests Step 4
Outbox, cross-silo message, ControlOutbox, CellOutbox, outbox drain Outbox Pattern Tests Step 5
API endpoint with silo decorator, endpoint test, permission check Endpoint Silo Tests Step 6

If the signal is ambiguous, ask the user to clarify which category.

Step 2: Gather Context

Before generating any test:

  1. Read the source module being tested. Determine its silo mode by checking for @cellsiloendpoint, @controlsiloendpoint, localmode = SiloMode.X, or @cellsilomodel/@controlsilo_model decorators.
  1. Find the existing test file using the mirror path convention:

- src/sentry/foo/bar.pytests/sentry/foo/testbar.py - src/sentry/foo/services/bar/service.pytests/sentry/foo/services/testbar.py - src/sentry/foo/services/bar/impl.pytests/sentry/foo/services/test_bar.py

  1. Read the existing test file to understand what's already tested, what base classes are used, and what patterns are established.
  1. Read source method signatures to understand parameters, return types, and which RPC models are involved.

Step 3: Generate RPC Service Tests

Load references/rpc-service-tests.md for complete templates and patterns.

RPC service tests must cover:

  • Silo compatibility: @allsilotest ensures the service works across all silo modes
  • Serialization round-trip: dispatchtolocal_service verifies args/return survive serialization
  • Field accuracy: Field-by-field comparison of RPC model against ORM object
  • Error handling: Not-found returns, disabled methods, remote exception wrapping
  • Cross-silo effects: outboxrunner() + assumetestsilomode for propagation checks

Quick Reference — Decorator & Base Class

Scenario Decorator Base Class
Standard RPC service @allsilotest TestCase
RPC with named cells @allsilotest(cells=createtestcells("us")) TestCase
RPC with member mapping assertions @allsilotest TestCase, HybridCloudTestMixin

Step 4: Generate API Gateway Tests

Load references/api-gateway-tests.md for complete templates and patterns.

API gateway tests verify that requests to control-silo endpoints are correctly proxied to the appropriate cell. They must cover:

  • Proxy pass-through: Requests forwarded with correct params, headers, body
  • Query parameter forwarding: Multi-value params preserved
  • Error proxying: Upstream errors forwarded correctly
  • Streaming responses: closestreamingresponse() for reading proxied response body

Quick Reference — Decorator & Base Class

Scenario Decorator Base Class
Standard gateway test @controlsilotest(cells=[ApiGatewayTestCase.CELL], includemonolithrun=True) ApiGatewayTestCase

Step 5: Generate Outbox Pattern Tests

Load references/outbox-tests.md for complete templates and patterns.

Outbox tests verify that cross-silo messages are created, drained, and produce the expected side effects. They must cover:

  • Outbox creation: Verify correct outbox records with outbox_context(flush=False)
  • Outbox processing: outbox_runner() drains pending messages
  • Cross-silo side effects: assumetestsilomodeof(Model) to check replica/mapping state
  • Idempotency: Draining the same shard twice produces no duplicates

Quick Reference — Decorator & Base Class

Scenario Decorator Base Class
Control outbox test @controlsilotest TestCase
Cell outbox test @cellsilotest TestCase
Outbox with threading/concurrency (none) TransactionTestCase

Step 6: Generate Endpoint Silo Tests

Load references/endpoint-silo-tests.md for complete templates and patterns.

Endpoint silo tests verify that API endpoints work correctly under their declared silo mode. They must cover:

  • Correct silo decorator: Match endpoint → test decorator
  • Cross-silo data setup: Create data using factory methods (no silo wrapper needed)
  • Permission checks: Verify 401/403 for unauthorized access
  • Response accuracy: Verify response body matches expected data

Quick Reference — Decorator Mapping

Endpoint Decorator Test Decorator
@cellsiloendpoint @cellsilotest
@controlsiloendpoint @controlsilotest
@controlsiloendpoint (with proxy) @controlsilotest(cells=createtestcells("us"))
No decorator (monolith-only) @nosilotest

Step 7: Validate

Before presenting the generated test, verify against this checklist:

  • Correct silo decorator on test class
  • assumetestsilomodeof(Model) for single-model ORM access; assumetestsilo_mode(SiloMode.X) for multi-model/non-model ORM blocks
  • Factory methods (self.create*) are NEVER wrapped in assumetestsilomode
  • Factory methods used — never Model.objects.create()
  • pytest-style assertions only (assert x == y)
  • Correct base class (TestCase for most tests; TransactionTestCase only for threading/concurrency)
  • Imports are correct and minimal
  • Test file at correct mirror path
  • Test methods have descriptive names (test<action><scenario>)
  • Run command: pytest -svv --reuse-db tests/sentry/path/to/test_file.py

Key Imports Quick Reference

# Silo decorators
from sentry.testutils.silo import (
    all_silo_test,
    control_silo_test,
    cell_silo_test,
    no_silo_test,
    assume_test_silo_mode,
    assume_test_silo_mode_of,
    create_test_cells,
)

# Base classes
from sentry.testutils.cases import TestCase, TransactionTestCase, APITestCase

# Cross-silo utilities
from sentry.testutils.outbox import outbox_runner
from sentry.testutils.hybrid_cloud import HybridCloudTestMixin
from sentry.silo.base import SiloMode

# RPC testing
from sentry.hybridcloud.rpc.service import dispatch_to_local_service

# API gateway testing
from sentry.testutils.helpers.apigateway import ApiGatewayTestCase, verify_request_params

# Outbox models
from sentry.hybridcloud.models.outbox import ControlOutbox, CellOutbox, outbox_context
from sentry.hybridcloud.outbox.category import OutboxCategory, OutboxScope

Context Manager Quick Reference

# Use ONLY for direct ORM queries — never for factory calls
assume_test_silo_mode(SiloMode.CONTROL)     # Switch to control silo for ORM access
assume_test_silo_mode(SiloMode.CELL)        # Switch to cell silo for ORM access
assume_test_silo_mode_of(ModelClass)        # Switch to silo matching model's silo mode

outbox_runner()                             # Drain all pending outboxes on exit
outbox_context(flush=False)                 # Create outboxes without flushing
override_cells(cells)                       # Override active cell config
override_settings(SILO_MODE=SiloMode.X)     # Override Django settings
override_options({"key": value})            # Override Sentry options