@aurabase/aurabase-js 0.3.0 → 0.4.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/README.md +26 -795
- package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.ts → dist/AuraClient-BcFE8u1v.d.cts} +1 -1
- package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.cts → dist/AuraClient-BcFE8u1v.d.ts} +1 -1
- package/{packages/aurabase/dist → dist}/index.d.cts +1 -1
- package/{packages/aurabase/dist → dist}/index.d.ts +1 -1
- package/{packages/aurabase/dist → dist}/ssr.d.cts +1 -1
- package/{packages/aurabase/dist → dist}/ssr.d.ts +1 -1
- package/package.json +72 -82
- package/.changeset/config.json +0 -11
- package/CHANGELOG.md +0 -30
- package/packages/ai/LICENSE +0 -21
- package/packages/ai/README.md +0 -106
- package/packages/ai/dist/index.cjs +0 -229
- package/packages/ai/dist/index.d.cts +0 -139
- package/packages/ai/dist/index.d.ts +0 -139
- package/packages/ai/dist/index.js +0 -226
- package/packages/ai/node_modules/.bin/esbuild +0 -19
- package/packages/ai/node_modules/.bin/tsc +0 -22
- package/packages/ai/node_modules/.bin/tsserver +0 -22
- package/packages/ai/node_modules/.bin/tsup +0 -22
- package/packages/ai/node_modules/.bin/tsup-node +0 -22
- package/packages/ai/node_modules/.bin/vite +0 -22
- package/packages/ai/node_modules/.bin/vitest +0 -22
- package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/ai/package.json +0 -61
- package/packages/ai/src/AiService.ts +0 -226
- package/packages/ai/src/index.ts +0 -18
- package/packages/ai/src/sse.ts +0 -141
- package/packages/ai/src/types.ts +0 -30
- package/packages/ai/tests/chat-stream.test.ts +0 -151
- package/packages/ai/tests/rag-namespaces.test.ts +0 -54
- package/packages/ai/tests/sse.test.ts +0 -69
- package/packages/ai/tsconfig.json +0 -5
- package/packages/ai/tsup.config.ts +0 -11
- package/packages/aurabase/LICENSE +0 -21
- package/packages/aurabase/README.md +0 -64
- package/packages/aurabase/node_modules/.bin/esbuild +0 -19
- package/packages/aurabase/node_modules/.bin/tsc +0 -22
- package/packages/aurabase/node_modules/.bin/tsserver +0 -22
- package/packages/aurabase/node_modules/.bin/tsup +0 -22
- package/packages/aurabase/node_modules/.bin/tsup-node +0 -22
- package/packages/aurabase/node_modules/.bin/vite +0 -22
- package/packages/aurabase/node_modules/.bin/vitest +0 -22
- package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/aurabase/package.json +0 -80
- package/packages/aurabase/src/AuraClient.ts +0 -237
- package/packages/aurabase/src/index.ts +0 -152
- package/packages/aurabase/src/ssr.ts +0 -156
- package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +0 -82
- package/packages/aurabase/tests/ai.test.ts +0 -111
- package/packages/aurabase/tests/auth-admin.test.ts +0 -515
- package/packages/aurabase/tests/auth-e2e.test.ts +0 -135
- package/packages/aurabase/tests/auth-hardening.test.ts +0 -206
- package/packages/aurabase/tests/auth.test.ts +0 -947
- package/packages/aurabase/tests/database.test.ts +0 -230
- package/packages/aurabase/tests/db-types-e2e.test.ts +0 -217
- package/packages/aurabase/tests/dispose.test.ts +0 -23
- package/packages/aurabase/tests/foreign-token.e2e.test.ts +0 -129
- package/packages/aurabase/tests/functions.test.ts +0 -107
- package/packages/aurabase/tests/integration.test.ts +0 -413
- package/packages/aurabase/tests/live-production-validation.js +0 -241
- package/packages/aurabase/tests/live-sdk-production-validation.js +0 -293
- package/packages/aurabase/tests/mocks.ts +0 -139
- package/packages/aurabase/tests/notifications.test.ts +0 -314
- package/packages/aurabase/tests/observability-backup.test.ts +0 -186
- package/packages/aurabase/tests/observability-hook.test.ts +0 -130
- package/packages/aurabase/tests/production-robustness.test.ts +0 -268
- package/packages/aurabase/tests/public-api-surface.test.ts +0 -53
- package/packages/aurabase/tests/query-builder.test.ts +0 -329
- package/packages/aurabase/tests/readme-smoke-e2e.test.ts +0 -231
- package/packages/aurabase/tests/realtime-filter-e2e.test.ts +0 -344
- package/packages/aurabase/tests/refresh-locks.test.ts +0 -210
- package/packages/aurabase/tests/retry-option.test.ts +0 -17
- package/packages/aurabase/tests/rpc-e2e.test.ts +0 -254
- package/packages/aurabase/tests/rs256-local-e2e.test.ts +0 -114
- package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +0 -235
- package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +0 -124
- package/packages/aurabase/tests/service-role-guard.test.ts +0 -99
- package/packages/aurabase/tests/ssr.test.ts +0 -91
- package/packages/aurabase/tests/storage-backend-e2e.test.ts +0 -481
- package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +0 -104
- package/packages/aurabase/tests/storage-transform-e2e.test.ts +0 -684
- package/packages/aurabase/tests/storage.test.ts +0 -55
- package/packages/aurabase/tests/types/client-generic.test-d.ts +0 -79
- package/packages/aurabase/tests/types/docs-snippets.test-d.ts +0 -571
- package/packages/aurabase/tests/types/error-code.test-d.ts +0 -53
- package/packages/aurabase/tsconfig.json +0 -5
- package/packages/aurabase/tsconfig.test-d.json +0 -5
- package/packages/aurabase/tsup.config.ts +0 -11
- package/packages/aurabase/vitest.config.ts +0 -16
- package/packages/aurabase/vitest.e2e.config.ts +0 -9
- package/packages/auth/LICENSE +0 -21
- package/packages/auth/README.md +0 -215
- package/packages/auth/dist/index.cjs +0 -1175
- package/packages/auth/dist/index.d.cts +0 -397
- package/packages/auth/dist/index.d.ts +0 -397
- package/packages/auth/dist/index.js +0 -1170
- package/packages/auth/node_modules/.bin/esbuild +0 -19
- package/packages/auth/node_modules/.bin/tsc +0 -22
- package/packages/auth/node_modules/.bin/tsserver +0 -22
- package/packages/auth/node_modules/.bin/tsup +0 -22
- package/packages/auth/node_modules/.bin/tsup-node +0 -22
- package/packages/auth/node_modules/.bin/vite +0 -22
- package/packages/auth/node_modules/.bin/vitest +0 -22
- package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/auth/package.json +0 -61
- package/packages/auth/src/AuthAdminService.ts +0 -149
- package/packages/auth/src/AuthService.ts +0 -1166
- package/packages/auth/src/SessionManager.ts +0 -92
- package/packages/auth/src/index.ts +0 -17
- package/packages/auth/src/jwks.ts +0 -337
- package/packages/auth/src/pkce.ts +0 -27
- package/packages/auth/src/types.ts +0 -89
- package/packages/auth/tests/auth-lifecycle.test.ts +0 -149
- package/packages/auth/tests/detect-session.test.ts +0 -361
- package/packages/auth/tests/getclaims.test.ts +0 -780
- package/packages/auth/tests/is-mfa-challenge.test.ts +0 -27
- package/packages/auth/tests/password-recovery.test.ts +0 -124
- package/packages/auth/tests/pkce.test.ts +0 -192
- package/packages/auth/tests/session-manager.test.ts +0 -103
- package/packages/auth/tests/set-session.test.ts +0 -139
- package/packages/auth/tests/verify-otp.test.ts +0 -153
- package/packages/auth/tsconfig.json +0 -5
- package/packages/auth/tsup.config.ts +0 -11
- package/packages/core/LICENSE +0 -21
- package/packages/core/README.md +0 -132
- package/packages/core/dist/index.cjs +0 -695
- package/packages/core/dist/index.d.cts +0 -1137
- package/packages/core/dist/index.d.ts +0 -1137
- package/packages/core/dist/index.js +0 -673
- package/packages/core/node_modules/.bin/esbuild +0 -22
- package/packages/core/node_modules/.bin/tsc +0 -22
- package/packages/core/node_modules/.bin/tsserver +0 -22
- package/packages/core/node_modules/.bin/tsup +0 -22
- package/packages/core/node_modules/.bin/tsup-node +0 -22
- package/packages/core/node_modules/.bin/vite +0 -22
- package/packages/core/node_modules/.bin/vitest +0 -22
- package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/core/package.json +0 -57
- package/packages/core/src/AuraError.ts +0 -89
- package/packages/core/src/BaseService.ts +0 -44
- package/packages/core/src/client.ts +0 -34
- package/packages/core/src/cookie-utils.ts +0 -42
- package/packages/core/src/fetch.ts +0 -435
- package/packages/core/src/index.ts +0 -22
- package/packages/core/src/retry.ts +0 -63
- package/packages/core/src/serialize.ts +0 -6
- package/packages/core/src/stores/BaseAuthStore.ts +0 -164
- package/packages/core/src/stores/LocalAuthStore.ts +0 -199
- package/packages/core/src/types.ts +0 -1042
- package/packages/core/tests/auth-store.test.ts +0 -300
- package/packages/core/tests/error-code.test.ts +0 -61
- package/packages/core/tests/error.test.ts +0 -24
- package/packages/core/tests/fetch.test.ts +0 -286
- package/packages/core/tests/mocks.ts +0 -139
- package/packages/core/tests/observability.test.ts +0 -86
- package/packages/core/tests/refresh-hardening.test.ts +0 -164
- package/packages/core/tests/refresh-observability.test.ts +0 -111
- package/packages/core/tests/retry.test.ts +0 -106
- package/packages/core/tests/serialize.test.ts +0 -12
- package/packages/core/tests/timeout.test.ts +0 -79
- package/packages/core/tsconfig.json +0 -5
- package/packages/core/tsup.config.ts +0 -11
- package/packages/db/LICENSE +0 -21
- package/packages/db/README.md +0 -152
- package/packages/db/VENDORED.md +0 -93
- package/packages/db/dist/index.cjs +0 -544
- package/packages/db/dist/index.d.cts +0 -1111
- package/packages/db/dist/index.d.ts +0 -1111
- package/packages/db/dist/index.js +0 -541
- package/packages/db/node_modules/.bin/esbuild +0 -19
- package/packages/db/node_modules/.bin/tsc +0 -22
- package/packages/db/node_modules/.bin/tsserver +0 -22
- package/packages/db/node_modules/.bin/tsup +0 -22
- package/packages/db/node_modules/.bin/tsup-node +0 -22
- package/packages/db/node_modules/.bin/vite +0 -22
- package/packages/db/node_modules/.bin/vitest +0 -22
- package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/db/package.json +0 -62
- package/packages/db/src/DatabaseService.ts +0 -170
- package/packages/db/src/QueryBuilder.ts +0 -830
- package/packages/db/src/index.ts +0 -2
- package/packages/db/src/pgrst-types/common/common.ts +0 -86
- package/packages/db/src/pgrst-types/common/rpc.ts +0 -151
- package/packages/db/src/pgrst-types/feature-flags.ts +0 -20
- package/packages/db/src/pgrst-types/types.ts +0 -134
- package/packages/db/src/select-query-parser/parser.ts +0 -479
- package/packages/db/src/select-query-parser/result.ts +0 -553
- package/packages/db/src/select-query-parser/types.ts +0 -132
- package/packages/db/src/select-query-parser/utils.ts +0 -707
- package/packages/db/tests/filters.test.ts +0 -81
- package/packages/db/tests/mutations-filtered.e2e.test.ts +0 -132
- package/packages/db/tests/mutations-filtered.test.ts +0 -188
- package/packages/db/tests/order.test.ts +0 -45
- package/packages/db/tests/rpc.test.ts +0 -41
- package/packages/db/tests/scale/build-large-schema.ts +0 -94
- package/packages/db/tests/scale/scale-compile.test.ts +0 -167
- package/packages/db/tests/schema.test.ts +0 -77
- package/packages/db/tests/single-accept.e2e.test.ts +0 -123
- package/packages/db/tests/single.test.ts +0 -211
- package/packages/db/tests/types/filters.test-d.ts +0 -52
- package/packages/db/tests/types/fixtures.ts +0 -40
- package/packages/db/tests/types/from-views.test-d.ts +0 -18
- package/packages/db/tests/types/mutations.test-d.ts +0 -23
- package/packages/db/tests/types/rpc.test-d.ts +0 -60
- package/packages/db/tests/types/schema-shape.test-d.ts +0 -8
- package/packages/db/tests/types/select-inference.test-d.ts +0 -38
- package/packages/db/tests/vendored/fixtures.ts +0 -83
- package/packages/db/tests/vendored/get-result.test-d.ts +0 -75
- package/packages/db/tsconfig.json +0 -5
- package/packages/db/tsconfig.test-d.json +0 -5
- package/packages/db/tsup.config.ts +0 -11
- package/packages/db/vitest.config.ts +0 -8
- package/packages/functions/LICENSE +0 -21
- package/packages/functions/README.md +0 -96
- package/packages/functions/dist/index.cjs +0 -173
- package/packages/functions/dist/index.d.cts +0 -81
- package/packages/functions/dist/index.d.ts +0 -81
- package/packages/functions/dist/index.js +0 -168
- package/packages/functions/node_modules/.bin/esbuild +0 -19
- package/packages/functions/node_modules/.bin/tsc +0 -22
- package/packages/functions/node_modules/.bin/tsserver +0 -22
- package/packages/functions/node_modules/.bin/tsup +0 -22
- package/packages/functions/node_modules/.bin/tsup-node +0 -22
- package/packages/functions/node_modules/.bin/vite +0 -22
- package/packages/functions/node_modules/.bin/vitest +0 -22
- package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/functions/package.json +0 -60
- package/packages/functions/src/FunctionsService.ts +0 -188
- package/packages/functions/src/errors.ts +0 -70
- package/packages/functions/src/index.ts +0 -6
- package/packages/functions/tests/invoke.test.ts +0 -97
- package/packages/functions/tests/response-type-errors.test.ts +0 -135
- package/packages/functions/tsconfig.json +0 -5
- package/packages/functions/tsup.config.ts +0 -11
- package/packages/gen/LICENSE +0 -21
- package/packages/gen/README.md +0 -84
- package/packages/gen/dist/cli.cjs +0 -334
- package/packages/gen/dist/cli.d.cts +0 -1
- package/packages/gen/dist/cli.d.ts +0 -1
- package/packages/gen/dist/cli.js +0 -332
- package/packages/gen/dist/index.cjs +0 -257
- package/packages/gen/dist/index.d.cts +0 -12
- package/packages/gen/dist/index.d.ts +0 -12
- package/packages/gen/dist/index.js +0 -255
- package/packages/gen/node_modules/.bin/esbuild +0 -19
- package/packages/gen/node_modules/.bin/tsc +0 -22
- package/packages/gen/node_modules/.bin/tsserver +0 -22
- package/packages/gen/node_modules/.bin/tsup +0 -22
- package/packages/gen/node_modules/.bin/tsup-node +0 -22
- package/packages/gen/node_modules/.bin/vite +0 -22
- package/packages/gen/node_modules/.bin/vitest +0 -22
- package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/gen/package.json +0 -66
- package/packages/gen/src/cli.ts +0 -67
- package/packages/gen/src/generate.ts +0 -0
- package/packages/gen/src/index.ts +0 -2
- package/packages/gen/tests/compile.test.ts +0 -213
- package/packages/gen/tests/e2e.test.ts +0 -130
- package/packages/gen/tests/generate.test.ts +0 -396
- package/packages/gen/tsconfig.json +0 -5
- package/packages/gen/tsup.config.ts +0 -11
- package/packages/notifications/LICENSE +0 -21
- package/packages/notifications/README.md +0 -134
- package/packages/notifications/dist/index.cjs +0 -128
- package/packages/notifications/dist/index.d.cts +0 -81
- package/packages/notifications/dist/index.d.ts +0 -81
- package/packages/notifications/dist/index.js +0 -125
- package/packages/notifications/node_modules/.bin/esbuild +0 -19
- package/packages/notifications/node_modules/.bin/tsc +0 -22
- package/packages/notifications/node_modules/.bin/tsserver +0 -22
- package/packages/notifications/node_modules/.bin/tsup +0 -22
- package/packages/notifications/node_modules/.bin/tsup-node +0 -22
- package/packages/notifications/node_modules/.bin/vite +0 -22
- package/packages/notifications/node_modules/.bin/vitest +0 -22
- package/packages/notifications/package.json +0 -60
- package/packages/notifications/src/NotificationsService.ts +0 -230
- package/packages/notifications/src/index.ts +0 -19
- package/packages/notifications/tsconfig.json +0 -5
- package/packages/notifications/tsup.config.ts +0 -11
- package/packages/realtime/LICENSE +0 -21
- package/packages/realtime/README.md +0 -183
- package/packages/realtime/dist/index.cjs +0 -977
- package/packages/realtime/dist/index.d.cts +0 -259
- package/packages/realtime/dist/index.d.ts +0 -259
- package/packages/realtime/dist/index.js +0 -973
- package/packages/realtime/node_modules/.bin/esbuild +0 -19
- package/packages/realtime/node_modules/.bin/tsc +0 -22
- package/packages/realtime/node_modules/.bin/tsserver +0 -22
- package/packages/realtime/node_modules/.bin/tsup +0 -22
- package/packages/realtime/node_modules/.bin/tsup-node +0 -22
- package/packages/realtime/node_modules/.bin/vite +0 -22
- package/packages/realtime/node_modules/.bin/vitest +0 -22
- package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/realtime/package.json +0 -60
- package/packages/realtime/src/AuraChannel.ts +0 -485
- package/packages/realtime/src/HeartbeatManager.ts +0 -73
- package/packages/realtime/src/RealtimeService.ts +0 -505
- package/packages/realtime/src/columnFilter.ts +0 -301
- package/packages/realtime/src/index.ts +0 -4
- package/packages/realtime/tests/ack-routing.test.ts +0 -81
- package/packages/realtime/tests/column-filter.test.ts +0 -144
- package/packages/realtime/tests/dispatch.test.ts +0 -191
- package/packages/realtime/tests/heartbeat.test.ts +0 -67
- package/packages/realtime/tests/http-broadcast.test.ts +0 -68
- package/packages/realtime/tests/realtime-token.test.ts +0 -43
- package/packages/realtime/tests/reconnect-race.test.ts +0 -149
- package/packages/realtime/tests/ref-id.test.ts +0 -34
- package/packages/realtime/tests/set-auth.test.ts +0 -70
- package/packages/realtime/tsconfig.json +0 -5
- package/packages/realtime/tsup.config.ts +0 -11
- package/packages/storage/LICENSE +0 -21
- package/packages/storage/README.md +0 -141
- package/packages/storage/dist/index.cjs +0 -333
- package/packages/storage/dist/index.d.cts +0 -185
- package/packages/storage/dist/index.d.ts +0 -185
- package/packages/storage/dist/index.js +0 -329
- package/packages/storage/node_modules/.bin/esbuild +0 -19
- package/packages/storage/node_modules/.bin/tsc +0 -22
- package/packages/storage/node_modules/.bin/tsserver +0 -22
- package/packages/storage/node_modules/.bin/tsup +0 -22
- package/packages/storage/node_modules/.bin/tsup-node +0 -22
- package/packages/storage/node_modules/.bin/vite +0 -22
- package/packages/storage/node_modules/.bin/vitest +0 -22
- package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/storage/package.json +0 -60
- package/packages/storage/src/DownloadBuilder.ts +0 -60
- package/packages/storage/src/StorageService.ts +0 -323
- package/packages/storage/src/index.ts +0 -2
- package/packages/storage/src/path.ts +0 -35
- package/packages/storage/src/transform.ts +0 -15
- package/packages/storage/tests/download.test.ts +0 -64
- package/packages/storage/tests/parity.test.ts +0 -154
- package/packages/storage/tests/path.test.ts +0 -87
- package/packages/storage/tests/transform.test.ts +0 -79
- package/packages/storage/tsconfig.json +0 -5
- package/packages/storage/tsup.config.ts +0 -11
- package/pnpm-workspace.yaml +0 -24
- package/tsconfig.base.json +0 -15
- /package/{packages/aurabase/dist → dist}/index.cjs +0 -0
- /package/{packages/aurabase/dist → dist}/index.js +0 -0
- /package/{packages/aurabase/dist → dist}/ssr.cjs +0 -0
- /package/{packages/aurabase/dist → dist}/ssr.js +0 -0
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
2
|
-
import { AuraClient } from '../src/AuraClient'
|
|
3
|
-
import { FetchMock, fakeTokenPair } from './mocks'
|
|
4
|
-
|
|
5
|
-
const BASE = 'http://localhost:8080'
|
|
6
|
-
const PROJECT = '00000000-0000-0000-0000-000000000001'
|
|
7
|
-
const PREFIX = `${BASE}/v1/functions/${PROJECT}`
|
|
8
|
-
|
|
9
|
-
let fetchMock: FetchMock
|
|
10
|
-
let client: AuraClient
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
fetchMock = new FetchMock()
|
|
14
|
-
fetchMock.init()
|
|
15
|
-
client = new AuraClient(BASE, PROJECT, 'aura_anon_test', {
|
|
16
|
-
auth: { persistSession: false },
|
|
17
|
-
})
|
|
18
|
-
const tp = fakeTokenPair()
|
|
19
|
-
client.authStore.save(tp.access_token, tp.refresh_token, tp.user)
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
afterEach(() => {
|
|
23
|
-
fetchMock.restore()
|
|
24
|
-
fetchMock.clearMocks()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
describe('FunctionsService route contract', () => {
|
|
28
|
-
it('lists and gets functions through backend routes', async () => {
|
|
29
|
-
fetchMock.on({ method: 'GET', url: PREFIX, replyCode: 200, replyBody: { data: [] } })
|
|
30
|
-
fetchMock.on({
|
|
31
|
-
method: 'GET',
|
|
32
|
-
url: `${PREFIX}/hello`,
|
|
33
|
-
replyCode: 200,
|
|
34
|
-
replyBody: { data: { id: 'fn-1', name: 'hello' } },
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
await client.functions.list()
|
|
38
|
-
await client.functions.get('hello')
|
|
39
|
-
|
|
40
|
-
expect(fetchMock.calls[0].url).toBe(PREFIX)
|
|
41
|
-
expect(fetchMock.calls[1].url).toBe(`${PREFIX}/hello`)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('invokes a function at /{name}/invoke and wraps the request body', async () => {
|
|
45
|
-
fetchMock.on({
|
|
46
|
-
method: 'POST',
|
|
47
|
-
url: `${PREFIX}/hello/invoke`,
|
|
48
|
-
replyCode: 200,
|
|
49
|
-
replyBody: { data: { status: 200 } },
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
await client.functions.invoke('hello', {
|
|
53
|
-
body: { name: 'Ada' },
|
|
54
|
-
method: 'POST',
|
|
55
|
-
path: '/welcome',
|
|
56
|
-
headers: { 'x-test': '1' },
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
expect(fetchMock.calls[0].url).toBe(`${PREFIX}/hello/invoke`)
|
|
60
|
-
expect(fetchMock.calls[0].body).toEqual({
|
|
61
|
-
method: 'POST',
|
|
62
|
-
path: '/welcome',
|
|
63
|
-
headers: { 'x-test': '1' },
|
|
64
|
-
body: { name: 'Ada' },
|
|
65
|
-
})
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('uses status and limit query params for jobs', async () => {
|
|
69
|
-
fetchMock.on({
|
|
70
|
-
method: 'GET',
|
|
71
|
-
url: `${PREFIX}/jobs?status=pending&limit=10`,
|
|
72
|
-
replyCode: 200,
|
|
73
|
-
replyBody: { data: [] },
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
await client.functions.listJobs({ status: 'pending', limit: 10 })
|
|
77
|
-
|
|
78
|
-
expect(fetchMock.calls[0].url).toBe(`${PREFIX}/jobs?status=pending&limit=10`)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('creates and deletes cron jobs by name', async () => {
|
|
82
|
-
fetchMock.on({
|
|
83
|
-
method: 'POST',
|
|
84
|
-
url: `${PREFIX}/cron`,
|
|
85
|
-
replyCode: 200,
|
|
86
|
-
replyBody: { data: { name: 'nightly' } },
|
|
87
|
-
})
|
|
88
|
-
fetchMock.on({
|
|
89
|
-
method: 'DELETE',
|
|
90
|
-
url: `${PREFIX}/cron/nightly`,
|
|
91
|
-
replyCode: 204,
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
await client.functions.createCronJob('nightly', '0 0 * * * *', 'hello', {
|
|
95
|
-
payload: { ok: true },
|
|
96
|
-
})
|
|
97
|
-
await client.functions.deleteCronJob('nightly')
|
|
98
|
-
|
|
99
|
-
expect(fetchMock.calls[0].body).toEqual({
|
|
100
|
-
name: 'nightly',
|
|
101
|
-
schedule: '0 0 * * * *',
|
|
102
|
-
function_name: 'hello',
|
|
103
|
-
payload: { ok: true },
|
|
104
|
-
})
|
|
105
|
-
expect(fetchMock.calls[1].url).toBe(`${PREFIX}/cron/nightly`)
|
|
106
|
-
})
|
|
107
|
-
})
|
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
2
|
-
import { createClient } from '../src/index'
|
|
3
|
-
|
|
4
|
-
const GATEWAY_URL = 'http://localhost:8080'
|
|
5
|
-
const MGMT_URL = 'http://localhost:8090'
|
|
6
|
-
|
|
7
|
-
describe('Tests d\'intégration du SDK JS en conditions réelles (E2E)', () => {
|
|
8
|
-
let devToken: string
|
|
9
|
-
let projectId: string
|
|
10
|
-
let anonKey: string
|
|
11
|
-
let serviceKey: string
|
|
12
|
-
|
|
13
|
-
// Identifiants développeur console générés dynamiquement
|
|
14
|
-
const runId = Math.random().toString(36).substring(2, 10)
|
|
15
|
-
const devEmail = `integration-dev-${runId}@aurabase.dev`
|
|
16
|
-
const devPassword = 'DevPasswordE2E123!'
|
|
17
|
-
const projectName = `integration-proj-${runId}`
|
|
18
|
-
|
|
19
|
-
// Identifiants utilisateur final
|
|
20
|
-
const endUserEmail = `enduser-${runId}@example.com`
|
|
21
|
-
const endUserPassword = 'EndUserPassword123!'
|
|
22
|
-
const otherUserEmail = `other-${runId}@example.com`
|
|
23
|
-
const otherUserPassword = 'OtherPassword123!'
|
|
24
|
-
|
|
25
|
-
beforeAll(async () => {
|
|
26
|
-
// 1. Enregistrement du développeur sur la console
|
|
27
|
-
const regRes = await fetch(`${MGMT_URL}/v1/control/accounts/register`, {
|
|
28
|
-
method: 'POST',
|
|
29
|
-
headers: { 'Content-Type': 'application/json' },
|
|
30
|
-
body: JSON.stringify({ email: devEmail, password: devPassword }),
|
|
31
|
-
})
|
|
32
|
-
expect(regRes.status).toBe(200)
|
|
33
|
-
const regData = await regRes.json()
|
|
34
|
-
devToken = regData.data.access_token
|
|
35
|
-
expect(devToken).toBeDefined()
|
|
36
|
-
|
|
37
|
-
// 2. Création dynamique d'une organisation
|
|
38
|
-
const orgRes = await fetch(`${MGMT_URL}/v1/control/orgs`, {
|
|
39
|
-
method: 'POST',
|
|
40
|
-
headers: {
|
|
41
|
-
'Authorization': `Bearer ${devToken}`,
|
|
42
|
-
'Content-Type': 'application/json',
|
|
43
|
-
},
|
|
44
|
-
body: JSON.stringify({ name: 'Integration Org', slug: `integration-org-${runId}` }),
|
|
45
|
-
})
|
|
46
|
-
expect(orgRes.status).toBeLessThan(300)
|
|
47
|
-
const orgData = await orgRes.json()
|
|
48
|
-
const orgId = orgData.id
|
|
49
|
-
expect(orgId).toBeDefined()
|
|
50
|
-
|
|
51
|
-
// 3. Création du projet temporaire via l'organisation
|
|
52
|
-
const projRes = await fetch(`${MGMT_URL}/v1/control/orgs/${orgId}/projects`, {
|
|
53
|
-
method: 'POST',
|
|
54
|
-
headers: {
|
|
55
|
-
'Authorization': `Bearer ${devToken}`,
|
|
56
|
-
'Content-Type': 'application/json',
|
|
57
|
-
},
|
|
58
|
-
body: JSON.stringify({ name: projectName, engine: 'postgres', region: 'eu-west-1' }),
|
|
59
|
-
})
|
|
60
|
-
expect(projRes.status).toBe(202) // 202 ACCEPTED
|
|
61
|
-
const projData = await projRes.json()
|
|
62
|
-
projectId = projData.id
|
|
63
|
-
expect(projectId).toBeDefined()
|
|
64
|
-
|
|
65
|
-
// Attente active du provisioning du projet (status = active)
|
|
66
|
-
let active = false
|
|
67
|
-
for (let i = 0; i < 50; i++) {
|
|
68
|
-
const statusRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}`, {
|
|
69
|
-
headers: { 'Authorization': `Bearer ${devToken}` },
|
|
70
|
-
})
|
|
71
|
-
const statusData = await statusRes.json()
|
|
72
|
-
if (statusData && statusData.status === 'active') {
|
|
73
|
-
active = true
|
|
74
|
-
break
|
|
75
|
-
}
|
|
76
|
-
await new Promise((resolve) => setTimeout(resolve, 1500))
|
|
77
|
-
}
|
|
78
|
-
expect(active).toBe(true)
|
|
79
|
-
|
|
80
|
-
// Récupération des clés API initiales (avec retry en cas de KEYS_PENDING / 404)
|
|
81
|
-
let keysRes: Response | null = null
|
|
82
|
-
for (let i = 0; i < 15; i++) {
|
|
83
|
-
keysRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}/initial-keys`, {
|
|
84
|
-
headers: { 'Authorization': `Bearer ${devToken}` },
|
|
85
|
-
})
|
|
86
|
-
if (keysRes.status === 200) {
|
|
87
|
-
break
|
|
88
|
-
}
|
|
89
|
-
await new Promise((resolve) => setTimeout(resolve, 1000))
|
|
90
|
-
}
|
|
91
|
-
expect(keysRes).not.toBeNull()
|
|
92
|
-
expect(keysRes!.status).toBe(200)
|
|
93
|
-
const keysData = await keysRes!.json()
|
|
94
|
-
const keys = keysData.data || keysData
|
|
95
|
-
anonKey = keys.find((k: any) => k.scope === 'anon').key
|
|
96
|
-
serviceKey = keys.find((k: any) => k.scope === 'service_role').key
|
|
97
|
-
expect(anonKey).toBeDefined()
|
|
98
|
-
expect(serviceKey).toBeDefined()
|
|
99
|
-
|
|
100
|
-
// 4. Création de la table 'todos' avec RLS active
|
|
101
|
-
const tableDef = {
|
|
102
|
-
name: 'todos',
|
|
103
|
-
columns: [
|
|
104
|
-
{
|
|
105
|
-
name: 'id',
|
|
106
|
-
col_type: 'uuid',
|
|
107
|
-
nullable: false,
|
|
108
|
-
unique: true,
|
|
109
|
-
default_val: 'gen_random_uuid()',
|
|
110
|
-
references: null
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
name: 'title',
|
|
114
|
-
col_type: 'text',
|
|
115
|
-
nullable: false,
|
|
116
|
-
unique: false,
|
|
117
|
-
default_val: null,
|
|
118
|
-
references: null
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
name: 'completed',
|
|
122
|
-
col_type: 'bool',
|
|
123
|
-
nullable: false,
|
|
124
|
-
unique: false,
|
|
125
|
-
default_val: 'false',
|
|
126
|
-
references: null
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
name: 'owner_id',
|
|
130
|
-
col_type: 'text',
|
|
131
|
-
nullable: false,
|
|
132
|
-
unique: false,
|
|
133
|
-
default_val: null,
|
|
134
|
-
references: null
|
|
135
|
-
}
|
|
136
|
-
],
|
|
137
|
-
primary_key: 'id',
|
|
138
|
-
indexes: [],
|
|
139
|
-
rls_enabled: true,
|
|
140
|
-
realtime_enabled: true
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const tableRes = await fetch(`${MGMT_URL}/v1/db/${projectId}/schema/tables`, {
|
|
144
|
-
method: 'POST',
|
|
145
|
-
headers: {
|
|
146
|
-
'Authorization': `Bearer ${devToken}`,
|
|
147
|
-
'Content-Type': 'application/json',
|
|
148
|
-
},
|
|
149
|
-
body: JSON.stringify(tableDef),
|
|
150
|
-
})
|
|
151
|
-
expect(tableRes.status).toBe(200)
|
|
152
|
-
|
|
153
|
-
// 5. Création de la policy RLS (propriétaire uniquement)
|
|
154
|
-
const policyDef = {
|
|
155
|
-
name: 'todos_owner_policy',
|
|
156
|
-
table: 'todos',
|
|
157
|
-
command: 'ALL',
|
|
158
|
-
using_expr: 'auth.uid()::text = owner_id',
|
|
159
|
-
check_expr: 'auth.uid()::text = owner_id'
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const policyRes = await fetch(`${MGMT_URL}/v1/db/${projectId}/policies`, {
|
|
163
|
-
method: 'POST',
|
|
164
|
-
headers: {
|
|
165
|
-
'Authorization': `Bearer ${devToken}`,
|
|
166
|
-
'Content-Type': 'application/json',
|
|
167
|
-
},
|
|
168
|
-
body: JSON.stringify(policyDef),
|
|
169
|
-
})
|
|
170
|
-
expect(policyRes.status).toBe(200)
|
|
171
|
-
|
|
172
|
-
// 6. Attente de l'indexation PostgREST (statut 200 OK garanti et réponse JSON sous forme de tableau ou de enveloppe data)
|
|
173
|
-
let ready = false
|
|
174
|
-
for (let i = 0; i < 30; i++) {
|
|
175
|
-
const probeRes = await fetch(`${GATEWAY_URL}/v1/db/${projectId}/todos`, {
|
|
176
|
-
headers: { 'apikey': anonKey },
|
|
177
|
-
})
|
|
178
|
-
const status = probeRes.status
|
|
179
|
-
let bodyText = ''
|
|
180
|
-
try {
|
|
181
|
-
bodyText = await probeRes.text()
|
|
182
|
-
} catch (e) {}
|
|
183
|
-
console.log(`[PROBE LOOP ${i}] HTTP STATUS:`, status, 'BODY:', bodyText)
|
|
184
|
-
|
|
185
|
-
// On s'assure que la Gateway ou PostgREST répond avec un succès (soit un tableau [], soit un objet enveloppe {"data":[]})
|
|
186
|
-
if (status === 200 && (bodyText.trim().startsWith('[') || bodyText.includes('"data":'))) {
|
|
187
|
-
ready = true
|
|
188
|
-
break
|
|
189
|
-
}
|
|
190
|
-
await new Promise((resolve) => setTimeout(resolve, 1500))
|
|
191
|
-
}
|
|
192
|
-
expect(ready).toBe(true)
|
|
193
|
-
|
|
194
|
-
// Attendre 3 secondes supplémentaires de sécurité pour garantir la stabilisation complète du cache PostgREST
|
|
195
|
-
await new Promise((resolve) => setTimeout(resolve, 3000))
|
|
196
|
-
}, 50000)
|
|
197
|
-
|
|
198
|
-
afterAll(async () => {
|
|
199
|
-
// Suppression propre du projet de test
|
|
200
|
-
if (projectId && devToken) {
|
|
201
|
-
const delRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}`, {
|
|
202
|
-
method: 'DELETE',
|
|
203
|
-
headers: { 'Authorization': `Bearer ${devToken}` },
|
|
204
|
-
})
|
|
205
|
-
expect(delRes.status).toBe(204) // NO CONTENT
|
|
206
|
-
}
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
it('devrait inscrire et connecter un utilisateur final avec succès', async () => {
|
|
210
|
-
const client = createClient(GATEWAY_URL, projectId, anonKey, {
|
|
211
|
-
auth: { persistSession: false },
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
// Inscription utilisateur principal
|
|
215
|
-
const signUpRes = await client.auth.signUp({
|
|
216
|
-
email: endUserEmail,
|
|
217
|
-
password: endUserPassword,
|
|
218
|
-
})
|
|
219
|
-
expect(signUpRes.error).toBeNull()
|
|
220
|
-
expect(signUpRes.data?.user).toBeDefined()
|
|
221
|
-
expect(signUpRes.data?.user?.email).toBe(endUserEmail)
|
|
222
|
-
|
|
223
|
-
// Inscription du second utilisateur (pour tester l'isolation RLS plus tard)
|
|
224
|
-
const signUpOtherRes = await client.auth.signUp({
|
|
225
|
-
email: otherUserEmail,
|
|
226
|
-
password: otherUserPassword,
|
|
227
|
-
})
|
|
228
|
-
expect(signUpOtherRes.error).toBeNull()
|
|
229
|
-
|
|
230
|
-
// Connexion
|
|
231
|
-
const signInRes = await client.auth.signInWithPassword({
|
|
232
|
-
email: endUserEmail,
|
|
233
|
-
password: endUserPassword,
|
|
234
|
-
})
|
|
235
|
-
expect(signInRes.error).toBeNull()
|
|
236
|
-
expect(signInRes.data?.access_token).toBeDefined()
|
|
237
|
-
|
|
238
|
-
// Récupération de l'utilisateur courant
|
|
239
|
-
const userRes = await client.auth.getUser()
|
|
240
|
-
expect(userRes.error).toBeNull()
|
|
241
|
-
expect(userRes.data?.email).toBe(endUserEmail)
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
it('devrait exécuter des requêtes CRUD avec RLS et valider l\'isolation des données', async () => {
|
|
245
|
-
const client = createClient(GATEWAY_URL, projectId, anonKey, {
|
|
246
|
-
auth: { persistSession: false },
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
// Se connecter en tant qu'utilisateur principal
|
|
250
|
-
await client.auth.signInWithPassword({
|
|
251
|
-
email: endUserEmail,
|
|
252
|
-
password: endUserPassword,
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
const user = (await client.auth.getUser()).data
|
|
256
|
-
expect(user).toBeDefined()
|
|
257
|
-
const userId = user!.id
|
|
258
|
-
|
|
259
|
-
// 1. Insertion de todo
|
|
260
|
-
const insertRes = await client.db.from('todos').insert({
|
|
261
|
-
title: 'Tester le SDK en conditions réelles',
|
|
262
|
-
completed: false,
|
|
263
|
-
owner_id: userId,
|
|
264
|
-
})
|
|
265
|
-
if (insertRes.error) {
|
|
266
|
-
console.log('DEBUG INSERT ERROR DETAIL:', JSON.stringify(insertRes.error, null, 2))
|
|
267
|
-
}
|
|
268
|
-
expect(insertRes.error).toBeNull()
|
|
269
|
-
|
|
270
|
-
// 2. Sélection de todo
|
|
271
|
-
const selectRes = await client.db.from('todos').select('*')
|
|
272
|
-
expect(selectRes.error).toBeNull()
|
|
273
|
-
expect(selectRes.data).toBeInstanceOf(Array)
|
|
274
|
-
expect(selectRes.data!.length).toBe(1)
|
|
275
|
-
expect(selectRes.data![0].title).toBe('Tester le SDK en conditions réelles')
|
|
276
|
-
|
|
277
|
-
const todoId = selectRes.data![0].id
|
|
278
|
-
expect(todoId).toBeDefined()
|
|
279
|
-
|
|
280
|
-
// 3. Vérification de l'isolation RLS : l'accès anonyme (sans JWT) doit retourner 0 lignes
|
|
281
|
-
const anonClient = createClient(GATEWAY_URL, projectId, anonKey, {
|
|
282
|
-
auth: { persistSession: false },
|
|
283
|
-
})
|
|
284
|
-
const anonSelectRes = await anonClient.db.from('todos').select('*')
|
|
285
|
-
expect(anonSelectRes.error).toBeNull()
|
|
286
|
-
expect(anonSelectRes.data).toBeInstanceOf(Array)
|
|
287
|
-
expect(anonSelectRes.data!.length).toBe(0)
|
|
288
|
-
|
|
289
|
-
// 4. Vérification de l'isolation RLS : un autre utilisateur connecté doit obtenir 0 lignes
|
|
290
|
-
const otherClient = createClient(GATEWAY_URL, projectId, anonKey, {
|
|
291
|
-
auth: { persistSession: false },
|
|
292
|
-
})
|
|
293
|
-
await otherClient.auth.signInWithPassword({
|
|
294
|
-
email: otherUserEmail,
|
|
295
|
-
password: otherUserPassword,
|
|
296
|
-
})
|
|
297
|
-
const otherSelectRes = await otherClient.db.from('todos').select('*')
|
|
298
|
-
expect(otherSelectRes.error).toBeNull()
|
|
299
|
-
expect(otherSelectRes.data).toBeInstanceOf(Array)
|
|
300
|
-
expect(otherSelectRes.data!.length).toBe(0)
|
|
301
|
-
|
|
302
|
-
// 5. Mise à jour de todo (l'utilisateur principal modifie son propre todo)
|
|
303
|
-
const updateRes = await client.db.from('todos').update(todoId, {
|
|
304
|
-
completed: true,
|
|
305
|
-
})
|
|
306
|
-
expect(updateRes.error).toBeNull()
|
|
307
|
-
|
|
308
|
-
const selectUpdatedRes = await client.db.from('todos').select('*')
|
|
309
|
-
expect(selectUpdatedRes.data![0].completed).toBe(true)
|
|
310
|
-
|
|
311
|
-
// 6. Suppression de todo
|
|
312
|
-
const deleteRes = await client.db.from('todos').delete(todoId)
|
|
313
|
-
expect(deleteRes.error).toBeNull()
|
|
314
|
-
|
|
315
|
-
const selectDeletedRes = await client.db.from('todos').select('*')
|
|
316
|
-
expect(selectDeletedRes.data!.length).toBe(0)
|
|
317
|
-
})
|
|
318
|
-
|
|
319
|
-
it('devrait exécuter des requêtes SQL brutes et rejeter les requêtes non autorisées', async () => {
|
|
320
|
-
const client = createClient(GATEWAY_URL, projectId, anonKey, {
|
|
321
|
-
auth: { persistSession: false },
|
|
322
|
-
})
|
|
323
|
-
|
|
324
|
-
await client.auth.signInWithPassword({
|
|
325
|
-
email: endUserEmail,
|
|
326
|
-
password: endUserPassword,
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
const user = (await client.auth.getUser()).data
|
|
330
|
-
const userId = user!.id
|
|
331
|
-
|
|
332
|
-
// Insérer un todo temporaire pour la requête SQL
|
|
333
|
-
const sqlInsert = await client.db.from('todos').insert({
|
|
334
|
-
title: 'SQL Todo',
|
|
335
|
-
completed: false,
|
|
336
|
-
owner_id: userId,
|
|
337
|
-
})
|
|
338
|
-
if (sqlInsert.error) {
|
|
339
|
-
console.log('DEBUG SQL INSERT ERROR:', JSON.stringify(sqlInsert.error, null, 2))
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Requête SQL autorisée
|
|
343
|
-
const sqlRes = await client.db.sql<any[]>('SELECT title FROM todos WHERE owner_id = $1', [userId])
|
|
344
|
-
expect(sqlRes.error).toBeNull()
|
|
345
|
-
expect(sqlRes.data).toBeDefined()
|
|
346
|
-
expect(sqlRes.data!.length).toBe(1)
|
|
347
|
-
expect(sqlRes.data![0].title).toBe('SQL Todo')
|
|
348
|
-
|
|
349
|
-
// Requête SQL non autorisée vers pg_catalog (rejetée par l'AST de la gateway)
|
|
350
|
-
const forbiddenSqlRes = await client.db.sql('SELECT * FROM pg_catalog.pg_tables')
|
|
351
|
-
expect(forbiddenSqlRes.error).not.toBeNull()
|
|
352
|
-
expect(forbiddenSqlRes.error?.message).toMatch(/non autorisées|interdit|rejetée|pg_catalog/)
|
|
353
|
-
})
|
|
354
|
-
|
|
355
|
-
it('devrait manipuler le service Storage (buckets et objets) avec succès', async () => {
|
|
356
|
-
// La gestion des buckets (create/delete) exige une clé service_role côté gateway ;
|
|
357
|
-
// ce test valide les méthodes storage du SDK de bout en bout, on utilise donc un
|
|
358
|
-
// client service_role (la RLS storage est testée ailleurs).
|
|
359
|
-
const client = createClient(GATEWAY_URL, projectId, serviceKey, {
|
|
360
|
-
auth: { persistSession: false },
|
|
361
|
-
})
|
|
362
|
-
|
|
363
|
-
const bucketName = `integration-bucket-${runId}`
|
|
364
|
-
const fileName = 'test-file.txt'
|
|
365
|
-
const fileContent = 'Bonjour Aurabase E2E'
|
|
366
|
-
|
|
367
|
-
// 1. Création de bucket
|
|
368
|
-
const bucketCreateRes = await client.storage.createBucket(bucketName, {
|
|
369
|
-
public: true,
|
|
370
|
-
})
|
|
371
|
-
expect(bucketCreateRes.error).toBeNull()
|
|
372
|
-
expect(bucketCreateRes.data?.name).toBe(bucketName)
|
|
373
|
-
|
|
374
|
-
// 2. Téléversement de fichier (upload)
|
|
375
|
-
const blob = new Blob([fileContent], { type: 'text/plain' })
|
|
376
|
-
const uploadRes = await client.storage.upload(bucketName, fileName, blob, {
|
|
377
|
-
contentType: 'text/plain',
|
|
378
|
-
})
|
|
379
|
-
expect(uploadRes.error).toBeNull()
|
|
380
|
-
expect(uploadRes.data?.key).toBeDefined()
|
|
381
|
-
|
|
382
|
-
// `data.key` est déjà relative au bucket (contrat SDK : réutilisable directement).
|
|
383
|
-
// Robuste : strippe un éventuel préfixe bucket si le backend en ajoutait un.
|
|
384
|
-
const uploadedKey = uploadRes.data!.key
|
|
385
|
-
const objectPath = uploadedKey.startsWith(`${bucketName}/`)
|
|
386
|
-
? uploadedKey.slice(bucketName.length + 1)
|
|
387
|
-
: uploadedKey
|
|
388
|
-
expect(objectPath).toBeTruthy()
|
|
389
|
-
|
|
390
|
-
// 3. Récupération des métadonnées
|
|
391
|
-
const metaRes = await client.storage.getMetadata(bucketName, objectPath)
|
|
392
|
-
expect(metaRes.error).toBeNull()
|
|
393
|
-
// Note : `getMetadata` renvoie la clé préfixée du bucket alors qu'`upload` renvoie la clé
|
|
394
|
-
// nue (incohérence de format backend, à harmoniser) → on vérifie l'inclusion, pas l'égalité.
|
|
395
|
-
expect((metaRes.data as any)?.key).toContain(uploadedKey)
|
|
396
|
-
|
|
397
|
-
// 4. Téléchargement et vérification du contenu
|
|
398
|
-
const downloadRes = await client.storage.download(bucketName, objectPath)
|
|
399
|
-
expect(downloadRes.error).toBeNull()
|
|
400
|
-
expect(downloadRes.data).toBeInstanceOf(Blob)
|
|
401
|
-
|
|
402
|
-
const textContent = await downloadRes.data!.text()
|
|
403
|
-
expect(textContent).toBe(fileContent)
|
|
404
|
-
|
|
405
|
-
// 5. Suppression du fichier
|
|
406
|
-
const removeRes = await client.storage.remove(bucketName, [objectPath])
|
|
407
|
-
expect(removeRes.error).toBeNull()
|
|
408
|
-
|
|
409
|
-
// 6. Suppression du bucket
|
|
410
|
-
const bucketDeleteRes = await client.storage.deleteBucket(bucketName)
|
|
411
|
-
expect(bucketDeleteRes.error).toBeNull()
|
|
412
|
-
})
|
|
413
|
-
})
|