test: add unit testing

This commit is contained in:
Krrish Dholakia
2025-09-19 17:41:27 -07:00
parent 21d6c4943e
commit ee5058b5e2
3 changed files with 305 additions and 340 deletions
+129 -114
View File
@@ -4765,9 +4765,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz",
"integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz",
"integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==",
"cpu": [
"arm"
],
@@ -4779,9 +4779,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz",
"integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz",
"integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==",
"cpu": [
"arm64"
],
@@ -4793,9 +4793,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz",
"integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz",
"integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==",
"cpu": [
"arm64"
],
@@ -4807,9 +4807,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz",
"integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz",
"integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==",
"cpu": [
"x64"
],
@@ -4821,9 +4821,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz",
"integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz",
"integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==",
"cpu": [
"arm64"
],
@@ -4835,9 +4835,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz",
"integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz",
"integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==",
"cpu": [
"x64"
],
@@ -4849,9 +4849,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz",
"integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz",
"integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==",
"cpu": [
"arm"
],
@@ -4863,9 +4863,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz",
"integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz",
"integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==",
"cpu": [
"arm"
],
@@ -4877,9 +4877,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz",
"integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz",
"integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==",
"cpu": [
"arm64"
],
@@ -4891,9 +4891,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz",
"integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz",
"integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==",
"cpu": [
"arm64"
],
@@ -4905,9 +4905,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz",
"integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz",
"integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==",
"cpu": [
"loong64"
],
@@ -4919,9 +4919,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz",
"integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz",
"integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==",
"cpu": [
"ppc64"
],
@@ -4933,9 +4933,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz",
"integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz",
"integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==",
"cpu": [
"riscv64"
],
@@ -4947,9 +4947,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz",
"integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz",
"integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==",
"cpu": [
"riscv64"
],
@@ -4961,9 +4961,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz",
"integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz",
"integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==",
"cpu": [
"s390x"
],
@@ -4975,9 +4975,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz",
"integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz",
"integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==",
"cpu": [
"x64"
],
@@ -4989,9 +4989,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz",
"integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz",
"integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==",
"cpu": [
"x64"
],
@@ -5003,9 +5003,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz",
"integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz",
"integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==",
"cpu": [
"arm64"
],
@@ -5017,9 +5017,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz",
"integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz",
"integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==",
"cpu": [
"arm64"
],
@@ -5031,9 +5031,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz",
"integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz",
"integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==",
"cpu": [
"ia32"
],
@@ -5044,10 +5044,24 @@
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz",
"integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz",
"integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz",
"integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==",
"cpu": [
"x64"
],
@@ -6440,6 +6454,33 @@
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/mocker": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
"integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "3.2.4",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"msw": "^2.4.9",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"peerDependenciesMeta": {
"msw": {
"optional": true
},
"vite": {
"optional": true
}
}
},
"node_modules/@vitest/pretty-format": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
@@ -19621,9 +19662,9 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"node_modules/rollup": {
"version": "4.50.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz",
"integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==",
"version": "4.52.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz",
"integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -19637,27 +19678,28 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.50.2",
"@rollup/rollup-android-arm64": "4.50.2",
"@rollup/rollup-darwin-arm64": "4.50.2",
"@rollup/rollup-darwin-x64": "4.50.2",
"@rollup/rollup-freebsd-arm64": "4.50.2",
"@rollup/rollup-freebsd-x64": "4.50.2",
"@rollup/rollup-linux-arm-gnueabihf": "4.50.2",
"@rollup/rollup-linux-arm-musleabihf": "4.50.2",
"@rollup/rollup-linux-arm64-gnu": "4.50.2",
"@rollup/rollup-linux-arm64-musl": "4.50.2",
"@rollup/rollup-linux-loong64-gnu": "4.50.2",
"@rollup/rollup-linux-ppc64-gnu": "4.50.2",
"@rollup/rollup-linux-riscv64-gnu": "4.50.2",
"@rollup/rollup-linux-riscv64-musl": "4.50.2",
"@rollup/rollup-linux-s390x-gnu": "4.50.2",
"@rollup/rollup-linux-x64-gnu": "4.50.2",
"@rollup/rollup-linux-x64-musl": "4.50.2",
"@rollup/rollup-openharmony-arm64": "4.50.2",
"@rollup/rollup-win32-arm64-msvc": "4.50.2",
"@rollup/rollup-win32-ia32-msvc": "4.50.2",
"@rollup/rollup-win32-x64-msvc": "4.50.2",
"@rollup/rollup-android-arm-eabi": "4.52.0",
"@rollup/rollup-android-arm64": "4.52.0",
"@rollup/rollup-darwin-arm64": "4.52.0",
"@rollup/rollup-darwin-x64": "4.52.0",
"@rollup/rollup-freebsd-arm64": "4.52.0",
"@rollup/rollup-freebsd-x64": "4.52.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.52.0",
"@rollup/rollup-linux-arm-musleabihf": "4.52.0",
"@rollup/rollup-linux-arm64-gnu": "4.52.0",
"@rollup/rollup-linux-arm64-musl": "4.52.0",
"@rollup/rollup-linux-loong64-gnu": "4.52.0",
"@rollup/rollup-linux-ppc64-gnu": "4.52.0",
"@rollup/rollup-linux-riscv64-gnu": "4.52.0",
"@rollup/rollup-linux-riscv64-musl": "4.52.0",
"@rollup/rollup-linux-s390x-gnu": "4.52.0",
"@rollup/rollup-linux-x64-gnu": "4.52.0",
"@rollup/rollup-linux-x64-musl": "4.52.0",
"@rollup/rollup-openharmony-arm64": "4.52.0",
"@rollup/rollup-win32-arm64-msvc": "4.52.0",
"@rollup/rollup-win32-ia32-msvc": "4.52.0",
"@rollup/rollup-win32-x64-gnu": "4.52.0",
"@rollup/rollup-win32-x64-msvc": "4.52.0",
"fsevents": "~2.3.2"
}
},
@@ -22197,33 +22239,6 @@
}
}
},
"node_modules/vitest/node_modules/@vitest/mocker": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
"integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "3.2.4",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"msw": "^2.4.9",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"peerDependenciesMeta": {
"msw": {
"optional": true
},
"vite": {
"optional": true
}
}
},
"node_modules/vitest/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
@@ -1,226 +0,0 @@
import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import userEvent from '@testing-library/user-event';
import { renderWithProviders, screen, waitFor } from "../../tests/test-utils";
import UIAccessControlForm from './UIAccessControlForm';
import * as networking from './networking';
// Mock the networking module
vi.mock('./networking', () => ({
getSSOSettings: vi.fn(),
updateSSOSettings: vi.fn(),
}));
// Mock NotificationManager
vi.mock('./molecules/notifications_manager', () => ({
default: {
fromBackend: vi.fn(),
},
}));
describe('UIAccessControlForm', () => {
const mockAccessToken = 'test-access-token';
const mockOnSuccess = vi.fn();
beforeEach(() => {
vi.resetAllMocks();
// Default mock for getSSOSettings
vi.mocked(networking.getSSOSettings).mockResolvedValue({
values: {
ui_access_mode: {
type: 'restricted_sso_group',
restricted_sso_group: 'admin-group',
sso_group_jwt_field: 'groups',
}
}
});
// Default mock for updateSSOSettings
vi.mocked(networking.updateSSOSettings).mockResolvedValue({});
});
it('renders the form with all expected fields', async () => {
renderWithProviders(
<UIAccessControlForm
accessToken={mockAccessToken}
onSuccess={mockOnSuccess}
/>
);
// Wait for the form to load
await waitFor(() => {
expect(screen.getByText('UI Access Mode')).toBeInTheDocument();
});
expect(screen.getByText('Configure who can access the UI interface and how group information is extracted from JWT tokens.')).toBeInTheDocument();
expect(screen.getByText('SSO Group JWT Field')).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Update UI Access Control' })).toBeInTheDocument();
});
it('sends ui_access_mode="none" when ui_access_mode_type is "all_authenticated_users"', async () => {
const user = userEvent.setup();
renderWithProviders(
<UIAccessControlForm
accessToken={mockAccessToken}
onSuccess={mockOnSuccess}
/>
);
// Wait for form to load
await waitFor(() => {
expect(screen.getByText('UI Access Mode')).toBeInTheDocument();
});
// Select "All Authenticated Users" from the dropdown
const accessModeSelect = screen.getByRole('combobox');
await user.click(accessModeSelect);
const allUsersOption = screen.getByText('All Authenticated Users');
await user.click(allUsersOption);
// Fill in the JWT field (optional but good for completeness)
const jwtField = screen.getByPlaceholderText('groups');
await user.clear(jwtField);
await user.type(jwtField, 'user_groups');
// Submit the form
const submitButton = screen.getByRole('button', { name: 'Update UI Access Control' });
await user.click(submitButton);
// Verify that updateSSOSettings was called with the correct payload
await waitFor(() => {
expect(networking.updateSSOSettings).toHaveBeenCalledWith(
mockAccessToken,
{
ui_access_mode: "none"
}
);
});
expect(mockOnSuccess).toHaveBeenCalled();
});
it('sends object structure when ui_access_mode_type is "restricted_sso_group"', async () => {
const user = userEvent.setup();
renderWithProviders(
<UIAccessControlForm
accessToken={mockAccessToken}
onSuccess={mockOnSuccess}
/>
);
// Wait for form to load
await waitFor(() => {
expect(screen.getByText('UI Access Mode')).toBeInTheDocument();
});
// Select "Restricted SSO Group" from the dropdown
const accessModeSelect = screen.getByRole('combobox');
await user.click(accessModeSelect);
const restrictedOption = screen.getByText('Restricted SSO Group');
await user.click(restrictedOption);
// Fill in the restricted SSO group field (should appear after selection)
await waitFor(() => {
expect(screen.getByText('Restricted SSO Group')).toBeInTheDocument();
});
const restrictedGroupInput = screen.getByPlaceholderText('ui-access-group');
await user.clear(restrictedGroupInput);
await user.type(restrictedGroupInput, 'admin-users');
// Fill in the JWT field
const jwtField = screen.getByPlaceholderText('groups');
await user.clear(jwtField);
await user.type(jwtField, 'team_groups');
// Submit the form
const submitButton = screen.getByRole('button', { name: 'Update UI Access Control' });
await user.click(submitButton);
// Verify that updateSSOSettings was called with the correct object structure
await waitFor(() => {
expect(networking.updateSSOSettings).toHaveBeenCalledWith(
mockAccessToken,
{
ui_access_mode: {
type: 'restricted_sso_group',
restricted_sso_group: 'admin-users',
sso_group_jwt_field: 'team_groups',
}
}
);
});
expect(mockOnSuccess).toHaveBeenCalled();
});
it('shows restricted SSO group field only when restricted_sso_group is selected', async () => {
const user = userEvent.setup();
renderWithProviders(
<UIAccessControlForm
accessToken={mockAccessToken}
onSuccess={mockOnSuccess}
/>
);
// Wait for form to load
await waitFor(() => {
expect(screen.getByText('UI Access Mode')).toBeInTheDocument();
});
// Initially, with "restricted_sso_group" selected, the field should be visible
expect(screen.getByText('Restricted SSO Group')).toBeInTheDocument();
// Switch to "All Authenticated Users"
const accessModeSelect = screen.getByRole('combobox');
await user.click(accessModeSelect);
const allUsersOption = screen.getByText('All Authenticated Users');
await user.click(allUsersOption);
// The restricted SSO group field should disappear
await waitFor(() => {
expect(screen.queryByText('Restricted SSO Group')).not.toBeInTheDocument();
});
});
it('handles API errors gracefully', async () => {
const user = userEvent.setup();
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
// Mock updateSSOSettings to reject
vi.mocked(networking.updateSSOSettings).mockRejectedValue(new Error('API Error'));
renderWithProviders(
<UIAccessControlForm
accessToken={mockAccessToken}
onSuccess={mockOnSuccess}
/>
);
// Wait for form to load
await waitFor(() => {
expect(screen.getByText('UI Access Mode')).toBeInTheDocument();
});
// Submit the form
const submitButton = screen.getByRole('button', { name: 'Update UI Access Control' });
await user.click(submitButton);
// Verify error handling
await waitFor(() => {
expect(consoleSpy).toHaveBeenCalledWith('Failed to save UI access settings:', expect.any(Error));
});
// onSuccess should not be called on error
expect(mockOnSuccess).not.toHaveBeenCalled();
consoleSpy.mockRestore();
});
});
@@ -0,0 +1,176 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import * as networking from './networking';
// Mock the networking module
vi.mock('./networking', () => ({
updateSSOSettings: vi.fn(),
}));
// Mock NotificationManager
vi.mock('./molecules/notifications_manager', () => ({
default: {
fromBackend: vi.fn(),
},
}));
// Extract the logic we want to test into a pure function
const buildApiPayload = (formValues: Record<string, any>) => {
if (formValues.ui_access_mode_type === 'all_authenticated_users') {
// Set ui_access_mode to none when all_authenticated_users is selected
return {
ui_access_mode: "none"
};
} else {
return {
ui_access_mode: {
type: formValues.ui_access_mode_type,
restricted_sso_group: formValues.restricted_sso_group,
sso_group_jwt_field: formValues.sso_group_jwt_field,
}
};
}
};
describe('UIAccessControlForm Logic', () => {
beforeEach(() => {
vi.resetAllMocks();
});
describe('buildApiPayload', () => {
it('should return ui_access_mode="none" when ui_access_mode_type is "all_authenticated_users"', () => {
const formValues = {
ui_access_mode_type: 'all_authenticated_users',
restricted_sso_group: 'some-group',
sso_group_jwt_field: 'groups',
};
const result = buildApiPayload(formValues);
expect(result).toEqual({
ui_access_mode: "none"
});
});
it('should return object structure when ui_access_mode_type is "restricted_sso_group"', () => {
const formValues = {
ui_access_mode_type: 'restricted_sso_group',
restricted_sso_group: 'admin-users',
sso_group_jwt_field: 'team_groups',
};
const result = buildApiPayload(formValues);
expect(result).toEqual({
ui_access_mode: {
type: 'restricted_sso_group',
restricted_sso_group: 'admin-users',
sso_group_jwt_field: 'team_groups',
}
});
});
it('should return object structure for any other ui_access_mode_type', () => {
const formValues = {
ui_access_mode_type: 'some_other_mode',
restricted_sso_group: 'test-group',
sso_group_jwt_field: 'user_groups',
};
const result = buildApiPayload(formValues);
expect(result).toEqual({
ui_access_mode: {
type: 'some_other_mode',
restricted_sso_group: 'test-group',
sso_group_jwt_field: 'user_groups',
}
});
});
it('should handle undefined values gracefully', () => {
const formValues = {
ui_access_mode_type: 'restricted_sso_group',
restricted_sso_group: undefined,
sso_group_jwt_field: undefined,
};
const result = buildApiPayload(formValues);
expect(result).toEqual({
ui_access_mode: {
type: 'restricted_sso_group',
restricted_sso_group: undefined,
sso_group_jwt_field: undefined,
}
});
});
it('should prioritize all_authenticated_users over other values', () => {
const formValues = {
ui_access_mode_type: 'all_authenticated_users',
restricted_sso_group: 'admin-group',
sso_group_jwt_field: 'groups',
};
const result = buildApiPayload(formValues);
// Should return "none" and ignore the other fields
expect(result).toEqual({
ui_access_mode: "none"
});
// Verify other fields are not included
expect(result).not.toHaveProperty('restricted_sso_group');
expect(result).not.toHaveProperty('sso_group_jwt_field');
});
});
describe('API Integration', () => {
it('should call updateSSOSettings with correct payload for all_authenticated_users', async () => {
const mockAccessToken = 'test-token';
const formValues = {
ui_access_mode_type: 'all_authenticated_users',
sso_group_jwt_field: 'groups',
};
vi.mocked(networking.updateSSOSettings).mockResolvedValue({});
const expectedPayload = buildApiPayload(formValues);
// Simulate the API call
await networking.updateSSOSettings(mockAccessToken, expectedPayload);
expect(networking.updateSSOSettings).toHaveBeenCalledWith(
mockAccessToken,
{ ui_access_mode: "none" }
);
});
it('should call updateSSOSettings with correct payload for restricted_sso_group', async () => {
const mockAccessToken = 'test-token';
const formValues = {
ui_access_mode_type: 'restricted_sso_group',
restricted_sso_group: 'admin-team',
sso_group_jwt_field: 'team_groups',
};
vi.mocked(networking.updateSSOSettings).mockResolvedValue({});
const expectedPayload = buildApiPayload(formValues);
// Simulate the API call
await networking.updateSSOSettings(mockAccessToken, expectedPayload);
expect(networking.updateSSOSettings).toHaveBeenCalledWith(
mockAccessToken,
{
ui_access_mode: {
type: 'restricted_sso_group',
restricted_sso_group: 'admin-team',
sso_group_jwt_field: 'team_groups',
}
}
);
});
});
});