mirror of
https://github.com/makeplane/plane.git
synced 2026-06-13 19:19:54 +00:00
9f77ea5ebb
* chore(api): add docker compose test runner
Adds docker-compose-test.yml at the repo root that boots an isolated
postgres / valkey / rabbitmq / minio stack with health checks and tmpfs
data dirs, then runs pytest against it and exits. Includes a usage doc
under apps/api/tests/RUNNING_TESTS.md and a pointer in AGENTS.md.
Prereq: ./setup.sh (generates apps/api/.env).
Usage:
docker compose -f docker-compose-test.yml up --build \
--abort-on-container-exit --exit-code-from api-tests
docker compose -f docker-compose-test.yml down -v
* fix(api): correct bugs surfaced by the pytest suite
Five small bugs caught by enabling the pytest contract suite end-to-end.
Each is independently justifiable:
- api/serializers/cycle.py + api/views/cycle.py: CycleCreateSerializer.validate
required project_id in the request body, but the view only ever passes
it through the URL kwarg. Cycle create/update via the public API was
returning 400 "Project ID is required". Read project_id from
serializer context (passed by the view) in addition to body/instance.
- app/views/api.py: ApiTokenEndpoint.get(pk) and patch(pk) did not filter
out is_service=True tokens, so a user could read and modify service
tokens through the user token endpoint. The list mode and delete
already filter is_service=False; aligned the other two.
- bgtasks/work_item_link_task.py: validate_url_ip checked hostname before
scheme, so file:///etc/passwd raised "No hostname found" instead of
the documented "Only HTTP and HTTPS" error. Swapped the order so the
scheme guard matches the docstring intent.
- utils/path_validator.py: get_allowed_hosts used `WEB_URL or APP_BASE_URL`
so when both are configured to different hosts (the standard local
setup: WEB_URL=:8000, APP_BASE_URL=:3000), only one was added to the
allow-list. Redirects to APP_BASE_URL then had their next_path stripped
because the host wasn't allowed. Include every configured base URL.
* chore(api): align pytest tests with current behavior, clear warnings
Test-side fixes paired with the product fixes in the previous commit, plus
deprecation cleanup that drops the test run from 104 warnings to 0.
Tests:
- tests/contract/api/test_cycles.py: project fixture sets cycle_view=True;
the Project model defaults the flag to False, so cycle create/update
always tripped "Cycles are not enabled for this project".
- tests/contract/app/test_authentication.py: next_path uses "/workspaces"
(validate_next_path rejects values without a leading slash and returns
empty, which dropped the path from the redirect URL).
- tests/unit/bg_tasks/test_copy_s3_objects.py: mocked sync_with_external_service
now returns description_json; the task unconditionally writes the value
back to the Issue, and Issue.description_json is NOT NULL on UPDATE.
- tests/unit/utils/test_url.py: three length-limit tests placed the URL at
char 970+ on a single line, which contains_url truncates away as ReDoS
defense (500-char per-line cap). Restructured to keep test intent intact
while staying inside the per-line window.
Warning cleanup (104 → 0):
- settings/common.py: removed USE_L10N=True (deprecated in Django 4.0,
removed in 5.0; default is True).
- celery.py, settings/local.py, settings/production.py: pythonjsonlogger
moved jsonlogger → json; update the import / formatter path.
37 lines
1.8 KiB
Markdown
37 lines
1.8 KiB
Markdown
# Agent Development Guide
|
|
|
|
## Commands
|
|
|
|
- `pnpm dev` - Start all dev servers (web:3000, admin:3001)
|
|
- `pnpm build` - Build all packages and apps
|
|
- `pnpm check` - Run all checks (format, lint, types)
|
|
- `pnpm check:lint` - OxLint across all packages
|
|
- `pnpm check:types` - TypeScript type checking
|
|
- `pnpm fix` - Auto-fix format and lint issues
|
|
- `pnpm turbo run <command> --filter=<package>` - Target specific package/app
|
|
- `pnpm --filter=@plane/ui storybook` - Start Storybook on port 6006
|
|
|
|
## Code Style
|
|
|
|
- **Imports**: Use `workspace:*` for internal packages, `catalog:` for external deps
|
|
- **TypeScript**: Strict mode enabled, all files must be typed
|
|
- **Formatting**: oxfmt, run `pnpm fix:format`
|
|
- **Linting**: OxLint with shared `.oxlintrc.json` config
|
|
- **Naming**: camelCase for variables/functions, PascalCase for components/types
|
|
- **Error Handling**: Use try-catch with proper error types, log errors appropriately
|
|
- **State Management**: MobX stores in `packages/shared-state`, reactive patterns
|
|
- **Testing**: All features require unit tests, use existing test framework per package
|
|
- **Components**: Build in `@plane/ui` with Storybook for isolated development
|
|
|
|
## Backend tests (Docker)
|
|
|
|
The Django/pytest suite for `apps/api` runs in an isolated stack defined by `docker-compose-test.yml` at the repo root.
|
|
|
|
Prereq (once): `./setup.sh` — generates `apps/api/.env` from `.env.example`.
|
|
|
|
- Full suite: `docker compose -f docker-compose-test.yml up --build --abort-on-container-exit --exit-code-from api-tests`
|
|
- Subset: `docker compose -f docker-compose-test.yml run --rm api-tests pytest -m unit`
|
|
- Teardown: `docker compose -f docker-compose-test.yml down -v`
|
|
|
|
See `apps/api/tests/RUNNING_TESTS.md` for the full walkthrough and troubleshooting; see `apps/api/tests/TESTING_GUIDE.md` for test conventions and fixtures.
|