mirror of
https://github.com/LukeHagar/redocly-cli.git
synced 2025-12-06 04:21:09 +00:00
chore: test for cli package (#773)
This commit is contained in:
32
.github/workflows/tests.yaml
vendored
32
.github/workflows/tests.yaml
vendored
@@ -3,6 +3,8 @@ name: Build and Test
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
@@ -38,6 +40,36 @@ jobs:
|
||||
env:
|
||||
CI: true
|
||||
|
||||
cli-package-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: npm-${{ hashFiles('package-lock.json') }}
|
||||
restore-keys: |
|
||||
npm-${{ hashFiles('package-lock.json') }}
|
||||
npm-
|
||||
- name: Environments
|
||||
run: |
|
||||
echo
|
||||
echo Using Node $(node -v), NPM $(npm -v)
|
||||
echo
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
env:
|
||||
CI: true
|
||||
- name: Prepare CLI package
|
||||
run: npm run pack:prepare
|
||||
- name: Install CLI Package
|
||||
run: npm install -g redocly-cli.tgz
|
||||
- name: Redocly version
|
||||
run: redocly --version
|
||||
- name: Definition test
|
||||
run: redocly lint packages/core/src/benchmark/benches/rebilly.yaml --format=stylish
|
||||
|
||||
coverage-report:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@ lib/
|
||||
output/
|
||||
*.tar.gz
|
||||
*.tsbuildinfo
|
||||
*.tgz
|
||||
@@ -1,3 +1,4 @@
|
||||
import { readFileSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { getCommandOutput, getEntrypoints, callSerializer, getParams } from './helpers';
|
||||
//@ts-ignore
|
||||
@@ -14,12 +15,12 @@ callSerializer();
|
||||
describe('webpack-bundle test', () => {
|
||||
test('bundle check', () => {
|
||||
const folderPath = join(__dirname, 'webpack-bundle/bundle');
|
||||
const enryPoint = getEntrypoints(folderPath);
|
||||
const entryPoint = getEntrypoints(folderPath);
|
||||
const args = getParams('../../../dist/bundle.js', 'bundle', [
|
||||
'--max-problems=1',
|
||||
'-o=/tmp/null',
|
||||
'--lint',
|
||||
...enryPoint,
|
||||
...entryPoint,
|
||||
]);
|
||||
const result = getCommandOutput(args, folderPath);
|
||||
(<any>expect(result)).toMatchSpecificSnapshot(join(folderPath, 'snapshot.js'));
|
||||
@@ -32,4 +33,48 @@ describe('webpack-bundle test', () => {
|
||||
const result = getCommandOutput(args, folderPath);
|
||||
(<any>expect(result)).toMatchSpecificSnapshot(join(folderPath, 'snapshot.js'));
|
||||
});
|
||||
|
||||
test('bundle-workflows', () => {
|
||||
const folderPath = join(__dirname, 'webpack-bundle/bundle-workflows');
|
||||
const entryPoint = getEntrypoints(folderPath);
|
||||
const args = getParams('../../../dist/bundle.js', 'bundle', [
|
||||
'--extends=redocly-registry',
|
||||
`--metafile=./metafile.json`,
|
||||
`-o=./bundle.yaml`,
|
||||
...entryPoint,
|
||||
]);
|
||||
|
||||
const result = getCommandOutput(args, folderPath);
|
||||
|
||||
const metaFile = readFileSync(`${folderPath}/metafile.json`, 'utf-8');
|
||||
const bundleFile = readFileSync(`${folderPath}/bundle.yaml`, 'utf-8');
|
||||
|
||||
(<any>expect(metaFile)).toMatchSpecificSnapshot(join(folderPath, 'meta-snapshot.js'));
|
||||
(<any>expect(bundleFile)).toMatchSpecificSnapshot(join(folderPath, 'bundle-snapshot.js'));
|
||||
(<any>expect(result)).toMatchSpecificSnapshot(join(folderPath, 'result-snapshot.js'));
|
||||
});
|
||||
|
||||
test('lint-workflows', () => {
|
||||
const folderPath = join(__dirname, 'webpack-bundle/lint-workflows');
|
||||
const entryPoint = getEntrypoints(folderPath);
|
||||
const args = getParams('../../../dist/bundle.js', 'lint', [
|
||||
'--format=json',
|
||||
'--lint-config=off',
|
||||
...entryPoint,
|
||||
]);
|
||||
const result = getCommandOutput(args, folderPath);
|
||||
(<any>expect(result)).toMatchSpecificSnapshot(join(folderPath, 'snapshot.js'));
|
||||
});
|
||||
|
||||
test('lint-workflows-fail', () => {
|
||||
const folderPath = join(__dirname, 'webpack-bundle/lint-workflows-fail');
|
||||
const entryPoint = getEntrypoints(folderPath);
|
||||
const args = getParams('../../../dist/bundle.js', 'lint', [
|
||||
'--format=json',
|
||||
'--lint-config=off',
|
||||
...entryPoint,
|
||||
]);
|
||||
const result = getCommandOutput(args, folderPath);
|
||||
(<any>expect(result)).toMatchSpecificSnapshot(join(folderPath, 'snapshot.js'));
|
||||
});
|
||||
});
|
||||
|
||||
3
__tests__/webpack-bundle/bundle-workflows/.redocly.yaml
Normal file
3
__tests__/webpack-bundle/bundle-workflows/.redocly.yaml
Normal file
@@ -0,0 +1,3 @@
|
||||
apis:
|
||||
main:
|
||||
root: ./openapi.yaml
|
||||
15
__tests__/webpack-bundle/bundle-workflows/Pet.yaml
Normal file
15
__tests__/webpack-bundle/bundle-workflows/Pet.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
description: A pet
|
||||
required:
|
||||
- id
|
||||
- name
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: 'id property'
|
||||
name:
|
||||
type: string
|
||||
description: 'name property'
|
||||
tag:
|
||||
type: string
|
||||
description: 'tag property'
|
||||
161
__tests__/webpack-bundle/bundle-workflows/bundle-snapshot.js
Normal file
161
__tests__/webpack-bundle/bundle-workflows/bundle-snapshot.js
Normal file
@@ -0,0 +1,161 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`webpack-bundle test bundle-workflows 1`] = `
|
||||
openapi: 3.0.0
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
description: test
|
||||
license:
|
||||
name: MIT
|
||||
url: https://opensource.org/licenses/MIT
|
||||
servers:
|
||||
- url: http://petstore.swagger.io/v1
|
||||
paths:
|
||||
/pets:
|
||||
get:
|
||||
summary: List all pets
|
||||
operationId: list_pets
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
description: How many items to return at one time (max 100)
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
default: 10
|
||||
maximum: 100
|
||||
- name: offset
|
||||
in: query
|
||||
description: Offset of first element to return in results.
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
responses:
|
||||
'200':
|
||||
description: An paged array of pets
|
||||
headers:
|
||||
x-next:
|
||||
description: A link to the next page of responses
|
||||
schema:
|
||||
type: string
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
post:
|
||||
summary: Create a pet
|
||||
operationId: create_pets
|
||||
tags:
|
||||
- pets
|
||||
responses:
|
||||
'204':
|
||||
description: Null response
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
/pets/{pet_id}:
|
||||
get:
|
||||
summary: Info for a specific pet
|
||||
operationId: get_pet_by_id
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: pet_id
|
||||
in: path
|
||||
required: true
|
||||
description: The id of the pet to retrieve
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Expected response to a valid request
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
components:
|
||||
schemas:
|
||||
Pets:
|
||||
description: A list of pets
|
||||
required:
|
||||
- pets
|
||||
- next_url
|
||||
- limit
|
||||
- offset
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
description: object containing a list of pets
|
||||
items:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
next_url:
|
||||
type: string
|
||||
description: this is the url to next page
|
||||
limit:
|
||||
type: integer
|
||||
format: int32
|
||||
description: limit
|
||||
offset:
|
||||
type: integer
|
||||
format: int32
|
||||
description: offset
|
||||
next_token:
|
||||
type: string
|
||||
description: next token
|
||||
Error:
|
||||
description: An error in processing a service request
|
||||
required:
|
||||
- code
|
||||
- message
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
description: code property
|
||||
message:
|
||||
type: string
|
||||
description: message property
|
||||
Pet:
|
||||
description: A pet
|
||||
required:
|
||||
- id
|
||||
- name
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: id property
|
||||
name:
|
||||
type: string
|
||||
description: name property
|
||||
tag:
|
||||
type: string
|
||||
description: tag property
|
||||
|
||||
`;
|
||||
156
__tests__/webpack-bundle/bundle-workflows/bundle.yaml
Normal file
156
__tests__/webpack-bundle/bundle-workflows/bundle.yaml
Normal file
@@ -0,0 +1,156 @@
|
||||
openapi: 3.0.0
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
description: test
|
||||
license:
|
||||
name: MIT
|
||||
url: https://opensource.org/licenses/MIT
|
||||
servers:
|
||||
- url: http://petstore.swagger.io/v1
|
||||
paths:
|
||||
/pets:
|
||||
get:
|
||||
summary: List all pets
|
||||
operationId: list_pets
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
description: How many items to return at one time (max 100)
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
default: 10
|
||||
maximum: 100
|
||||
- name: offset
|
||||
in: query
|
||||
description: Offset of first element to return in results.
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
responses:
|
||||
'200':
|
||||
description: An paged array of pets
|
||||
headers:
|
||||
x-next:
|
||||
description: A link to the next page of responses
|
||||
schema:
|
||||
type: string
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
post:
|
||||
summary: Create a pet
|
||||
operationId: create_pets
|
||||
tags:
|
||||
- pets
|
||||
responses:
|
||||
'204':
|
||||
description: Null response
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
/pets/{pet_id}:
|
||||
get:
|
||||
summary: Info for a specific pet
|
||||
operationId: get_pet_by_id
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: pet_id
|
||||
in: path
|
||||
required: true
|
||||
description: The id of the pet to retrieve
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Expected response to a valid request
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
components:
|
||||
schemas:
|
||||
Pets:
|
||||
description: A list of pets
|
||||
required:
|
||||
- pets
|
||||
- next_url
|
||||
- limit
|
||||
- offset
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
description: object containing a list of pets
|
||||
items:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
next_url:
|
||||
type: string
|
||||
description: this is the url to next page
|
||||
limit:
|
||||
type: integer
|
||||
format: int32
|
||||
description: limit
|
||||
offset:
|
||||
type: integer
|
||||
format: int32
|
||||
description: offset
|
||||
next_token:
|
||||
type: string
|
||||
description: next token
|
||||
Error:
|
||||
description: An error in processing a service request
|
||||
required:
|
||||
- code
|
||||
- message
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
description: code property
|
||||
message:
|
||||
type: string
|
||||
description: message property
|
||||
Pet:
|
||||
description: A pet
|
||||
required:
|
||||
- id
|
||||
- name
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: id property
|
||||
name:
|
||||
type: string
|
||||
description: name property
|
||||
tag:
|
||||
type: string
|
||||
description: tag property
|
||||
@@ -0,0 +1,3 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`webpack-bundle test bundle-workflows 1`] = `{"fileDependencies":{},"rootType":{"properties":{"openapi":null,"info":{"properties":{"title":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"termsOfService":{"type":"string"},"contact":{"properties":{"name":{"type":"string"},"url":{"type":"string"},"email":{"type":"string"}},"name":"Contact"},"license":{"properties":{"name":{"type":"string"},"url":{"type":"string"}},"required":["name"],"name":"License"}},"required":["title","version"],"name":"Info"},"servers":{"name":"ServerList","properties":{},"items":{"properties":{"url":{"type":"string"},"description":{"type":"string"},"variables":{"name":"ServerVariableMap","properties":{}}},"required":["url"],"name":"Server"}},"security":{"name":"SecurityRequirementList","properties":{},"items":{"properties":{},"additionalProperties":{"type":"array","items":{"type":"string"}},"name":"SecurityRequirement"}},"tags":{"name":"TagList","properties":{},"items":{"properties":{"name":{"type":"string"},"description":{"type":"string"},"externalDocs":{"properties":{"description":{"type":"string"},"url":{"type":"string"}},"required":["url"],"name":"ExternalDocs"}},"required":["name"],"name":"Tag"}},"externalDocs":{"properties":{"description":{"type":"string"},"url":{"type":"string"}},"required":["url"],"name":"ExternalDocs"},"paths":{"properties":{},"name":"PathMap"},"components":{"properties":{"parameters":{"name":"NamedParameters","properties":{}},"schemas":{"name":"NamedSchemas","properties":{}},"responses":{"name":"NamedResponses","properties":{}},"examples":{"name":"NamedExamples","properties":{}},"requestBodies":{"name":"NamedRequestBodies","properties":{}},"headers":{"name":"NamedHeaders","properties":{}},"securitySchemes":{"name":"NamedSecuritySchemes","properties":{}},"links":{"name":"NamedLinks","properties":{}},"callbacks":{"name":"NamedCallbacks","properties":{}}},"name":"Components"},"x-webhooks":{"properties":{},"name":"WebhooksMap"}},"required":["openapi","paths","info"],"name":"DefinitionRoot"},"refTypes":{},"visitorsData":{"registry-dependencies":{"links":[]}}}`;
|
||||
1
__tests__/webpack-bundle/bundle-workflows/metafile.json
Normal file
1
__tests__/webpack-bundle/bundle-workflows/metafile.json
Normal file
@@ -0,0 +1 @@
|
||||
{"fileDependencies":{},"rootType":{"properties":{"openapi":null,"info":{"properties":{"title":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"termsOfService":{"type":"string"},"contact":{"properties":{"name":{"type":"string"},"url":{"type":"string"},"email":{"type":"string"}},"name":"Contact"},"license":{"properties":{"name":{"type":"string"},"url":{"type":"string"}},"required":["name"],"name":"License"}},"required":["title","version"],"name":"Info"},"servers":{"name":"ServerList","properties":{},"items":{"properties":{"url":{"type":"string"},"description":{"type":"string"},"variables":{"name":"ServerVariableMap","properties":{}}},"required":["url"],"name":"Server"}},"security":{"name":"SecurityRequirementList","properties":{},"items":{"properties":{},"additionalProperties":{"type":"array","items":{"type":"string"}},"name":"SecurityRequirement"}},"tags":{"name":"TagList","properties":{},"items":{"properties":{"name":{"type":"string"},"description":{"type":"string"},"externalDocs":{"properties":{"description":{"type":"string"},"url":{"type":"string"}},"required":["url"],"name":"ExternalDocs"}},"required":["name"],"name":"Tag"}},"externalDocs":{"properties":{"description":{"type":"string"},"url":{"type":"string"}},"required":["url"],"name":"ExternalDocs"},"paths":{"properties":{},"name":"PathMap"},"components":{"properties":{"parameters":{"name":"NamedParameters","properties":{}},"schemas":{"name":"NamedSchemas","properties":{}},"responses":{"name":"NamedResponses","properties":{}},"examples":{"name":"NamedExamples","properties":{}},"requestBodies":{"name":"NamedRequestBodies","properties":{}},"headers":{"name":"NamedHeaders","properties":{}},"securitySchemes":{"name":"NamedSecuritySchemes","properties":{}},"links":{"name":"NamedLinks","properties":{}},"callbacks":{"name":"NamedCallbacks","properties":{}}},"name":"Components"},"x-webhooks":{"properties":{},"name":"WebhooksMap"}},"required":["openapi","paths","info"],"name":"DefinitionRoot"},"refTypes":{},"visitorsData":{"registry-dependencies":{"links":[]}}}
|
||||
141
__tests__/webpack-bundle/bundle-workflows/openapi.yaml
Normal file
141
__tests__/webpack-bundle/bundle-workflows/openapi.yaml
Normal file
@@ -0,0 +1,141 @@
|
||||
openapi: '3.0.0'
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
description: test
|
||||
license:
|
||||
name: MIT
|
||||
url: https://opensource.org/licenses/MIT
|
||||
servers:
|
||||
- url: http://petstore.swagger.io/v1
|
||||
paths:
|
||||
/pets:
|
||||
get:
|
||||
summary: List all pets
|
||||
operationId: list_pets
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
description: How many items to return at one time (max 100)
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
default: 10
|
||||
maximum: 100
|
||||
- name: offset
|
||||
in: query
|
||||
description: Offset of first element to return in results.
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
responses:
|
||||
'200':
|
||||
description: An paged array of pets
|
||||
headers:
|
||||
x-next:
|
||||
description: A link to the next page of responses
|
||||
schema:
|
||||
type: string
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
post:
|
||||
summary: Create a pet
|
||||
operationId: create_pets
|
||||
tags:
|
||||
- pets
|
||||
responses:
|
||||
'204':
|
||||
description: Null response
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
/pets/{pet_id}:
|
||||
get:
|
||||
summary: Info for a specific pet
|
||||
operationId: get_pet_by_id
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: pet_id
|
||||
in: path
|
||||
required: true
|
||||
description: The id of the pet to retrieve
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Expected response to a valid request
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
components:
|
||||
schemas:
|
||||
Pets:
|
||||
description: A list of pets
|
||||
required:
|
||||
- pets
|
||||
- next_url
|
||||
- limit
|
||||
- offset
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
description: 'object containing a list of pets'
|
||||
items:
|
||||
$ref: Pet.yaml
|
||||
next_url:
|
||||
type: string
|
||||
description: this is the url to next page
|
||||
limit:
|
||||
type: integer
|
||||
format: int32
|
||||
description: limit
|
||||
offset:
|
||||
type: integer
|
||||
format: int32
|
||||
description: offset
|
||||
next_token:
|
||||
type: string
|
||||
description: next token
|
||||
|
||||
Error:
|
||||
description: An error in processing a service request
|
||||
required:
|
||||
- code
|
||||
- message
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
description: 'code property'
|
||||
message:
|
||||
type: string
|
||||
description: 'message property'
|
||||
@@ -0,0 +1,8 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`webpack-bundle test bundle-workflows 1`] = `
|
||||
|
||||
bundling ./openapi.yaml...
|
||||
📦 Created a bundle for ./openapi.yaml at bundle.yaml <test>ms.
|
||||
|
||||
`;
|
||||
@@ -0,0 +1,9 @@
|
||||
apis:
|
||||
main:
|
||||
root: ./openapi.yaml
|
||||
|
||||
lint:
|
||||
rules:
|
||||
operation-operationId: warn
|
||||
operation-summary: error
|
||||
extends: []
|
||||
155
__tests__/webpack-bundle/lint-workflows-fail/openapi.yaml
Normal file
155
__tests__/webpack-bundle/lint-workflows-fail/openapi.yaml
Normal file
@@ -0,0 +1,155 @@
|
||||
openapi: '3.0.0'
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
description: test
|
||||
license:
|
||||
name: MIT
|
||||
url: https://opensource.org/licenses/MIT
|
||||
servers:
|
||||
- url: http://petstore.swagger.io/v1
|
||||
paths:
|
||||
/pets:
|
||||
get:
|
||||
summary: List all pets
|
||||
operationId: list_pets
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
description: How many items to return at one time (max 100)
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
default: 10
|
||||
maximum: 100
|
||||
- name: offset
|
||||
in: query
|
||||
description: Offset of first element to return in results.
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
responses:
|
||||
'200':
|
||||
description: An paged array of pets
|
||||
headers:
|
||||
x-next:
|
||||
description: A link to the next page of responses
|
||||
schema:
|
||||
type: string
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
post:
|
||||
summary: Create a pet
|
||||
operationId: create_pets
|
||||
tags:
|
||||
- pets
|
||||
responses:
|
||||
'204':
|
||||
description: Null response
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
/pets/{pet_id}:
|
||||
get:
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: pet_id
|
||||
in: path
|
||||
required: true
|
||||
description: The id of the pet to retrieve
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Expected response to a valid request
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
components:
|
||||
schemas:
|
||||
Pet:
|
||||
description: A pet
|
||||
required:
|
||||
- id
|
||||
- name
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: 'id property'
|
||||
name:
|
||||
type: string
|
||||
description: 'name property'
|
||||
tag:
|
||||
type: string
|
||||
description: 'tag property'
|
||||
Pets:
|
||||
description: A list of pets
|
||||
required:
|
||||
- pets
|
||||
- next_url
|
||||
- limit
|
||||
- offset
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
description: 'object containing a list of pets'
|
||||
items:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
next_url:
|
||||
type: string
|
||||
description: this is the url to next page
|
||||
limit:
|
||||
type: integer
|
||||
format: int32
|
||||
description: limit
|
||||
offset:
|
||||
type: integer
|
||||
format: int32
|
||||
description: offset
|
||||
next_token:
|
||||
type: string
|
||||
description: next token
|
||||
|
||||
Error:
|
||||
description: An error in processing a service request
|
||||
required:
|
||||
- code
|
||||
- message
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
description: 'code property'
|
||||
message:
|
||||
type: string
|
||||
description: 'message property'
|
||||
51
__tests__/webpack-bundle/lint-workflows-fail/snapshot.js
Normal file
51
__tests__/webpack-bundle/lint-workflows-fail/snapshot.js
Normal file
@@ -0,0 +1,51 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`webpack-bundle test lint-workflows-fail 1`] = `
|
||||
{
|
||||
"totals": {
|
||||
"errors": 1,
|
||||
"warnings": 1,
|
||||
"ignored": 0
|
||||
},
|
||||
"version": "<version>",
|
||||
"problems": [
|
||||
{
|
||||
"ruleId": "operation-summary",
|
||||
"severity": "error",
|
||||
"message": "Operation object should contain \`summary\` field.",
|
||||
"location": [
|
||||
{
|
||||
"source": {
|
||||
"ref": "openapi.yaml"
|
||||
},
|
||||
"pointer": "#/paths/~1pets~1{pet_id}/get/summary",
|
||||
"reportOnKey": true
|
||||
}
|
||||
],
|
||||
"suggest": []
|
||||
},
|
||||
{
|
||||
"ruleId": "operation-operationId",
|
||||
"severity": "warn",
|
||||
"message": "Operation object should contain \`operationId\` field.",
|
||||
"location": [
|
||||
{
|
||||
"source": {
|
||||
"ref": "openapi.yaml"
|
||||
},
|
||||
"pointer": "#/paths/~1pets~1{pet_id}/get/operationId",
|
||||
"reportOnKey": true
|
||||
}
|
||||
],
|
||||
"suggest": []
|
||||
}
|
||||
]
|
||||
}
|
||||
validating ./openapi.yaml...
|
||||
./openapi.yaml: validated in <test>ms
|
||||
|
||||
❌ Validation failed with 1 error and 1 warning.
|
||||
run \`openapi lint --generate-ignore-file\` to add all problems to the ignore file.
|
||||
|
||||
|
||||
`;
|
||||
7
__tests__/webpack-bundle/lint-workflows/.redocly.yaml
Normal file
7
__tests__/webpack-bundle/lint-workflows/.redocly.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
apis:
|
||||
main:
|
||||
root: ./openapi.yaml
|
||||
|
||||
lint:
|
||||
extends:
|
||||
- recommended
|
||||
157
__tests__/webpack-bundle/lint-workflows/openapi.yaml
Normal file
157
__tests__/webpack-bundle/lint-workflows/openapi.yaml
Normal file
@@ -0,0 +1,157 @@
|
||||
openapi: '3.0.0'
|
||||
info:
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
description: test
|
||||
license:
|
||||
name: MIT
|
||||
url: https://opensource.org/licenses/MIT
|
||||
servers:
|
||||
- url: http://petstore.swagger.io/v1
|
||||
paths:
|
||||
/pets:
|
||||
get:
|
||||
summary: List all pets
|
||||
operationId: list_pets
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
description: How many items to return at one time (max 100)
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
default: 10
|
||||
maximum: 100
|
||||
- name: offset
|
||||
in: query
|
||||
description: Offset of first element to return in results.
|
||||
required: false
|
||||
schema:
|
||||
type: integer
|
||||
format: int32
|
||||
responses:
|
||||
'200':
|
||||
description: An paged array of pets
|
||||
headers:
|
||||
x-next:
|
||||
description: A link to the next page of responses
|
||||
schema:
|
||||
type: string
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
post:
|
||||
summary: Create a pet
|
||||
operationId: create_pets
|
||||
tags:
|
||||
- pets
|
||||
responses:
|
||||
'204':
|
||||
description: Null response
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
/pets/{pet_id}:
|
||||
get:
|
||||
summary: Info for a specific pet
|
||||
operationId: get_pet_by_id
|
||||
tags:
|
||||
- pets
|
||||
parameters:
|
||||
- name: pet_id
|
||||
in: path
|
||||
required: true
|
||||
description: The id of the pet to retrieve
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Expected response to a valid request
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pets'
|
||||
'400':
|
||||
description: An error response
|
||||
default:
|
||||
description: unexpected error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
components:
|
||||
schemas:
|
||||
Pet:
|
||||
description: A pet
|
||||
required:
|
||||
- id
|
||||
- name
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: 'id property'
|
||||
name:
|
||||
type: string
|
||||
description: 'name property'
|
||||
tag:
|
||||
type: string
|
||||
description: 'tag property'
|
||||
Pets:
|
||||
description: A list of pets
|
||||
required:
|
||||
- pets
|
||||
- next_url
|
||||
- limit
|
||||
- offset
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
description: 'object containing a list of pets'
|
||||
items:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
next_url:
|
||||
type: string
|
||||
description: this is the url to next page
|
||||
limit:
|
||||
type: integer
|
||||
format: int32
|
||||
description: limit
|
||||
offset:
|
||||
type: integer
|
||||
format: int32
|
||||
description: offset
|
||||
next_token:
|
||||
type: string
|
||||
description: next token
|
||||
|
||||
Error:
|
||||
description: An error in processing a service request
|
||||
required:
|
||||
- code
|
||||
- message
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
description: 'code property'
|
||||
message:
|
||||
type: string
|
||||
description: 'message property'
|
||||
19
__tests__/webpack-bundle/lint-workflows/snapshot.js
Normal file
19
__tests__/webpack-bundle/lint-workflows/snapshot.js
Normal file
@@ -0,0 +1,19 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`webpack-bundle test lint-workflows 1`] = `
|
||||
{
|
||||
"totals": {
|
||||
"errors": 0,
|
||||
"warnings": 0,
|
||||
"ignored": 0
|
||||
},
|
||||
"version": "<version>",
|
||||
"problems": []
|
||||
}
|
||||
validating ./openapi.yaml...
|
||||
./openapi.yaml: validated in <test>ms
|
||||
|
||||
Woohoo! Your OpenAPI definition is valid. 🎉
|
||||
|
||||
|
||||
`;
|
||||
@@ -29,7 +29,8 @@
|
||||
"benchmark": "node --expose-gc --noconcurrent_sweeping --predictable packages/core/src/benchmark/benchmark.js",
|
||||
"webpack-bundle": "webpack --config webpack.config.ts",
|
||||
"upload": "node scripts/archive-and-upload-bundle.js",
|
||||
"deploy-local": "npm run webpack-bundle && npm run compile && ENV=local npm run upload"
|
||||
"deploy-local": "npm run webpack-bundle && npm run compile && ENV=local npm run upload",
|
||||
"pack:prepare": "cd packages/cli && (mv \"$(npm pack | tail -n 1)\" ../../redocly-cli.tgz)"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
|
||||
@@ -1,5 +1,146 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`bundle should add to meta ref from redocly registry 1`] = `
|
||||
fileDependencies: {}
|
||||
rootType:
|
||||
properties:
|
||||
openapi: null
|
||||
info:
|
||||
properties:
|
||||
title:
|
||||
type: string
|
||||
version:
|
||||
type: string
|
||||
description:
|
||||
type: string
|
||||
termsOfService:
|
||||
type: string
|
||||
contact:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
email:
|
||||
type: string
|
||||
name: Contact
|
||||
license:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- name
|
||||
name: License
|
||||
required:
|
||||
- title
|
||||
- version
|
||||
name: Info
|
||||
servers:
|
||||
name: ServerList
|
||||
properties: {}
|
||||
items:
|
||||
properties:
|
||||
url:
|
||||
type: string
|
||||
description:
|
||||
type: string
|
||||
variables:
|
||||
name: ServerVariableMap
|
||||
properties: {}
|
||||
required:
|
||||
- url
|
||||
name: Server
|
||||
security:
|
||||
name: SecurityRequirementList
|
||||
properties: {}
|
||||
items:
|
||||
properties: {}
|
||||
additionalProperties:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
name: SecurityRequirement
|
||||
tags:
|
||||
name: TagList
|
||||
properties: {}
|
||||
items:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description:
|
||||
type: string
|
||||
externalDocs:
|
||||
properties:
|
||||
description:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- url
|
||||
name: ExternalDocs
|
||||
required:
|
||||
- name
|
||||
name: Tag
|
||||
externalDocs:
|
||||
properties:
|
||||
description:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- url
|
||||
name: ExternalDocs
|
||||
paths:
|
||||
properties: {}
|
||||
name: PathMap
|
||||
components:
|
||||
properties:
|
||||
parameters:
|
||||
name: NamedParameters
|
||||
properties: {}
|
||||
schemas:
|
||||
name: NamedSchemas
|
||||
properties: {}
|
||||
responses:
|
||||
name: NamedResponses
|
||||
properties: {}
|
||||
examples:
|
||||
name: NamedExamples
|
||||
properties: {}
|
||||
requestBodies:
|
||||
name: NamedRequestBodies
|
||||
properties: {}
|
||||
headers:
|
||||
name: NamedHeaders
|
||||
properties: {}
|
||||
securitySchemes:
|
||||
name: NamedSecuritySchemes
|
||||
properties: {}
|
||||
links:
|
||||
name: NamedLinks
|
||||
properties: {}
|
||||
callbacks:
|
||||
name: NamedCallbacks
|
||||
properties: {}
|
||||
name: Components
|
||||
x-webhooks:
|
||||
properties: {}
|
||||
name: WebhooksMap
|
||||
required:
|
||||
- openapi
|
||||
- paths
|
||||
- info
|
||||
name: DefinitionRoot
|
||||
refTypes: {}
|
||||
visitorsData:
|
||||
registry-dependencies:
|
||||
links:
|
||||
- https://api.redocly.com/registry/params
|
||||
|
||||
`;
|
||||
|
||||
exports[`bundle should bundle external refs 1`] = `
|
||||
openapi: 3.0.0
|
||||
paths:
|
||||
|
||||
@@ -2,11 +2,21 @@ import outdent from 'outdent';
|
||||
import * as path from 'path';
|
||||
|
||||
import { bundleDocument, bundle } from '../bundle';
|
||||
import { parseYamlToDocument, yamlSerializer } from '../../__tests__/utils';
|
||||
import { parseYamlToDocument, yamlSerializer, makeConfig } from '../../__tests__/utils';
|
||||
import { LintConfig, Config, ResolvedConfig } from '../config';
|
||||
import { BaseResolver } from '../resolve';
|
||||
|
||||
describe('bundle', () => {
|
||||
const fetchMock = jest.fn(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
text: () => 'External schema content',
|
||||
headers: {
|
||||
get: () => '',
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
expect.addSnapshotSerializer(yamlSerializer);
|
||||
|
||||
const testDocument = parseYamlToDocument(
|
||||
@@ -28,7 +38,7 @@ describe('bundle', () => {
|
||||
shared_a:
|
||||
name: shared-a
|
||||
`,
|
||||
'',
|
||||
''
|
||||
);
|
||||
|
||||
it('change nothing with only internal refs', async () => {
|
||||
@@ -60,7 +70,7 @@ describe('bundle', () => {
|
||||
});
|
||||
expect(problems).toHaveLength(1);
|
||||
expect(problems[0].message).toEqual(
|
||||
`Two schemas are referenced with the same name but different content. Renamed param-b to param-b-2.`,
|
||||
`Two schemas are referenced with the same name but different content. Renamed param-b to param-b-2.`
|
||||
);
|
||||
expect(res.parsed).toMatchSnapshot();
|
||||
});
|
||||
@@ -98,47 +108,25 @@ describe('bundle', () => {
|
||||
});
|
||||
|
||||
it('should pull hosted schema', async () => {
|
||||
const fetchMock = jest.fn(
|
||||
() => Promise.resolve({
|
||||
ok: true,
|
||||
text: () => 'External schema content',
|
||||
headers: {
|
||||
get: () => ''
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
const { bundle: res, problems } = await bundle({
|
||||
config: new Config({} as ResolvedConfig),
|
||||
externalRefResolver: new BaseResolver({
|
||||
http: {
|
||||
customFetch: fetchMock,
|
||||
headers: []
|
||||
}
|
||||
headers: [],
|
||||
},
|
||||
}),
|
||||
ref: path.join(__dirname, 'fixtures/refs/hosted.yaml')
|
||||
ref: path.join(__dirname, 'fixtures/refs/hosted.yaml'),
|
||||
});
|
||||
|
||||
expect(problems).toHaveLength(0);
|
||||
expect(fetchMock).toHaveBeenCalledWith(
|
||||
"https://someexternal.schema",
|
||||
{
|
||||
headers: {}
|
||||
}
|
||||
);
|
||||
expect(fetchMock).toHaveBeenCalledWith('https://someexternal.schema', {
|
||||
headers: {},
|
||||
});
|
||||
expect(res.parsed).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should not bundle url refs if used with keepUrlRefs', async () => {
|
||||
const fetchMock = jest.fn(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
text: () => 'External schema content',
|
||||
headers: {
|
||||
get: () => '',
|
||||
},
|
||||
}),
|
||||
);
|
||||
const { bundle: res, problems } = await bundle({
|
||||
config: new Config({} as ResolvedConfig),
|
||||
externalRefResolver: new BaseResolver({
|
||||
@@ -153,4 +141,50 @@ describe('bundle', () => {
|
||||
expect(problems).toHaveLength(0);
|
||||
expect(res.parsed).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should add to meta ref from redocly registry', async () => {
|
||||
const testDocument = parseYamlToDocument(
|
||||
outdent`
|
||||
openapi: 3.0.0
|
||||
paths:
|
||||
/pet:
|
||||
get:
|
||||
operationId: get
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/shared_a'
|
||||
- name: get_b
|
||||
post:
|
||||
operationId: post
|
||||
parameters:
|
||||
- $ref: 'https://api.redocly.com/registry/params'
|
||||
components:
|
||||
parameters:
|
||||
shared_a:
|
||||
name: shared-a
|
||||
`,
|
||||
''
|
||||
);
|
||||
|
||||
const config = await makeConfig({}, { 'registry-dependencies': 'on' });
|
||||
|
||||
const {
|
||||
bundle: result,
|
||||
problems,
|
||||
...meta
|
||||
} = await bundleDocument({
|
||||
document: testDocument,
|
||||
config: config,
|
||||
externalRefResolver: new BaseResolver({
|
||||
http: {
|
||||
customFetch: fetchMock,
|
||||
headers: [],
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
||||
const parsedMeta = JSON.parse(JSON.stringify(meta));
|
||||
|
||||
expect(problems).toHaveLength(0);
|
||||
expect(parsedMeta).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user