files_dedupe.go (FileDedupKey, FindProjectDuplicates, ApplyDedupGroups, DeleteFilesByDedupKey)
покрыт только unit-тестами. Живого доказательства, что dedup реально находит и удаляет дубли на портале, нет.
Работа (TDD)
TestIntegrationFileDedup (//go:build integration): throwaway-проект → две папки, загрузить
один и тот же файл (по stem+ext) в обе (и дубль в одну) → FindProjectDuplicates находит группу → ApplyDedupGroups/DeleteFilesByDedupKey удаляет лишние → survivor остался, остальные исчезли (poll).
Проверить isTrashFolderTitle/mergeProjectRootForDedupe поведение на живом дереве.
Найденные баги — починить; тест не ослаблять.
Критерии
TestIntegrationFileDedup зелёный на живом портале; survivor и удаления подтверждены polling-ом.
Unit-тесты files_dedupe_test.go остаются зелёными.
Вывод приложен; throwaway-проект удалён.
Эпик: #53
## W6 — live-тест файлового dedup (TDD)
### Проблема
`files_dedupe.go` (`FileDedupKey`, `FindProjectDuplicates`, `ApplyDedupGroups`, `DeleteFilesByDedupKey`)
покрыт только unit-тестами. Живого доказательства, что dedup реально находит и удаляет дубли на портале, нет.
### Работа (TDD)
1. `TestIntegrationFileDedup` (`//go:build integration`): throwaway-проект → две папки, загрузить
один и тот же файл (по stem+ext) в обе (и дубль в одну) → `FindProjectDuplicates` находит группу →
`ApplyDedupGroups`/`DeleteFilesByDedupKey` удаляет лишние → survivor остался, остальные исчезли (poll).
2. Проверить `isTrashFolderTitle`/`mergeProjectRootForDedupe` поведение на живом дереве.
3. Найденные баги — починить; тест не ослаблять.
### Критерии
- [ ] `TestIntegrationFileDedup` зелёный на живом портале; survivor и удаления подтверждены polling-ом.
- [ ] Unit-тесты `files_dedupe_test.go` остаются зелёными.
- [ ] Вывод приложен; throwaway-проект удалён.
TestIntegrationFileDedup (//go:build integration) — throwaway-проект go-onlyoffice-test-dedup-*:
две папки (A, B) + project root, дубли одного stem|ext (2 в A, 1 в B, 2 в root).
FindProjectDuplicates within: группа A (2) и группа root (2).
DedupeProject(--cross, dry-run): 1 группа, 5 файлов, 4 к удалению; в группе есть root-копия.
fix(files): пропускать пустой dedup-ключ (dotfiles) — .env/.gitignore/.npmrc дают FileDedupKey="", а findWithinFolderDuplicates/findCrossFolderDuplicates схлопывали их в одну группу дублей → удаление лишнего. Добавлен unit TestFindDuplicatesSkipsEmptyKey (падал до фикса).
fix(files): ретраить transient-ответы при удалении файлов — DeleteDavItems (путь ApplyDedupGroups/DeleteFilesByDedupKey) не шёл через DoRetry и падал на 429 от openresty. Теперь каждый delete идёт через DoRetry.
go build ./... — зелёный. gitleaks detect --no-banner --redact -s . — no leaks.
Throwaway-проекты после прогона не остаются (проверено GetProjects — 0 с префиксом go-onlyoffice-test-).
Блокеры
Нет. go test -tags=integration ./... падает на пред-существующем не-моём cmd/office/fetch/task_integration_test.go (loader.TaskFields undefined) — точечно корневой пакет (.) зелёный; не трогал.
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
W6 — live-тест файлового dedup (TDD)
Проблема
files_dedupe.go(FileDedupKey,FindProjectDuplicates,ApplyDedupGroups,DeleteFilesByDedupKey)покрыт только unit-тестами. Живого доказательства, что dedup реально находит и удаляет дубли на портале, нет.
Работа (TDD)
TestIntegrationFileDedup(//go:build integration): throwaway-проект → две папки, загрузитьодин и тот же файл (по stem+ext) в обе (и дубль в одну) →
FindProjectDuplicatesнаходит группу →ApplyDedupGroups/DeleteFilesByDedupKeyудаляет лишние → survivor остался, остальные исчезли (poll).isTrashFolderTitle/mergeProjectRootForDedupeповедение на живом дереве.Критерии
TestIntegrationFileDedupзелёный на живом портале; survivor и удаления подтверждены polling-ом.files_dedupe_test.goостаются зелёными.Отчёт SE — W6 #63 (live-тест файлового dedup)
Branch:
test/w6-file-dedup#63Commits:
d9db1c5(test),f8783b8(fix empty key),5588c2d(fix delete retry)HEAD SHA:
5588c2d3f7f88da7402c248198c5e9efd98a9342PR: #65
Что сделано
TestIntegrationFileDedup(//go:build integration) — throwaway-проектgo-onlyoffice-test-dedup-*:две папки (
A,B) + project root, дубли одного stem|ext (2 в A, 1 в B, 2 в root).FindProjectDuplicateswithin: группа A (2) и группа root (2).DedupeProject(--cross, dry-run): 1 группа, 5 файлов, 4 к удалению; в группе есть root-копия.DeleteFilesByDedupKey(A): удалила 2 копии;ApplyDedupGroups: удалила 4 копии.IsTrashFolderTitleиmergeProjectRootForDedupeпроверены на живом дереве (root ровно один раз, root-файлы в cross-группе).fix(files): пропускать пустой dedup-ключ (dotfiles)—.env/.gitignore/.npmrcдаютFileDedupKey="", аfindWithinFolderDuplicates/findCrossFolderDuplicatesсхлопывали их в одну группу дублей → удаление лишнего. Добавлен unitTestFindDuplicatesSkipsEmptyKey(падал до фикса).fix(files): ретраить transient-ответы при удалении файлов—DeleteDavItems(путьApplyDedupGroups/DeleteFilesByDedupKey) не шёл черезDoRetryи падал на429от openresty. Теперь каждый delete идёт черезDoRetry.Фактический вывод
(второй прогон — тоже PASS; survivor = keep, удалены ровно 4 лишние копии)
Unit (до/после фикса — сначала FAIL на empty-key, потом PASS):
go build ./...— зелёный.gitleaks detect --no-banner --redact -s .— no leaks.Throwaway-проекты после прогона не остаются (проверено
GetProjects— 0 с префиксомgo-onlyoffice-test-).Блокеры
Нет.
go test -tags=integration ./...падает на пред-существующем не-моёмcmd/office/fetch/task_integration_test.go(loader.TaskFields undefined) — точечно корневой пакет (.) зелёный; не трогал.Мержить/закрывать — PO/RE. PR #65 ждёт ревью.