insforge 1.2.10 → 1.3.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/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
|
@@ -1,241 +1,241 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# End-to-End test script for Insforge Backend
|
|
4
|
-
|
|
5
|
-
# Get the directory where this script is located
|
|
6
|
-
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
7
|
-
|
|
8
|
-
# Source the test configuration
|
|
9
|
-
source "$SCRIPT_DIR/../test-config.sh"
|
|
10
|
-
|
|
11
|
-
# Test variables
|
|
12
|
-
TEST_EMAIL="${TEST_USER_EMAIL_PREFIX}e2e_$(date +%s)@example.com"
|
|
13
|
-
TEST_PASSWORD="TestPassword123!"
|
|
14
|
-
USER_TOKEN=""
|
|
15
|
-
API_KEY=""
|
|
16
|
-
USER_ID=""
|
|
17
|
-
TEST_TABLE="test_todos_$(date +%s)"
|
|
18
|
-
TEST_BUCKET="test-bucket-$(date +%s)"
|
|
19
|
-
|
|
20
|
-
# Export API_KEY so cleanup can use it
|
|
21
|
-
export ACCESS_API_KEY=""
|
|
22
|
-
|
|
23
|
-
# Register test resources for cleanup
|
|
24
|
-
register_test_user "$TEST_EMAIL"
|
|
25
|
-
register_test_table "$TEST_TABLE"
|
|
26
|
-
register_test_bucket "$TEST_BUCKET"
|
|
27
|
-
|
|
28
|
-
echo "Starting End-to-End Tests for Insforge Backend"
|
|
29
|
-
echo "=================================="
|
|
30
|
-
|
|
31
|
-
# Function to test endpoint
|
|
32
|
-
test_endpoint() {
|
|
33
|
-
local test_name=$1
|
|
34
|
-
local response=$2
|
|
35
|
-
local expected_status=$3
|
|
36
|
-
local actual_status=$(echo "$response" | tail -n 1)
|
|
37
|
-
|
|
38
|
-
if [ "$actual_status" == "$expected_status" ]; then
|
|
39
|
-
print_success "$test_name"
|
|
40
|
-
return 0
|
|
41
|
-
else
|
|
42
|
-
print_fail "$test_name - Expected $expected_status, got $actual_status"
|
|
43
|
-
echo "Response: $(echo "$response" | sed '$d')"
|
|
44
|
-
return 1
|
|
45
|
-
fi
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
# 1. Test Health Check
|
|
49
|
-
print_info "1. Testing Health Check"
|
|
50
|
-
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/health")
|
|
51
|
-
test_endpoint "Health check" "$response" "200"
|
|
52
|
-
|
|
53
|
-
# 2. Test User Registration
|
|
54
|
-
print_info "2. Testing User Registration"
|
|
55
|
-
response_with_code=$(register_user "$TEST_EMAIL" "$TEST_PASSWORD" "Test User" && echo -e "\n201")
|
|
56
|
-
test_endpoint "User registration" "$response_with_code" "201"
|
|
57
|
-
|
|
58
|
-
# Extract token from response
|
|
59
|
-
response=$(echo "$response_with_code" | sed '$d')
|
|
60
|
-
USER_TOKEN=$(echo "$response" | grep -o '"accessToken":"[^"]*' | grep -o '[^"]*$')
|
|
61
|
-
USER_ID=$(echo "$response" | grep -o '"user":{[^}]*' | grep -o '"id":"[^"]*' | grep -o '[^"]*$')
|
|
62
|
-
|
|
63
|
-
if [ -z "$USER_TOKEN" ]; then
|
|
64
|
-
print_fail "Failed to extract user token"
|
|
65
|
-
else
|
|
66
|
-
echo "User ID: $USER_ID"
|
|
67
|
-
echo "Token: ${USER_TOKEN:0:20}..."
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
# 3. Test User Login
|
|
71
|
-
print_info "3. Testing User Login"
|
|
72
|
-
response_with_code=$(login_user "$TEST_EMAIL" "$TEST_PASSWORD" && echo -e "\n200")
|
|
73
|
-
test_endpoint "User login" "$response_with_code" "200"
|
|
74
|
-
|
|
75
|
-
# 4. Test Get Profile (with auth)
|
|
76
|
-
print_info "4. Testing Get Profile"
|
|
77
|
-
response_with_code=$(get_user_profile "$USER_TOKEN" && echo -e "\n200")
|
|
78
|
-
test_endpoint "Get profile" "$response_with_code" "200"
|
|
79
|
-
|
|
80
|
-
# Get admin token for table operations and API key
|
|
81
|
-
admin_token=$(get_admin_token)
|
|
82
|
-
if [ -z "$admin_token" ]; then
|
|
83
|
-
print_fail "Could not get admin token for table operations"
|
|
84
|
-
else
|
|
85
|
-
print_success "Got admin token for table operations"
|
|
86
|
-
fi
|
|
87
|
-
|
|
88
|
-
# 5. Get API Key
|
|
89
|
-
print_info "5. Getting API Key"
|
|
90
|
-
# First try environment variable or docker logs
|
|
91
|
-
API_KEY=$(get_admin_api_key)
|
|
92
|
-
|
|
93
|
-
# If that fails, try to get it via the API endpoint
|
|
94
|
-
if [ -z "$API_KEY" ] && [ -n "$admin_token" ]; then
|
|
95
|
-
api_key_response=$(curl -s "$TEST_API_BASE/metadata/api-key" \
|
|
96
|
-
-H "Authorization: Bearer $admin_token")
|
|
97
|
-
API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
if [ -n "$API_KEY" ]; then
|
|
101
|
-
print_success "Got API key"
|
|
102
|
-
echo "API Key: ${API_KEY:0:20}..."
|
|
103
|
-
# Export for cleanup
|
|
104
|
-
export ACCESS_API_KEY="$API_KEY"
|
|
105
|
-
else
|
|
106
|
-
print_fail "Failed to get API key - remaining tests will be skipped"
|
|
107
|
-
fi
|
|
108
|
-
|
|
109
|
-
# Continue only if we have an API key
|
|
110
|
-
if [ -z "$API_KEY" ]; then
|
|
111
|
-
print_info "Skipping remaining tests - no API key available"
|
|
112
|
-
exit 0
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
# 6. Test Create Table
|
|
116
|
-
print_info "6. Testing Create Table"
|
|
117
|
-
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/tables" \
|
|
118
|
-
-H "Authorization: Bearer $admin_token" \
|
|
119
|
-
-H "Content-Type: application/json" \
|
|
120
|
-
-d "{
|
|
121
|
-
\"tableName\": \"$TEST_TABLE\",
|
|
122
|
-
\"rlsEnabled\": false,
|
|
123
|
-
\"columns\": [
|
|
124
|
-
{\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false},
|
|
125
|
-
{\"columnName\": \"completed\", \"type\": \"boolean\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"false\"},
|
|
126
|
-
{\"columnName\": \"user_id\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
|
|
127
|
-
]
|
|
128
|
-
}")
|
|
129
|
-
test_endpoint "Create table" "$response" "201"
|
|
130
|
-
|
|
131
|
-
# Wait a bit for table creation to propagate
|
|
132
|
-
sleep 1
|
|
133
|
-
|
|
134
|
-
# 7. Test Insert Record
|
|
135
|
-
print_info "7. Testing Insert Record"
|
|
136
|
-
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
137
|
-
-H "Authorization: Bearer $admin_token" \
|
|
138
|
-
-H "Content-Type: application/json" \
|
|
139
|
-
-d "[{
|
|
140
|
-
\"title\": \"Test Todo Item\",
|
|
141
|
-
\"completed\": false,
|
|
142
|
-
\"user_id\": \"$USER_ID\"
|
|
143
|
-
}]")
|
|
144
|
-
test_endpoint "Insert record" "$response" "201"
|
|
145
|
-
|
|
146
|
-
# Extract record ID
|
|
147
|
-
# PostgREST returns an empty array on successful insert, so we need to query the table
|
|
148
|
-
sleep 1 # Give PostgREST time to sync
|
|
149
|
-
query_response=$(curl -s "$TEST_API_BASE/database/records/$TEST_TABLE?limit=1&order=created_at.desc" \
|
|
150
|
-
-H "Authorization: Bearer $admin_token")
|
|
151
|
-
RECORD_ID=$(echo "$query_response" | jq -r '.[0].id' 2>/dev/null || echo "")
|
|
152
|
-
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
|
|
153
|
-
# Try alternative parsing
|
|
154
|
-
RECORD_ID=$(echo "$query_response" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
155
|
-
fi
|
|
156
|
-
echo "Record ID: $RECORD_ID"
|
|
157
|
-
|
|
158
|
-
# 8. Test Get Records
|
|
159
|
-
print_info "8. Testing Get Records"
|
|
160
|
-
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
161
|
-
-H "Authorization: Bearer $admin_token")
|
|
162
|
-
test_endpoint "Get records" "$response" "200"
|
|
163
|
-
|
|
164
|
-
# 9. Test Update Record
|
|
165
|
-
if [ -n "$RECORD_ID" ]; then
|
|
166
|
-
print_info "9. Testing Update Record"
|
|
167
|
-
response=$(curl -s -w "\n%{http_code}" -X PATCH "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
168
|
-
-H "Authorization: Bearer $admin_token" \
|
|
169
|
-
-H "Content-Type: application/json" \
|
|
170
|
-
-d '{
|
|
171
|
-
"completed": true
|
|
172
|
-
}')
|
|
173
|
-
test_endpoint "Update record" "$response" "204"
|
|
174
|
-
else
|
|
175
|
-
print_info "9. Skipping Update Record test - no record ID"
|
|
176
|
-
fi
|
|
177
|
-
|
|
178
|
-
# 10. Test Storage - Create Bucket
|
|
179
|
-
print_info "10. Testing Create Storage Bucket"
|
|
180
|
-
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/storage/buckets" \
|
|
181
|
-
-H "Authorization: Bearer $API_KEY" \
|
|
182
|
-
-H "Content-Type: application/json" \
|
|
183
|
-
-d "{
|
|
184
|
-
\"bucketName\": \"$TEST_BUCKET\",
|
|
185
|
-
\"isPublic\": false
|
|
186
|
-
}")
|
|
187
|
-
test_endpoint "Create bucket" "$response" "201"
|
|
188
|
-
|
|
189
|
-
# 11. Test Upload File
|
|
190
|
-
print_info "11. Testing Upload File"
|
|
191
|
-
echo "Test file content" > /tmp/test-upload.txt
|
|
192
|
-
response=$(curl -s -w "\n%{http_code}" -X PUT "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
193
|
-
-H "Authorization: Bearer $API_KEY" \
|
|
194
|
-
-F "file=@/tmp/test-upload.txt")
|
|
195
|
-
test_endpoint "Upload file" "$response" "201"
|
|
196
|
-
|
|
197
|
-
# 12. Test Download File
|
|
198
|
-
print_info "12. Testing Download File"
|
|
199
|
-
response=$(curl -s -L -w "\n%{http_code}" "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
200
|
-
-H "Authorization: Bearer $API_KEY" \
|
|
201
|
-
-o /tmp/test-download.txt)
|
|
202
|
-
test_endpoint "Download file" "$response" "200"
|
|
203
|
-
|
|
204
|
-
# Verify file content
|
|
205
|
-
if [ -f /tmp/test-download.txt ]; then
|
|
206
|
-
downloaded_content=$(cat /tmp/test-download.txt)
|
|
207
|
-
if [ "$downloaded_content" == "Test file content" ]; then
|
|
208
|
-
print_success "File content verified"
|
|
209
|
-
else
|
|
210
|
-
print_fail "File content mismatch"
|
|
211
|
-
fi
|
|
212
|
-
rm -f /tmp/test-download.txt
|
|
213
|
-
else
|
|
214
|
-
print_fail "Downloaded file not found"
|
|
215
|
-
fi
|
|
216
|
-
|
|
217
|
-
# 13. Test Delete Record
|
|
218
|
-
if [ -n "$RECORD_ID" ]; then
|
|
219
|
-
print_info "13. Testing Delete Record"
|
|
220
|
-
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
221
|
-
-H "Authorization: Bearer $admin_token")
|
|
222
|
-
test_endpoint "Delete record" "$response" "204"
|
|
223
|
-
else
|
|
224
|
-
print_info "13. Skipping Delete Record test - no record ID"
|
|
225
|
-
fi
|
|
226
|
-
|
|
227
|
-
# 14. Test Delete File
|
|
228
|
-
print_info "14. Testing Delete File"
|
|
229
|
-
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
230
|
-
-H "Authorization: Bearer $API_KEY")
|
|
231
|
-
test_endpoint "Delete file" "$response" "200"
|
|
232
|
-
|
|
233
|
-
# Clean up temp files
|
|
234
|
-
rm -f /tmp/test-upload.txt
|
|
235
|
-
|
|
236
|
-
echo ""
|
|
237
|
-
echo "=================================="
|
|
238
|
-
print_success "End-to-End tests completed!"
|
|
239
|
-
echo "=================================="
|
|
240
|
-
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# End-to-End test script for Insforge Backend
|
|
4
|
+
|
|
5
|
+
# Get the directory where this script is located
|
|
6
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
7
|
+
|
|
8
|
+
# Source the test configuration
|
|
9
|
+
source "$SCRIPT_DIR/../test-config.sh"
|
|
10
|
+
|
|
11
|
+
# Test variables
|
|
12
|
+
TEST_EMAIL="${TEST_USER_EMAIL_PREFIX}e2e_$(date +%s)@example.com"
|
|
13
|
+
TEST_PASSWORD="TestPassword123!"
|
|
14
|
+
USER_TOKEN=""
|
|
15
|
+
API_KEY=""
|
|
16
|
+
USER_ID=""
|
|
17
|
+
TEST_TABLE="test_todos_$(date +%s)"
|
|
18
|
+
TEST_BUCKET="test-bucket-$(date +%s)"
|
|
19
|
+
|
|
20
|
+
# Export API_KEY so cleanup can use it
|
|
21
|
+
export ACCESS_API_KEY=""
|
|
22
|
+
|
|
23
|
+
# Register test resources for cleanup
|
|
24
|
+
register_test_user "$TEST_EMAIL"
|
|
25
|
+
register_test_table "$TEST_TABLE"
|
|
26
|
+
register_test_bucket "$TEST_BUCKET"
|
|
27
|
+
|
|
28
|
+
echo "Starting End-to-End Tests for Insforge Backend"
|
|
29
|
+
echo "=================================="
|
|
30
|
+
|
|
31
|
+
# Function to test endpoint
|
|
32
|
+
test_endpoint() {
|
|
33
|
+
local test_name=$1
|
|
34
|
+
local response=$2
|
|
35
|
+
local expected_status=$3
|
|
36
|
+
local actual_status=$(echo "$response" | tail -n 1)
|
|
37
|
+
|
|
38
|
+
if [ "$actual_status" == "$expected_status" ]; then
|
|
39
|
+
print_success "$test_name"
|
|
40
|
+
return 0
|
|
41
|
+
else
|
|
42
|
+
print_fail "$test_name - Expected $expected_status, got $actual_status"
|
|
43
|
+
echo "Response: $(echo "$response" | sed '$d')"
|
|
44
|
+
return 1
|
|
45
|
+
fi
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# 1. Test Health Check
|
|
49
|
+
print_info "1. Testing Health Check"
|
|
50
|
+
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/health")
|
|
51
|
+
test_endpoint "Health check" "$response" "200"
|
|
52
|
+
|
|
53
|
+
# 2. Test User Registration
|
|
54
|
+
print_info "2. Testing User Registration"
|
|
55
|
+
response_with_code=$(register_user "$TEST_EMAIL" "$TEST_PASSWORD" "Test User" && echo -e "\n201")
|
|
56
|
+
test_endpoint "User registration" "$response_with_code" "201"
|
|
57
|
+
|
|
58
|
+
# Extract token from response
|
|
59
|
+
response=$(echo "$response_with_code" | sed '$d')
|
|
60
|
+
USER_TOKEN=$(echo "$response" | grep -o '"accessToken":"[^"]*' | grep -o '[^"]*$')
|
|
61
|
+
USER_ID=$(echo "$response" | grep -o '"user":{[^}]*' | grep -o '"id":"[^"]*' | grep -o '[^"]*$')
|
|
62
|
+
|
|
63
|
+
if [ -z "$USER_TOKEN" ]; then
|
|
64
|
+
print_fail "Failed to extract user token"
|
|
65
|
+
else
|
|
66
|
+
echo "User ID: $USER_ID"
|
|
67
|
+
echo "Token: ${USER_TOKEN:0:20}..."
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# 3. Test User Login
|
|
71
|
+
print_info "3. Testing User Login"
|
|
72
|
+
response_with_code=$(login_user "$TEST_EMAIL" "$TEST_PASSWORD" && echo -e "\n200")
|
|
73
|
+
test_endpoint "User login" "$response_with_code" "200"
|
|
74
|
+
|
|
75
|
+
# 4. Test Get Profile (with auth)
|
|
76
|
+
print_info "4. Testing Get Profile"
|
|
77
|
+
response_with_code=$(get_user_profile "$USER_TOKEN" && echo -e "\n200")
|
|
78
|
+
test_endpoint "Get profile" "$response_with_code" "200"
|
|
79
|
+
|
|
80
|
+
# Get admin token for table operations and API key
|
|
81
|
+
admin_token=$(get_admin_token)
|
|
82
|
+
if [ -z "$admin_token" ]; then
|
|
83
|
+
print_fail "Could not get admin token for table operations"
|
|
84
|
+
else
|
|
85
|
+
print_success "Got admin token for table operations"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# 5. Get API Key
|
|
89
|
+
print_info "5. Getting API Key"
|
|
90
|
+
# First try environment variable or docker logs
|
|
91
|
+
API_KEY=$(get_admin_api_key)
|
|
92
|
+
|
|
93
|
+
# If that fails, try to get it via the API endpoint
|
|
94
|
+
if [ -z "$API_KEY" ] && [ -n "$admin_token" ]; then
|
|
95
|
+
api_key_response=$(curl -s "$TEST_API_BASE/metadata/api-key" \
|
|
96
|
+
-H "Authorization: Bearer $admin_token")
|
|
97
|
+
API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if [ -n "$API_KEY" ]; then
|
|
101
|
+
print_success "Got API key"
|
|
102
|
+
echo "API Key: ${API_KEY:0:20}..."
|
|
103
|
+
# Export for cleanup
|
|
104
|
+
export ACCESS_API_KEY="$API_KEY"
|
|
105
|
+
else
|
|
106
|
+
print_fail "Failed to get API key - remaining tests will be skipped"
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
# Continue only if we have an API key
|
|
110
|
+
if [ -z "$API_KEY" ]; then
|
|
111
|
+
print_info "Skipping remaining tests - no API key available"
|
|
112
|
+
exit 0
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# 6. Test Create Table
|
|
116
|
+
print_info "6. Testing Create Table"
|
|
117
|
+
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/tables" \
|
|
118
|
+
-H "Authorization: Bearer $admin_token" \
|
|
119
|
+
-H "Content-Type: application/json" \
|
|
120
|
+
-d "{
|
|
121
|
+
\"tableName\": \"$TEST_TABLE\",
|
|
122
|
+
\"rlsEnabled\": false,
|
|
123
|
+
\"columns\": [
|
|
124
|
+
{\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false},
|
|
125
|
+
{\"columnName\": \"completed\", \"type\": \"boolean\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"false\"},
|
|
126
|
+
{\"columnName\": \"user_id\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
|
|
127
|
+
]
|
|
128
|
+
}")
|
|
129
|
+
test_endpoint "Create table" "$response" "201"
|
|
130
|
+
|
|
131
|
+
# Wait a bit for table creation to propagate
|
|
132
|
+
sleep 1
|
|
133
|
+
|
|
134
|
+
# 7. Test Insert Record
|
|
135
|
+
print_info "7. Testing Insert Record"
|
|
136
|
+
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
137
|
+
-H "Authorization: Bearer $admin_token" \
|
|
138
|
+
-H "Content-Type: application/json" \
|
|
139
|
+
-d "[{
|
|
140
|
+
\"title\": \"Test Todo Item\",
|
|
141
|
+
\"completed\": false,
|
|
142
|
+
\"user_id\": \"$USER_ID\"
|
|
143
|
+
}]")
|
|
144
|
+
test_endpoint "Insert record" "$response" "201"
|
|
145
|
+
|
|
146
|
+
# Extract record ID
|
|
147
|
+
# PostgREST returns an empty array on successful insert, so we need to query the table
|
|
148
|
+
sleep 1 # Give PostgREST time to sync
|
|
149
|
+
query_response=$(curl -s "$TEST_API_BASE/database/records/$TEST_TABLE?limit=1&order=created_at.desc" \
|
|
150
|
+
-H "Authorization: Bearer $admin_token")
|
|
151
|
+
RECORD_ID=$(echo "$query_response" | jq -r '.[0].id' 2>/dev/null || echo "")
|
|
152
|
+
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
|
|
153
|
+
# Try alternative parsing
|
|
154
|
+
RECORD_ID=$(echo "$query_response" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
155
|
+
fi
|
|
156
|
+
echo "Record ID: $RECORD_ID"
|
|
157
|
+
|
|
158
|
+
# 8. Test Get Records
|
|
159
|
+
print_info "8. Testing Get Records"
|
|
160
|
+
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
161
|
+
-H "Authorization: Bearer $admin_token")
|
|
162
|
+
test_endpoint "Get records" "$response" "200"
|
|
163
|
+
|
|
164
|
+
# 9. Test Update Record
|
|
165
|
+
if [ -n "$RECORD_ID" ]; then
|
|
166
|
+
print_info "9. Testing Update Record"
|
|
167
|
+
response=$(curl -s -w "\n%{http_code}" -X PATCH "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
168
|
+
-H "Authorization: Bearer $admin_token" \
|
|
169
|
+
-H "Content-Type: application/json" \
|
|
170
|
+
-d '{
|
|
171
|
+
"completed": true
|
|
172
|
+
}')
|
|
173
|
+
test_endpoint "Update record" "$response" "204"
|
|
174
|
+
else
|
|
175
|
+
print_info "9. Skipping Update Record test - no record ID"
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
# 10. Test Storage - Create Bucket
|
|
179
|
+
print_info "10. Testing Create Storage Bucket"
|
|
180
|
+
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/storage/buckets" \
|
|
181
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
182
|
+
-H "Content-Type: application/json" \
|
|
183
|
+
-d "{
|
|
184
|
+
\"bucketName\": \"$TEST_BUCKET\",
|
|
185
|
+
\"isPublic\": false
|
|
186
|
+
}")
|
|
187
|
+
test_endpoint "Create bucket" "$response" "201"
|
|
188
|
+
|
|
189
|
+
# 11. Test Upload File
|
|
190
|
+
print_info "11. Testing Upload File"
|
|
191
|
+
echo "Test file content" > /tmp/test-upload.txt
|
|
192
|
+
response=$(curl -s -w "\n%{http_code}" -X PUT "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
193
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
194
|
+
-F "file=@/tmp/test-upload.txt")
|
|
195
|
+
test_endpoint "Upload file" "$response" "201"
|
|
196
|
+
|
|
197
|
+
# 12. Test Download File
|
|
198
|
+
print_info "12. Testing Download File"
|
|
199
|
+
response=$(curl -s -L -w "\n%{http_code}" "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
200
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
201
|
+
-o /tmp/test-download.txt)
|
|
202
|
+
test_endpoint "Download file" "$response" "200"
|
|
203
|
+
|
|
204
|
+
# Verify file content
|
|
205
|
+
if [ -f /tmp/test-download.txt ]; then
|
|
206
|
+
downloaded_content=$(cat /tmp/test-download.txt)
|
|
207
|
+
if [ "$downloaded_content" == "Test file content" ]; then
|
|
208
|
+
print_success "File content verified"
|
|
209
|
+
else
|
|
210
|
+
print_fail "File content mismatch"
|
|
211
|
+
fi
|
|
212
|
+
rm -f /tmp/test-download.txt
|
|
213
|
+
else
|
|
214
|
+
print_fail "Downloaded file not found"
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
# 13. Test Delete Record
|
|
218
|
+
if [ -n "$RECORD_ID" ]; then
|
|
219
|
+
print_info "13. Testing Delete Record"
|
|
220
|
+
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
221
|
+
-H "Authorization: Bearer $admin_token")
|
|
222
|
+
test_endpoint "Delete record" "$response" "204"
|
|
223
|
+
else
|
|
224
|
+
print_info "13. Skipping Delete Record test - no record ID"
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# 14. Test Delete File
|
|
228
|
+
print_info "14. Testing Delete File"
|
|
229
|
+
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
230
|
+
-H "Authorization: Bearer $API_KEY")
|
|
231
|
+
test_endpoint "Delete file" "$response" "200"
|
|
232
|
+
|
|
233
|
+
# Clean up temp files
|
|
234
|
+
rm -f /tmp/test-upload.txt
|
|
235
|
+
|
|
236
|
+
echo ""
|
|
237
|
+
echo "=================================="
|
|
238
|
+
print_success "End-to-End tests completed!"
|
|
239
|
+
echo "=================================="
|
|
240
|
+
|
|
241
241
|
# Note: All test resources will be cleaned up automatically on exit
|