@saluzi/saluzi-edu 0.2.12 → 0.2.13
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/dist/cli.js +212 -140
- package/dist/rcs-web/assets/Dashboard-YYwDrKTN.js +1 -0
- package/dist/rcs-web/assets/Join-DKCP5X6X.js +1 -0
- package/dist/rcs-web/assets/Login-0VGZs85I.js +1 -0
- package/{packages/remote-control-server/web/dist/assets/SessionDetail-DSoMXZJb.js → dist/rcs-web/assets/SessionDetail-DmK-DfBQ.js} +11 -11
- package/dist/rcs-web/assets/Setup-C0cjxXMt.js +1 -0
- package/dist/rcs-web/assets/{ShareLanding-C06U9Nrr.js → ShareLanding-DUZrreJ7.js} +1 -1
- package/dist/rcs-web/assets/TeamCreate-B8ZV6EdY.js +1 -0
- package/dist/rcs-web/assets/{TeamDetail-d_GwIRHd.js → TeamDetail-DBAsJ__i.js} +2 -2
- package/dist/rcs-web/assets/{TeamList-BlNGdKci.js → TeamList-C-Hte4nV.js} +1 -1
- package/dist/rcs-web/assets/{TeamSettings-CPraC9uS.js → TeamSettings-CNVwYwcp.js} +1 -1
- package/dist/rcs-web/assets/UserSettings-DRdz9kYE.js +1 -0
- package/dist/rcs-web/assets/{arc-BmYza-0n.js → arc-CJxirXEQ.js} +1 -1
- package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-CYBtlgdO.js → architectureDiagram-3BPJPVTR-BZvIHrLA.js} +1 -1
- package/dist/rcs-web/assets/{blockDiagram-GPEHLZMM-RJAfHk_a.js → blockDiagram-GPEHLZMM-3p0y3Ija.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-CJ-qJA6w.js → dist/rcs-web/assets/c4Diagram-AAUBKEIU-Bmz9A1wn.js} +1 -1
- package/dist/rcs-web/assets/channel-DaI_n8dp.js +1 -0
- package/dist/rcs-web/assets/{chunk-2J33WTMH-n5I6Q1zJ.js → chunk-2J33WTMH-B8gQz22j.js} +1 -1
- package/dist/rcs-web/assets/{chunk-4BX2VUAB-CSOBh7qY.js → chunk-4BX2VUAB-CgLEZsTU.js} +1 -1
- package/dist/rcs-web/assets/{chunk-55IACEB6-C0euQVm_.js → chunk-55IACEB6-0mdE_-IS.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-Ch7yD8cR.js → dist/rcs-web/assets/chunk-727SXJPM-DdtjnIHR.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-Ms2Q7r6u.js → dist/rcs-web/assets/chunk-AQP2D5EJ-BtwFPk50.js} +1 -1
- package/dist/rcs-web/assets/{chunk-FMBD7UC4-bszHUkpx.js → chunk-FMBD7UC4-BcO9mQ0P.js} +1 -1
- package/dist/rcs-web/assets/{chunk-ND2GUHAM-BVQIhq6J.js → chunk-ND2GUHAM-BvRq13S_.js} +1 -1
- package/dist/rcs-web/assets/{chunk-QZHKN3VN-BVEDe5qc.js → chunk-QZHKN3VN-D7GHkPpq.js} +1 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +1 -0
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +1 -0
- package/dist/rcs-web/assets/{code-block-IT6T5CEO-B26n-rFC.js → code-block-IT6T5CEO-B1p-vO-3.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-DXc7GE8W.js → dist/rcs-web/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js} +1 -1
- package/dist/rcs-web/assets/{dagre-BM42HDAG-DAXofHt_.js → dagre-BM42HDAG-CHGuio22.js} +1 -1
- package/dist/rcs-web/assets/{diagram-2AECGRRQ-DK0TBUQA.js → diagram-2AECGRRQ-DIDRyQk8.js} +1 -1
- package/dist/rcs-web/assets/{diagram-5GNKFQAL-DMsq-Grp.js → diagram-5GNKFQAL-CNubKb6P.js} +1 -1
- package/dist/rcs-web/assets/{diagram-KO2AKTUF-B3FMhmUc.js → diagram-KO2AKTUF-CzQh664-.js} +1 -1
- package/dist/rcs-web/assets/{diagram-LMA3HP47-BjO3BHFl.js → diagram-LMA3HP47-CWBR7-VG.js} +1 -1
- package/dist/rcs-web/assets/{diagram-OG6HWLK6-CNg4B2L3.js → diagram-OG6HWLK6-BMHdlbcZ.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-BDxz8NRK.js → dist/rcs-web/assets/erDiagram-TEJ5UH35-OgT8dC-K.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-VIgM13sK.js → dist/rcs-web/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js} +1 -1
- package/dist/rcs-web/assets/{ganttDiagram-6RSMTGT7-Ba2QuJU0.js → ganttDiagram-6RSMTGT7-DctpzEKN.js} +1 -1
- package/dist/rcs-web/assets/{gitGraphDiagram-PVQCEYII-B-gV-lAg.js → gitGraphDiagram-PVQCEYII-5KpLszm9.js} +1 -1
- package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-DothwgD4.js → infoDiagram-5YYISTIA-BAKD_Tt7.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-DhpjM1Vc.js → dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js} +1 -1
- package/dist/rcs-web/assets/{journeyDiagram-JHISSGLW-PbQTouMJ.js → journeyDiagram-JHISSGLW-BtGih-ik.js} +1 -1
- package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-63WdwG-X.js → kanban-definition-UN3LZRKU-BsEGZsD1.js} +1 -1
- package/dist/rcs-web/assets/{linear-CeRljV9s.js → linear-Dj636PNG.js} +1 -1
- package/dist/rcs-web/assets/main-CkqtCllF.js +238 -0
- package/dist/rcs-web/assets/{mermaid-VLURNSYL-CG6yNR7g.js → mermaid-VLURNSYL-DutpHHm9.js} +4 -4
- package/dist/rcs-web/assets/{mermaid.core-CAuNNATY.js → mermaid.core-XHHf0pen.js} +5 -5
- package/dist/rcs-web/assets/{mindmap-definition-RKZ34NQL-9hDL1CUV.js → mindmap-definition-RKZ34NQL-BBa8V_3g.js} +1 -1
- package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-BS_P2t04.js → pieDiagram-4H26LBE5-BuNEdo9H.js} +1 -1
- package/dist/rcs-web/assets/{quadrantDiagram-W4KKPZXB-Cp9QQkHV.js → quadrantDiagram-W4KKPZXB-CsJgyQIN.js} +1 -1
- package/dist/rcs-web/assets/{requirementDiagram-4Y6WPE33-C_XSzOKE.js → requirementDiagram-4Y6WPE33-DqMJZ914.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-BhuVqzZd.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-C3IPZrcW.js → dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js} +1 -1
- package/dist/rcs-web/assets/{stateDiagram-AJRCARHV-CN4iNPRl.js → stateDiagram-AJRCARHV-S-QqQr-D.js} +1 -1
- package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-CICBlDSJ.js → stateDiagram-v2-BHNVJYJU-D77KfDr-.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-Be7t_3rC.js → dist/rcs-web/assets/timeline-definition-PNZ67QCA-De8bFWnE.js} +1 -1
- package/dist/rcs-web/assets/{useTeams-DPHGnBHL.js → useTeams-CqJOqEy1.js} +1 -1
- package/dist/rcs-web/assets/{vennDiagram-CIIHVFJN-CSaUc2Xv.js → vennDiagram-CIIHVFJN-Dikwrn1L.js} +1 -1
- package/dist/rcs-web/assets/{wardleyDiagram-YWT4CUSO-DTuJrl9P.js → wardleyDiagram-YWT4CUSO-DUzpiV6H.js} +1 -1
- package/dist/rcs-web/assets/{workerType-CSqeySYe.js → workerType-DOQ0AHrq.js} +1 -1
- package/dist/rcs-web/assets/{xychartDiagram-2RQKCTM6-BQ0oU3Qi.js → xychartDiagram-2RQKCTM6-OZNbB32D.js} +1 -1
- package/dist/rcs-web/index.html +1 -1
- package/package.json +2 -2
- package/packages/remote-control-server/src/__tests__/cookie.test.ts +0 -71
- package/packages/remote-control-server/src/__tests__/data-layer-round2.test.ts +556 -0
- package/packages/remote-control-server/src/__tests__/route-mounting.test.ts +212 -0
- package/packages/remote-control-server/src/__tests__/routes.test.ts +5 -44
- package/packages/remote-control-server/src/__tests__/security-fixes.test.ts +526 -0
- package/packages/remote-control-server/src/__tests__/security-round3.test.ts +780 -0
- package/packages/remote-control-server/src/__tests__/shares.test.ts +5 -2
- package/packages/remote-control-server/src/auth/constants.ts +0 -6
- package/packages/remote-control-server/src/auth/cookie.ts +0 -43
- package/packages/remote-control-server/src/auth/csrf.ts +58 -0
- package/packages/remote-control-server/src/auth/middleware.ts +7 -4
- package/packages/remote-control-server/src/index.ts +26 -0
- package/packages/remote-control-server/src/registerRoutes.ts +17 -1
- package/packages/remote-control-server/src/routes/web/auth-routes.ts +93 -54
- package/packages/remote-control-server/src/routes/web/auth.ts +16 -23
- package/packages/remote-control-server/src/routes/web/sessions.ts +30 -5
- package/packages/remote-control-server/src/routes/web/shares.ts +38 -1
- package/packages/remote-control-server/src/routes/web/teams.ts +22 -4
- package/packages/remote-control-server/src/services/session.ts +143 -9
- package/packages/remote-control-server/src/store.ts +34 -1
- package/packages/remote-control-server/src/types/api.ts +0 -1
- package/packages/remote-control-server/web/dist/assets/Dashboard-YYwDrKTN.js +1 -0
- package/packages/remote-control-server/web/dist/assets/Join-DKCP5X6X.js +1 -0
- package/packages/remote-control-server/web/dist/assets/Login-0VGZs85I.js +1 -0
- package/{dist/rcs-web/assets/SessionDetail-DSoMXZJb.js → packages/remote-control-server/web/dist/assets/SessionDetail-DmK-DfBQ.js} +11 -11
- package/packages/remote-control-server/web/dist/assets/Setup-C0cjxXMt.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{ShareLanding-C06U9Nrr.js → ShareLanding-DUZrreJ7.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/TeamCreate-B8ZV6EdY.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{TeamDetail-d_GwIRHd.js → TeamDetail-DBAsJ__i.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{TeamList-BlNGdKci.js → TeamList-C-Hte4nV.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{TeamSettings-CPraC9uS.js → TeamSettings-CNVwYwcp.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/UserSettings-DRdz9kYE.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{arc-BmYza-0n.js → arc-CJxirXEQ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-CYBtlgdO.js → architectureDiagram-3BPJPVTR-BZvIHrLA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{blockDiagram-GPEHLZMM-RJAfHk_a.js → blockDiagram-GPEHLZMM-3p0y3Ija.js} +1 -1
- package/{dist/rcs-web/assets/c4Diagram-AAUBKEIU-CJ-qJA6w.js → packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-Bmz9A1wn.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/channel-DaI_n8dp.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-n5I6Q1zJ.js → chunk-2J33WTMH-B8gQz22j.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-CSOBh7qY.js → chunk-4BX2VUAB-CgLEZsTU.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-C0euQVm_.js → chunk-55IACEB6-0mdE_-IS.js} +1 -1
- package/{dist/rcs-web/assets/chunk-727SXJPM-Ch7yD8cR.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-DdtjnIHR.js} +1 -1
- package/{dist/rcs-web/assets/chunk-AQP2D5EJ-Ms2Q7r6u.js → packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-BtwFPk50.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-bszHUkpx.js → chunk-FMBD7UC4-BcO9mQ0P.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-BVQIhq6J.js → chunk-ND2GUHAM-BvRq13S_.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-BVEDe5qc.js → chunk-QZHKN3VN-D7GHkPpq.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +1 -0
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-B26n-rFC.js → code-block-IT6T5CEO-B1p-vO-3.js} +1 -1
- package/{dist/rcs-web/assets/cose-bilkent-S5V4N54A-DXc7GE8W.js → packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-DAXofHt_.js → dagre-BM42HDAG-CHGuio22.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-DK0TBUQA.js → diagram-2AECGRRQ-DIDRyQk8.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-DMsq-Grp.js → diagram-5GNKFQAL-CNubKb6P.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-B3FMhmUc.js → diagram-KO2AKTUF-CzQh664-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-BjO3BHFl.js → diagram-LMA3HP47-CWBR7-VG.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-OG6HWLK6-CNg4B2L3.js → diagram-OG6HWLK6-BMHdlbcZ.js} +1 -1
- package/{dist/rcs-web/assets/erDiagram-TEJ5UH35-BDxz8NRK.js → packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-OgT8dC-K.js} +1 -1
- package/{dist/rcs-web/assets/flowDiagram-I6XJVG4X-VIgM13sK.js → packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ganttDiagram-6RSMTGT7-Ba2QuJU0.js → ganttDiagram-6RSMTGT7-DctpzEKN.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{gitGraphDiagram-PVQCEYII-B-gV-lAg.js → gitGraphDiagram-PVQCEYII-5KpLszm9.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-DothwgD4.js → infoDiagram-5YYISTIA-BAKD_Tt7.js} +1 -1
- package/{dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-DhpjM1Vc.js → packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{journeyDiagram-JHISSGLW-PbQTouMJ.js → journeyDiagram-JHISSGLW-BtGih-ik.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-63WdwG-X.js → kanban-definition-UN3LZRKU-BsEGZsD1.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{linear-CeRljV9s.js → linear-Dj636PNG.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/main-CkqtCllF.js +238 -0
- package/packages/remote-control-server/web/dist/assets/{mermaid-VLURNSYL-CG6yNR7g.js → mermaid-VLURNSYL-DutpHHm9.js} +4 -4
- package/packages/remote-control-server/web/dist/assets/{mermaid.core-CAuNNATY.js → mermaid.core-XHHf0pen.js} +5 -5
- package/packages/remote-control-server/web/dist/assets/{mindmap-definition-RKZ34NQL-9hDL1CUV.js → mindmap-definition-RKZ34NQL-BBa8V_3g.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-BS_P2t04.js → pieDiagram-4H26LBE5-BuNEdo9H.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{quadrantDiagram-W4KKPZXB-Cp9QQkHV.js → quadrantDiagram-W4KKPZXB-CsJgyQIN.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{requirementDiagram-4Y6WPE33-C_XSzOKE.js → requirementDiagram-4Y6WPE33-DqMJZ914.js} +1 -1
- package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-BhuVqzZd.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js} +1 -1
- package/{dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-C3IPZrcW.js → packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-AJRCARHV-CN4iNPRl.js → stateDiagram-AJRCARHV-S-QqQr-D.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-CICBlDSJ.js → stateDiagram-v2-BHNVJYJU-D77KfDr-.js} +1 -1
- package/{dist/rcs-web/assets/timeline-definition-PNZ67QCA-Be7t_3rC.js → packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-De8bFWnE.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{useTeams-DPHGnBHL.js → useTeams-CqJOqEy1.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{vennDiagram-CIIHVFJN-CSaUc2Xv.js → vennDiagram-CIIHVFJN-Dikwrn1L.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{wardleyDiagram-YWT4CUSO-DTuJrl9P.js → wardleyDiagram-YWT4CUSO-DUzpiV6H.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{workerType-CSqeySYe.js → workerType-DOQ0AHrq.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{xychartDiagram-2RQKCTM6-BQ0oU3Qi.js → xychartDiagram-2RQKCTM6-OZNbB32D.js} +1 -1
- package/packages/remote-control-server/web/dist/index.html +1 -1
- package/dist/rcs-web/assets/Dashboard-D_Im4UId.js +0 -1
- package/dist/rcs-web/assets/Join-BTnvMsB9.js +0 -1
- package/dist/rcs-web/assets/Login-ClT7RckC.js +0 -1
- package/dist/rcs-web/assets/Setup-PaDA6Et-.js +0 -1
- package/dist/rcs-web/assets/TeamCreate-249rK3U3.js +0 -1
- package/dist/rcs-web/assets/UserSettings-X627Fdni.js +0 -1
- package/dist/rcs-web/assets/channel-BUwWbT6U.js +0 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-DYtx22zv.js +0 -1
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-DYtx22zv.js +0 -1
- package/dist/rcs-web/assets/i18n-Dbt-vEQ3.js +0 -1
- package/dist/rcs-web/assets/main-DvfxciBy.js +0 -238
- package/packages/remote-control-server/web/dist/assets/Dashboard-D_Im4UId.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Join-BTnvMsB9.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Login-ClT7RckC.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Setup-PaDA6Et-.js +0 -1
- package/packages/remote-control-server/web/dist/assets/TeamCreate-249rK3U3.js +0 -1
- package/packages/remote-control-server/web/dist/assets/UserSettings-X627Fdni.js +0 -1
- package/packages/remote-control-server/web/dist/assets/channel-BUwWbT6U.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-DYtx22zv.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-DYtx22zv.js +0 -1
- package/packages/remote-control-server/web/dist/assets/i18n-Dbt-vEQ3.js +0 -1
- package/packages/remote-control-server/web/dist/assets/main-DvfxciBy.js +0 -238
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, mock } from 'bun:test'
|
|
2
|
+
import { mockConfigModule } from './helpers/mock-config'
|
|
3
|
+
|
|
4
|
+
// Mock config before any imports
|
|
5
|
+
mock.module('../config', () => mockConfigModule())
|
|
6
|
+
|
|
7
|
+
import { Hono } from 'hono'
|
|
8
|
+
import type { MiddlewareHandler } from 'hono/types'
|
|
9
|
+
import { resetDbSingleton, getDb } from '../db/sqlite'
|
|
10
|
+
|
|
11
|
+
// Dummy serveStatic — returns a middleware.
|
|
12
|
+
// When `path: 'index.html'` is set, serves SPA fallback HTML.
|
|
13
|
+
// Otherwise, passes through (simulates "file not found" so downstream routes handle it).
|
|
14
|
+
const serveStatic: (opts: Record<string, unknown>) => MiddlewareHandler = (
|
|
15
|
+
opts: Record<string, unknown>,
|
|
16
|
+
) => {
|
|
17
|
+
const path = opts.path as string | undefined
|
|
18
|
+
if (path === 'index.html') {
|
|
19
|
+
return c => c.html('<!DOCTYPE html><html><body>SPA</body></html>')
|
|
20
|
+
}
|
|
21
|
+
return async (_c, next) => {
|
|
22
|
+
await next()
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Dummy upgradeWebSocket
|
|
27
|
+
const upgradeWebSocket = (() => {
|
|
28
|
+
return () => (c: import('hono').Context, next: import('hono').Next) =>
|
|
29
|
+
next()
|
|
30
|
+
}) as import('hono/ws').UpgradeWebSocket<unknown>
|
|
31
|
+
|
|
32
|
+
import { registerRoutes } from '../registerRoutes'
|
|
33
|
+
|
|
34
|
+
function createApp(): Hono {
|
|
35
|
+
const app = new Hono()
|
|
36
|
+
registerRoutes(app, serveStatic, upgradeWebSocket)
|
|
37
|
+
return app
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function setupTestDb(): void {
|
|
41
|
+
resetDbSingleton()
|
|
42
|
+
// Force init with an in-memory-like temp path
|
|
43
|
+
getDb()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
describe('Route mounting integration', () => {
|
|
47
|
+
let app: Hono
|
|
48
|
+
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
setupTestDb()
|
|
51
|
+
app = createApp()
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// -------------------------------------------------------------------------
|
|
55
|
+
// Task 1: auth-routes mounted at /web/auth
|
|
56
|
+
// -------------------------------------------------------------------------
|
|
57
|
+
describe('auth-routes mounted at /web/auth', () => {
|
|
58
|
+
test('GET /web/auth/me returns 401 (not 404) when unauthenticated', async () => {
|
|
59
|
+
const res = await app.request('/web/auth/me', { method: 'GET' })
|
|
60
|
+
// Should NOT be 404 — route is mounted. 401 because no auth token.
|
|
61
|
+
expect(res.status).not.toBe(404)
|
|
62
|
+
expect(res.status).toBe(401)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('POST /web/auth/login returns 400 (not 404) for empty body', async () => {
|
|
66
|
+
const res = await app.request('/web/auth/login', {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers: { 'Content-Type': 'application/json' },
|
|
69
|
+
body: JSON.stringify({}),
|
|
70
|
+
})
|
|
71
|
+
// Route exists → should not 404. Missing fields → 400.
|
|
72
|
+
expect(res.status).not.toBe(404)
|
|
73
|
+
expect(res.status).toBe(400)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
test('GET /web/auth/setup-status returns 200 (not 404)', async () => {
|
|
77
|
+
const res = await app.request('/web/auth/setup-status', {
|
|
78
|
+
method: 'GET',
|
|
79
|
+
})
|
|
80
|
+
expect(res.status).not.toBe(404)
|
|
81
|
+
expect(res.status).toBe(200)
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// -------------------------------------------------------------------------
|
|
86
|
+
// Task 1: shares mounted at /web
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
describe('shares routes mounted at /web', () => {
|
|
89
|
+
test('POST /web/sessions/test/share returns 401 (not 404)', async () => {
|
|
90
|
+
const res = await app.request('/web/sessions/test/share', {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: { 'Content-Type': 'application/json' },
|
|
93
|
+
body: JSON.stringify({}),
|
|
94
|
+
})
|
|
95
|
+
// Route mounted → not 404. No auth → 401.
|
|
96
|
+
expect(res.status).not.toBe(404)
|
|
97
|
+
expect(res.status).toBe(401)
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
test('GET /web/sessions/s/test-token returns 401 (not 404)', async () => {
|
|
101
|
+
const res = await app.request('/web/sessions/s/test-token', {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
})
|
|
104
|
+
// Route mounted → not 404. No auth → 401.
|
|
105
|
+
expect(res.status).not.toBe(404)
|
|
106
|
+
expect(res.status).toBe(401)
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
// -------------------------------------------------------------------------
|
|
111
|
+
// Task 1: teams mounted at /web
|
|
112
|
+
// -------------------------------------------------------------------------
|
|
113
|
+
describe('teams routes mounted at /web', () => {
|
|
114
|
+
test('GET /web/teams returns 401 (not 404)', async () => {
|
|
115
|
+
const res = await app.request('/web/teams', { method: 'GET' })
|
|
116
|
+
// Route mounted → not 404. No auth → 401.
|
|
117
|
+
expect(res.status).not.toBe(404)
|
|
118
|
+
expect(res.status).toBe(401)
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
test('POST /web/teams returns 401 (not 404)', async () => {
|
|
122
|
+
const res = await app.request('/web/teams', {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers: { 'Content-Type': 'application/json' },
|
|
125
|
+
body: JSON.stringify({ name: 'test', slug: 'test-team' }),
|
|
126
|
+
})
|
|
127
|
+
expect(res.status).not.toBe(404)
|
|
128
|
+
expect(res.status).toBe(401)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
// -------------------------------------------------------------------------
|
|
133
|
+
// Existing /web/bind stub still works
|
|
134
|
+
// -------------------------------------------------------------------------
|
|
135
|
+
describe('legacy /web/bind stub preserved', () => {
|
|
136
|
+
test('POST /web/bind returns 410 Gone', async () => {
|
|
137
|
+
const res = await app.request('/web/bind', { method: 'POST' })
|
|
138
|
+
expect(res.status).toBe(410)
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
describe('SPA fallback', () => {
|
|
144
|
+
let app: Hono
|
|
145
|
+
|
|
146
|
+
beforeEach(() => {
|
|
147
|
+
setupTestDb()
|
|
148
|
+
app = createApp()
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
test('GET /login serves index.html (SPA fallback)', async () => {
|
|
152
|
+
const res = await app.request('/login', { method: 'GET' })
|
|
153
|
+
expect(res.status).toBe(200)
|
|
154
|
+
const text = await res.text()
|
|
155
|
+
expect(text).toContain('SPA')
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
test('GET /setup serves index.html', async () => {
|
|
159
|
+
const res = await app.request('/setup', { method: 'GET' })
|
|
160
|
+
expect(res.status).toBe(200)
|
|
161
|
+
const text = await res.text()
|
|
162
|
+
expect(text).toContain('SPA')
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
test('GET /join serves index.html', async () => {
|
|
166
|
+
const res = await app.request('/join', { method: 'GET' })
|
|
167
|
+
expect(res.status).toBe(200)
|
|
168
|
+
const text = await res.text()
|
|
169
|
+
expect(text).toContain('SPA')
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
test('GET /settings serves index.html', async () => {
|
|
173
|
+
const res = await app.request('/settings', { method: 'GET' })
|
|
174
|
+
expect(res.status).toBe(200)
|
|
175
|
+
const text = await res.text()
|
|
176
|
+
expect(text).toContain('SPA')
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
test('GET /teams serves index.html', async () => {
|
|
180
|
+
const res = await app.request('/teams', { method: 'GET' })
|
|
181
|
+
expect(res.status).toBe(200)
|
|
182
|
+
const text = await res.text()
|
|
183
|
+
expect(text).toContain('SPA')
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
test('GET /teams/some-id serves index.html', async () => {
|
|
187
|
+
const res = await app.request('/teams/some-id', { method: 'GET' })
|
|
188
|
+
expect(res.status).toBe(200)
|
|
189
|
+
const text = await res.text()
|
|
190
|
+
expect(text).toContain('SPA')
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
test('SPA fallback does NOT intercept /web/auth/me', async () => {
|
|
194
|
+
const res = await app.request('/web/auth/me', { method: 'GET' })
|
|
195
|
+
// Should be 401 from the auth route, not 200 from SPA fallback
|
|
196
|
+
expect(res.status).toBe(401)
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
test('SPA fallback does NOT intercept /v1/sessions', async () => {
|
|
200
|
+
const res = await app.request('/v1/sessions', { method: 'GET' })
|
|
201
|
+
// Should not be SPA fallback — expect a real API response (likely 401)
|
|
202
|
+
const text = await res.text()
|
|
203
|
+
expect(text).not.toContain('SPA')
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
test('Existing /code fallback still works', async () => {
|
|
207
|
+
const res = await app.request('/code', { method: 'GET' })
|
|
208
|
+
expect(res.status).toBe(200)
|
|
209
|
+
const text = await res.text()
|
|
210
|
+
expect(text).toContain('SPA')
|
|
211
|
+
})
|
|
212
|
+
})
|
|
@@ -539,61 +539,22 @@ describe('Web Auth Routes', () => {
|
|
|
539
539
|
app = createApp()
|
|
540
540
|
})
|
|
541
541
|
|
|
542
|
-
test('POST /web/bind —
|
|
543
|
-
// Create session first
|
|
544
|
-
const sessRes = await app.request('/v1/sessions', {
|
|
545
|
-
method: 'POST',
|
|
546
|
-
headers: { ...AUTH_HEADERS, 'Content-Type': 'application/json' },
|
|
547
|
-
body: JSON.stringify({}),
|
|
548
|
-
})
|
|
549
|
-
const { id } = await sessRes.json()
|
|
550
|
-
|
|
551
|
-
const bindRes = await app.request('/web/bind?uuid=test-uuid', {
|
|
552
|
-
method: 'POST',
|
|
553
|
-
headers: { 'Content-Type': 'application/json' },
|
|
554
|
-
body: JSON.stringify({ sessionId: id }),
|
|
555
|
-
})
|
|
556
|
-
expect(bindRes.status).toBe(200)
|
|
557
|
-
const body = await bindRes.json()
|
|
558
|
-
expect(body.ok).toBe(true)
|
|
559
|
-
})
|
|
560
|
-
|
|
561
|
-
test('POST /web/bind — binds compat code session ID to UUID', async () => {
|
|
562
|
-
const sessRes = await app.request('/v1/code/sessions', {
|
|
563
|
-
method: 'POST',
|
|
564
|
-
headers: { ...AUTH_HEADERS, 'Content-Type': 'application/json' },
|
|
565
|
-
body: JSON.stringify({}),
|
|
566
|
-
})
|
|
567
|
-
const body = await sessRes.json()
|
|
568
|
-
const compatId = toWebSessionId(body.session.id)
|
|
569
|
-
|
|
570
|
-
const bindRes = await app.request('/web/bind?uuid=test-uuid', {
|
|
571
|
-
method: 'POST',
|
|
572
|
-
headers: { 'Content-Type': 'application/json' },
|
|
573
|
-
body: JSON.stringify({ sessionId: compatId }),
|
|
574
|
-
})
|
|
575
|
-
expect(bindRes.status).toBe(200)
|
|
576
|
-
const bindBody = await bindRes.json()
|
|
577
|
-
expect(bindBody.ok).toBe(true)
|
|
578
|
-
expect(bindBody.sessionId).toBe(compatId)
|
|
579
|
-
})
|
|
580
|
-
|
|
581
|
-
test('POST /web/bind — 404 for unknown session', async () => {
|
|
542
|
+
test('POST /web/bind — returns 410 Gone (endpoint removed)', async () => {
|
|
582
543
|
const res = await app.request('/web/bind?uuid=test-uuid', {
|
|
583
544
|
method: 'POST',
|
|
584
545
|
headers: { 'Content-Type': 'application/json' },
|
|
585
|
-
body: JSON.stringify({ sessionId: '
|
|
546
|
+
body: JSON.stringify({ sessionId: 'ses_123' }),
|
|
586
547
|
})
|
|
587
|
-
expect(res.status).toBe(
|
|
548
|
+
expect(res.status).toBe(410)
|
|
588
549
|
})
|
|
589
550
|
|
|
590
|
-
test('POST /web/bind —
|
|
551
|
+
test('POST /web/bind — returns 410 for missing params too', async () => {
|
|
591
552
|
const res = await app.request('/web/bind', {
|
|
592
553
|
method: 'POST',
|
|
593
554
|
headers: { 'Content-Type': 'application/json' },
|
|
594
555
|
body: JSON.stringify({}),
|
|
595
556
|
})
|
|
596
|
-
expect(res.status).toBe(
|
|
557
|
+
expect(res.status).toBe(410)
|
|
597
558
|
})
|
|
598
559
|
})
|
|
599
560
|
|