kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
feat: refactor and WIP add e2e tests
rodzic
d809560257
commit
832862367d
|
@ -0,0 +1,8 @@
|
|||
# ------------------------------------------------------------------------------
|
||||
# This is an example .env file.
|
||||
#
|
||||
# All of these environment vars must be defined either in your environment or in
|
||||
# a local .env file in order to run this project.
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# TODO
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "@agentic/platform-e2e-tests",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"description": "Internal Agentic platform E2E tests.",
|
||||
"author": "Travis Fischer <travis@transitivebullsh.it>",
|
||||
"license": "UNLICENSED",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/transitive-bullshit/agentic-platform.git",
|
||||
"directory": "apps/e2e"
|
||||
},
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"test": "run-s test:*",
|
||||
"test:lint": "eslint .",
|
||||
"test:typecheck": "tsc --noEmit",
|
||||
"test:e2e": "vitest run"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@agentic/platform": "workspace:*",
|
||||
"@agentic/platform-api-client": "workspace:*",
|
||||
"@agentic/platform-fixtures": "workspace:*"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
import 'dotenv/config'
|
||||
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
import { loadAgenticConfig } from '@agentic/platform'
|
||||
import { AgenticApiClient } from '@agentic/platform-api-client'
|
||||
import { describe, expect, test } from 'vitest'
|
||||
|
||||
const fixtures = [
|
||||
'basic-raw-free-ts',
|
||||
'basic-raw-free-json',
|
||||
'pricing-freemium',
|
||||
'pricing-pay-as-you-go',
|
||||
'pricing-3-plans',
|
||||
'pricing-monthly-annual',
|
||||
'pricing-custom-0'
|
||||
]
|
||||
|
||||
const fixturesDir = path.join(
|
||||
fileURLToPath(import.meta.url),
|
||||
'..',
|
||||
'..',
|
||||
'..',
|
||||
'..',
|
||||
'packages',
|
||||
'fixtures'
|
||||
)
|
||||
const validFixturesDir = path.join(fixturesDir, 'valid')
|
||||
console.log(validFixturesDir)
|
||||
|
||||
describe('loadAgenticConfig', () => {
|
||||
for (const fixture of fixtures) {
|
||||
test(
|
||||
`${fixture}`,
|
||||
{
|
||||
timeout: 60_000
|
||||
},
|
||||
async () => {
|
||||
const fixtureDir = path.join(validFixturesDir, fixture)
|
||||
|
||||
const config = await loadAgenticConfig({ cwd: fixtureDir })
|
||||
expect(config).toMatchSnapshot()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
for (const fixture of invalidFixtures) {
|
||||
test(
|
||||
`invalid: ${fixture}`,
|
||||
{
|
||||
timeout: 60_000
|
||||
},
|
||||
async () => {
|
||||
const fixtureDir = path.join(invalidFixturesDir, fixture)
|
||||
|
||||
await expect(
|
||||
loadAgenticConfig({ cwd: fixtureDir })
|
||||
).rejects.toThrowErrorMatchingSnapshot()
|
||||
}
|
||||
)
|
||||
}
|
||||
})
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"extends": "@fisch0920/config/tsconfig-node",
|
||||
"include": ["src", "*.config.ts"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
import { defineConfig } from 'tsup'
|
||||
|
||||
export default defineConfig([
|
||||
{
|
||||
entry: ['src/server.ts'],
|
||||
outDir: 'dist',
|
||||
target: 'node18',
|
||||
platform: 'node',
|
||||
format: ['esm'],
|
||||
splitting: false,
|
||||
sourcemap: true,
|
||||
minify: false,
|
||||
shims: true,
|
||||
dts: true
|
||||
}
|
||||
])
|
|
@ -0,0 +1,12 @@
|
|||
import tsconfigPaths from 'vite-tsconfig-paths'
|
||||
import { defineConfig } from 'vitest/config'
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [tsconfigPaths()],
|
||||
test: {
|
||||
environment: 'node',
|
||||
globals: true,
|
||||
watch: false,
|
||||
restoreMocks: true
|
||||
}
|
||||
})
|
|
@ -38,10 +38,10 @@ export async function getRequestCacheKey(
|
|||
// TODO: gracefully handle content-encoding compression
|
||||
// TODO: more robust content-type detection
|
||||
|
||||
if (type?.includes('json')) {
|
||||
if (type.includes('json')) {
|
||||
const bodyJson: any = await request.clone().json()
|
||||
hash = hashObject(bodyJson)
|
||||
} else if (type?.includes('text/')) {
|
||||
} else if (type.includes('text/')) {
|
||||
const bodyString = await request.clone().text()
|
||||
hash = await sha256(bodyString)
|
||||
} else {
|
||||
|
|
|
@ -20,8 +20,7 @@
|
|||
"scripts": {
|
||||
"test": "run-s test:*",
|
||||
"test:lint": "eslint .",
|
||||
"test:typecheck": "tsc --noEmit",
|
||||
"test:unit": "vitest run"
|
||||
"test:typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@agentic/platform": "workspace:*",
|
||||
|
@ -39,11 +38,9 @@
|
|||
"open": "catalog:",
|
||||
"ora": "catalog:",
|
||||
"restore-cursor": "catalog:",
|
||||
"semver": "catalog:",
|
||||
"unconfig": "catalog:"
|
||||
"semver": "catalog:"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@agentic/platform-fixtures": "workspace:*",
|
||||
"@commander-js/extra-typings": "catalog:",
|
||||
"@types/semver": "catalog:"
|
||||
},
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import { loadAgenticConfig } from '@agentic/platform'
|
||||
import { Command } from 'commander'
|
||||
import { oraPromise } from 'ora'
|
||||
|
||||
import type { Context } from '../types'
|
||||
import { AuthStore } from '../lib/auth-store'
|
||||
import { loadAgenticConfig } from '../lib/load-agentic-config'
|
||||
|
||||
export function registerDebugCommand({ program, logger }: Context) {
|
||||
const command = new Command('debug')
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import { loadAgenticConfig } from '@agentic/platform'
|
||||
import { Command } from 'commander'
|
||||
import { oraPromise } from 'ora'
|
||||
|
||||
import type { Context } from '../types'
|
||||
import { AuthStore } from '../lib/auth-store'
|
||||
import { loadAgenticConfig } from '../lib/load-agentic-config'
|
||||
|
||||
export function registerDeployCommand({ client, program, logger }: Context) {
|
||||
const command = new Command('deploy')
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import type { AgenticApiClient } from '@agentic/platform-api-client'
|
||||
import type { Deployment } from '@agentic/platform-types'
|
||||
import { loadAgenticConfig } from '@agentic/platform'
|
||||
|
||||
import { AuthStore } from './auth-store'
|
||||
import { loadAgenticConfig } from './load-agentic-config'
|
||||
|
||||
export async function resolveDeployment({
|
||||
client,
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
"scripts": {
|
||||
"test": "run-s test:*",
|
||||
"test:lint": "eslint .",
|
||||
"test:typecheck": "tsc --noEmit"
|
||||
"test:typecheck": "tsc --noEmit",
|
||||
"test:unit": "vitest run"
|
||||
},
|
||||
"dependencies": {
|
||||
"@agentic/platform-core": "workspace:*",
|
||||
|
@ -29,6 +30,7 @@
|
|||
"@hono/zod-openapi": "catalog:",
|
||||
"@modelcontextprotocol/sdk": "catalog:",
|
||||
"semver": "catalog:",
|
||||
"unconfig": "catalog:",
|
||||
"zod": "catalog:"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
export * from './define-config'
|
||||
export * from './load-agentic-config'
|
||||
export * from './resolve-agentic-project-config'
|
||||
export * from './validate-agentic-project-config'
|
||||
export { defaultFreePricingPlan } from '@agentic/platform-types'
|
||||
|
|
|
@ -39,7 +39,6 @@ const fixturesDir = path.join(
|
|||
'..',
|
||||
'..',
|
||||
'..',
|
||||
'..',
|
||||
'fixtures'
|
||||
)
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
import type { AgenticProjectConfig } from '@agentic/platform-types'
|
||||
import { validateAgenticProjectConfig } from '@agentic/platform'
|
||||
import { loadConfig } from 'unconfig'
|
||||
|
||||
import { validateAgenticProjectConfig } from './validate-agentic-project-config'
|
||||
|
||||
export async function loadAgenticConfig({
|
||||
cwd
|
||||
}: {
|
|
@ -7,10 +7,10 @@ import {
|
|||
resolvedAgenticProjectConfigSchema
|
||||
} from '@agentic/platform-types'
|
||||
|
||||
// NOTE: The extra typing and cast here are necessary because we're
|
||||
// overriding the default zod types for some fields (e.g. `pricingPlans`) in
|
||||
// order to get stricter TypeScript types than what zod v3 allows (nested
|
||||
// discrimianted unions). This should be removed once we upgrade to zod v4.
|
||||
// NOTE: The extra typing and casts here are necessary because we're overriding
|
||||
// the default zod types for some fields (e.g. `pricingPlans`) in order to get
|
||||
// stricter TypeScript types than what zod v3 allows (nested discrimianted
|
||||
// unions). We should consider removing these once we upgrade to zod v4.
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
@ -20,7 +20,7 @@ export function parseAgenticProjectConfig(
|
|||
{ strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {}
|
||||
): AgenticProjectConfig {
|
||||
return parseZodSchema<
|
||||
z.infer<typeof agenticProjectConfigSchema>,
|
||||
z.output<typeof agenticProjectConfigSchema>,
|
||||
ZodTypeDef,
|
||||
z.input<typeof agenticProjectConfigSchema>
|
||||
>(
|
||||
|
@ -41,7 +41,7 @@ export function parseResolvedAgenticProjectConfig(
|
|||
{ strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {}
|
||||
): ResolvedAgenticProjectConfig {
|
||||
return parseZodSchema<
|
||||
z.infer<typeof resolvedAgenticProjectConfigSchema>,
|
||||
z.output<typeof resolvedAgenticProjectConfigSchema>,
|
||||
ZodTypeDef,
|
||||
z.input<typeof resolvedAgenticProjectConfigSchema>
|
||||
>(
|
||||
|
|
|
@ -343,6 +343,18 @@ importers:
|
|||
specifier: 'catalog:'
|
||||
version: 0.43.1(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(kysely@0.28.2)(postgres@3.4.7)
|
||||
|
||||
apps/e2e:
|
||||
devDependencies:
|
||||
'@agentic/platform':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/platform
|
||||
'@agentic/platform-api-client':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/api-client
|
||||
'@agentic/platform-fixtures':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/fixtures
|
||||
|
||||
apps/gateway:
|
||||
dependencies:
|
||||
'@agentic/platform':
|
||||
|
@ -451,13 +463,7 @@ importers:
|
|||
semver:
|
||||
specifier: 'catalog:'
|
||||
version: 7.7.2
|
||||
unconfig:
|
||||
specifier: 'catalog:'
|
||||
version: 7.3.2
|
||||
devDependencies:
|
||||
'@agentic/platform-fixtures':
|
||||
specifier: workspace:*
|
||||
version: link:../fixtures
|
||||
'@commander-js/extra-typings':
|
||||
specifier: 'catalog:'
|
||||
version: 14.0.0(commander@14.0.0)
|
||||
|
@ -538,6 +544,9 @@ importers:
|
|||
semver:
|
||||
specifier: 'catalog:'
|
||||
version: 7.7.2
|
||||
unconfig:
|
||||
specifier: 'catalog:'
|
||||
version: 7.3.2
|
||||
zod:
|
||||
specifier: 'catalog:'
|
||||
version: 3.25.36
|
||||
|
|
|
@ -51,6 +51,8 @@
|
|||
- add support for caching
|
||||
- add support for custom headers on responses
|
||||
- signed requests
|
||||
- revisit deployment identifiers so possibly be URL-friendly?
|
||||
- rename parseFaasIdentifier and move validators package into platform-types
|
||||
|
||||
## License
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue