Aller au contenu principal

Référence API

Référence du lanceur de tests par lots, du moteur de scénarios, de la configuration, des assertions et des rapports de @powerduck/openapi-cli. Les exports ci-dessous sont accessibles depuis la racine du paquet.

Vue d’ensemble des exports​

ExportNatureDescription
runTestsfonctionExécuter les opérations collectées et renvoyer un TestReport
resolveConfigfonctionRésoudre un CliConfig à partir des arguments, du fichier et des valeurs par défaut
loadSpecfonction asynchroneCharger une spécification locale ou distante et résoudre ses références
isRemoteSpecfonctionVérifier si le chemin commence par http(s)://
DEFAULT_CONFIGconstanteValeurs par défaut intégrées
runDeclarativeAssertionsfonctionÉvaluer un tableau de DeclarativeAssertion sur une réponse
extractAssertionsfonctionExtraire les assertions déclaratives x-tests d’une opération
extractPostmanScriptsfonctionExtraire la chaîne du script de test Postman d’une opération
resolveJsonPathfonctionRésolveur JSONPath minimal : notation pointée et indices de tableau
generateJsonReportfonctionÉcrire report.json sur disque et renvoyer son chemin
generateCliReportfonctionConstruire le rapport CLI coloré sans l’afficher
printCliReportfonctionAfficher le rapport CLI sur la sortie standard et renvoyer la chaîne
generateHtmlReportfonctionÉcrire report.html sur disque et renvoyer son chemin
CliArgstypeStructure d’entrée de la résolution CLI/configuration
DeclarativeAssertiontypeObjet d’assertion déclarative
CliConfigtypeInterface de configuration centrale
TestReporttypeRapport complet renvoyé par runTests
TestResulttypeRésultat du test d’une opération
TestSummarytypeTotaux de réussite et d’échec
AssertionResulttypeRésultat d’une assertion
ReportFormattype"json" | "cli" | "html"
ProtocolNametype"http" | "sse" | "websocket" | "graphql" | "grpc" | "mcp"
TestStatustype"passed" | "failed" | "skipped" | "error"
AuthConfigtypeConfiguration de l’authentification
TlsConfigtypeConfiguration TLS et certificats
FilterConfigtypeFiltre d’opérations
collectOperationsfonctionCollecter les opérations en appliquant le filtre des tests par lots
executeStepfonction asynchroneExécuter une opération avec des options propres à l’étape
buildSummaryfonctionCalculer les totaux et le taux de réussite
formatAssertionErrorfonctionConvertir une erreur d’assertion en texte lisible
buildImplicitAssertionsfonctionConstruire les assertions par défaut propres au protocole
runScenariofonction asynchroneExécuter des étapes ordonnées avec variables partagées et itérations fondées sur des données
resolveStepsfonctionRésoudre toutes les références du scénario avant d’envoyer les requêtes
applyExtractsfonctionExtraire des valeurs de réponse dans des variables textuelles
stepReffonctionNormaliser une référence d’étape
ScenarioDefinition, ScenarioStep, ScenarioStepRequest, ScenarioExtracttypesDéfinitions d’entrée et d’extraction des scénarios
ScenarioStatus, ScenarioStepResult, ScenarioEvent, ScenarioEventType, ScenarioReport, RunScenarioOptionstypesRésultats, événements en direct et options d’exécution des scénarios

runTests​

runTests(config: CliConfig): Promise<TestReport>

Charge la spécification avec loadSpec, collecte les opérations selon config.filter, les exécute avec une concurrence limitée à min(config.concurrency ?? 5, queue.length), puis évalue les assertions déclaratives et Postman. En l’absence d’assertions utilisateur, ajoute les assertions implicites du protocole. Trie les résultats par chemin puis méthode et renvoie un TestReport.

Structure du TestReport renvoyé :

interface TestReport {
summary: TestSummary;
results: TestResult[];
config: CliConfig;
generatedAt: string; // ISO timestamp
version: string; // runner version string
}

resolveConfig​

resolveConfig(args: CliArgs): CliConfig

