# Test-Driven Development Workflow ## Core TDD Cycle 1. **Red** - Write failing test 2. **Green** - Make test pass 3. **Refactor** - Improve code while keeping tests passing ## Writing Effective Tests ### Test Structure ``` # Arrange - Set up test data and conditions # Act - Execute the code being tested # Assert - Verify expected behavior ``` ### Good Test Characteristics - **Isolated** - Tests don't depend on each other - **Repeatable** - Same input always produces same output - **Fast** - Tests run quickly - **Clear** - Test name describes what's being tested - **Focused** - One concept per test ### Test Naming ``` test___ ``` Examples: - `test_rename_folder_as_owner_succeeds` - `test_rename_folder_without_permission_returns_403` - `test_rename_folder_with_empty_name_returns_400` ## Common Patterns ### Testing Error Conditions ```javascript // Test expected errors test('rename_folder_without_permission_returns_403', async () => { // Arrange: Set up user without permissions const user = createUserWithoutPermissions(); // Act: Attempt rename const response = await renameFolder(user, folderId, newName); // Assert: Verify 403 error expect(response.status).toBe(403); expect(response.error).toContain('forbidden'); }); ``` ### Testing Happy Path ```javascript test('rename_folder_as_owner_succeeds', async () => { // Arrange: Set up folder with owner const owner = createOwner(); const folder = createFolder(owner); // Act: Rename folder const response = await renameFolder(owner, folder.id, 'NewName'); // Assert: Verify success expect(response.status).toBe(200); expect(response.data.name).toBe('NewName'); }); ``` ### Testing Edge Cases ```javascript test('rename_folder_with_special_characters_sanitizes_name', async () => { const owner = createOwner(); const folder = createFolder(owner); const response = await renameFolder(owner, folder.id, ''); expect(response.status).toBe(200); expect(response.data.name).not.toContain('