Skip to content

Commit befe0ca

Browse files
committed
ci: add integration tests
1 parent 6e1e2d3 commit befe0ca

3 files changed

Lines changed: 477 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,74 @@ jobs:
7272
- uses: Swatinem/rust-cache@v2
7373
- run: cargo install cargo-audit
7474
- run: cargo audit
75+
76+
integration:
77+
name: Integration Tests
78+
runs-on: ubuntu-latest
79+
permissions:
80+
id-token: write
81+
steps:
82+
- uses: actions/checkout@v4
83+
84+
- uses: actions/setup-node@v4
85+
with:
86+
node-version: "lts/*"
87+
88+
- uses: dtolnay/rust-toolchain@v1
89+
with:
90+
toolchain: stable
91+
targets: wasm32-unknown-unknown
92+
- uses: Swatinem/rust-cache@v2
93+
94+
- name: Start MinIO
95+
run: |
96+
docker run -d --name minio \
97+
-p 9000:9000 \
98+
-e MINIO_ROOT_USER=minioadmin \
99+
-e MINIO_ROOT_PASSWORD=minioadmin \
100+
minio/minio:latest server /data
101+
102+
# Wait for MinIO to be ready
103+
for i in $(seq 1 30); do
104+
if curl -sf http://localhost:9000/minio/health/live > /dev/null 2>&1; then
105+
echo "MinIO is ready"
106+
break
107+
fi
108+
sleep 1
109+
done
110+
111+
- name: Seed MinIO buckets
112+
run: |
113+
curl -sSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
114+
chmod +x /usr/local/bin/mc
115+
116+
mc alias set local http://localhost:9000 minioadmin minioadmin
117+
mc mb --ignore-existing local/public-data
118+
mc mb --ignore-existing local/private-uploads
119+
mc anonymous set download local/public-data
120+
echo "Hello from s3-proxy!" | mc pipe local/public-data/hello.txt
121+
echo '{"status":"ok"}' | mc pipe local/public-data/health.json
122+
echo "Secret payload" | mc pipe local/private-uploads/docs/secret.txt
123+
124+
- name: Write .dev.vars
125+
run: |
126+
echo "SESSION_TOKEN_KEY=$(openssl rand -base64 32)" > examples/cf-workers/.dev.vars
127+
128+
- name: Start wrangler dev
129+
working-directory: examples/cf-workers
130+
run: |
131+
npx wrangler dev --config wrangler.integration.toml --port 8787 &
132+
133+
# Wait for wrangler to be ready
134+
for i in $(seq 1 60); do
135+
if curl -so /dev/null http://localhost:8787/ 2>/dev/null; then
136+
echo "Wrangler dev is ready"
137+
break
138+
fi
139+
sleep 2
140+
done
141+
142+
- uses: astral-sh/setup-uv@v5
143+
144+
- name: Run integration tests
145+
run: uvx --with pytest,boto3,requests pytest tests/integration/ -v
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# CI integration-test config — CF Workers + local MinIO
2+
# Based on wrangler.toml but trimmed to MinIO-only buckets.
3+
4+
compatibility_date = "2024-11-11"
5+
main = "build/worker/shim.mjs"
6+
name = "multistore"
7+
8+
[build]
9+
command = "cargo install worker-build && worker-build --release"
10+
11+
[vars]
12+
VIRTUAL_HOST_DOMAIN = "s3.local"
13+
14+
[vars.PROXY_CONFIG]
15+
16+
# --- Buckets (MinIO only) ---
17+
18+
[[vars.PROXY_CONFIG.buckets]]
19+
allowed_roles = ["github-actions"]
20+
anonymous_access = true
21+
backend_type = "s3"
22+
name = "public-data"
23+
24+
[vars.PROXY_CONFIG.buckets.backend_options]
25+
access_key_id = "minioadmin"
26+
bucket_name = "public-data"
27+
endpoint = "http://localhost:9000"
28+
region = "us-east-1"
29+
secret_access_key = "minioadmin"
30+
31+
[[vars.PROXY_CONFIG.buckets]]
32+
allowed_roles = ["github-actions"]
33+
anonymous_access = false
34+
backend_type = "s3"
35+
name = "private-uploads"
36+
37+
[vars.PROXY_CONFIG.buckets.backend_options]
38+
access_key_id = "minioadmin"
39+
bucket_name = "private-uploads"
40+
endpoint = "http://localhost:9000"
41+
region = "us-east-1"
42+
secret_access_key = "minioadmin"
43+
44+
# --- Static credentials ---
45+
46+
[[vars.PROXY_CONFIG.credentials]]
47+
access_key_id = "AKTEST000000000001"
48+
created_at = "2024-01-01T00:00:00Z"
49+
enabled = true
50+
principal_name = "integration-test-user"
51+
secret_access_key = "testSecretKey00000000000000000001"
52+
53+
[[vars.PROXY_CONFIG.credentials.allowed_scopes]]
54+
actions = ["get_object", "head_object", "put_object", "delete_object", "list_bucket"]
55+
bucket = "public-data"
56+
prefixes = []
57+
58+
[[vars.PROXY_CONFIG.credentials.allowed_scopes]]
59+
actions = ["get_object", "head_object", "put_object", "delete_object", "list_bucket"]
60+
bucket = "private-uploads"
61+
prefixes = []
62+
63+
# --- Roles ---
64+
65+
[[vars.PROXY_CONFIG.roles]]
66+
max_session_duration_secs = 3600
67+
name = "GitHub Actions"
68+
role_id = "github-actions"
69+
subject_conditions = ["*"]
70+
trusted_oidc_issuers = [
71+
"https://token.actions.githubusercontent.com",
72+
]
73+
74+
[[vars.PROXY_CONFIG.roles.allowed_scopes]]
75+
actions = ["get_object", "head_object", "put_object", "delete_object", "list_bucket"]
76+
bucket = "public-data"
77+
prefixes = []
78+
79+
[[vars.PROXY_CONFIG.roles.allowed_scopes]]
80+
actions = ["get_object", "head_object", "put_object", "delete_object", "list_bucket"]
81+
bucket = "private-uploads"
82+
prefixes = []
83+
84+
[[vars.PROXY_CONFIG.roles]]
85+
max_session_duration_secs = 3600
86+
name = "GitHub Actions (No Access)"
87+
role_id = "github-actions-no-access"
88+
subject_conditions = ["*"]
89+
trusted_oidc_issuers = [
90+
"https://token.actions.githubusercontent.com",
91+
]
92+
93+
# --- Rate limiting bindings (required by wrangler dev) ---
94+
95+
[[ratelimits]]
96+
name = "ANON_RATE_LIMITER"
97+
namespace_id = "1001"
98+
[ratelimits.simple]
99+
limit = 200
100+
period = 10
101+
102+
[[ratelimits]]
103+
name = "AUTH_RATE_LIMITER"
104+
namespace_id = "1002"
105+
[ratelimits.simple]
106+
limit = 1_000
107+
period = 10
108+
109+
# --- Bandwidth metering ---
110+
111+
[vars.BANDWIDTH_QUOTAS]
112+
public-data = { limit_bytes = 2_147_483_648, window_secs = 300 }
113+
114+
[[durable_objects.bindings]]
115+
name = "BANDWIDTH_METER"
116+
class_name = "BandwidthMeter"
117+
118+
[[migrations]]
119+
tag = "v1"
120+
new_sqlite_classes = ["BandwidthMeter"]

0 commit comments

Comments
 (0)