# Cleanup and Rollback Guide

Strategies for test data isolation and cleanup.

## Savepoint/Rollback Pattern

Best for synchronous test isolation.

```apex
// Create savepoint BEFORE any DML
Savepoint sp = Database.setSavepoint();

try {
    // Create test data
    List<Account> accounts = TestDataFactory_Account.create(100);

    // Run your tests
    Test.startTest();
    MyClass.processAccounts(accounts);
    Test.stopTest();

    // Assert results
    System.assertEquals(expected, actual);

} finally {
    // Always rollback
    Database.rollback(sp);
}
```

**Limitations:**

- Does not roll back async operations
- Maximum 5 savepoints per transaction

## Cleanup by Name Pattern

```apex
String pattern = 'Test%';

DELETE [SELECT Id FROM Opportunity WHERE Name LIKE :pattern];
DELETE [SELECT Id FROM Contact WHERE LastName LIKE :pattern];
DELETE [SELECT Id FROM Account WHERE Name LIKE :pattern];
```

**Order matters:** Delete children before parents.

## Cleanup by Date

```apex
DateTime startTime = DateTime.now().addHours(-1);

DELETE [
    SELECT Id FROM Account
    WHERE CreatedDate >= :startTime
    AND Name LIKE 'Test%'
];
```

## Cleanup via Cirra AI MCP

```
# Query IDs to delete
soql_query(query="SELECT Id FROM Account WHERE Name LIKE 'Test%'")

# Delete the records
sobject_dml(
  operation="delete",
  sobjectType="Account",
  records=[{"Id": "001xx..."}, ...]
)
```

## Best Practices

1. **Track created IDs** - Store in Set<Id>
2. **Delete in order** - Children first, parents last
3. **Use test prefixes** - 'Test', 'BulkTest'
4. **Preview before delete** - Verify records first
5. **Use @isTest** - Auto-rollback in tests
