Compress always-on contracts and restore pagination fields
The always-on set is paid by every session, so it gets the tightest form: git-sync-check shrinks to its procedural core, testing-policy moves the table-test example to README.md and folds the agent instructions into the rules, go-code-style inlines the error-wrapping example. Per-session read cost drops from 403 to 336 lines. Also restore the pagination response fields in table-management: the previous dedup replaced them with a reference to go-api, which the table router line does not load. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,12 @@
|
||||
# Contract: Testing Policy
|
||||
|
||||
Version: 1.1
|
||||
Version: 1.2
|
||||
|
||||
## Purpose
|
||||
|
||||
Определяет когда писать тесты, когда не писать, и как их поддерживать.
|
||||
Применяется ко всем проектам на Go. Агенты следуют этим правилам самостоятельно, без запроса подтверждения.
|
||||
|
||||
---
|
||||
Применяется ко всем проектам на Go. Агенты следуют этим правилам самостоятельно,
|
||||
без запроса подтверждения. See `README.md` for a reference table test.
|
||||
|
||||
## Когда тест обязателен
|
||||
|
||||
@@ -24,11 +23,9 @@ Version: 1.1
|
||||
|
||||
Для local-first desktop приложений правила деградированных состояний и recovery-тестов определяются также `local-first-recovery` contract.
|
||||
|
||||
---
|
||||
|
||||
## Когда тест не нужен
|
||||
|
||||
Тест не пишется на код, где он не даёт ценности:
|
||||
Тест не пишется на код, где он не даёт ценности. Не писать его и не упоминать его отсутствие:
|
||||
|
||||
- Геттеры и сеттеры: `func (s *Server) Port() int { return s.port }`
|
||||
- Конфиг-структуры и константы
|
||||
@@ -36,50 +33,15 @@ Version: 1.1
|
||||
- Логирование и форматирование вывода
|
||||
- HTTP-хендлеры без бизнес-логики (только роутинг и вызов сервиса)
|
||||
|
||||
---
|
||||
|
||||
## Структура теста
|
||||
|
||||
Использовать стандартный Go `testing`. Табличные тесты (`[]struct{ ... }`) — когда случаев больше двух.
|
||||
|
||||
```go
|
||||
func TestParseGPUSensor(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
xml string
|
||||
want int
|
||||
}{
|
||||
{"normal", `<VALUE>290</VALUE>`, 29},
|
||||
{"zero", `<VALUE>0</VALUE>`, 0},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := parseGPUTemp(tt.xml)
|
||||
if got != tt.want {
|
||||
t.Fatalf("got %d, want %d", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Фикстуры (XML, JSON, бинарные данные) — инлайн-константы или файлы в `testdata/`.
|
||||
Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах.
|
||||
|
||||
---
|
||||
- Стандартный Go `testing`. Табличные тесты (`[]struct{ ... }`) — когда случаев больше двух.
|
||||
- Фикстуры (XML, JSON, бинарные данные) — инлайн-константы или файлы в `testdata/`.
|
||||
- Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах.
|
||||
|
||||
## Мейнтейнс
|
||||
|
||||
- Сломанный тест — чинится или удаляется в том же коммите где сломался.
|
||||
- Закомментированный тест — не допускается. Если тест неактуален — удалить.
|
||||
- Тест, проверяющий удалённую функциональность — удалить вместе с функциональностью.
|
||||
|
||||
---
|
||||
|
||||
## Инструкция для агентов (Codex, Claude)
|
||||
|
||||
1. При добавлении функциональности — проверь по списку выше, попадает ли код в категорию "обязателен".
|
||||
2. Если да — напиши тест в том же коммите, без запроса подтверждения.
|
||||
3. Если нет — не пиши тест, не упоминай его отсутствие.
|
||||
4. При удалении функциональности — удали соответствующие тесты.
|
||||
5. При обнаружении закомментированных или сломанных тестов — удали или почини.
|
||||
- При удалении функциональности — удалить соответствующие тесты в том же коммите.
|
||||
|
||||
Reference in New Issue
Block a user