@sync-in/server 1.9.6 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -4
- package/environment/environment.dist.yaml +15 -5
- package/package.json +13 -14
- package/server/app.bootstrap.js +1 -1
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +3 -2
- package/server/app.constants.js.map +1 -1
- package/server/applications/files/constants/cache.js +2 -5
- package/server/applications/files/constants/cache.js.map +1 -1
- package/server/applications/files/constants/files.js +4 -0
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/operations.js +4 -0
- package/server/applications/files/constants/operations.js.map +1 -1
- package/server/applications/files/constants/routes.js +1 -26
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/files.config.js +15 -39
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.js +4 -4
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.module.js +12 -9
- package/server/applications/files/files.module.js.map +1 -1
- package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +32 -0
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +280 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +552 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.config.js +40 -0
- package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js +110 -0
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js +128 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +47 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -0
- package/server/applications/files/{interfaces/only-office-config.interface.js → modules/collabora-online/collabora-online.dtos.js} +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.guard.js → modules/collabora-online/collabora-online.guard.js} +7 -21
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +86 -0
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js +10 -0
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.module.js +41 -0
- package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js +35 -0
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +59 -0
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js +28 -0
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -0
- package/server/applications/files/{decorators → modules/only-office}/only-office-environment.decorator.js +5 -5
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -0
- package/server/applications/files/{services/files-only-office-manager.service.js → modules/only-office/only-office-manager.service.js} +101 -97
- package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +477 -0
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.config.js +51 -0
- package/server/applications/files/modules/only-office/only-office.config.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.constants.js +417 -0
- package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -0
- package/server/applications/files/{files-only-office.controller.js → modules/only-office/only-office.controller.js} +35 -52
- package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -0
- package/server/applications/files/{files-only-office.controller.spec.js → modules/only-office/only-office.controller.spec.js} +24 -21
- package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.dtos.js +10 -0
- package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.guard.js +40 -0
- package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.guard.spec.js → modules/only-office/only-office.guard.spec.js} +15 -21
- package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.interface.js +10 -0
- package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.module.js +41 -0
- package/server/applications/files/modules/only-office/only-office.module.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.routes.js +45 -0
- package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.strategy.js → modules/only-office/only-office.strategy.js} +11 -11
- package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -0
- package/server/applications/files/services/files-lock-manager.service.js +25 -33
- package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +17 -16
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +2 -2
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.spec.js +3 -1
- package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +2 -2
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/utils/files.js +10 -2
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/links/constants/routes.js +5 -0
- package/server/applications/links/constants/routes.js.map +1 -1
- package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
- package/server/applications/links/links.controller.js +25 -5
- package/server/applications/links/links.controller.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +43 -21
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +4 -3
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +9 -2
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +3 -0
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +2 -1
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +1 -0
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/spaces/constants/spaces.js +2 -2
- package/server/applications/spaces/constants/spaces.js.map +1 -1
- package/server/applications/spaces/decorators/space-override-permission.decorator.js +18 -0
- package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -0
- package/server/applications/spaces/guards/space.guard.js +40 -33
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +10 -15
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +4 -0
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.js +9 -8
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
- package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +40 -17
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.spec.js +2157 -1289
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/utils/webdav.js +8 -4
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +4 -4
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.js +8 -3
- package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +350 -4
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -1
- package/server/configuration/config.environment.js +5 -1
- package/server/configuration/config.environment.js.map +1 -1
- package/server/configuration/config.interfaces.js.map +1 -1
- package/static/3rdpartylicenses.txt +507 -507
- package/static/assets/pdfjs/build/pdf.mjs +93 -33
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
- package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.worker.mjs +166 -54
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/images/checkmark.svg +5 -0
- package/static/assets/pdfjs/web/images/pages_closeButton.svg +3 -0
- package/static/assets/pdfjs/web/images/pages_selected.svg +7 -0
- package/static/assets/pdfjs/web/images/pages_viewArrow.svg +3 -0
- package/static/assets/pdfjs/web/images/pages_viewButton.svg +3 -0
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +6 -2
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +82 -17
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +3 -5
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hr/viewer.ftl +66 -0
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +3 -8
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +0 -14
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +1 -3
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +4 -2
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +35 -0
- package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -5
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/th/viewer.ftl +2 -2
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/viewer.css +1778 -835
- package/static/assets/pdfjs/web/viewer.html +167 -86
- package/static/assets/pdfjs/web/viewer.mjs +1106 -801
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/chunk-27V66YJV.js +2 -0
- package/static/{chunk-BVKDW5XO.js → chunk-27Z3SYRL.js} +1 -1
- package/static/{chunk-HLKZCMKV.js → chunk-2RWLNKZH.js} +1 -1
- package/static/chunk-2YQ4SX3A.js +13 -0
- package/static/{chunk-GENTF6JM.js → chunk-3JYMJQYT.js} +1 -1
- package/static/chunk-3QTROEHV.js +1 -0
- package/static/{chunk-C5T7RZSD.js → chunk-3RPUQ22U.js} +1 -1
- package/static/{chunk-EPDWJEPD.js → chunk-3WZ6F3LC.js} +1 -1
- package/static/chunk-3ZLBVUCX.js +2 -0
- package/static/{chunk-SF6Q6VRC.js → chunk-45AZ6ZML.js} +1 -1
- package/static/chunk-46TJLPJY.js +1 -0
- package/static/chunk-4NIYCYRS.js +2 -0
- package/static/{chunk-GLPKRULI.js → chunk-4TPFERL6.js} +1 -1
- package/static/{chunk-KAAFVHYE.js → chunk-5O66CLTD.js} +1 -1
- package/static/chunk-6OEOADR6.js +1 -0
- package/static/chunk-6WMXMIE4.js +1 -0
- package/static/{chunk-QKMN3S4M.js → chunk-7VRYTDX4.js} +1 -1
- package/static/{chunk-Z2KBIZ5D.js → chunk-ARS47O5X.js} +1 -1
- package/static/chunk-B6HQYQYG.js +1 -0
- package/static/chunk-BCN4T5DO.js +2 -0
- package/static/{chunk-7HL5Z6PF.js → chunk-CCZWPM7Q.js} +1 -1
- package/static/{chunk-DU4Q4RWJ.js → chunk-CMNMPG6Z.js} +1 -1
- package/static/{chunk-BX3QZ7IL.js → chunk-CSVPAZHK.js} +1 -1
- package/static/{chunk-BJARRIS6.js → chunk-D55YR5X7.js} +4 -4
- package/static/{chunk-NHMYAVJK.js → chunk-D5FQ72R4.js} +1 -1
- package/static/{chunk-7QYALK5T.js → chunk-DGCVA6BM.js} +1 -1
- package/static/{chunk-IBC7CFBQ.js → chunk-DVCN3P7Q.js} +1 -1
- package/static/chunk-E32J777S.js +5 -0
- package/static/{chunk-FEQUP26G.js → chunk-FIUF2JM4.js} +1 -1
- package/static/{chunk-ODAQRAPO.js → chunk-G3PL6YX3.js} +1 -1
- package/static/chunk-G7RZN7HN.js +1 -0
- package/static/{chunk-IIKL33TV.js → chunk-GQHXYX6Z.js} +1 -1
- package/static/{chunk-5HYSNQR4.js → chunk-GWRAGN3M.js} +1 -1
- package/static/{chunk-ANH4VNOS.js → chunk-GXWGB7WO.js} +1 -1
- package/static/{chunk-25PWAXTJ.js → chunk-HGODIZTV.js} +1 -1
- package/static/{chunk-X5UDV4ZB.js → chunk-HZAB6F4Q.js} +1 -1
- package/static/chunk-I3FR3A45.js +1 -0
- package/static/{chunk-JYHTSSKW.js → chunk-I5SPA4G2.js} +1 -1
- package/static/{chunk-DQAQUSVW.js → chunk-IMFO2MI7.js} +1 -1
- package/static/{chunk-AYYJZMBE.js → chunk-JNTNMIUH.js} +1 -1
- package/static/chunk-JRXG43AA.js +2 -0
- package/static/{chunk-3AR5VNJE.js → chunk-KAUCN24H.js} +1 -1
- package/static/{chunk-3WS72A6C.js → chunk-KDUAB76O.js} +1 -1
- package/static/chunk-KPOQLDWF.js +1 -0
- package/static/{chunk-UO7ATVQG.js → chunk-KWFELZTM.js} +1 -1
- package/static/{chunk-2CAAJBRO.js → chunk-L3BIP4AA.js} +1 -1
- package/static/{chunk-DK2LAJEL.js → chunk-LGIVVJDD.js} +1 -1
- package/static/{chunk-5ATJIR5S.js → chunk-LNLBIJZD.js} +1 -1
- package/static/chunk-LTJNLOX2.js +1 -0
- package/static/{chunk-GRV44RYI.js → chunk-LZUHREOF.js} +1 -1
- package/static/{chunk-XIQXRSZ2.js → chunk-NIR4YE2E.js} +1 -1
- package/static/{chunk-TOCCCZP2.js → chunk-NJJURHX4.js} +1 -1
- package/static/chunk-NNZWSNAW.js +1 -0
- package/static/chunk-NWKBB7J4.js +1 -0
- package/static/chunk-O3YLAEVE.js +3 -0
- package/static/chunk-OUHCDDT6.js +1 -0
- package/static/{chunk-B4TDS6AQ.js → chunk-PDG7DOEF.js} +1 -1
- package/static/chunk-POUWUMC4.js +1 -0
- package/static/{chunk-NQCKX2AD.js → chunk-PPJCVBJH.js} +1 -1
- package/static/{chunk-ZCOEP4O2.js → chunk-PQZLR4P3.js} +1 -1
- package/static/chunk-PVYVY3GD.js +1 -0
- package/static/chunk-Q5X5TPAG.js +1 -0
- package/static/{chunk-LFAQLJZK.js → chunk-QHJT5H4M.js} +1 -1
- package/static/{chunk-D6QWQHWE.js → chunk-R4VMWCM5.js} +1 -1
- package/static/{chunk-O233BXWK.js → chunk-R7PLNX75.js} +1 -1
- package/static/chunk-RJULB733.js +1 -0
- package/static/{chunk-E5C4QRNQ.js → chunk-RNVPQQKT.js} +5 -5
- package/static/chunk-RTNEBRKJ.js +1 -0
- package/static/{chunk-GYYJ4FWN.js → chunk-S3TTWPQA.js} +1 -1
- package/static/{chunk-4GBA6EJ4.js → chunk-SDJNZULP.js} +1 -1
- package/static/chunk-SNOOCDJD.js +1 -0
- package/static/chunk-T42BV6TR.js +1 -0
- package/static/{chunk-5KVI243T.js → chunk-TNCKNU6I.js} +1 -1
- package/static/{chunk-OVUMPMVM.js → chunk-ULSPQ3HP.js} +1 -1
- package/static/{chunk-5NFH4E2B.js → chunk-UOK3LKSX.js} +1 -1
- package/static/{chunk-CHMDM2ZW.js → chunk-VD5JHSDS.js} +1 -1
- package/static/{chunk-2F42MZQ5.js → chunk-XBKCQCBI.js} +1 -1
- package/static/{chunk-2U5VKTML.js → chunk-XEWLBWFF.js} +1 -1
- package/static/{chunk-FSGT46LM.js → chunk-XTVNHFKX.js} +1 -1
- package/static/chunk-ZCSHU3D7.js +1 -0
- package/static/{chunk-QUUQOBTF.js → chunk-ZEJLIGAY.js} +1 -1
- package/static/{chunk-7H5O4BLV.js → chunk-ZHOE5VEY.js} +1 -1
- package/static/chunk-ZOMRIN3G.js +2 -0
- package/static/index.html +2 -2
- package/static/main-YKDNJ7LK.js +11 -0
- package/static/{styles-S5HVK4H5.css → styles-XLLEY5Y3.css} +1 -1
- package/server/applications/files/constants/only-office.js +0 -531
- package/server/applications/files/constants/only-office.js.map +0 -1
- package/server/applications/files/decorators/only-office-environment.decorator.js.map +0 -1
- package/server/applications/files/files-only-office.controller.js.map +0 -1
- package/server/applications/files/files-only-office.controller.spec.js.map +0 -1
- package/server/applications/files/guards/files-only-office.guard.js.map +0 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js.map +0 -1
- package/server/applications/files/guards/files-only-office.strategy.js.map +0 -1
- package/server/applications/files/interfaces/only-office-config.interface.js.map +0 -1
- package/server/applications/files/services/files-only-office-manager.service.js.map +0 -1
- package/server/applications/files/services/files-only-office-manager.service.spec.js +0 -58
- package/server/applications/files/services/files-only-office-manager.service.spec.js.map +0 -1
- package/static/chunk-42L6C5MT.js +0 -1
- package/static/chunk-4ZKAVMB4.js +0 -1
- package/static/chunk-5GIWZKNS.js +0 -1
- package/static/chunk-5WCQBTXW.js +0 -1
- package/static/chunk-B2A4HNDC.js +0 -1
- package/static/chunk-BSB4VROD.js +0 -2
- package/static/chunk-CUC7R6C2.js +0 -1
- package/static/chunk-DHFQIFOF.js +0 -1
- package/static/chunk-DRHPEERW.js +0 -2
- package/static/chunk-FCGTI42I.js +0 -1
- package/static/chunk-FCR5AEHR.js +0 -3
- package/static/chunk-HB5DC7RJ.js +0 -1
- package/static/chunk-ITVA26X2.js +0 -2
- package/static/chunk-KWKZN53T.js +0 -1
- package/static/chunk-LBXOAKBD.js +0 -1
- package/static/chunk-LZKI5P5T.js +0 -1
- package/static/chunk-MGMDT4VN.js +0 -1
- package/static/chunk-MWUUM2NK.js +0 -13
- package/static/chunk-MYM43ENO.js +0 -1
- package/static/chunk-NAH4V2R6.js +0 -2
- package/static/chunk-PCFH5HCI.js +0 -2
- package/static/chunk-Q6B4OVER.js +0 -5
- package/static/chunk-QV5LQKTS.js +0 -1
- package/static/chunk-S4UTSOPV.js +0 -1
- package/static/chunk-SRBOO7AO.js +0 -1
- package/static/chunk-VZPCXSRG.js +0 -2
- package/static/chunk-XKEBQNQJ.js +0 -1
- package/static/chunk-YYTDPI5S.js +0 -1
- package/static/main-ODUA232E.js +0 -11
- /package/static/assets/pdfjs/web/images/{toolbarButton-sidebarToggle.svg → toolbarButton-viewsManagerToggle.svg} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-methods.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag\"')\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe(WebDAVMethods.name, () => {\n let service: WebDAVMethods\n let filesManager: {\n sendFileFromSpace: jest.Mock\n mkFile: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n copyMove: jest.Mock\n }\n let filesLockManager: {\n create: jest.Mock\n isLockedWithToken: jest.Mock\n removeLock: jest.Mock\n browseLocks: jest.Mock\n browseParentChildLocks: jest.Mock\n checkConflicts: jest.Mock\n getLocksByPath: jest.Mock\n getLockByToken: jest.Mock\n refreshLockTimeout: jest.Mock\n }\n let webDAVSpaces: { propfind: jest.Mock; spaceEnv: jest.Mock }\n const makeRes = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n const baseReq = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'user-1' },\n dav: {\n url: '/webdav/url',\n depth: '0',\n httpVersion: 'HTTP/1.1',\n body: '<lockrequest/>',\n lock: { timeout: 60, lockscope: 'exclusive', owner: 'user-1', token: 'opaquetoken:abc' }\n },\n space: {\n id: 10,\n alias: 'spaceA',\n url: '/spaces/spaceA/file.txt',\n realPath: '/real/path/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt' }\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn().mockResolvedValue(undefined),\n saveStream: jest.fn(),\n delete: jest.fn().mockResolvedValue(undefined),\n touch: jest.fn().mockResolvedValue(undefined),\n mkDir: jest.fn().mockResolvedValue(undefined),\n copyMove: jest.fn().mockResolvedValue(undefined)\n }\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn().mockResolvedValue(undefined),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn().mockResolvedValue(undefined),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn().mockResolvedValue(undefined)\n }\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n {\n provide: FilesManager,\n useValue: filesManager\n },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockReset().mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('headOrGet', () => {\n it('streams the file when repository is FILES and not in shares list', async () => {\n const req = baseReq()\n const res = makeRes()\n const streamable = { stream: 'ok' }\n const send = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(send.checks).toHaveBeenCalledTimes(1)\n expect(send.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n\n it('returns 403 when repository is not allowed', async () => {\n const req = baseReq({ space: { ...baseReq().space, inSharesList: true } })\n const res = makeRes()\n\n // repository not FILES or inSharesList true => forbidden\n await service.headOrGet(req, res, 'OTHER')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('handles error thrown by sendFile.checks via handleError', async () => {\n const req = baseReq()\n const res = makeRes()\n const send = {\n checks: jest.fn().mockRejectedValue(new Error('boom')),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n const handleSpy = jest.spyOn<any, any>(service, 'handleError').mockReturnValue('handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(handleSpy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('lock', () => {\n it('when body is empty: returns 400 if resource does not exist (lock refresh)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('when body is empty: delegates to lockRefresh if resource exists', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('ok')\n })\n\n it('returns 403 when creating new lock on non-existing resource without permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false) // resource does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('returns 409 when parent does not exist for new lock', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource does not exist\n .mockResolvedValueOnce(false) // parent does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/parent-missing')\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('creates lock on existing resource and returns 200 with lock-token header', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true) // resource exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, davLock, _timeout) => {\n davLock.locktoken = 'opaquetoken:1'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.headers['lock-token']).toBe('<opaquetoken:1>')\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.body).toBeDefined()\n })\n\n it('creates lock on unmapped URL (resource missing), creates empty file and returns 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource missing\n .mockResolvedValueOnce(true) // parent exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, davLock, _timeout) => {\n davLock.locktoken = 'opaquetoken:new'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toBe('<opaquetoken:new>')\n })\n\n it('returns 423 when a lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockResolvedValue([false, { davLock: { lockroot: '/locked' }, dbFilePath: 'file.txt' }])\n\n await service.lock(req, res)\n\n // DAV_ERROR_RES should have set 423 on the response\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('unlock', () => {\n it('returns 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns 409 when lock token does not exist or does not match URL', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('returns 403 when the lock owner is a different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 }, key: 'k1' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n\n it('removes lock and returns 204 when owner matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, key: 'k2' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('k2')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('propfind', () => {\n it('returns 404 when repository is FILES and path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'prop' } })\n const res = makeRes()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns multistatus with only property names when PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'propname', httpVersion: 'HTTP/1.1' } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/a')\n })\n\n it('collects lock discovery based on depth', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req0 = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: '0'\n }\n })\n const reqInf = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: 'infinity'\n }\n })\n const res0 = makeRes()\n const resInf = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt', getlastmodified: 'x' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(req0, res0 as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseLocks).toHaveBeenCalledTimes(1)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(reqInf, resInf as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledTimes(1)\n })\n\n it('includes lockdiscovery when requested', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n body: { propfind: { prop: { lockdiscovery: '' } } }\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n\n await service.propfind(req, res as any, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/dav/url')\n })\n })\n\n describe('put', () => {\n it.each([\n { existed: true, expected: HttpStatus.NO_CONTENT, checkEtag: true },\n { existed: false, expected: HttpStatus.CREATED, checkEtag: false }\n ])('returns correct status for PUT when existed=%s', async ({ existed, expected, checkEtag }) => {\n filesManager.saveStream.mockResolvedValue(existed)\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n if (checkEtag) {\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n }\n expect(res.statusCode).toBe(expected)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n const err = new Error('save failed')\n filesManager.saveStream.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.put(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('delete', () => {\n it('returns 204 on success', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n const err = new Error('delete failed')\n filesManager.delete.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.delete(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('proppatch', () => {\n it('returns 404 when target does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, url: '/x', body: { propertyupdate: {} } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/x')\n })\n\n it('returns 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { unknown: {} } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { foo: 'bar' } } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 207 with errors when unsupported props are provided', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ randomProp: 'x' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('randomProp')\n expect(res.body).toContain('403')\n })\n\n it('applies modified props and still returns 207; failed dependency if one fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'keep' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('delegates lock conflict to handleError when checkConflicts throws', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { prop: [{ lastmodified: 'x' }] } } } } })\n const res = makeRes()\n const err = new Error('conflict')\n filesLockManager.checkConflicts.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.proppatch(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n\n it('normalizes array of propertyupdate items containing {prop: ...}', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-03-01' } }, { prop: { ['Win32CreationTime']: 'ignore' } }]\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('wraps single prop object into an array for processing', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: { lastmodified: '2024-03-02' }\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('handles REMOVE action on supported property and returns 207', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n remove: {\n prop: [{ ['Win32CreationTime']: '' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('returns 207 with 424 Failed Dependency when touching lastmodified fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValueOnce(new Error('touch failed'))\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'ok' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('424')\n expect(res.body).toContain('lastmodified')\n })\n\n it('returns 207 with 403 for unsupported prop and 424 for supported prop as failed dependency', async () => {\n // Préparation : la ressource existe et pas de conflit de lock\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n\n // On envoie à la fois une prop non supportée ('randomProp') et une prop supportée ('Win32CreationTime')\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: [{ randomProp: 'x' }, { Win32CreationTime: 'keep' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n // Exécution\n await service.proppatch(req, res)\n\n // Assertions : multistatus, xml, et contenu\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n const xml = res.body as string\n // On doit trouver le nom de la prop non supportée avec status 403\n expect(xml).toContain('randomProp')\n expect(xml).toContain('403')\n // On doit trouver le nom de la prop supportée avec status 424 (failed dependency)\n expect(xml).toContain('Win32CreationTime')\n expect(xml).toContain('424')\n })\n })\n\n describe('mkcol', () => {\n it('returns 201 when directory created', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n filesManager.mkDir.mockRejectedValue(new Error('mkdir failed'))\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.mkcol(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('copyMove', () => {\n it('returns 404 when destination space not found', async () => {\n const req = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/unknown', isMove: false, overwrite: false } } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/unknown')\n })\n\n it('aborts when evaluateIfHeaders fails', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', token: { value: 'bad', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBeUndefined()\n })\n\n it('aborts with 412 when destination If-Header haveLock mismatches', async () => {\n const handler = (service as any)['webDAVHandler']\n const dstSpace = { ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } }\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.getLocksByPath.mockResolvedValue([{}]) // there is a lock, but mustMatch=false -> mismatch\n\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', haveLock: { mustMatch: false } }]\n }\n })\n const res = makeRes()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns 204 when destination existed; 201 when not', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(true)\n const req1 = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: true, overwrite: true } } })\n const res1 = makeRes()\n await service.copyMove(req1, res1 as any)\n expect(res1.statusCode).toBe(HttpStatus.NO_CONTENT)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false)\n const req2 = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: false } } })\n const res2 = makeRes()\n await service.copyMove(req2, res2 as any)\n expect(res2.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n\n // Chain 1) LockConflict without lockroot (fallback to dbFilePath) then 2) unexpected error\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.copyMove.mockRejectedValueOnce(new LockConflict({ dbFilePath: 'dst' } as any)).mockRejectedValueOnce(new Error('copy failed'))\n\n const req = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: true } } })\n\n // 1) LockConflict => DAV_ERROR_RES(423) using e.lock.dbFilePath\n const res1 = makeRes()\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const result1 = await service.copyMove(req, res1)\n\n expect(result1).toBe(res1)\n expect(res1.statusCode).toBe(HttpStatus.LOCKED)\n\n // 2) Unexpected error => HttpException 500 and log contains \" -> /dst\"\n const res2 = makeRes()\n try {\n await service.copyMove(req, res2)\n expect(true).toBe(false) // should not reach\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n\n // Verify the log message includes an arrow to the destination (toUrl)\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /dst'))\n })\n\n it('returns early when evaluateIfHeaders returns false (explicit spy)', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n // Ensure destination space resolves so we reach the evaluateIfHeaders call\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n // Decorator is no-op (mocked), so copyMove calls evaluateIfHeaders once for destination: force it to return false\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res as any)\n\n expect(spy).toHaveBeenCalledTimes(1)\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n })\n\n describe('evaluateIfHeaders', () => {\n it('returns true when no headers', async () => {\n const req = baseReq({ dav: { ...baseReq().dav, ifHeaders: undefined } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n })\n\n const negativeIfHeaderCases = [\n {\n name: 'haveLock mismatch',\n dav: { ifHeaders: [{ haveLock: { mustMatch: true } }] },\n setup: async () => {\n // No lock present => match=false, mustMatch=true => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n }\n },\n {\n name: 'haveLock mismatch when locks exist but mustMatch=false',\n dav: { ifHeaders: [{ haveLock: { mustMatch: false } }] },\n setup: async () => {\n // Lock present => match=true, mustMatch=false => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'dst', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([{}])\n }\n },\n {\n name: 'token not found',\n dav: { ifHeaders: [{ token: { value: 'missing', mustMatch: true } }] },\n setup: async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n }\n },\n {\n name: 'etag mismatch',\n dav: { ifHeaders: [{ etag: { value: 'W/\"bad\"', mustMatch: true } }] },\n setup: async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n }\n }\n ] as const\n\n it.each(negativeIfHeaderCases)('fails with 412 on %s', async ({ dav, setup }) => {\n await setup()\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns true when one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [\n { etag: { value: 'W/\"bad\"', mustMatch: true } },\n { etag: { value: 'W/\"etag\"', mustMatch: true } } // this should pass\n ]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('fails with 412 on token url mismatch', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/other', token: { value: 'opaquetoken:xyz', mustMatch: true } }]\n }\n })\n const res = makeRes()\n // Space for the explicit path\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dav/other', realPath: '/real/other', dbFile: { path: 'other' } })\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } }) // not a parent of /dav/other\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('fails with 412 and logs error when haveLock lookup throws', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', haveLock: { mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('boom'))\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns true when token exists and path matches lockroot', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', token: { value: 'opaquetoken:good', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } })\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('returns false without setting status when If-Header path cannot be resolved', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/missing' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBeUndefined()\n expect(res.body).toBeUndefined()\n })\n\n it('fails with 412 on etag when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag\"', mustMatch: true } }]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('lockRefresh', () => {\n const refresh400Cases = [\n {\n name: 'more than one or zero tokens in If header',\n dav: { body: undefined, ifHeaders: [] },\n expectMsg: 'Expected a lock token'\n },\n {\n name: 'token extraction fails',\n dav: { body: undefined, ifHeaders: [{ notAToken: true }] },\n expectMsg: 'Unable to extract token'\n }\n ] as const\n\n it.each(refresh400Cases)('returns 400 when %s', async ({ dav, expectMsg }) => {\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain(expectMsg)\n })\n\n it('returns 412 when token not found or not matching URL', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:missing', mustMatch: true } }] }\n })\n const res = makeRes()\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:missing')\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns 403 when owner mismatch', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }] }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 } })\n\n await (service as any).lockRefresh(req, res, baseReq().space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n\n it('returns 200 and XML body on success', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n body: undefined,\n lock: { ...baseReq().dav.lock, timeout: 120 },\n ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }]\n }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, davLock: { lockroot: '/dav/url' } })\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('handleError integration', () => {\n it('maps LockConflict to 423 Locked via DAV_ERROR_RES', async () => {\n // simulate LockConflict during PUT\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.saveStream.mockRejectedValue(new LockConflict({ dbFilePath: 'file.txt', davLock: { lockroot: '/dav/url' } } as any))\n\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(typeof res.body).toBe('string')\n })\n\n it('maps FileError to its httpCode and message', async () => {\n const { FileError } = jest.requireActual('../../files/models/file-error')\n filesManager.delete.mockRejectedValue(new FileError(409, 'conflict happened'))\n\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('conflict happened')\n })\n\n it('throws 500 HttpException for unexpected errors', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n filesManager.saveStream.mockRejectedValue(new Error('unexpected'))\n\n try {\n await service.put(req, res)\n // If we reach this line, the test should fail\n expect(true).toBe(false)\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","dirName","genEtag","mockReturnValue","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","WebDAVMethods","name","service","filesManager","filesLockManager","webDAVSpaces","makeRes","res","statusCode","body","headers","contentType","status","code","send","payload","header","value","toLowerCase","type","ct","baseReq","overrides","method","user","id","login","dav","url","depth","httpVersion","lock","timeout","lockscope","owner","token","space","alias","realPath","inSharesList","dbFile","path","beforeAll","sendFileFromSpace","mkFile","mockResolvedValue","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","propfind","spaceEnv","module","Test","createTestingModule","providers","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","beforeEach","clearAllMocks","mockReset","afterEach","restoreAllMocks","it","expect","toBeDefined","req","streamable","stream","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","mockRejectedValue","Error","handleSpy","spyOn","toHaveBeenCalled","BAD_REQUEST","lockRefreshSpy","mockResolvedValueOnce","not","CONFLICT","mockImplementation","_user","_dbFile","_depth","davLock","_timeout","locktoken","dbFilePath","lockroot","OK","CREATED","LOCKED","unlock","NOT_FOUND","key","NO_CONTENT","propfindMode","handler","href","MULTI_STATUS","toContain","req0","prop","STANDARD_PROPS","reqInf","res0","resInf","getlastmodified","lockdiscovery","each","existed","expected","checkEtag","put","err","spy","propertyupdate","proppatch","unknown","set","foo","randomProp","lastmodified","remove","mockRejectedValueOnce","Win32CreationTime","xml","mkcol","destination","isMove","overwrite","ifHeaders","mustMatch","toBeUndefined","dstSpace","haveLock","PRECONDITION_FAILED","req1","res1","req2","res2","LockConflict","logSpy","result1","e","toBeInstanceOf","HttpException","getStatus","INTERNAL_SERVER_ERROR","stringContaining","ok","evaluateIfHeaders","negativeIfHeaderCases","setup","PathsUtils","spaceId","inTrash","etag","refresh400Cases","expectMsg","notAToken","lockRefresh","IfHeaderUtils","FileError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-methods.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { FileLock } from '../../files/interfaces/file-lock.interface'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, genEtag, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { DEPTH, LOCK_DISCOVERY_PROP, PROPSTAT, STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\n// Mock external dependencies\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn().mockReturnValue(false),\n isPathIsDir: jest.fn(),\n fileName: jest.fn().mockReturnValue('fileName'),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag-123\"')\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe('WebDAVMethods', () => {\n let service: WebDAVMethods\n let filesManager: jest.Mocked<FilesManager>\n let filesLockManager: jest.Mocked<FilesLockManager>\n let webDAVSpaces: jest.Mocked<WebDAVSpaces>\n\n // Helper to create a mocked response object\n const createMockResponse = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n // Helper to create a base request object\n const createBaseRequest = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'test-user', fullName: 'Test User', email: 'test-user@sync-in.com' },\n dav: {\n url: '/webdav/test/file.txt',\n depth: '0',\n httpVersion: 'HTTP/1.1',\n body: '<lockinfo/>',\n lock: {\n timeout: 60,\n lockscope: 'exclusive',\n owner: 'test-user',\n token: 'opaquelocktoken:abc123'\n },\n ifHeaders: []\n },\n space: {\n id: 1,\n alias: 'test-space',\n url: '/webdav/test/file.txt',\n realPath: '/real/path/to/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt', spaceId: 1, inTrash: false }\n },\n ...overrides\n }) as any\n\n beforeEach(async () => {\n // Initialize mocks\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n copyMove: jest.fn()\n } as any\n\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn(),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn(),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn(),\n genDAVToken: jest.fn().mockReturnValue('opaquelocktoken:new-token')\n } as any\n\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n } as any\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n { provide: FilesManager, useValue: filesManager },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n\n // Reset global mocks\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/to')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n describe('Service initialization', () => {\n it('should be defined', () => {\n expect(service).toBeDefined()\n expect(service).toBeInstanceOf(WebDAVMethods)\n })\n })\n\n describe('headOrGet', () => {\n describe('Success cases', () => {\n it('should stream file when repository is FILES and not in shares list', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const streamable = { stream: 'file-content' }\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(sendFile.checks).toHaveBeenCalledTimes(1)\n expect(sendFile.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n })\n\n describe('Error cases', () => {\n it('should return 403 when repository is not FILES', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.headOrGet(req, res, 'OTHER_REPO')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should return 403 when resource is in shares list', async () => {\n const req = createBaseRequest({ space: { ...createBaseRequest().space, inSharesList: true } })\n const res = createMockResponse()\n\n await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should handle errors from sendFile.checks', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('File check failed')\n const sendFile = {\n checks: jest.fn().mockRejectedValue(error),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n\n it('should handle errors from sendFile.stream', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('Stream failed')\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockRejectedValue(error)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n })\n })\n\n describe('lock', () => {\n describe('Lock refresh (without body)', () => {\n it('should return 400 if resource does not exist for lock refresh', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('should delegate to lockRefresh when resource exists and no body', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('refresh-ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('refresh-ok')\n })\n })\n\n describe('Lock creation on existing resource', () => {\n it('should create lock successfully and return 200', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options, _timeout) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n } as Partial<FileLock>\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n expect(res.body).toBeDefined()\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock creation on non-existent resource', () => {\n it('should return 403 when user lacks ADD permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should return 409 when parent directory does not exist', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(false) // parent\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/missing')\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should create empty file and lock, return 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(true) // parent exists\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, false, false, false)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n })\n })\n\n describe('Lock conflict', () => {\n it('should return 423 when lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockResolvedValue([\n false,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n }\n ] as any)\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n })\n })\n })\n\n describe('unlock', () => {\n describe('Success cases', () => {\n it('should unlock resource and return 204', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 1, login: 'test-user' },\n key: 'lock-key-123'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('lock-key-123')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('Error cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 409 when lock token does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' },\n key: 'lock-key-456'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('propfind', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist in FILES repository', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, propfindMode: 'prop' } })\n const res = createMockResponse()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return multistatus with property names in PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: 'propname' }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/webdav/test/file.txt')\n })\n\n it('should return multistatus with property values in PROP mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield {\n href: '/webdav/test/file.txt',\n name: 'file.txt',\n getlastmodified: 'Mon, 01 Jan 2024 00:00:00 GMT'\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock discovery', () => {\n it('should collect locks with depth 0', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: DEPTH.RESOURCE,\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should collect parent and child locks with depth infinity', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: 'infinity',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should not collect locks for PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: PROPSTAT.PROPNAME }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test', name: 'test' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n expect(filesLockManager.browseParentChildLocks).not.toHaveBeenCalled()\n })\n\n it('should not collect locks for shares list', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n space: { ...createBaseRequest().space, inSharesList: true },\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/shares', name: 'shares' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('put', () => {\n describe('Success cases', () => {\n it('should return 204 when updating existing file', async () => {\n filesManager.saveStream.mockResolvedValue(true) // file existed\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, expect.objectContaining({ dav: expect.any(Object) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should return 201 when creating new file', async () => {\n filesManager.saveStream.mockResolvedValue(false) // file didn't exist\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should extract and pass lock tokens from if-headers', async () => {\n filesManager.saveStream.mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PUT',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:xyz', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:xyz'])\n\n await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(\n req.user,\n req.space,\n req,\n expect.objectContaining({\n dav: expect.objectContaining({\n lockTokens: ['opaquelocktoken:xyz']\n })\n })\n )\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.saveStream.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file error', async () => {\n const fileError = new FileError(409, 'File conflict')\n filesManager.saveStream.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Unexpected error')\n filesManager.saveStream.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await expect(service.put(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('delete', () => {\n describe('Success cases', () => {\n it('should delete resource and return 204', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: expect.any(Array) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(result).toBe(res)\n })\n\n it('should extract lock tokens from if-headers', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'DELETE',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:abc'])\n\n await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: ['opaquelocktoken:abc'] }))\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.delete.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(404, 'File not found')\n filesManager.delete.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Database error')\n filesManager.delete.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await expect(service.delete(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('proppatch', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { invalidaction: {} } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('should return 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { notprop: {} } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n })\n\n describe('SET action', () => {\n it('should successfully modify lastmodified property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('should return 207 with 403 for unsupported properties', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ unsupportedProp: 'value' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n })\n\n it('should handle Win32 properties correctly', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('should return 424 failed dependency when touch fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValue(new Error('Touch failed'))\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('424')\n })\n\n it('should mark supported props as 424 when unsupported prop fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: { prop: [{ unsupportedProp: 'fail' }, { Win32CreationTime: 'ok' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('424')\n })\n })\n\n describe('REMOVE action', () => {\n it('should handle REMOVE action on supported property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n remove: { prop: [{ Win32CreationTime: '' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n })\n\n describe('Data normalization', () => {\n it('should normalize array of propertyupdate items', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-01-01' } }, { prop: { Win32CreationTime: 'ok' } }]\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('lastmodified')\n })\n\n it('should wrap single prop object into array', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: { prop: { lastmodified: '2024-01-01' } }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n })\n\n describe('Lock handling', () => {\n it('should check lock conflicts before applying changes', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: 'ok' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesLockManager.checkConflicts).toHaveBeenCalledWith(\n req.space.dbFile,\n req.dav.depth,\n expect.objectContaining({\n userId: req.user.id,\n lockTokens: expect.any(Array)\n })\n )\n })\n\n it('should handle lock conflict error', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesLockManager.checkConflicts.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n })\n\n describe('mkcol', () => {\n describe('Success cases', () => {\n it('should create directory and return 201', async () => {\n filesManager.mkDir.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalledWith(\n req.user,\n req.space,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'dir',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.mkDir.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(409, 'Directory already exists')\n filesManager.mkDir.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Directory already exists')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Filesystem error')\n filesManager.mkDir.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await expect(service.mkcol(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('copyMove', () => {\n describe('Base cases', () => {\n it('should return 404 when destination space not found', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/unknown', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/webdav/unknown')\n })\n })\n\n describe('COPY operation', () => {\n it('should copy file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/copy.txt',\n realPath: '/real/path/to/copy.txt',\n dbFile: { path: 'copy.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/copy.txt', isMove: false, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(\n req.user,\n req.space,\n dstSpace,\n false,\n false,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should copy file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('MOVE operation', () => {\n it('should move file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/moved.txt',\n realPath: '/real/path/to/moved.txt',\n dbFile: { path: 'moved.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/moved.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, false, false, expect.any(Object))\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should move file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: true, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('If-Headers on destination', () => {\n it('should return early when evaluateIfHeaders fails for destination', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', etag: { value: 'W/\"wrong\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n\n it('should return 412 when destination If-Header haveLock mismatches', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue(dstSpace.dbFile)\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'dest.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle lock conflict without lockRoot (fallback to dbFilePath)', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict({ dbFilePath: 'dest.txt' } as any, 'Lock conflict')\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const fileError = new FileError(409, 'File conflict')\n filesManager.copyMove.mockRejectedValue(fileError)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const unexpectedError = new Error('Unexpected filesystem error')\n filesManager.copyMove.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await expect(service.copyMove(req, res)).rejects.toThrow(HttpException)\n })\n\n it('should include destination URL in error log', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n filesManager.copyMove.mockRejectedValue(new Error('Copy failed'))\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n try {\n await service.copyMove(req, res)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /webdav/test/dest.txt'))\n })\n })\n })\n\n describe('evaluateIfHeaders', () => {\n describe('Base cases', () => {\n it('should return true when no if-headers present', async () => {\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, ifHeaders: undefined } })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return true when at least one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return false when path cannot be resolved', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ path: '/webdav/unknown/file.txt' }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBeUndefined()\n })\n })\n\n describe('haveLock condition', () => {\n it('should return true when haveLock matches (lock exists, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when haveLock matches (no lock, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when haveLock mismatches (lock exists, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock mismatches (no lock, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock lookup throws error', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('Database error'))\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n\n describe('token condition', () => {\n it('should return true when token exists and path matches lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when token exists and path is child of lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/subfolder/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when token not found', async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when token exists but path does not match lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/other/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should evaluate token condition with explicit path in if-header', async () => {\n const explicitSpace = {\n ...createBaseRequest().space,\n url: '/webdav/explicit/path.txt',\n realPath: '/real/path/to/explicit.txt',\n dbFile: { path: 'explicit/path.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(explicitSpace)\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/explicit' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n {\n path: '/webdav/explicit/path.txt',\n token: { value: 'opaquelocktoken:xyz', mustMatch: true }\n }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(webDAVSpaces.spaceEnv).toHaveBeenCalledWith(req.user, '/webdav/explicit/path.txt')\n expect(result).toBe(true)\n })\n })\n\n describe('etag condition', () => {\n it('should return true when etag matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when etag does not match and mustMatch=false', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"different\"', mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when etag mismatches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should cache etag for multiple conditions on same path', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong1\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(genEtag).toHaveBeenCalledTimes(1) // Cached\n })\n })\n\n describe('Multiple conditions', () => {\n it('should evaluate multiple conditions and return true if any matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { haveLock: { mustMatch: true } }, // Will fail (no lock)\n { haveLock: { mustMatch: false } } // Will succeed (no lock)\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when all conditions fail', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { etag: { value: 'W/\"wrong1\"', mustMatch: true } },\n { etag: { value: 'W/\"wrong2\"', mustMatch: true } },\n { token: { value: 'opaquelocktoken:missing', mustMatch: true } }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n })\n\n describe('lockRefresh (private method)', () => {\n describe('Parameter validation', () => {\n it('should return 400 when no if-headers present', async () => {\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, body: undefined, ifHeaders: [] }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when more than one if-header present', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'token1', mustMatch: true } }, { token: { value: 'token2', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when token extraction fails', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ notAToken: true }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockImplementation(() => {\n throw new Error('No token found')\n })\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unable to extract token')\n })\n })\n\n describe('Token validation', () => {\n it('should return 412 when token not found or does not match path', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:missing')\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith('opaquelocktoken:missing', 'file.txt')\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n const req = createBaseRequest({\n user: { id: 1, login: 'user1' },\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' }\n } as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n })\n\n describe('Successful refresh', () => {\n it('should refresh lock and return 200 with XML body', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: 180 },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt', lockToken: 'opaquelocktoken:abc' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, 180)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n\n it('should use default timeout when not specified', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: undefined },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, undefined)\n })\n })\n })\n\n describe('handleError (private method)', () => {\n describe('LockConflict errors', () => {\n it('should handle LockConflict with lockRoot', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n } as any,\n 'Lock conflict'\n )\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toContain('application/xml')\n })\n\n it('should handle LockConflict without lockRoot (fallback to dbFilePath)', async () => {\n const lockError = new LockConflict({ dbFilePath: 'file.txt' } as any, 'Lock conflict')\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('FileError errors', () => {\n it('should handle FileError and return correct status code', async () => {\n const fileError = new FileError(409, 'Conflict: file already exists')\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Conflict: file already exists')\n })\n\n it('should strip additional error information after comma', async () => {\n const fileError = new FileError(404, 'File not found, /real/path/details')\n const req = createBaseRequest({ method: 'GET' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n })\n\n describe('Unexpected errors', () => {\n it('should throw HttpException for unexpected errors', () => {\n const unexpectedError = new Error('Database connection failed')\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n expect(() => {\n ;(service as any).handleError(req, res, unexpectedError)\n }).toThrow(HttpException)\n })\n\n it('should log error with method and URL', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'PUT', dav: { ...createBaseRequest().dav, url: '/webdav/test.txt' } })\n const res = createMockResponse()\n const error = new Error('Test error')\n\n try {\n ;(service as any).handleError(req, res, error)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('PUT'))\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('/webdav/test.txt'))\n })\n\n it('should include destination URL in log when provided', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'COPY' })\n const res = createMockResponse()\n const error = new Error('Copy error')\n\n try {\n ;(service as any).handleError(req, res, error, '/webdav/destination.txt')\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /webdav/destination.txt'))\n })\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","mockReturnValue","isPathIsDir","fileName","dirName","genEtag","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","service","filesManager","filesLockManager","webDAVSpaces","createMockResponse","res","statusCode","body","headers","contentType","status","code","send","payload","header","name","value","toLowerCase","type","ct","createBaseRequest","overrides","method","user","id","login","fullName","email","dav","url","depth","httpVersion","lock","timeout","lockscope","owner","token","ifHeaders","space","alias","realPath","inSharesList","dbFile","path","spaceId","inTrash","beforeEach","sendFileFromSpace","mkFile","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","genDAVToken","propfind","spaceEnv","module","Test","createTestingModule","providers","WebDAVMethods","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","clearAllMocks","mockResolvedValue","afterEach","restoreAllMocks","it","expect","toBeDefined","toBeInstanceOf","req","streamable","stream","sendFile","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","error","Error","mockRejectedValue","spyOn","BAD_REQUEST","lockRefreshSpy","mockImplementation","_user","_dbFile","_app","_depth","options","_timeout","dbFilePath","lockRoot","lockToken","lockScope","lockInfo","OK","toContain","not","toHaveBeenCalled","mockResolvedValueOnce","CONFLICT","CREATED","LOCKED","key","unlock","NO_CONTENT","NOT_FOUND","propfindMode","href","MULTI_STATUS","prop","STANDARD_PROPS","getlastmodified","DEPTH","RESOURCE","LOCK_DISCOVERY_PROP","PROPSTAT","PROPNAME","put","objectContaining","any","Object","mustMatch","IfHeaderUtils","lockTokens","lockError","LockConflict","fileError","FileError","unexpectedError","rejects","toThrow","HttpException","Array","propertyupdate","set","lastmodified","proppatch","invalidaction","notprop","unsupportedProp","Win32CreationTime","remove","userId","mkcol","destination","isMove","overwrite","dstSpace","etag","toBeUndefined","PathsUtils","haveLock","PRECONDITION_FAILED","logSpy","stringContaining","evaluateIfHeaders","explicitSpace","lockRefresh","notAToken","mockLock","handleError"],"mappings":"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"}
|
|
@@ -123,15 +123,15 @@ function LOCK_DISCOVERY(locks) {
|
|
|
123
123
|
[`${_webdav.NS_PREFIX}:write`]: null
|
|
124
124
|
},
|
|
125
125
|
[`${_webdav.NS_PREFIX}:lockscope`]: {
|
|
126
|
-
[`${_webdav.NS_PREFIX}:${lock.
|
|
126
|
+
[`${_webdav.NS_PREFIX}:${lock.options?.lockScope || _webdav.LOCK_SCOPE.EXCLUSIVE}`]: null
|
|
127
127
|
},
|
|
128
128
|
[`${_webdav.NS_PREFIX}:locktoken`]: {
|
|
129
|
-
[`${_webdav.NS_PREFIX}:href`]: lock.
|
|
129
|
+
[`${_webdav.NS_PREFIX}:href`]: lock.options?.lockToken || _shared.SERVER_NAME
|
|
130
130
|
},
|
|
131
131
|
[`${_webdav.NS_PREFIX}:lockroot`]: {
|
|
132
|
-
[`${_webdav.NS_PREFIX}:href`]: (0, _shared.encodeUrl)(lock.
|
|
132
|
+
[`${_webdav.NS_PREFIX}:href`]: (0, _shared.encodeUrl)(lock.options?.lockRoot || lock.dbFilePath)
|
|
133
133
|
},
|
|
134
|
-
[`${_webdav.NS_PREFIX}:owner`]: lock
|
|
134
|
+
[`${_webdav.NS_PREFIX}:owner`]: formatLockOwner(lock),
|
|
135
135
|
[`${_webdav.NS_PREFIX}:timeout`]: `Second-${Math.floor(lock.expiration - (0, _shared.currentTimeStamp)())}`,
|
|
136
136
|
[`${_webdav.NS_PREFIX}:depth`]: lock.depth
|
|
137
137
|
}
|
|
@@ -162,5 +162,9 @@ function DAV_ERROR(error, href) {
|
|
|
162
162
|
function DAV_ERROR_RES(code, error, res, href) {
|
|
163
163
|
return res.status(code).type(_webdav.XML_CONTENT_TYPE).send(DAV_ERROR(error, href));
|
|
164
164
|
}
|
|
165
|
+
function formatLockOwner(lock) {
|
|
166
|
+
const lockInfo = `${lock.options.lockInfo ? `${lock.options.lockInfo}` : ''}${lock.app ? ` ${lock.app}` : ''}`;
|
|
167
|
+
return `${lock.owner.fullName} (${lock.owner.email})${lockInfo ? ` - ${lockInfo}` : ''}`;
|
|
168
|
+
}
|
|
165
169
|
|
|
166
170
|
//# sourceMappingURL=webdav.js.map
|