mirror of
https://github.com/larksuite/cli.git
synced 2026-07-06 00:06:28 +08:00
5.6 KiB
5.6 KiB
Apps CLI E2E Coverage
Metrics
- Denominator: 9 leaf commands (all user-visible shortcuts)
- Command coverage: 100% (9/9)
- API dry-run coverage: 100% (7/7 API-backed commands)
- Local E2E coverage: 100% (2/2 local-only commands)
- Live coverage: 1/1 live-capable command (
apps +list); all other commands blocked — see "Blocked" below
Summary
TestAppsCreateDryRun: happy path with--app-type html, all-fields shape, rejection paths (missing name, missing app-type, invalid app-type, legacy uppercaseHTML).--app-typeis a strict lowercase enum (html/full_stack); the CLI does not normalize case — legacy uppercase compatibility is a server concern.TestAppsUpdateDryRun: partial-field PATCH semantics;--app-idand at-least-one-field validation.TestAppsListDryRun: defaultpage_size=20; empty--page-tokenomitted; negative size passed through to server (no client-side bound check);--keyword/--ownership/--app-typepass-through + empty-omission; invalid--ownershipand legacy uppercase--app-typeenum rejection.TestAppsAccessScopeSetDryRun: CLI inputspecific/public/tenant-> server enumRange/All/Tenant;apply_config.approversshape; four mutex rejection paths.TestAppsAccessScopeGetDryRun: URL shape; no body/params on GET;--app-idrequired.TestAppsHTMLPublishDryRun: walker manifest for directory + single file; hidden files intentionally included (design decision); empty dir / missingindex.htmlproduce envelopevalidation_errorfield (dry-run exits 0 advisory, not blocking); both required-flag rejections.TestAppsGitCredentialInitDryRun: URL shape for issuing a Miaoda Git PAT; no body;app_idquery metadata included.TestAppsGitCredentialListLocalE2E: local-only command scans every app storage directory and reports repository URL and status without exposing PAT or expiry details.TestAppsGitCredentialRemoveLocalE2E: local cleanup command removes app-scoped metadata under an isolated config dir.TestAppsListWorkflowAsUser: liveapps +listagainst the service. Fivet.Runproof points — default list (envelopeok:true,data.itemsarray, and when non-empty each item hasapp_id/namewithicon_url/created_atstripped),--page-size 1caps items when the tenant has multiple apps, high-entropy--keywordreturns a well-formed empty list,--ownership mineaccepted,--app-type htmlnever returnsfull_stack. All assertions are tenant-data-independent (empty list is valid); skips viaSkipWithoutUserTokenwhen no user credentials are present.
Blocked (live): every command except apps +list remains without live coverage. Apps has no +delete endpoint (OAPI doc explicitly defers archive/delete), so any create-and-cleanup workflow would leak tenant state. Every read command other than +list requires a --app-id (or a session/release id), and obtaining a real one means creating an app that cannot be cleaned up. A shared per-run fixture app was considered and rejected: with no delete path, each CI run would leave an orphaned app — a real and accumulating drain on Miaoda tenant resources. Only apps +list is read-only AND fixture-independent, so it is the sole live-covered command. Revisit the rest when the server exposes DELETE /apps/{appId}.
Command Table
| Status | Cmd | Type | Testcase | Key parameter shapes | Notes / uncovered reason |
|---|---|---|---|---|---|
| ✓ | apps +create | shortcut | apps_create_dryrun_test.go::TestAppsCreateDryRun | --name, --app-type (required, case-sensitive, html/full_stack), --description, --icon-url |
live blocked: no +delete to clean up |
| ✓ | apps +update | shortcut | apps_update_dryrun_test.go::TestAppsUpdateDryRun | --app-id; at least one of --name/--description |
live blocked: no +delete |
| ✓ | apps +list | shortcut | apps_list_dryrun_test.go::TestAppsListDryRun; apps_list_workflow_test.go::TestAppsListWorkflowAsUser | --keyword; --ownership (enum all/mine/shared); --app-type (enum html/full_stack); --page-size default 20; --page-token cursor |
live covered: read-only, no app_id fixture needed; tenant-data-independent assertions |
| ✓ | apps +access-scope-set | shortcut | apps_access_scope_set_dryrun_test.go::TestAppsAccessScopeSetDryRun | --scope specific/public/tenant; --targets JSON; --apply-enabled --approver; --require-login |
live blocked: needs real open_ids |
| ✓ | apps +access-scope-get | shortcut | apps_access_scope_get_dryrun_test.go::TestAppsAccessScopeGetDryRun | --app-id |
live blocked: depends on +access-scope-set state |
| ✓ | apps +html-publish | shortcut | apps_html_publish_dryrun_test.go::TestAppsHTMLPublishDryRun | --app-id, --path (file or directory containing index.html) |
live blocked: real upload has side effects; no rollback API |
| ✓ | apps +git-credential-init | shortcut | apps_git_credential_dryrun_test.go::TestAppsGitCredentialInitDryRun | --app-id; dry-run GET /open-apis/spark/v1/apps/{app_id}/git_info |
live blocked: issues short-lived repository PAT |
| ✓ | apps +git-credential-list | shortcut | apps_git_credential_local_test.go::TestAppsGitCredentialListLocalE2E | no --app-id; scans all local app storage directories and reports app_id, repository URL, and status without PAT or expiry |
local E2E only: no dry-run API because command is local read only |
| ✓ | apps +git-credential-remove | shortcut | apps_git_credential_local_test.go::TestAppsGitCredentialRemoveLocalE2E | --app-id; deletes local metadata, keychain PAT, and Git config |
local E2E only: no dry-run API because command is local cleanup only |