Fusionne args (options CLI), un éventuel fichier JSON args.config et DEFAULT_CONFIG. Charge le envFile résolu s’il existe, puis développe les références ${ENV_VAR} dans serverUrl, proxy, les valeurs des en-têtes, auth.token et les valeurs des variables. Lève "No OpenAPI spec path provided..." sans spécification, ou Invalid proxy URL: <url> si proxy ne peut pas être analysé.

CliArgs reprend les options CLI :

interface CliArgs {
spec?: string;
server?: string;
output?: string;
format?: string;
method?: string;
path?: string;
tag?: string;
operationId?: string;
concurrency?: number;
timeout?: number;
proxy?: string;
ca?: string;
cert?: string;
key?: string;
insecure?: boolean;
header?: string[];
bearer?: string;
variable?: string[];
config?: string;
env?: string;
failOnError?: boolean;
grpcReflection?: boolean;
grpcProto?: string[];
mcpTransport?: string;
mcpCommand?: string;
mcpArgs?: string;
mcpCwd?: string;
}

loadSpec​

loadSpec(config: CliConfig): Promise<unknown>

Lit config.specPath. Si isRemoteSpec est vrai, récupère le document via HTTP(S), avec au plus 5 redirections, config.timeout et User-Agent: @powerduck/openapi-cli ; sinon lit le fichier local. Le contenu JSON doit être un objet contenant un objet paths. Les références internes $ref sont ensuite résolues dans la mesure du possible ; en cas d’échec, la spécification reste intacte.

isRemoteSpec​

isRemoteSpec(specPath: string): boolean

Renvoie true si specPath, débarrassé des espaces aux extrémités, correspond à /^https?:\/\//i.

DEFAULT_CONFIG​

const DEFAULT_CONFIG = {
outputDir: "./openapi-cli-report",
formats: ["json", "cli", "html"],
concurrency: 5,
timeout: 30000,
failOnError: true,
grpcReflection: true,
mcpTransport: "streamable-http",
};

Moteur d’assertions​

runDeclarativeAssertions​

runDeclarativeAssertions(
assertions: DeclarativeAssertion[],
ctx: { status?: number; headers?: Record<string,string>; body?: unknown; bodyText?: string; durationMs: number },
): AssertionResult[]

Évalue chaque assertion déclarative sur le contexte de réponse. Les erreurs d’évaluation sont enregistrées comme un AssertionResult en échec.

extractAssertions​

extractAssertions(operation: any, pathItem?: any): DeclarativeAssertion[]

Collecte les tableaux x-tests de l’élément de chemin puis de l’opération. Seuls les objets possédant à la fois name et assert sont conservés.

extractPostmanScripts​

extractPostmanScripts(operation: any): string | undefined

Renvoie la chaîne operation["x-postman-scripts"].test si elle existe.

resolveJsonPath​

resolveJsonPath(obj: unknown, path: string): unknown

Résolveur minimal prenant en charge les préfixes $. ou $, la notation pointée et les indices numériques, par exemple $.data.items[0].id. Renvoie undefined si un segment n’existe pas.

DeclarativeAssertion​

interface DeclarativeAssertion {
name: string;
assert: "status" | "header" | "bodyContains" | "jsonPath" | "responseTime" | "bodyEquals";
value?: number; // assert=status
key?: string; // assert=header
contains?: string; // assert=header / bodyContains
path?: string; // assert=jsonPath
equals?: unknown; // assert=jsonPath
exists?: boolean; // assert=jsonPath
max?: number; // assert=responseTime
body?: string; // assert=bodyEquals
}

Générateurs de rapports​

generateJsonReport​

generateJsonReport(report: TestReport, outputDir: string): string

Le rapport peut contenir des en-têtes et corps de requête, des variables et des paramètres d’authentification. Masquez les valeurs sensibles avant de le partager ou de l’enregistrer.

Crée outputDir récursivement, écrit report.json avec JSON.stringify(report, null, 2) et renvoie le chemin absolu.

generateCliReport​

generateCliReport(report: TestReport): string

Construit, sans l’afficher, une chaîne de rapport CLI colorée par séquences ANSI : en-tête, résumé, progression, lignes de résultat et détails des assertions.

