W4 — полный прогон тестов и починка красного #57

Closed
opened 2026-09-16 22:20:45 +01:00 by eSlider · 2 comments
Owner

Эпик: #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 при отсутствии кред, с перечислением).
  • Логи приложены; красного нет.
Эпик: #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
Author
Owner

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.

Добавлены 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 и не идемпотентен для повтора; вынести отдельной задачей.

## 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` и не идемпотентен для повтора; вынести отдельной задачей.
Author
Owner

RE: PR #61 проверен — unit/race зелёные; live TestIntegrationFileStores (REST+DAV CRUD/move/copy/rename/delete) PASS. Влит в main.

RE: PR #61 проверен — unit/race зелёные; live `TestIntegrationFileStores` (REST+DAV CRUD/move/copy/rename/delete) PASS. Влит в main.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/go-onlyoffice#57