# REST API Coverage Implementation Report

Agent: `rest_api_group1`

Date: 2026-03-21

## Postman Requests Mapped (9)

These requests were previously reported as unmapped postman-to-catalog debt and are now mapped via `tests/contract/rest_api/catalog.yaml` plus live contract tests:

1. `GET /services/data/v63.0/sobjects/ContentVersion/:CONTENT_VERSION_ID/VersionData` — `REST / SObject / Download file`
2. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME` — `REST / SObject / SObject Basic Information`
3. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/deleted` — `REST / SObject / SObject Get Deleted`
4. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/updated` — `REST / SObject / SObject Get Updated`
5. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/:FIELD_NAME/:FIELD_VALUE` — `REST / SObject / SObject Rows by External ID`
6. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/:RECORD_ID/:BLOB_FIELD` — `REST / SObject / SObject Blob Retrieve`
7. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/:RECORD_ID/richTextImageFields/:FIELD_NAME/:CONTENT_REFERENCE_ID` — `REST / SObject / SObject Rich Text Image Retrieve`
8. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/:RECORD_ID/:RELATIONSHIP_FIELD_NAME` — `REST / SObject / SObject Relationships`
9. `GET /services/data/v63.0/sobjects/:SOBJECT_API_NAME/suggestedArticles` — `REST / SObject / SObject Suggested Articles`

## Catalog Endpoints Added / Updated

Updated in `tests/contract/rest_api/catalog.yaml` (category: `sObjects`):

- Added:
  - `GET /services/data/v63.0/sobjects/{sobject}` (`sObject Basic Information`) → `sobjects/get_sobject_basic_info_test.go`
  - `GET /services/data/v63.0/sobjects/{sobject}/deleted` (`sObject Get Deleted`) → `sobjects/get_sobject_deleted_test.go`
  - `GET /services/data/v63.0/sobjects/{sobject}/updated` (`sObject Get Updated`) → `sobjects/get_sobject_updated_test.go`
  - `GET /services/data/v63.0/sobjects/{sobject}/{id}/{field}` (`sObject Field Subresource`) → `sobjects/get_sobject_field_subresource_test.go`
  - `GET /services/data/v63.0/sobjects/ContentVersion/{id}/VersionData` (`Download File`) → `sobjects/get_sobject_field_subresource_test.go`
  - `GET /services/data/v63.0/sobjects/{sobject}/{id}/richTextImageFields/{fieldName}/{contentReferenceId}` (`sObject Rich Text Image Retrieve`) → `sobjects/get_sobject_rich_text_image_retrieve_test.go`
  - `GET /services/data/v63.0/sobjects/{sobject}/suggestedArticles` (`sObject Suggested Articles`) → `sobjects/get_sobject_suggested_articles_test.go`
- Updated:
  - External ID endpoints: `GET|PATCH /services/data/v63.0/sobjects/{sobject}/{fieldName}/{fieldValue}` (removed incorrect `/external/...` segment) → existing external-id tests updated accordingly.

## Test Scenarios Implemented

- `tests/contract/rest_api/sobjects/get_sobject_basic_info_test.go`
  - Success: `GET /sobjects/Account` returns `objectDescribe` + `recentItems`
  - Error: unknown sObject → `NOT_FOUND`
  - Error: anonymous request → `INVALID_SESSION_ID`

- `tests/contract/rest_api/sobjects/get_sobject_deleted_test.go`
  - Success: create + delete `Account`, then `GET /sobjects/Account/deleted?start=&end=` includes deleted id
  - Error: unknown sObject → `NOT_FOUND`
  - Error: anonymous request → `INVALID_SESSION_ID`

- `tests/contract/rest_api/sobjects/get_sobject_updated_test.go`
  - Success: create + patch `Account`, then `GET /sobjects/Account/updated?start=&end=` includes updated id
  - Error: unknown sObject → `NOT_FOUND`
  - Error: anonymous request → `INVALID_SESSION_ID`

- `tests/contract/rest_api/sobjects/get_sobject_field_subresource_test.go`
  - Relationship: create `Account` + `Contact`, then `GET /sobjects/Account/{id}/Contacts` includes child record
  - Blob: if `ContentVersion` is available, create `ContentVersion` and fetch `VersionData` bytes via `GET /sobjects/ContentVersion/{id}/VersionData`

- `tests/contract/rest_api/sobjects/get_sobject_rich_text_image_retrieve_test.go`
  - Error: unknown sObject → `NOT_FOUND`
  - Error: anonymous request → `INVALID_SESSION_ID`

- `tests/contract/rest_api/sobjects/get_sobject_suggested_articles_test.go`
  - Success (when supported): `GET /sobjects/Case/suggestedArticles?...` returns `200` JSON
  - Skip (org-dependent): `404/403` treated as feature-unavailable
  - Error: anonymous request → `INVALID_SESSION_ID`

## Postman Normalization

- `tests/contract/rest_api/rest_api.postman_collection.json`: normalized `Download file` to use `v{{version}}` and `:CONTENT_VERSION_ID` so it can map to the cataloged endpoint.

## Test Execution Results

- Compile-only verification (no live HTTP assertions): `cd tests/contract && go test -p 1 ./rest_api/... -run '^$' -count=1` ✅

## Coverage Metrics

- Postman-to-catalog mapping debt: `67` → `58` unmapped requests (−9)
- Catalog endpoint count: `48` → `55` endpoints (+7)

## Remaining Gaps / Issues

- Live verification requires a reachable target (`CONTRACT_TARGET=local` with a running backend at `http://127.0.0.1:3001`, or `CONTRACT_TARGET=sandbox` with a valid `tests/contract/sandbox.yaml`).
- `ContentVersion` coverage is exercised opportunistically (skips blob assertions if the object/route is unavailable).