printCliReport​

printCliReport(report: TestReport): string

Appelle generateCliReport, affiche le résultat avec console.log et renvoie la chaîne.

generateHtmlReport​

generateHtmlReport(report: TestReport, outputDir: string): string

Crée outputDir et écrit un report.html autonome avec résumé, progression, filtres, lignes dépliables et modes clair/sombre. Renvoie le chemin du fichier.

Types de résultats​

TestResult​

interface TestResult {
operationId: string;
path: string;
method: string;
protocol: ProtocolName | string;
status: TestStatus;
durationMs: number;
request?: {
method?: string;
url?: string;
headers?: Record<string, string>;
body?: unknown;
target?: string;
};
response?: {
status?: number;
statusText?: string;
contentType?: string;
sizeBytes?: number;
body?: unknown;
text?: string;
headers?: Record<string, string>;
events?: unknown[];
streaming?: boolean;
};
assertions?: AssertionResult[];
error?: string;
timestamp: string;
}

TestSummary​

interface TestSummary {
total: number;
passed: number;
failed: number;
errors: number;
skipped: number;
durationMs: number;
passRate: number; // rounded to one decimal
}

AssertionResult​

interface AssertionResult {
name: string;
passed: boolean;
error?: string;
}

Moteur de scénarios​

runScenario​

runScenario(definition: ScenarioDefinition, options: RunScenarioOptions): Promise<ScenarioReport>

Exécute les étapes dans l’ordre avec une portée de variables partagée par itération. Toutes les références sont résolues avant l’exécution ; le filtre des tests par lots est ignoré, ce qui permet de viser toute opération de la spécification. Les variables sont initialisées depuis la configuration et le scénario ; les valeurs extraites servent aux étapes suivantes. stopOnFailure vaut true par défaut. options.signal annule l’exécution et les étapes restantes sont marquées comme ignorées. Les exceptions des écouteurs onEvent n’interrompent pas l’exécution.

Le data du scénario exécute toute la séquence avec une portée neuve pour chaque ligne. iterations peut demander des répétitions supplémentaires ; le nombre effectif est le maximum entre le nombre déclaré et le nombre de lignes, limité à 1000. Le request.data d’une étape répète cette étape ; seules les extractions de la dernière exécution restent dans la portée partagée.

Types de scénarios​

Les déclarations suivantes décrivent les entrées et sorties. ScenarioDataRow et ScenarioIterations sont des structures auxiliaires présentées pour clarifier l’ensemble ; ce ne sont pas des exports nommés de la racine. Leurs structures sont accessibles à travers les interfaces publiques.

import type { RequestValues } from "@powerduck/openapi-request";

interface ScenarioExtract {
name: string;
from: "body" | "header" | "status";
path?: string;
key?: string;
}

type ScenarioDataRow = Record<string, string>;

interface ScenarioStepRequest {
values?: RequestValues;
serverUrl?: string;
extract?: ScenarioExtract[];
assertions?: DeclarativeAssertion[];
data?: ScenarioDataRow[];
}

interface ScenarioStep {
ref?: string;
method?: string;
path?: string;
name?: string;
request?: ScenarioStepRequest;
skip?: boolean;
}

interface ScenarioDefinition {
name: string;
description?: string;
steps: ScenarioStep[];
variables?: Record<string, string>;
stopOnFailure?: boolean;
data?: ScenarioDataRow[];
iterations?: number;
}

type ScenarioStatus = "passed" | "failed" | "error" | "cancelled";

interface ScenarioStepResult extends TestResult {
index: number;
ref: string;
name?: string;
scenarioIteration?: number;
scenarioIterations?: number;
stepIteration?: number;
stepIterations?: number;
extracted?: Record<string, string>;
variablesAfter?: Record<string, string>;
notRun?: boolean;
notRunReason?: string;
}

type ScenarioEventType =
| "scenario:start"
| "step:start"
| "step:finish"
| "step:skip"
| "scenario:finish"
| "scenario:cancel";

