Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
512 changes: 512 additions & 0 deletions .plans/spec-sdk-tests/01-ci-cd-integration.md

Large diffs are not rendered by default.

732 changes: 732 additions & 0 deletions .plans/spec-sdk-tests/02-coverage-reporting.md

Large diffs are not rendered by default.

408 changes: 408 additions & 0 deletions .plans/spec-sdk-tests/03-contributing-docs.md

Large diffs are not rendered by default.

475 changes: 475 additions & 0 deletions .plans/spec-sdk-tests/04-implementation-order.md

Large diffs are not rendered by default.

94 changes: 94 additions & 0 deletions .plans/spec-sdk-tests/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# OpenAPI Validation Test Suite - Implementation Plans

This directory contains detailed planning documents for the next phases of the OpenAPI validation test suite project.

## Current State (Completed)

- ✅ **Test Suite**: 147 comprehensive tests across 8 destination types
- ✅ **Test Results**: 129 passing tests (87.8% pass rate)
- ✅ **Coverage**: All destination types tested (Webhook, AWS SQS, RabbitMQ, Azure Service Bus, AWS S3, Hookdeck, AWS Kinesis, GCP Pub/Sub)
- ✅ **Documentation**: `TEST_STATUS.md` with detailed results and analysis
- ✅ **Issue Tracking**: 3 GitHub issues created for backend improvements
- ✅ **Test Infrastructure**: Factory pattern, SDK client utilities, comprehensive test suite

## Next Phases

This plan directory outlines the roadmap for enhancing the test suite with production-ready features:

### 1. [CI/CD Integration](./01-ci-cd-integration.md)
Automate test execution in GitHub Actions to ensure continuous validation of API endpoints against the OpenAPI specification.

**Key Outcomes:**
- Automated test runs on PRs and commits
- Docker-based test environment
- Test status badges
- Failure notifications

### 2. [Coverage Reporting](./02-coverage-reporting.md)
Track and visualize which OpenAPI endpoints are tested, identify gaps, and enforce coverage thresholds.

**Key Outcomes:**
- Automated coverage reports
- Visual coverage dashboards
- Coverage trend tracking
- Minimum coverage enforcement

### 3. [Contributing Documentation](./03-contributing-docs.md)
Provide clear guidelines for developers to add new tests and understand the testing architecture.

**Key Outcomes:**
- Updated CONTRIBUTING.md
- Test development guide
- Factory pattern documentation
- Development workflow examples

### 4. [Implementation Order](./04-implementation-order.md)
Recommended sequence for implementing the above phases with effort estimates and success criteria.

**Key Outcomes:**
- Prioritized roadmap
- Dependency mapping
- Effort estimates
- Success metrics

## Plan Structure

Each planning document follows this structure:

1. **Overview** - Purpose and goals
2. **Requirements** - Specific needs and constraints
3. **Technical Approach** - Implementation details
4. **Examples** - Code snippets and configurations
5. **Acceptance Criteria** - Definition of done
6. **Dependencies** - Related systems and prerequisites
7. **Risks & Considerations** - Potential challenges

## How to Use These Plans

1. **Review** - Read through each plan to understand the scope
2. **Prioritize** - Use `04-implementation-order.md` to sequence work
3. **Implement** - Follow the technical approaches and examples
4. **Validate** - Check against acceptance criteria
5. **Iterate** - Update plans based on learnings

## Related Documentation

- [`/spec-sdk-tests/README.md`](../../spec-sdk-tests/README.md) - Test suite documentation
- [`/spec-sdk-tests/TEST_STATUS.md`](../../spec-sdk-tests/TEST_STATUS.md) - Current test results
- [`/docs/apis/openapi.yaml`](../../docs/apis/openapi.yaml) - OpenAPI specification
- [`/CONTRIBUTING.md`](../../CONTRIBUTING.md) - General contribution guidelines

## Feedback and Updates

These plans are living documents. As implementation progresses:

- Update plans with new learnings
- Add implementation notes
- Document deviations from original plan
- Capture best practices discovered

---

