go test -tags=integration ./... (с туннелями ES/БД и кредами)
Починить всё красное, в т.ч. известный долг: go vet -tags=integration падает на cmd/office/fetch/task_integration_test.go (loader.TaskFields undefined). Не маскировать skip-ом —
либо починить, либо обоснованный t.Skip с комментарием.
Приложить полные логи (числа PASS/FAIL) в отчёт.
Критерии
unit и race — зелёные.
integration — зелёные (или корректные skip при отсутствии кред, с перечислением).
Логи приложены; красного нет.
Эпик: #53
## W4 — полный прогон тестов и починка красного
### Цель
Все тесты зелёные; красное починено.
### Работа
1. `go build ./... && go vet ./...`
2. `go test ./...` (unit)
3. `go test -race ./...`
4. `go test -tags=integration ./...` (с туннелями ES/БД и кредами)
5. Починить всё красное, в т.ч. известный долг: `go vet -tags=integration` падает на
`cmd/office/fetch/task_integration_test.go` (`loader.TaskFields undefined`). Не маскировать skip-ом —
либо починить, либо обоснованный `t.Skip` с комментарием.
6. Приложить полные логи (числа PASS/FAIL) в отчёт.
### Критерии
- [ ] unit и race — зелёные.
- [ ] integration — зелёные (или корректные skip при отсутствии кред, с перечислением).
- [ ] Логи приложены; красного нет.
eSlider
added the test label 2026-09-16 22:20:53 +01:00
W4 #57 — отчёт: полный прогон тестов и починка красного
PR #61: #61
Ветка chore/test-green#57 · коммит d6b8eb7 (base main, вкл. #54/#55/#56). Не мержу и не закрываю.
Что починено
1. Известный долг: loader.TaskFields undefined (компиляция с -tags=integration)
cmd/office/fetch/task_integration_test.go использовал loader.TaskFields, удалённый
метод (заменён на loader.DetailForm → model.FormFields). Из-за этого падал и go vet -tags=integration, и сборка integration. Тест переписан на актуальный API: DetailForm + проверка fields.Primary/fields.Secondary. Не skip — реальная правка. go build -tags=integration ./... и go vet -tags=integration ./... теперь зелёные.
2. 429 openresty (главная причина красного integration)
Параллельный и даже последовательный go test -tags=integration ./... падал на
транзитных ответах edge: 429 Too Many Requests (HTML от openresty), а не JSON.
Транзитные коды ретраились только в bulk-тулах (DoRetry), но не в транспорте/аутентификации.
Исправлено в корне:
retryRaw (retry.go) — обёртка над DoRetry/DefaultRetryPolicy (детерминированный
линейный backoff, 429/502/503/504) для всех raw-ответов;
через неё теперь идут getJSON, formRequest, deleteReq, postJSON, putJSON, uploadMultipartMethod (http.go), Query (request.go);
AuthenticateContext/ensureToken — тот же ретрай (auth.go), плюс Query теперь
проверяет HTTP-статус и возвращает ...: 429 ... вместо ошибки JSON-декода HTML.
go vet -tags=integration ./... — OK (до фикса падал на TaskFields)
go test ./... (unit) — ok 11 пакетов, FAIL 0
go test -race ./... — ok 11, FAIL 0, data races 0
go test -tags=integration -v ./... (REST ONLYOFFICE_* + ES ONLYOFFICE_ES_URL=http://127.0.0.1:9200, ONLYOFFICE_TENANT=1; DB — live MySQL DSN, туннель -L 3306, ONLYOFFICE_PG_TEST_FILE_ID=22484, ONLYOFFICE_PG_TEST_FOLDER_ID=649) — PASS 318 / FAIL 0 / SKIP 13
Нет. Замечание на будущее (вне #57): прямые c.client.Do в files_webdav.go
(deleteJSON/uploadReader) и mails.go не обёрнуты ретраем — uploadReader
принимает io.Reader и не идемпотентен для повтора; вынести отдельной задачей.
## W4 #57 — отчёт: полный прогон тестов и починка красного
PR #61: https://git.produktor.io/eSlider/go-onlyoffice/pulls/61
Ветка `chore/test-green#57` · коммит `d6b8eb7` (base `main`, вкл. #54/#55/#56). Не мержу и не закрываю.
## Что починено
### 1. Известный долг: `loader.TaskFields undefined` (компиляция с `-tags=integration`)
`cmd/office/fetch/task_integration_test.go` использовал `loader.TaskFields`, удалённый
метод (заменён на `loader.DetailForm` → `model.FormFields`). Из-за этого падал и
`go vet -tags=integration`, и сборка integration. Тест переписан на актуальный API:
`DetailForm` + проверка `fields.Primary`/`fields.Secondary`. Не skip — реальная правка.
`go build -tags=integration ./...` и `go vet -tags=integration ./...` теперь зелёные.
### 2. 429 openresty (главная причина красного integration)
Параллельный и даже последовательный `go test -tags=integration ./...` падал на
транзитных ответах edge: `429 Too Many Requests` (HTML от openresty), а не JSON.
Транзитные коды ретраились только в bulk-тулах (`DoRetry`), но не в транспорте/аутентификации.
Исправлено в корне:
- `retryRaw` (retry.go) — обёртка над `DoRetry`/`DefaultRetryPolicy` (детерминированный
линейный backoff, 429/502/503/504) для всех raw-ответов;
- через неё теперь идут `getJSON`, `formRequest`, `deleteReq`, `postJSON`, `putJSON`,
`uploadMultipartMethod` (http.go), `Query` (request.go);
- `AuthenticateContext`/`ensureToken` — тот же ретрай (auth.go), плюс `Query` теперь
проверяет HTTP-статус и возвращает `...: 429 ...` вместо ошибки JSON-декода HTML.
Добавлены unit-тесты `TestTransient`, `TestDoRetry*` (retry_test.go).
## Логи (числа PASS/FAIL)
- `go build ./...` — OK
- `go vet ./...` — OK
- `go vet -tags=integration ./...` — OK (до фикса падал на `TaskFields`)
- `go test ./...` (unit) — `ok` 11 пакетов, **FAIL 0**
- `go test -race ./...` — `ok` 11, **FAIL 0**, data races **0**
- `go test -tags=integration -v ./...` (REST `ONLYOFFICE_*` + ES `ONLYOFFICE_ES_URL=http://127.0.0.1:9200`,
`ONLYOFFICE_TENANT=1`; DB — live MySQL DSN, туннель `-L 3306`, `ONLYOFFICE_PG_TEST_FILE_ID=22484`,
`ONLYOFFICE_PG_TEST_FOLDER_ID=649`) — **PASS 318 / FAIL 0 / SKIP 13**
- Корневой пакет отдельно: **136 PASS / 0 FAIL** (до фикса — 3 FAIL: ProjectFilesFlow,
TaskFilesFlow, MailList)
- `TestIntegrationPGStore` и `TestIntegrationSQLFacade` — **PASS** на живом MySQL
(`sql store backend: mysql`, `Entry.Provider == "mysql"`)
- gitleaks: **no leaks found**
### SKIP (корректные, с причиной)
| тест | причина |
|------|---------|
| `TestIntegrationMinioFallback` | нет `MINIO_ACCESS_KEY/SECRET_KEY` |
| `TestIntegrationMailList` / `TestIntegrationMailInboxDetail` / `TestIntegrationPreviewMailFromAPI` | пустой inbox на инстансе |
| `TestIntegrationUpdateTaskTitleDescription` / `TestIntegrationTaskFieldsFromLiveAPI` / `TestIntegrationPreviewTaskFromAPI` | на инстансе 0 задач |
| `TestIntegrationPreviewOpportunityFromAPI` | 0 opportunities |
| `TestIntegrationPreviewFileFromAPI` / `TestIntegrationPreviewCSVFromDownloadedFile` | не задан `ONLYOFFICE_PROJECT_ID` |
| `TestTXTToDOCXPreservesLines` / `TestMDDocxRoundTrip` | нет pandoc |
| `TestOptimizePDF` | нет локальной фикстуры |
## Изменённые файлы
`auth.go`, `http.go`, `request.go`, `retry.go`, `retry_test.go`,
`cmd/office/fetch/task_integration_test.go`, `AGENTS.md` (описание retry).
## Блокеры
Нет. Замечание на будущее (вне #57): прямые `c.client.Do` в `files_webdav.go`
(`deleteJSON`/`uploadReader`) и `mails.go` не обёрнуты ретраем — `uploadReader`
принимает `io.Reader` и не идемпотентен для повтора; вынести отдельной задачей.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Эпик: #53
W4 — полный прогон тестов и починка красного
Цель
Все тесты зелёные; красное починено.
Работа
go build ./... && go vet ./...go test ./...(unit)go test -race ./...go test -tags=integration ./...(с туннелями ES/БД и кредами)go vet -tags=integrationпадает наcmd/office/fetch/task_integration_test.go(loader.TaskFields undefined). Не маскировать skip-ом —либо починить, либо обоснованный
t.Skipс комментарием.Критерии
W4 #57 — отчёт: полный прогон тестов и починка красного
PR #61: #61
Ветка
chore/test-green#57· коммитd6b8eb7(basemain, вкл. #54/#55/#56). Не мержу и не закрываю.Что починено
1. Известный долг:
loader.TaskFields undefined(компиляция с-tags=integration)cmd/office/fetch/task_integration_test.goиспользовалloader.TaskFields, удалённыйметод (заменён на
loader.DetailForm→model.FormFields). Из-за этого падал иgo vet -tags=integration, и сборка integration. Тест переписан на актуальный API:DetailForm+ проверкаfields.Primary/fields.Secondary. Не skip — реальная правка.go build -tags=integration ./...иgo vet -tags=integration ./...теперь зелёные.2. 429 openresty (главная причина красного integration)
Параллельный и даже последовательный
go test -tags=integration ./...падал натранзитных ответах edge:
429 Too Many Requests(HTML от openresty), а не JSON.Транзитные коды ретраились только в bulk-тулах (
DoRetry), но не в транспорте/аутентификации.Исправлено в корне:
retryRaw(retry.go) — обёртка надDoRetry/DefaultRetryPolicy(детерминированныйлинейный backoff, 429/502/503/504) для всех raw-ответов;
getJSON,formRequest,deleteReq,postJSON,putJSON,uploadMultipartMethod(http.go),Query(request.go);AuthenticateContext/ensureToken— тот же ретрай (auth.go), плюсQueryтеперьпроверяет HTTP-статус и возвращает
...: 429 ...вместо ошибки JSON-декода HTML.Добавлены unit-тесты
TestTransient,TestDoRetry*(retry_test.go).Логи (числа PASS/FAIL)
go build ./...— OKgo vet ./...— OKgo vet -tags=integration ./...— OK (до фикса падал наTaskFields)go test ./...(unit) —ok11 пакетов, FAIL 0go test -race ./...—ok11, FAIL 0, data races 0go test -tags=integration -v ./...(RESTONLYOFFICE_*+ ESONLYOFFICE_ES_URL=http://127.0.0.1:9200,ONLYOFFICE_TENANT=1; DB — live MySQL DSN, туннель-L 3306,ONLYOFFICE_PG_TEST_FILE_ID=22484,ONLYOFFICE_PG_TEST_FOLDER_ID=649) — PASS 318 / FAIL 0 / SKIP 13TaskFilesFlow, MailList)
TestIntegrationPGStoreиTestIntegrationSQLFacade— PASS на живом MySQL(
sql store backend: mysql,Entry.Provider == "mysql")SKIP (корректные, с причиной)
TestIntegrationMinioFallbackMINIO_ACCESS_KEY/SECRET_KEYTestIntegrationMailList/TestIntegrationMailInboxDetail/TestIntegrationPreviewMailFromAPITestIntegrationUpdateTaskTitleDescription/TestIntegrationTaskFieldsFromLiveAPI/TestIntegrationPreviewTaskFromAPITestIntegrationPreviewOpportunityFromAPITestIntegrationPreviewFileFromAPI/TestIntegrationPreviewCSVFromDownloadedFileONLYOFFICE_PROJECT_IDTestTXTToDOCXPreservesLines/TestMDDocxRoundTripTestOptimizePDFИзменённые файлы
auth.go,http.go,request.go,retry.go,retry_test.go,cmd/office/fetch/task_integration_test.go,AGENTS.md(описание retry).Блокеры
Нет. Замечание на будущее (вне #57): прямые
c.client.Doвfiles_webdav.go(
deleteJSON/uploadReader) иmails.goне обёрнуты ретраем —uploadReaderпринимает
io.Readerи не идемпотентен для повтора; вынести отдельной задачей.RE: PR #61 проверен — unit/race зелёные; live
TestIntegrationFileStores(REST+DAV CRUD/move/copy/rename/delete) PASS. Влит в main.