interface ScenarioEvent {
type: ScenarioEventType;
scenario: string;
stepIndex?: number;
step?: ScenarioStepResult;
status?: ScenarioStatus;
message?: string;
scenarioIteration?: number;
scenarioIterations?: number;
stepIteration?: number;
stepIterations?: number;
}

interface ScenarioIterations {
scenarioCount: number;
stepCounts: number[];
}

interface ScenarioReport {
name: string;
description?: string;
status: ScenarioStatus;
summary: TestSummary;
steps: ScenarioStepResult[];
variables: Record<string, string>;
iterations?: ScenarioIterations;
config: CliConfig;
startedAt: string;
durationMs: number;
generatedAt: string;
version: string;
}

interface RunScenarioOptions {
config: CliConfig;
spec?: unknown;
onEvent?: (event: ScenarioEvent) => void;
signal?: AbortSignal;
}

stepRef et resolveSteps​

stepRef(step: ScenarioStep): string
resolveSteps(definition: ScenarioDefinition, operations: OperationInfo[]): ResolvedStep[]

stepRef privilégie les champs explicites method et path, sinon normalise ref tout en conservant un operationId seul. resolveSteps renvoie des entrées contenant step, op et le ref normalisé. Une référence introuvable provoque une exception, même pour une étape ignorée.

applyExtracts​

applyExtracts(extracts: ScenarioExtract[] | undefined, response: TestResult["response"]): Record<string, string>

Lit les valeurs du corps par JSONPath, les en-têtes sans tenir compte de la casse, ou le statut de réponse. Les valeurs absentes et nulles sont omises ; les autres sont converties en chaînes, les objets étant sérialisés en JSON.

Fonctions auxiliaires du lanceur​

Les signatures utilisent des types auxiliaires qui ne sont pas des exports nommés de la racine. Déduisez-les des fonctions publiques plutôt que d’importer des fichiers internes :

import { collectOperations, executeStep, resolveSteps } from "@powerduck/openapi-cli";

type OperationInfo = ReturnType<typeof collectOperations>[number];
type StepExecutionOptions = Parameters<typeof executeStep>[2];
type StepExecution = Awaited<ReturnType<typeof executeStep>>;
type ResolvedStep = ReturnType<typeof resolveSteps>[number];

collectOperations​

collectOperations(spec: any, config: CliConfig): OperationInfo[]

Collecte les opérations standard et supplémentaires, attribue un operationId de repli, déduit le protocole et applique config.filter. Chaque entrée contient path, method, operation, pathItem, operationId et protocol.

executeStep​

executeStep(client: ReturnType<typeof createClient>, op: OperationInfo, options: StepExecutionOptions): Promise<StepExecution>

Le client vient de createClient dans @powerduck/openapi-request. Les options exigent config et spec, avec signal, variables, values, serverUrl et extraAssertions facultatifs. Le retour contient result, la response normalisée, un request facultatif et la portée de variables env produite par les scripts. Les tests par lots et les scénarios partagent cette exécution.

buildSummary​

buildSummary(results: TestResult[], durationMs: number): TestSummary

Compte les résultats réussis, échoués, en erreur et ignorés. Le taux est le nombre de réussites divisé par le total, arrondi à une décimale ; il vaut zéro pour un ensemble vide.

formatAssertionError​

formatAssertionError(error: unknown): string | undefined

Extrait un message lisible d’une chaîne, d’un Error ou des champs message ou msg, puis se rabat sur la sérialisation. Une entrée falsy donne undefined.

buildImplicitAssertions​

buildImplicitAssertions(protocol: string, response: TestResult["response"]): AssertionResult[]

Construit les contrôles de la section Assertions implicites. Les protocoles inconnus ne produisent aucun contrôle implicite.

Assertions implicites​

Lorsqu’une opération ne définit ni x-tests ni script Postman, le lanceur ajoute une assertion implicite propre au protocole :

ProtocoleContrôle implicite
http, sseStatut HTTP 2xx
graphqlStatut HTTP 2xx et absence de tableau errors non vide à la racine
grpcCode de statut gRPC 0 (OK)
mcpLa réponse JSON-RPC possède result et aucun error
websocketLa connexion atteint open sans événement d’erreur