**Last Updated**: 2025-10-12
**Status**: Ready for implementation
**Owner**: Engineering Team
13 changes: 6 additions & 7 deletions .speakeasy/workflow.lock
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
speakeasyVersion: 1.609.0
speakeasyVersion: 1.636.3
sources:
Outpost API:
sourceNamespace: outpost-api
sourceRevisionDigest: sha256:e09cf02de047cf6d007545274c477e2a90c561074b9de170d844d9ab9ffbbca6
sourceBlobDigest: sha256:c405cfc4f2de092323a9dd68a09f7c08b563d363bce7463fc8b426d10acacf99
sourceRevisionDigest: sha256:2fd0f3a228f7804a077a738eea8bdd8d0238c799b5d0c699113ab5b982c9c3f4
sourceBlobDigest: sha256:84ea2c33aa27fd52d26243b2be5d1acdafc8b7c3c737f678cffdc62bbcac8c58
tags:
- latest
- speakeasy-sdk-regen-1756922597
- 0.0.1
targets:
outpost-go:
Expand All @@ -26,10 +25,10 @@ targets:
outpost-ts:
source: Outpost API
sourceNamespace: outpost-api
sourceRevisionDigest: sha256:e09cf02de047cf6d007545274c477e2a90c561074b9de170d844d9ab9ffbbca6
sourceBlobDigest: sha256:c405cfc4f2de092323a9dd68a09f7c08b563d363bce7463fc8b426d10acacf99
sourceRevisionDigest: sha256:2fd0f3a228f7804a077a738eea8bdd8d0238c799b5d0c699113ab5b982c9c3f4
sourceBlobDigest: sha256:84ea2c33aa27fd52d26243b2be5d1acdafc8b7c3c737f678cffdc62bbcac8c58
codeSamplesNamespace: outpost-api-typescript-code-samples
codeSamplesRevisionDigest: sha256:b1155400f3addb67547999bf99f4eb4f009470ab62329d57488f78843ff6f9b6
codeSamplesRevisionDigest: sha256:d4eca43f53a3683f444aa9e98cc59cee0fbe9bfc00696753e1f9587b0955f9ab
workflow:
workflowVersion: 1.0.0
speakeasyVersion: latest
Expand Down
2 changes: 1 addition & 1 deletion docs/apis/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ components:
key_template:
type: string
description: JMESPath expression for generating S3 object keys. Default is join('', [time.rfc3339_nano, '_', metadata."event-id", '.json']).
example: "join('/', [time.year, time.month, time.day, metadata.\"event-id\", '.json'])"
example: 'join(''/'', [time.year, time.month, time.day, metadata."event-id", ''.json''])'
storage_class:
type: string
description: The storage class for the S3 objects (e.g., STANDARD, INTELLIGENT_TIERING, GLACIER, etc.). Defaults to "STANDARD".
Expand Down
30 changes: 20 additions & 10 deletions sdks/outpost-typescript/.speakeasy/gen.lock
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
lockVersion: 2.0.0
id: edb58086-83b9-45a3-9095-52bf57a11009
management:
docChecksum: f88900fa0dfdee97044181ff0fbb5027
docChecksum: 5ba70e6fd5c38bf6938a020a3ee4e211
docVersion: 0.0.1
speakeasyVersion: 1.609.0
generationVersion: 2.692.0
releaseVersion: 0.4.0
configChecksum: 261fce5d39cf94a38cacbbd5e21d37f2
speakeasyVersion: 1.636.3
generationVersion: 2.723.11
releaseVersion: 0.5.1
configChecksum: f68ee8655bbd6462d87583a682258f8b
repoURL: https://github.com/hookdeck/outpost.git
repoSubDirectory: sdks/outpost-typescript
installationURL: https://gitpkg.now.sh/hookdeck/outpost/sdks/outpost-typescript
Expand All @@ -16,11 +16,11 @@ features:
additionalDependencies: 0.1.0
additionalProperties: 0.1.1
constsAndDefaults: 0.1.12
core: 3.21.22
core: 3.21.26
defaultEnabledRetries: 0.1.0
enumUnions: 0.1.0
envVarSecurityUsage: 0.1.2
globalSecurity: 2.82.13
globalSecurity: 2.82.14
globalSecurityCallbacks: 0.1.0
globalServerURLs: 2.82.5
globals: 2.82.2
Expand All @@ -31,7 +31,7 @@ features:
responseFormat: 0.2.3
retries: 2.83.0
sdkHooks: 0.3.0
unions: 2.85.11
unions: 2.86.0
generatedFiles:
- .gitattributes
- .npmignore
Expand Down Expand Up @@ -66,12 +66,16 @@ generatedFiles:
- docs/models/components/destinationcreateawssqstype.md
- docs/models/components/destinationcreateazureservicebus.md
- docs/models/components/destinationcreateazureservicebustype.md
- docs/models/components/destinationcreategcppubsub.md
- docs/models/components/destinationcreategcppubsubtype.md
- docs/models/components/destinationcreatehookdeck.md
- docs/models/components/destinationcreatehookdecktype.md
- docs/models/components/destinationcreaterabbitmq.md
- docs/models/components/destinationcreaterabbitmqtype.md
- docs/models/components/destinationcreatewebhook.md
- docs/models/components/destinationcreatewebhooktype.md
- docs/models/components/destinationgcppubsub.md
- docs/models/components/destinationgcppubsubtype.md
- docs/models/components/destinationhookdeck.md
- docs/models/components/destinationhookdecktype.md
- docs/models/components/destinationrabbitmq.md
Expand All @@ -83,12 +87,15 @@ generatedFiles:
- docs/models/components/destinationupdateawskinesis.md
- docs/models/components/destinationupdateawss3.md
- docs/models/components/destinationupdateawssqs.md
- docs/models/components/destinationupdategcppubsub.md
- docs/models/components/destinationupdatehookdeck.md
- docs/models/components/destinationupdaterabbitmq.md
- docs/models/components/destinationupdatewebhook.md
- docs/models/components/destinationwebhook.md
- docs/models/components/destinationwebhooktype.md
- docs/models/components/event.md
- docs/models/components/gcppubsubconfig.md
- docs/models/components/gcppubsubcredentials.md
- docs/models/components/hookdeckcredentials.md
- docs/models/components/portalredirect.md
- docs/models/components/publishrequest.md
Expand Down Expand Up @@ -173,7 +180,6 @@ generatedFiles:
- docs/sdks/destinations/README.md
- docs/sdks/events/README.md
- docs/sdks/health/README.md
- docs/sdks/outpost/README.md
- docs/sdks/publish/README.md
- docs/sdks/schemas/README.md
- docs/sdks/tenants/README.md
Expand Down Expand Up @@ -289,9 +295,11 @@ generatedFiles:
- src/models/components/destinationcreateawss3.ts
- src/models/components/destinationcreateawssqs.ts
- src/models/components/destinationcreateazureservicebus.ts
- src/models/components/destinationcreategcppubsub.ts
- src/models/components/destinationcreatehookdeck.ts
- src/models/components/destinationcreaterabbitmq.ts
- src/models/components/destinationcreatewebhook.ts
- src/models/components/destinationgcppubsub.ts
- src/models/components/destinationhookdeck.ts
- src/models/components/destinationrabbitmq.ts
- src/models/components/destinationschemafield.ts
Expand All @@ -300,11 +308,14 @@ generatedFiles:
- src/models/components/destinationupdateawskinesis.ts
- src/models/components/destinationupdateawss3.ts
- src/models/components/destinationupdateawssqs.ts
- src/models/components/destinationupdategcppubsub.ts
- src/models/components/destinationupdatehookdeck.ts
- src/models/components/destinationupdaterabbitmq.ts
- src/models/components/destinationupdatewebhook.ts
- src/models/components/destinationwebhook.ts
- src/models/components/event.ts
- src/models/components/gcppubsubconfig.ts
- src/models/components/gcppubsubcredentials.ts
- src/models/components/hookdeckcredentials.ts
- src/models/components/index.ts
- src/models/components/portalredirect.ts
Expand Down Expand Up @@ -654,4 +665,3 @@ examples:
application/json: {}
examplesVersion: 1.0.2
generatedTests: {}
releaseNotes: "## Typescript SDK Changes Detected:\n* `outpost.events.list()`: \n * `request` **Changed**\n * `response` **Changed** **Breaking** :warning:\n* `outpost.events.listByDestination()`: \n * `request` **Changed**\n * `response` **Changed** **Breaking** :warning:\n* `outpost.destinations.list()`: \n * `request.type` **Changed**\n * `response.[].[awsS3]` **Added**\n* `outpost.destinations.create()`: \n * `request.destinationCreate.[awsS3]` **Added**\n * `response.[aws_s3]` **Added**\n* `outpost.destinations.get()`: `response.[aws_s3]` **Added**\n* `outpost.destinations.update()`: \n * `request.destinationUpdate.[destinationUpdateAwss3]` **Added**\n * `response.[destination].[awsS3]` **Added**\n* `outpost.destinations.enable()`: `response.[aws_s3]` **Added**\n* `outpost.destinations.disable()`: `response.[aws_s3]` **Added**\n* `outpost.schemas.get()`: \n * `request.type` **Changed**\n* `outpost.schemas.getDestinationTypeJwt()`: \n * `request.type` **Changed**\n"
6 changes: 5 additions & 1 deletion sdks/outpost-typescript/.speakeasy/gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ generation:
auth:
oAuth2ClientCredentialsEnabled: true
oAuth2PasswordEnabled: true
hoistGlobalSecurity: true
tests:
generateTests: true
generateNewTests: false
skipResponseBodyAssertions: false
typescript:
version: 0.4.0
version: 0.5.1
acceptHeaderEnum: true
additionalDependencies:
dependencies: {}
devDependencies: {}
Expand Down Expand Up @@ -51,10 +53,12 @@ typescript:
jsonpath: rfc9535
maxMethodParams: 0
methodArguments: require-security-and-request
modelPropertyCasing: camel
moduleFormat: dual
outputModelSuffix: output
packageName: '@hookdeck/outpost-sdk'
responseFormat: flat
sseFlatResponse: false
templateVersion: v2
usageSDKInitImports: []
useIndexModules: true
8 changes: 2 additions & 6 deletions sdks/outpost-typescript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,7 @@ bun add @hookdeck/outpost-sdk
### Yarn

