Files
ginnoir 2fd0677c5f feat: add garden module infrastructure (task 70)
- Add MinIO service to compose.yaml with named volume
- Add generic /api/uploads POST+GET route with auth, 5 MB, image/* guards
- Add src/lib/minio.ts singleton client with ensureBucket helper
- Add garden Drizzle schema: containers, plants, care_logs, care_schedules, species_cache
- Register garden module in src/modules/index.ts and src/lib/db.ts
- Apply migration 0015_garden_schema.sql
- Add MINIO_* and PERENUAL_API_KEY to .env.example
- Add task briefs 70-75 for the full garden feature arc
- Add uploads.spec.ts E2E test (RED → GREEN on route auth guard)
2026-06-01 19:23:19 -05:00

33 lines
1.0 KiB
TypeScript

import { test, expect } from "@playwright/test";
// Run without any stored auth cookies so requests are genuinely unauthenticated
test.use({ storageState: { cookies: [], origins: [] } });
test("POST /api/uploads rejects unauthenticated requests with 401", async ({ request }) => {
const response = await request.post("/api/uploads", {
multipart: {
file: {
name: "test.jpg",
mimeType: "image/jpeg",
buffer: Buffer.from("fake-image-data"),
},
},
});
expect(response.status()).toBe(401);
});
test("POST /api/uploads rejects non-image files with 415", async ({ request }) => {
// Without auth this will be 401, but the route shape is validated
const response = await request.post("/api/uploads", {
multipart: {
file: {
name: "document.pdf",
mimeType: "application/pdf",
buffer: Buffer.from("%PDF-1.4 test"),
},
},
});
// 401 because unauthenticated; 415 once authenticated — both indicate the route exists
expect([401, 415]).toContain(response.status());
});