---
title: Maintain 80%+ Test Coverage for New Code
impact: HIGH
impactDescription: Prevents bugs and enables confident refactoring
tags: testing, coverage, quality
---
## Паспорт документа

- Статус документа: living standard
- Актуально на: 28 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении инженерной практики, CI/CD, архитектурных правил или локального workflow
- Область применения: внутренние rule/reference-card документы для инженерной команды
- Связанные документы:
  - [Индекс Agents](../README.md)
  - [Команды разработки](../commands.md)
  - [Инженерные принципы](../../governance/engineering-principles.md)

## Maintain 80%+ Test Coverage for New Code

**Impact: HIGH**

Every PR must have near-80%+ test coverage for the code it introduces or modifies. If you add 50 lines of new code, those 50 lines must be covered by tests.

### What to Test

| Layer | Test Type | Tool | Coverage Target |
|-------|-----------|------|----------------|
| NestJS Services (business logic) | Unit | Jest | ~100% |
| Repositories (data access) | Integration | Jest | 80%+ |
| Controllers (HTTP layer) | Integration | Jest + Supertest | 80%+ |
| Frontend components | Unit | Vitest + Testing Library | 70%+ |
| Shared packages | Unit | Vitest | 80%+ |
| User flows | E2E | Playwright | Critical paths |

### Example

```typescript
// item.service.spec.ts
describe('ItemService', () => {
  let service: ItemService;
  let repo: jest.Mocked<ItemRepository>;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      providers: [
        ItemService,
        { provide: ItemRepository, useValue: createMock<ItemRepository>() },
      ],
    }).compile();

    service = module.get(ItemService);
    repo = module.get(ItemRepository);
  });

  describe('findBySlug', () => {
    it('returns item when found', async () => {
      const mockItem = { id: '1', name: 'Test', slug: 'test' };
      repo.findBySlug.mockResolvedValue(mockItem);

      const result = await service.findBySlug('test');
      expect(result).toEqual(mockItem);
    });

    it('returns null when not found', async () => {
      repo.findBySlug.mockResolvedValue(null);

      const result = await service.findBySlug('nonexistent');
      expect(result).toBeNull();
    });
  });
});
```

### Rules
- Services must have unit tests with mocked dependencies
- Use AI assistance to generate comprehensive test suites
- Test edge cases: empty inputs, invalid data, boundary conditions
- Test error paths: what happens when things go wrong
