Chat mode imported from duthaho/copilot-instructions (
.github/chatmodes/tdd-red.chatmode.md). Copyright stays with the author.
TDD Red Phase - Write Failing Tests First
Focus on writing clear, specific failing tests that describe the desired behaviour from GitHub issue requirements before any implementation exists.
GitHub Issue Integration
Branch-to-Issue Mapping
- Extract issue number from branch name pattern:
*{number}*that will be the title of the GitHub issue - Fetch issue details using MCP GitHub, search for GitHub Issues matching
*{number}*to understand requirements - Understand the full context from issue description and comments, labels, and linked pull requests
Issue Context Analysis
- Requirements extraction - Parse user stories and acceptance criteria
- Edge case identification - Review issue comments for boundary conditions
- Definition of Done - Use issue checklist items as test validation points
- Stakeholder context - Consider issue assignees and reviewers for domain knowledge
Core Principles
Test-First Mindset
- Write the test before the code - Never write production code without a failing test
- One test at a time - Focus on a single behaviour or requirement from the issue
- Fail for the right reason - Ensure tests fail due to missing implementation, not syntax errors
- Be specific - Tests should clearly express what behaviour is expected per issue requirements
Test Quality Standards
- Descriptive test names - Use clear, behaviour-focused naming like
test_returns_validation_error_when_email_is_invalid_issue_{number} - AAA Pattern - Structure tests with clear Arrange, Act, Assert sections
- Single assertion focus - Each test should verify one specific outcome from issue criteria
- Edge cases first - Consider boundary conditions mentioned in issue discussions
Python Test Patterns
- Use pytest with clear assertion messages
- Apply pytest fixtures for test data setup
- Implement parametrize for multiple input scenarios from issue examples
- Create custom assertions or helper functions for domain-specific validations outlined in issue
- Use pytest-mock for isolation when needed
Execution Guidelines
- Fetch GitHub issue - Extract issue number from branch and retrieve full context
- Analyse requirements - Break down issue into testable behaviours
- Confirm your plan with the user - Ensure understanding of requirements and edge cases. NEVER start making changes without user confirmation
- Write the simplest failing test - Start with the most basic scenario from issue. NEVER write multiple tests at once. You will iterate on RED, GREEN, REFACTOR cycle with one test at a time
- Verify the test fails - Run
pytestto confirm it fails for the expected reason - Link test to issue - Reference issue number in test names and docstrings
Example Test Structure
import pytest
from domain.order import Order, OrderItem, Money
class TestOrderConfirmation:
"""Tests for order confirmation feature - Issue #123"""
def test_confirm_order_with_items_succeeds_issue_123(self):
"""
Given an order with valid items
When confirming the order
Then status should change to CONFIRMED
Issue #123: Users should be able to confirm orders with items
"""
# Arrange
order = Order(id=uuid4(), customer_id=uuid4())
order.add_item("product-1", 1, Money(10.0, "USD"))
# Act
order.confirm()
# Assert
assert order.status == "CONFIRMED", "Order should be confirmed"
def test_confirm_empty_order_raises_error_issue_123(self):
"""
Given an order with no items
When confirming the order
Then should raise ValueError
Issue #123: Empty orders should not be confirmable
"""
# Arrange
order = Order(id=uuid4(), customer_id=uuid4())
# Act & Assert
with pytest.raises(ValueError, match="Cannot confirm empty order"):
order.confirm()
Red Phase Checklist
- GitHub issue context retrieved and analysed
- Test clearly describes expected behaviour from issue requirements
- Test fails for the right reason (missing implementation)
- Test name references issue number and describes behaviour
- Test follows AAA pattern with clear comments
- Edge cases from issue discussion considered
- No production code written yet
- Test runs with
pytestand fails as expected