```bash
yarn add @hookdeck/outpost-sdk zod

# Note that Yarn does not install peer dependencies automatically. You will need
# to install zod as shown above.
yarn add @hookdeck/outpost-sdk
```

> [!NOTE]
Expand Down Expand Up @@ -251,7 +248,6 @@ run();

* [check](docs/sdks/health/README.md#check) - Health Check


### [publish](docs/sdks/publish/README.md)

* [event](docs/sdks/publish/README.md#event) - Publish Event
Expand Down Expand Up @@ -602,7 +598,7 @@ httpClient.addHook("requestError", (error, request) => {
console.groupEnd();
});

const sdk = new Outpost({ httpClient });
const sdk = new Outpost({ httpClient: httpClient });
```
<!-- End Custom HTTP Client [http-client] -->

Expand Down
12 changes: 6 additions & 6 deletions sdks/outpost-typescript/RUNTIMES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

This SDK is intended to be used in JavaScript runtimes that support ECMAScript 2020 or newer. The SDK uses the following features:

* [Web Fetch API][web-fetch]
* [Web Streams API][web-streams] and in particular `ReadableStream`
* [Async iterables][async-iter] using `Symbol.asyncIterator`
- [Web Fetch API][web-fetch]
- [Web Streams API][web-streams] and in particular `ReadableStream`
- [Async iterables][async-iter] using `Symbol.asyncIterator`

[web-fetch]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
[web-streams]: https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
Expand All @@ -25,7 +25,7 @@ Runtime environments that are explicitly supported are:

The following `tsconfig.json` options are recommended for projects using this
SDK in order to get static type support for features like async iterables,
streams and `fetch`-related APIs ([`for await...of`][for-await-of],
streams and `fetch`-related APIs ([`for await...of`][for-await-of],
[`AbortSignal`][abort-signal], [`Request`][request], [`Response`][response] and
so on):

Expand All @@ -38,11 +38,11 @@ so on):
{
"compilerOptions": {
"target": "es2020", // or higher
"lib": ["es2020", "dom", "dom.iterable"],
"lib": ["es2020", "dom", "dom.iterable"]
}
}
```

While `target` can be set to older ECMAScript versions, it may result in extra,
unnecessary compatibility code being generated if you are not targeting old
runtimes.
runtimes.
4 changes: 2 additions & 2 deletions sdks/outpost-typescript/docs/models/components/awss3config.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ let value: Awss3Config = {
bucket: "my-bucket",
region: "us-east-1",
keyTemplate:
"join('/', [time.year, time.month, time.day, metadata.`\"event-id\"`, '.json'])",
"join('/', [time.year, time.month, time.day, metadata.\"event-id\", '.json'])",
storageClass: "STANDARD",
};
```
Expand All @@ -20,5 +20,5 @@ let value: Awss3Config = {
| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `bucket` | *string* | :heavy_check_mark: | The name of your AWS S3 bucket. | my-bucket |
| `region` | *string* | :heavy_check_mark: | The AWS region where your bucket is located. | us-east-1 |
| `keyTemplate` | *string* | :heavy_minus_sign: | JMESPath expression for generating S3 object keys. Default is join('', [time.rfc3339_nano, '_', metadata."event-id", '.json']). | join('/', [time.year, time.month, time.day, metadata.`"event-id"`, '.json']) |
| `keyTemplate` | *string* | :heavy_minus_sign: | JMESPath expression for generating S3 object keys. Default is join('', [time.rfc3339_nano, '_', metadata."event-id", '.json']). | join('/', [time.year, time.month, time.day, metadata."event-id", '.json']) |
| `storageClass` | *string* | :heavy_minus_sign: | The storage class for the S3 objects (e.g., STANDARD, INTELLIGENT_TIERING, GLACIER, etc.). Defaults to "STANDARD". | STANDARD |
23 changes: 23 additions & 0 deletions sdks/outpost-typescript/docs/models/components/destination.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,26 @@ const value: components.DestinationAwss3 = {
};
```

### `components.DestinationGCPPubSub`

```typescript
const value: components.DestinationGCPPubSub = {
id: "des_gcp_pubsub_123",
type: "gcp_pubsub",
topics: [
"order.created",
"order.updated",
],
disabledAt: null,
createdAt: new Date("2024-03-10T14:30:00Z"),
config: {
projectId: "my-project-123",
topic: "events-topic",
},
credentials: {
serviceAccountJson:
"{\"type\":\"service_account\",\"project_id\":\"my-project-123\",...}",
},
};
```

Loading
Loading