@stoplight/elements-core 9.0.10 → 9.0.12-beta-0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.js +6 -0
- package/.storybook/manager.js +1 -0
- package/.storybook/preview.jsx +50 -0
- package/dist/LICENSE +190 -0
- package/dist/README.md +1 -0
- package/{index.esm.js → dist/index.esm.js} +64 -20
- package/{index.js → dist/index.js} +64 -21
- package/{index.mjs → dist/index.mjs} +64 -20
- package/dist/package.json +64 -0
- package/dist/styled.d.ts +5 -0
- package/jest.config.js +10 -0
- package/package.json +74 -14
- package/src/__fixtures__/articles/basic.md +10 -0
- package/src/__fixtures__/articles/kitchen-sink.md +318 -0
- package/src/__fixtures__/articles/long-page-heading.md +955 -0
- package/src/__fixtures__/articles/multiple-try-its.md +54 -0
- package/src/__fixtures__/articles/schema-with-refs.ts +82 -0
- package/src/__fixtures__/http-request.json +11 -0
- package/src/__fixtures__/models/model-with-no-examples.json +15 -0
- package/src/__fixtures__/models/model-with-one-example.json +23 -0
- package/src/__fixtures__/models/model-with-three-examples.json +35 -0
- package/src/__fixtures__/operations/application-octet-stream-post.ts +39 -0
- package/src/__fixtures__/operations/base64-file-upload.ts +43 -0
- package/src/__fixtures__/operations/big-response.ts +4690 -0
- package/src/__fixtures__/operations/bundled-parameter.ts +128 -0
- package/src/__fixtures__/operations/empty-response.ts +15 -0
- package/src/__fixtures__/operations/examples-request-body.ts +135 -0
- package/src/__fixtures__/operations/head-todos.ts +49 -0
- package/src/__fixtures__/operations/invalid-response-example.ts +45 -0
- package/src/__fixtures__/operations/multipart-formdata-post.ts +61 -0
- package/src/__fixtures__/operations/operation-minimal.ts +11 -0
- package/src/__fixtures__/operations/operation-parameters.ts +337 -0
- package/src/__fixtures__/operations/operation-with-examples.ts +113 -0
- package/src/__fixtures__/operations/operation-without-servers.ts +16 -0
- package/src/__fixtures__/operations/patch-todos.ts +49 -0
- package/src/__fixtures__/operations/put-todos.ts +862 -0
- package/src/__fixtures__/operations/referenced-body.ts +62 -0
- package/src/__fixtures__/operations/request-body-empty-schema.ts +35 -0
- package/src/__fixtures__/operations/request-body.ts +62 -0
- package/src/__fixtures__/operations/securedOperation.ts +118 -0
- package/src/__fixtures__/operations/security-basic.ts +24 -0
- package/src/__fixtures__/operations/security-bearer.ts +25 -0
- package/src/__fixtures__/operations/simple-get.ts +17 -0
- package/src/__fixtures__/operations/simple.ts +103 -0
- package/src/__fixtures__/operations/string-numeric-enums.ts +32 -0
- package/src/__fixtures__/operations/urlencoded-post-oneof.ts +81 -0
- package/src/__fixtures__/operations/urlencoded-post.ts +54 -0
- package/src/__fixtures__/operations/vendor-extensions.ts +337 -0
- package/src/__fixtures__/operations/with-url-variables.ts +47 -0
- package/src/__fixtures__/operations/x-code-samples.ts +348 -0
- package/src/__fixtures__/schemas/circular.ts +1906 -0
- package/src/__fixtures__/schemas/contact.json +293 -0
- package/src/__fixtures__/schemas/media-entry.json +69 -0
- package/src/__fixtures__/schemas/simple.json +27 -0
- package/src/__fixtures__/schemas/todo-full.v1.json +35 -0
- package/src/__fixtures__/schemas/todo-partial.v1.json +14 -0
- package/src/__fixtures__/schemas/user.v1.json +17 -0
- package/src/__fixtures__/security-schemes/index.ts +38 -0
- package/src/__fixtures__/services/petstore.ts +167 -0
- package/src/__fixtures__/services/with-unnamed-servers.ts +38 -0
- package/src/__fixtures__/services/with-url-variables.ts +83 -0
- package/src/__fixtures__/services/without-origin.ts +20 -0
- package/src/__fixtures__/table-of-contents/nested.ts +44 -0
- package/src/__fixtures__/table-of-contents/studio-template.ts +100 -0
- package/src/__fixtures__/table-of-contents/studio.ts +559 -0
- package/src/components/Docs/Article/Article.spec.tsx +38 -0
- package/src/components/Docs/Article/Article.stories.tsx +17 -0
- package/src/components/Docs/Article/index.tsx +38 -0
- package/src/components/Docs/Docs.stories.tsx +33 -0
- package/src/components/Docs/Docs.tsx +272 -0
- package/src/components/Docs/HttpOperation/Badges.tsx +49 -0
- package/src/components/Docs/HttpOperation/Body.tsx +115 -0
- package/src/components/Docs/HttpOperation/Callbacks.tsx +89 -0
- package/src/components/Docs/HttpOperation/HttpOperation.spec.tsx +787 -0
- package/src/components/Docs/HttpOperation/HttpOperation.stories.ts +14 -0
- package/src/components/Docs/HttpOperation/HttpOperation.tsx +260 -0
- package/src/components/Docs/HttpOperation/LazySchemaTreePreviewer.tsx +651 -0
- package/src/components/Docs/HttpOperation/Parameters.spec.tsx +101 -0
- package/src/components/Docs/HttpOperation/Parameters.tsx +118 -0
- package/src/components/Docs/HttpOperation/Request.tsx +152 -0
- package/src/components/Docs/HttpOperation/Responses.tsx +301 -0
- package/src/components/Docs/HttpOperation/index.ts +1 -0
- package/src/components/Docs/HttpService/AdditionalInfo.stories.ts +48 -0
- package/src/components/Docs/HttpService/AdditionalInfo.tsx +61 -0
- package/src/components/Docs/HttpService/ExportButton.tsx +35 -0
- package/src/components/Docs/HttpService/HttpService.spec.tsx +429 -0
- package/src/components/Docs/HttpService/HttpService.stories.ts +14 -0
- package/src/components/Docs/HttpService/HttpService.tsx +99 -0
- package/src/components/Docs/HttpService/SecuritySchemes.tsx +82 -0
- package/src/components/Docs/HttpService/ServerInfo.tsx +196 -0
- package/src/components/Docs/HttpService/index.ts +1 -0
- package/src/components/Docs/Model/Model.spec.tsx +241 -0
- package/src/components/Docs/Model/Model.stories.tsx +16 -0
- package/src/components/Docs/Model/Model.tsx +192 -0
- package/src/components/Docs/Model/index.ts +1 -0
- package/src/components/Docs/NodeVendorExtensions.tsx +55 -0
- package/src/components/Docs/Sections.tsx +54 -0
- package/src/components/Docs/Security/PanelContent.tsx +38 -0
- package/src/components/Docs/Security/index.ts +1 -0
- package/src/components/Docs/Skeleton.tsx +12 -0
- package/src/components/Docs/TwoColumnLayout.tsx +27 -0
- package/src/components/Docs/index.ts +1 -0
- package/src/components/Docs/story-helper.ts +46 -0
- package/src/components/Docs/story-renderer-helper.tsx +56 -0
- package/src/components/Layout/MobileTopNav.tsx +78 -0
- package/src/components/Layout/ResponsiveSidebarLayout.tsx +175 -0
- package/src/components/Layout/SidebarLayout.tsx +107 -0
- package/src/components/LinkHeading.tsx +21 -0
- package/src/components/LoadMore.tsx +20 -0
- package/src/components/Loading/Loading.tsx +9 -0
- package/src/components/Logo.tsx +25 -0
- package/src/components/MarkdownViewer/CustomComponents/CodeComponent.spec.ts +90 -0
- package/src/components/MarkdownViewer/CustomComponents/CodeComponent.tsx +164 -0
- package/src/components/MarkdownViewer/CustomComponents/Provider.tsx +20 -0
- package/src/components/MarkdownViewer/CustomComponents/ReactRouterLink.tsx +27 -0
- package/src/components/MarkdownViewer/CustomComponents/ResolvedImage.tsx +86 -0
- package/src/components/MarkdownViewer/CustomComponents/ScrollToHashElement.tsx +96 -0
- package/src/components/MarkdownViewer/MarkdownViewer.spec.tsx +170 -0
- package/src/components/MarkdownViewer/index.tsx +10 -0
- package/src/components/NonIdealState.tsx +20 -0
- package/src/components/PoweredByLink.tsx +30 -0
- package/src/components/RequestSamples/RequestSamples.stories.tsx +67 -0
- package/src/components/RequestSamples/RequestSamples.tsx +246 -0
- package/src/components/RequestSamples/__tests__/RequestSamples.test.tsx +131 -0
- package/src/components/RequestSamples/__tests__/__snapshots__/convertRequestToSample.spec.ts.snap +746 -0
- package/src/components/RequestSamples/__tests__/convertRequestToSample.spec.ts +118 -0
- package/src/components/RequestSamples/convertRequestToSample.ts +56 -0
- package/src/components/RequestSamples/extractCodeSamples.ts +50 -0
- package/src/components/RequestSamples/index.ts +2 -0
- package/src/components/RequestSamples/requestSampleConfigs.ts +182 -0
- package/src/components/ResponseExamples/ResponseExamples.spec.tsx +121 -0
- package/src/components/ResponseExamples/ResponseExamples.stories.tsx +21 -0
- package/src/components/ResponseExamples/ResponseExamples.tsx +79 -0
- package/src/components/TableOfContents/TableOfContents.spec.tsx +301 -0
- package/src/components/TableOfContents/TableOfContents.stories.tsx +121 -0
- package/src/components/TableOfContents/TableOfContents.tsx +406 -0
- package/src/components/TableOfContents/constants.ts +45 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/TableOfContents/types.ts +51 -0
- package/src/components/TableOfContents/utils.ts +84 -0
- package/src/components/TryIt/Auth/APIKeyAuth.tsx +19 -0
- package/src/components/TryIt/Auth/Auth.tsx +169 -0
- package/src/components/TryIt/Auth/AuthTokenInput.tsx +37 -0
- package/src/components/TryIt/Auth/BasicAuth.tsx +62 -0
- package/src/components/TryIt/Auth/BearerAuth.tsx +19 -0
- package/src/components/TryIt/Auth/DigestAuth.tsx +35 -0
- package/src/components/TryIt/Auth/OAuth2Auth.tsx +19 -0
- package/src/components/TryIt/Auth/authentication-utils.ts +113 -0
- package/src/components/TryIt/Body/BinaryBody.tsx +52 -0
- package/src/components/TryIt/Body/FormDataBody.tsx +145 -0
- package/src/components/TryIt/Body/RequestBody.tsx +71 -0
- package/src/components/TryIt/Body/__tests__/BinaryBody.test.tsx +29 -0
- package/src/components/TryIt/Body/__tests__/FormDataBody.test.tsx +94 -0
- package/src/components/TryIt/Body/request-body-utils.ts +127 -0
- package/src/components/TryIt/Body/useTextRequestBodyState.ts +27 -0
- package/src/components/TryIt/Mocking/MockingButton.tsx +98 -0
- package/src/components/TryIt/Mocking/mocking-utils.ts +56 -0
- package/src/components/TryIt/Mocking/useMockingOptions.ts +6 -0
- package/src/components/TryIt/Parameters/FileUploadParameterEditors.tsx +62 -0
- package/src/components/TryIt/Parameters/OperationParameters.tsx +39 -0
- package/src/components/TryIt/Parameters/ParameterEditor.tsx +118 -0
- package/src/components/TryIt/Parameters/__tests__/parameter-utils.spec.ts +60 -0
- package/src/components/TryIt/Parameters/parameter-utils.spec.ts +118 -0
- package/src/components/TryIt/Parameters/parameter-utils.ts +179 -0
- package/src/components/TryIt/Parameters/useOperationParameters.ts +60 -0
- package/src/components/TryIt/Response/ReponseCodeViewer.tsx +28 -0
- package/src/components/TryIt/Response/Response.spec.tsx +174 -0
- package/src/components/TryIt/Response/Response.tsx +172 -0
- package/src/components/TryIt/Response/hooks/useLineCount.ts +7 -0
- package/src/components/TryIt/Servers/ServerVariables.tsx +33 -0
- package/src/components/TryIt/Servers/ServersDropdown.tsx +53 -0
- package/src/components/TryIt/Servers/VariableEditor.tsx +51 -0
- package/src/components/TryIt/Servers/useServerVariables.ts +19 -0
- package/src/components/TryIt/TryIt.spec.tsx +1511 -0
- package/src/components/TryIt/TryIt.stories.tsx +77 -0
- package/src/components/TryIt/TryIt.tsx +384 -0
- package/src/components/TryIt/TryItWithRequestSamples.spec.tsx +143 -0
- package/src/components/TryIt/TryItWithRequestSamples.stories.tsx +32 -0
- package/src/components/TryIt/TryItWithRequestSamples.tsx +42 -0
- package/src/components/TryIt/build-request.spec.ts +213 -0
- package/src/components/TryIt/build-request.ts +357 -0
- package/src/components/TryIt/chosenServer.ts +5 -0
- package/src/components/TryIt/index.ts +3 -0
- package/src/components/__tests__/LinkHeading.spec.tsx +125 -0
- package/src/constants.ts +176 -0
- package/src/containers/MockingProvider.tsx +23 -0
- package/src/context/InlineRefResolver.spec.tsx +183 -0
- package/src/context/InlineRefResolver.tsx +94 -0
- package/src/context/Options.tsx +27 -0
- package/src/context/Persistence.tsx +24 -0
- package/src/context/RouterType.tsx +9 -0
- package/src/core.css +97 -0
- package/src/hoc/utils.ts +5 -0
- package/src/hoc/withMosaicProvider.spec.tsx +48 -0
- package/src/hoc/withMosaicProvider.tsx +28 -0
- package/src/hoc/withQueryClientProvider.spec.tsx +38 -0
- package/src/hoc/withQueryClientProvider.tsx +35 -0
- package/src/hoc/withRouter.tsx +71 -0
- package/src/hooks/useBundleRefsIntoDocument.ts +60 -0
- package/src/hooks/useFirstRender.ts +8 -0
- package/src/hooks/useIsCompact.ts +26 -0
- package/src/hooks/useParsedData.ts +99 -0
- package/src/hooks/useParsedValue.ts +19 -0
- package/src/hooks/useResponsiveLayout.tsx +51 -0
- package/src/hooks/useRouter.tsx +31 -0
- package/src/hooks/useUniqueId.ts +4 -0
- package/src/index.ts +48 -0
- package/src/styled.tsx +22 -0
- package/src/styles.css +4 -0
- package/src/types.ts +170 -0
- package/src/utils/__tests__/securitySchemes.spec.ts +137 -0
- package/src/utils/exampleGeneration/exampleGeneration.spec.tsx +18 -0
- package/src/utils/exampleGeneration/exampleGeneration.ts +110 -0
- package/src/utils/fileToBase64.ts +11 -0
- package/src/utils/guards.ts +48 -0
- package/src/utils/headers.ts +316 -0
- package/src/utils/http-spec/IServer.ts +100 -0
- package/src/utils/http-spec/__tests__/IServer.spec.ts +51 -0
- package/src/utils/http-spec/examples.ts +5 -0
- package/src/utils/http.ts +9 -0
- package/src/utils/jotai/persistAtom.ts +31 -0
- package/src/utils/node.ts +19 -0
- package/src/utils/oas/__tests__/security.spec.ts +18 -0
- package/src/utils/oas/security.ts +76 -0
- package/src/utils/ref-resolving/ReferenceResolver.ts +29 -0
- package/src/utils/ref-resolving/resolvedObject.test.ts +415 -0
- package/src/utils/ref-resolving/resolvedObject.ts +109 -0
- package/src/utils/securitySchemes.ts +117 -0
- package/src/utils/string.ts +15 -0
- package/src/utils/tests/chooseOption.ts +7 -0
- package/src/web-components/createElementClass.ts +154 -0
- package/tsconfig.build.json +14 -0
- package/tsconfig.json +7 -0
- package/styled.d.ts +0 -12
- /package/{__fixtures__ → dist/__fixtures__}/articles/schema-with-refs.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/application-octet-stream-post.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/base64-file-upload.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/big-response.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/examples-request-body.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/head-todos.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/multipart-formdata-post.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/operation-minimal.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/operation-parameters.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/operation-with-examples.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/operation-without-servers.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/patch-todos.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/put-todos.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/referenced-body.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/request-body-empty-schema.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/request-body.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/securedOperation.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/security-basic.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/security-bearer.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/simple-get.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/string-numeric-enums.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/urlencoded-post-oneof.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/urlencoded-post.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/operations/with-url-variables.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/security-schemes/index.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/services/petstore.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/services/with-unnamed-servers.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/services/with-url-variables.d.ts +0 -0
- /package/{__fixtures__ → dist/__fixtures__}/services/without-origin.d.ts +0 -0
- /package/{components → dist/components}/Docs/Article/Article.spec.d.ts +0 -0
- /package/{components → dist/components}/Docs/Article/Article.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/Article/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/Docs.d.ts +0 -0
- /package/{components → dist/components}/Docs/Docs.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Badges.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Body.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Callbacks.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/HttpOperation.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/HttpOperation.spec.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/HttpOperation.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/LazySchemaTreePreviewer.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Parameters.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Parameters.spec.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Request.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/Responses.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpOperation/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/AdditionalInfo.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/AdditionalInfo.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/ExportButton.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/HttpService.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/HttpService.spec.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/HttpService.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/SecuritySchemes.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/ServerInfo.d.ts +0 -0
- /package/{components → dist/components}/Docs/HttpService/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/Model/Model.d.ts +0 -0
- /package/{components → dist/components}/Docs/Model/Model.spec.d.ts +0 -0
- /package/{components → dist/components}/Docs/Model/Model.stories.d.ts +0 -0
- /package/{components → dist/components}/Docs/Model/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/NodeVendorExtensions.d.ts +0 -0
- /package/{components → dist/components}/Docs/Sections.d.ts +0 -0
- /package/{components → dist/components}/Docs/Security/PanelContent.d.ts +0 -0
- /package/{components → dist/components}/Docs/Security/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/Skeleton.d.ts +0 -0
- /package/{components → dist/components}/Docs/TwoColumnLayout.d.ts +0 -0
- /package/{components → dist/components}/Docs/index.d.ts +0 -0
- /package/{components → dist/components}/Docs/story-helper.d.ts +0 -0
- /package/{components → dist/components}/Docs/story-renderer-helper.d.ts +0 -0
- /package/{components → dist/components}/Layout/MobileTopNav.d.ts +0 -0
- /package/{components → dist/components}/Layout/ResponsiveSidebarLayout.d.ts +0 -0
- /package/{components → dist/components}/Layout/SidebarLayout.d.ts +0 -0
- /package/{components → dist/components}/LinkHeading.d.ts +0 -0
- /package/{components → dist/components}/LoadMore.d.ts +0 -0
- /package/{components → dist/components}/Loading/Loading.d.ts +0 -0
- /package/{components → dist/components}/Logo.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/CodeComponent.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/CodeComponent.spec.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/Provider.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/ReactRouterLink.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/ResolvedImage.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/CustomComponents/ScrollToHashElement.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/MarkdownViewer.spec.d.ts +0 -0
- /package/{components → dist/components}/MarkdownViewer/index.d.ts +0 -0
- /package/{components → dist/components}/NonIdealState.d.ts +0 -0
- /package/{components → dist/components}/PoweredByLink.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/RequestSamples.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/RequestSamples.stories.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/convertRequestToSample.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/extractCodeSamples.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/index.d.ts +0 -0
- /package/{components → dist/components}/RequestSamples/requestSampleConfigs.d.ts +0 -0
- /package/{components → dist/components}/ResponseExamples/ResponseExamples.d.ts +0 -0
- /package/{components → dist/components}/ResponseExamples/ResponseExamples.spec.d.ts +0 -0
- /package/{components → dist/components}/ResponseExamples/ResponseExamples.stories.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/TableOfContents.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/TableOfContents.spec.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/TableOfContents.stories.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/constants.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/index.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/types.d.ts +0 -0
- /package/{components → dist/components}/TableOfContents/utils.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/APIKeyAuth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/Auth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/AuthTokenInput.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/BasicAuth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/BearerAuth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/DigestAuth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/OAuth2Auth.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Auth/authentication-utils.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Body/BinaryBody.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Body/FormDataBody.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Body/RequestBody.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Body/request-body-utils.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Body/useTextRequestBodyState.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Mocking/MockingButton.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Mocking/mocking-utils.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Mocking/useMockingOptions.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/FileUploadParameterEditors.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/OperationParameters.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/ParameterEditor.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/parameter-utils.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/parameter-utils.spec.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Parameters/useOperationParameters.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Response/ReponseCodeViewer.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Response/Response.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Response/Response.spec.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Response/hooks/useLineCount.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Servers/ServerVariables.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Servers/ServersDropdown.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Servers/VariableEditor.d.ts +0 -0
- /package/{components → dist/components}/TryIt/Servers/useServerVariables.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryIt.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryIt.spec.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryIt.stories.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryItWithRequestSamples.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryItWithRequestSamples.spec.d.ts +0 -0
- /package/{components → dist/components}/TryIt/TryItWithRequestSamples.stories.d.ts +0 -0
- /package/{components → dist/components}/TryIt/build-request.d.ts +0 -0
- /package/{components → dist/components}/TryIt/build-request.spec.d.ts +0 -0
- /package/{components → dist/components}/TryIt/chosenServer.d.ts +0 -0
- /package/{components → dist/components}/TryIt/index.d.ts +0 -0
- /package/{constants.d.ts → dist/constants.d.ts} +0 -0
- /package/{containers → dist/containers}/MockingProvider.d.ts +0 -0
- /package/{context → dist/context}/InlineRefResolver.d.ts +0 -0
- /package/{context → dist/context}/InlineRefResolver.spec.d.ts +0 -0
- /package/{context → dist/context}/Options.d.ts +0 -0
- /package/{context → dist/context}/Persistence.d.ts +0 -0
- /package/{context → dist/context}/RouterType.d.ts +0 -0
- /package/{core.css → dist/core.css} +0 -0
- /package/{hoc → dist/hoc}/utils.d.ts +0 -0
- /package/{hoc → dist/hoc}/withMosaicProvider.d.ts +0 -0
- /package/{hoc → dist/hoc}/withMosaicProvider.spec.d.ts +0 -0
- /package/{hoc → dist/hoc}/withQueryClientProvider.d.ts +0 -0
- /package/{hoc → dist/hoc}/withQueryClientProvider.spec.d.ts +0 -0
- /package/{hoc → dist/hoc}/withRouter.d.ts +0 -0
- /package/{hooks → dist/hooks}/useBundleRefsIntoDocument.d.ts +0 -0
- /package/{hooks → dist/hooks}/useFirstRender.d.ts +0 -0
- /package/{hooks → dist/hooks}/useIsCompact.d.ts +0 -0
- /package/{hooks → dist/hooks}/useParsedData.d.ts +0 -0
- /package/{hooks → dist/hooks}/useParsedValue.d.ts +0 -0
- /package/{hooks → dist/hooks}/useResponsiveLayout.d.ts +0 -0
- /package/{hooks → dist/hooks}/useRouter.d.ts +0 -0
- /package/{hooks → dist/hooks}/useUniqueId.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{styles.min.css → dist/styles.min.css} +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{utils → dist/utils}/exampleGeneration/exampleGeneration.d.ts +0 -0
- /package/{utils → dist/utils}/exampleGeneration/exampleGeneration.spec.d.ts +0 -0
- /package/{utils → dist/utils}/fileToBase64.d.ts +0 -0
- /package/{utils → dist/utils}/guards.d.ts +0 -0
- /package/{utils → dist/utils}/headers.d.ts +0 -0
- /package/{utils → dist/utils}/http-spec/IServer.d.ts +0 -0
- /package/{utils → dist/utils}/http-spec/examples.d.ts +0 -0
- /package/{utils → dist/utils}/http.d.ts +0 -0
- /package/{utils → dist/utils}/jotai/persistAtom.d.ts +0 -0
- /package/{utils → dist/utils}/node.d.ts +0 -0
- /package/{utils → dist/utils}/oas/security.d.ts +0 -0
- /package/{utils → dist/utils}/ref-resolving/ReferenceResolver.d.ts +0 -0
- /package/{utils → dist/utils}/ref-resolving/resolvedObject.d.ts +0 -0
- /package/{utils → dist/utils}/ref-resolving/resolvedObject.test.d.ts +0 -0
- /package/{utils → dist/utils}/securitySchemes.d.ts +0 -0
- /package/{utils → dist/utils}/string.d.ts +0 -0
- /package/{utils → dist/utils}/tests/chooseOption.d.ts +0 -0
- /package/{web-components → dist/web-components}/createElementClass.d.ts +0 -0
|
@@ -0,0 +1,787 @@
|
|
|
1
|
+
import { HttpParamStyles, IHttpOperation } from '@stoplight/types';
|
|
2
|
+
import { screen } from '@testing-library/dom';
|
|
3
|
+
import { act, render } from '@testing-library/react';
|
|
4
|
+
import userEvent from '@testing-library/user-event';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { MemoryRouter } from 'react-router-dom';
|
|
7
|
+
|
|
8
|
+
import httpOperation from '../../../__fixtures__/operations/put-todos';
|
|
9
|
+
import requestBody from '../../../__fixtures__/operations/request-body';
|
|
10
|
+
import { ElementsOptionsProvider } from '../../../context/Options';
|
|
11
|
+
import { withPersistenceBoundary } from '../../../context/Persistence';
|
|
12
|
+
import { withMosaicProvider } from '../../../hoc/withMosaicProvider';
|
|
13
|
+
import { chooseOption } from '../../../utils/tests/chooseOption';
|
|
14
|
+
import { renderExtensionRenderer } from '../story-renderer-helper';
|
|
15
|
+
import { HttpOperation as HttpOperationWithoutPersistence } from './index';
|
|
16
|
+
|
|
17
|
+
const _HttpOperation = withMosaicProvider(withPersistenceBoundary(HttpOperationWithoutPersistence));
|
|
18
|
+
|
|
19
|
+
const HttpOperation: typeof _HttpOperation = props => (
|
|
20
|
+
<MemoryRouter>
|
|
21
|
+
<_HttpOperation {...props} />
|
|
22
|
+
</MemoryRouter>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
|
|
27
|
+
Wondering what this `unmount()` thingy in some of the tests is all about?
|
|
28
|
+
|
|
29
|
+
The reason is that an asynchronous action in TryIt component - resolving
|
|
30
|
+
a Promise coming from `buildHarRequest()` call - causes an async update to
|
|
31
|
+
React state, which then causes an `act(...)` warning in the tests which are
|
|
32
|
+
synchronous.
|
|
33
|
+
|
|
34
|
+
If you see an unwarranted `act(...)` warning when writing a synchronous test,
|
|
35
|
+
use the same method to mitigate the issue. Don't do it mindlessly though!
|
|
36
|
+
Sometimes `act(...)` warning is warranted.
|
|
37
|
+
|
|
38
|
+
If `buildHarRequest` is no longer asynchronous, or it disappeared from the codebase,
|
|
39
|
+
you can attempt to remove manual `unmount()` calls.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
describe('HttpOperation', () => {
|
|
43
|
+
describe('Header', () => {
|
|
44
|
+
it('should display "Deprecated" badge for deprecated http operation', () => {
|
|
45
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, deprecated: true }} />);
|
|
46
|
+
|
|
47
|
+
const badge = getDeprecatedBadge();
|
|
48
|
+
|
|
49
|
+
expect(badge).toBeInTheDocument();
|
|
50
|
+
|
|
51
|
+
unmount();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should not display "Deprecated" badge for http operation that is not deprecated', () => {
|
|
55
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, deprecated: false }} />);
|
|
56
|
+
|
|
57
|
+
const deprecatedBadge = getDeprecatedBadge();
|
|
58
|
+
|
|
59
|
+
expect(deprecatedBadge).not.toBeInTheDocument();
|
|
60
|
+
|
|
61
|
+
unmount();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should correctly display with server variables at beginning, middle, and end', () => {
|
|
65
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, deprecated: false }} />);
|
|
66
|
+
|
|
67
|
+
const serversButton = screen.getByRole('button', { name: /server/i });
|
|
68
|
+
userEvent.click(serversButton);
|
|
69
|
+
|
|
70
|
+
const enableItem = screen.getByRole('menuitemradio', { name: /pr/i });
|
|
71
|
+
userEvent.click(enableItem);
|
|
72
|
+
|
|
73
|
+
expect(serversButton).toHaveTextContent('PR');
|
|
74
|
+
|
|
75
|
+
expect(screen.queryAllByText(/{proto}:\/\/x-{pr}.todos-pr.stoplight.io:{port}/)[0]).toBeInTheDocument();
|
|
76
|
+
unmount();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('Security', () => {
|
|
81
|
+
it('should display security panel for each security scheme', () => {
|
|
82
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation }} />);
|
|
83
|
+
|
|
84
|
+
const apikeyPanel = screen.getAllByText(/Security: API Key \(api_key\)/i);
|
|
85
|
+
const apikey2Panel = screen.getByText(/Security: API Key \(api_key2\)/i);
|
|
86
|
+
const apiMultiplePanel = screen.getByText(/Security: API Key \(api_key\) & API Key \(api_key2\)/i);
|
|
87
|
+
const basicPanel = screen.getByText(/Security: Basic Auth \(basicKey\)/i);
|
|
88
|
+
const bearerPanel = screen.getByText(/Security: Bearer Auth \(bearerKey\)/i);
|
|
89
|
+
const digestPanel = screen.getByText(/Security: Digest Auth \(digest\)/i);
|
|
90
|
+
const oidcPanel = screen.getByText(/Security: OpenID Connect/i);
|
|
91
|
+
const oauthPanel = screen.getAllByText(/Security: OAuth 2.0/i);
|
|
92
|
+
const mixedPanel = screen.getByText(/Security: OAuth 2.0 & API Key/i);
|
|
93
|
+
|
|
94
|
+
expect(apikeyPanel).toHaveLength(2);
|
|
95
|
+
expect(apikey2Panel).toBeInTheDocument();
|
|
96
|
+
expect(apiMultiplePanel).toBeInTheDocument();
|
|
97
|
+
expect(basicPanel).toBeInTheDocument();
|
|
98
|
+
expect(bearerPanel).toBeInTheDocument();
|
|
99
|
+
expect(digestPanel).toBeInTheDocument();
|
|
100
|
+
expect(oidcPanel).toBeInTheDocument();
|
|
101
|
+
expect(oauthPanel).toHaveLength(2);
|
|
102
|
+
expect(mixedPanel).toBeInTheDocument();
|
|
103
|
+
|
|
104
|
+
unmount();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('displays keys for duplicated security types', () => {
|
|
108
|
+
const security = [
|
|
109
|
+
[
|
|
110
|
+
{
|
|
111
|
+
id: '?http-security-0?',
|
|
112
|
+
key: 'oauth2WithScopes',
|
|
113
|
+
type: 'oauth2' as const,
|
|
114
|
+
description: 'foo',
|
|
115
|
+
flows: {
|
|
116
|
+
implicit: {
|
|
117
|
+
scopes: {
|
|
118
|
+
'write:pets': 'modify pets in your account',
|
|
119
|
+
'read:pets': 'read your pets',
|
|
120
|
+
},
|
|
121
|
+
refreshUrl: 'http://refreshUrl.com',
|
|
122
|
+
authorizationUrl: 'http://authorizationUrl.com',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
[
|
|
128
|
+
{
|
|
129
|
+
id: '?http-security-1?',
|
|
130
|
+
key: 'oauth2WithEmptyScopes',
|
|
131
|
+
type: 'oauth2' as const,
|
|
132
|
+
description: 'foo',
|
|
133
|
+
flows: {
|
|
134
|
+
authorizationCode: {
|
|
135
|
+
scopes: {},
|
|
136
|
+
refreshUrl: 'http://refreshUrl.com',
|
|
137
|
+
tokenUrl: 'http://tokenUrl.com',
|
|
138
|
+
authorizationUrl: 'http://authorizationUrl.com',
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, security }} />);
|
|
146
|
+
|
|
147
|
+
const oauth2Panel = screen.getByText(/^Security: OAuth 2.0 \(oauth2WithScopes\)$/i);
|
|
148
|
+
const oauth2WithEmptyScopesPanel = screen.getByText(/^Security: OAuth 2.0 \(oauth2WithEmptyScopes\)$/i);
|
|
149
|
+
|
|
150
|
+
expect(oauth2Panel).toBeInTheDocument();
|
|
151
|
+
expect(oauth2WithEmptyScopesPanel).toBeInTheDocument();
|
|
152
|
+
|
|
153
|
+
unmount();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should expand on click', () => {
|
|
157
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation }} />);
|
|
158
|
+
|
|
159
|
+
const oauthPanel = screen.getAllByText(/Security: OAuth 2.0/i)[0];
|
|
160
|
+
|
|
161
|
+
expect(oauthPanel).toBeInTheDocument();
|
|
162
|
+
expect(screen.queryByText('write:pets')).not.toBeInTheDocument();
|
|
163
|
+
|
|
164
|
+
act(() => oauthPanel.click());
|
|
165
|
+
|
|
166
|
+
expect(screen.queryAllByText('write:pets')).toHaveLength(4);
|
|
167
|
+
|
|
168
|
+
unmount();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should display individual descriptions with names when expanding AND security schemes', () => {
|
|
172
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation }} />);
|
|
173
|
+
|
|
174
|
+
const oauthPanel = screen.getByText(/Security: OAuth 2.0 & API Key/i);
|
|
175
|
+
const apiKeysBefore = screen.getAllByText(/API Key/i);
|
|
176
|
+
const oauthKeysBefore = screen.getAllByText(/OAuth 2.0/i);
|
|
177
|
+
|
|
178
|
+
expect(oauthPanel).toBeInTheDocument();
|
|
179
|
+
expect(screen.queryByText('write:pets')).not.toBeInTheDocument();
|
|
180
|
+
expect(apiKeysBefore).toHaveLength(7);
|
|
181
|
+
expect(oauthKeysBefore).toHaveLength(2);
|
|
182
|
+
|
|
183
|
+
act(() => oauthPanel.click());
|
|
184
|
+
|
|
185
|
+
const apiKeysAfter = screen.getAllByText(/API Key/i);
|
|
186
|
+
const oauthKeysAfter = screen.getAllByText(/OAuth 2.0/i);
|
|
187
|
+
|
|
188
|
+
expect(screen.queryAllByText('write:pets')).toHaveLength(4);
|
|
189
|
+
expect(apiKeysAfter).toHaveLength(11);
|
|
190
|
+
expect(oauthKeysAfter).toHaveLength(3);
|
|
191
|
+
|
|
192
|
+
unmount();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('should not re-display security name with description when expanding singleton schemes', () => {
|
|
196
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation }} />);
|
|
197
|
+
|
|
198
|
+
const oauthPanel = screen.getAllByText(/Security: OAuth 2.0/i)[1];
|
|
199
|
+
const oauthKeysBefore = screen.getAllByText(/OAuth 2.0/i);
|
|
200
|
+
|
|
201
|
+
expect(oauthPanel).toBeInTheDocument();
|
|
202
|
+
expect(screen.queryByText('write:pets')).not.toBeInTheDocument();
|
|
203
|
+
expect(oauthKeysBefore).toHaveLength(2);
|
|
204
|
+
|
|
205
|
+
act(() => oauthPanel.click());
|
|
206
|
+
|
|
207
|
+
const oauthKeysAfter = screen.getAllByText(/OAuth 2.0/i);
|
|
208
|
+
|
|
209
|
+
expect(screen.queryAllByText('write:pets')).toHaveLength(4);
|
|
210
|
+
expect(oauthKeysAfter).toHaveLength(2);
|
|
211
|
+
|
|
212
|
+
unmount();
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('Query Parameters', () => {
|
|
217
|
+
it('should render panel when there are query parameters', async () => {
|
|
218
|
+
const data: IHttpOperation = {
|
|
219
|
+
id: 'get',
|
|
220
|
+
method: 'get',
|
|
221
|
+
path: '/path',
|
|
222
|
+
responses: [],
|
|
223
|
+
request: {
|
|
224
|
+
query: [
|
|
225
|
+
{
|
|
226
|
+
id: '?http-query-parameter-name?',
|
|
227
|
+
name: 'parameter name',
|
|
228
|
+
description: 'a parameter description',
|
|
229
|
+
schema: {
|
|
230
|
+
type: 'string',
|
|
231
|
+
},
|
|
232
|
+
allowEmptyValue: true,
|
|
233
|
+
allowReserved: true,
|
|
234
|
+
deprecated: true,
|
|
235
|
+
explode: true,
|
|
236
|
+
required: true,
|
|
237
|
+
style: HttpParamStyles.Form,
|
|
238
|
+
examples: [
|
|
239
|
+
{
|
|
240
|
+
id: '?http-example-0?',
|
|
241
|
+
value: 'example value',
|
|
242
|
+
key: 'example key',
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const { unmount } = render(<HttpOperation data={data} />);
|
|
251
|
+
|
|
252
|
+
const queryParametersPanel = screen.queryByRole('heading', { name: 'Query Parameters' });
|
|
253
|
+
expect(queryParametersPanel).toBeInTheDocument();
|
|
254
|
+
expect(queryParametersPanel).toBeVisible();
|
|
255
|
+
expect(queryParametersPanel).toBeEnabled();
|
|
256
|
+
|
|
257
|
+
unmount();
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('should not render panel when there are no header parameters', () => {
|
|
261
|
+
const data: IHttpOperation = {
|
|
262
|
+
id: 'get',
|
|
263
|
+
method: 'get',
|
|
264
|
+
path: '/path',
|
|
265
|
+
responses: [],
|
|
266
|
+
request: {
|
|
267
|
+
query: [],
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const { unmount } = render(<HttpOperation data={data} />);
|
|
272
|
+
|
|
273
|
+
const headersPanel = screen.queryByRole('heading', { name: 'Query Parameters' });
|
|
274
|
+
expect(headersPanel).not.toBeInTheDocument();
|
|
275
|
+
|
|
276
|
+
unmount();
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it('should not render default styles', () => {
|
|
280
|
+
const operationData: IHttpOperation = {
|
|
281
|
+
id: 'get',
|
|
282
|
+
method: 'get',
|
|
283
|
+
path: '/path',
|
|
284
|
+
responses: [],
|
|
285
|
+
request: {
|
|
286
|
+
query: [
|
|
287
|
+
{
|
|
288
|
+
id: '?http-query-default-style-param?',
|
|
289
|
+
name: 'default style param',
|
|
290
|
+
schema: {
|
|
291
|
+
type: 'string',
|
|
292
|
+
},
|
|
293
|
+
style: HttpParamStyles.Form,
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
id: '?http-query-different-style-param?',
|
|
297
|
+
name: 'different style param',
|
|
298
|
+
schema: {
|
|
299
|
+
type: 'string',
|
|
300
|
+
},
|
|
301
|
+
style: HttpParamStyles.SpaceDelimited,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
const { unmount } = render(<HttpOperation data={operationData} />);
|
|
307
|
+
|
|
308
|
+
expect(screen.queryByText(/Space separated values/)).toBeInTheDocument();
|
|
309
|
+
expect(screen.queryByText(/Form style values/)).not.toBeInTheDocument();
|
|
310
|
+
|
|
311
|
+
unmount();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
describe('Header Parameters', () => {
|
|
316
|
+
it('should render panel when there are header parameters', () => {
|
|
317
|
+
const data: IHttpOperation = {
|
|
318
|
+
id: 'get',
|
|
319
|
+
method: 'get',
|
|
320
|
+
path: '/path',
|
|
321
|
+
responses: [],
|
|
322
|
+
request: {
|
|
323
|
+
headers: [
|
|
324
|
+
{
|
|
325
|
+
id: '?http-header-parameter-name?',
|
|
326
|
+
name: 'parameter name',
|
|
327
|
+
description: 'a parameter description',
|
|
328
|
+
schema: {
|
|
329
|
+
type: 'string',
|
|
330
|
+
},
|
|
331
|
+
deprecated: true,
|
|
332
|
+
explode: true,
|
|
333
|
+
required: true,
|
|
334
|
+
style: HttpParamStyles.Simple,
|
|
335
|
+
examples: [
|
|
336
|
+
{
|
|
337
|
+
id: '?http-example-0?',
|
|
338
|
+
key: 'example',
|
|
339
|
+
value: 'example value',
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
},
|
|
343
|
+
],
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
const { unmount } = render(<HttpOperation data={data} />);
|
|
348
|
+
|
|
349
|
+
const headersPanel = screen.queryByRole('heading', { name: 'Headers' });
|
|
350
|
+
expect(headersPanel).toBeInTheDocument();
|
|
351
|
+
expect(headersPanel).toBeVisible();
|
|
352
|
+
expect(headersPanel).toBeEnabled();
|
|
353
|
+
|
|
354
|
+
unmount();
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('should not render panel when there are no header parameters', () => {
|
|
358
|
+
const data = {
|
|
359
|
+
id: 'get',
|
|
360
|
+
method: 'get',
|
|
361
|
+
path: '/path',
|
|
362
|
+
responses: [],
|
|
363
|
+
request: {
|
|
364
|
+
headers: [],
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
const { unmount } = render(<HttpOperation data={data} />);
|
|
369
|
+
|
|
370
|
+
const headersPanel = screen.queryByRole('heading', { name: 'Headers' });
|
|
371
|
+
expect(headersPanel).not.toBeInTheDocument();
|
|
372
|
+
|
|
373
|
+
unmount();
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
describe('Path Parameters', () => {
|
|
378
|
+
it('should render panel when there are path parameters', async () => {
|
|
379
|
+
const data: IHttpOperation = {
|
|
380
|
+
id: 'get',
|
|
381
|
+
method: 'get',
|
|
382
|
+
path: '/path',
|
|
383
|
+
summary: 'Some endpoint',
|
|
384
|
+
responses: [],
|
|
385
|
+
request: {
|
|
386
|
+
path: [
|
|
387
|
+
{
|
|
388
|
+
id: '?http-path-param-parameter-name?',
|
|
389
|
+
name: 'parameter name',
|
|
390
|
+
description: 'a parameter description',
|
|
391
|
+
schema: {
|
|
392
|
+
type: 'string',
|
|
393
|
+
examples: ['another example'],
|
|
394
|
+
},
|
|
395
|
+
deprecated: true,
|
|
396
|
+
explode: true,
|
|
397
|
+
required: true,
|
|
398
|
+
style: HttpParamStyles.Simple,
|
|
399
|
+
examples: [
|
|
400
|
+
{
|
|
401
|
+
id: '?http-example-example?',
|
|
402
|
+
key: 'example',
|
|
403
|
+
value: 'example value',
|
|
404
|
+
},
|
|
405
|
+
],
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
const { unmount } = render(<HttpOperation data={data} />);
|
|
412
|
+
|
|
413
|
+
const headersPanel = screen.queryByRole('heading', { name: 'Path Parameters' });
|
|
414
|
+
expect(headersPanel).toBeInTheDocument();
|
|
415
|
+
expect(headersPanel).toBeVisible();
|
|
416
|
+
expect(headersPanel).toBeEnabled();
|
|
417
|
+
|
|
418
|
+
unmount();
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
describe('Request Body', () => {
|
|
423
|
+
const httpOperationWithRequestBodyContents: IHttpOperation = {
|
|
424
|
+
path: '/',
|
|
425
|
+
id: 'some_id',
|
|
426
|
+
method: 'get',
|
|
427
|
+
request: {
|
|
428
|
+
body: {
|
|
429
|
+
id: '?http-request-body?',
|
|
430
|
+
contents: [
|
|
431
|
+
{
|
|
432
|
+
id: '?http-request-body-media-0?',
|
|
433
|
+
mediaType: 'application/json',
|
|
434
|
+
schema: {
|
|
435
|
+
type: 'object',
|
|
436
|
+
properties: {
|
|
437
|
+
some_property: { type: 'string' },
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
{ id: '?http-request-body-media-1?', mediaType: 'application/xml' },
|
|
442
|
+
],
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
responses: [{ id: '?http-response-200?', code: '200', description: 'Hello world!' }],
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
const httpOperationWithoutRequestBodyContents = {
|
|
449
|
+
path: '/',
|
|
450
|
+
id: 'some_id',
|
|
451
|
+
method: 'get',
|
|
452
|
+
request: {
|
|
453
|
+
body: {
|
|
454
|
+
id: '?http-request-body?',
|
|
455
|
+
description: 'Some body description',
|
|
456
|
+
contents: [],
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
responses: [{ id: '?http-response-200?', code: '200', description: 'Hello world!' }],
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
it('should render select for content type', () => {
|
|
463
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithRequestBodyContents} />);
|
|
464
|
+
|
|
465
|
+
const select = screen.queryByLabelText('Request Body Content Type');
|
|
466
|
+
expect(select).not.toBeNull();
|
|
467
|
+
|
|
468
|
+
unmount();
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
it('should allow to select different content type', () => {
|
|
472
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithRequestBodyContents} />);
|
|
473
|
+
|
|
474
|
+
const select = screen.getByLabelText('Request Body Content Type');
|
|
475
|
+
|
|
476
|
+
expect(select).toHaveTextContent('application/json');
|
|
477
|
+
|
|
478
|
+
chooseOption(select, 'application/xml');
|
|
479
|
+
|
|
480
|
+
expect(select).toHaveTextContent('application/xml');
|
|
481
|
+
|
|
482
|
+
unmount();
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
it('should not render select if there are no contents', () => {
|
|
486
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithoutRequestBodyContents} />);
|
|
487
|
+
|
|
488
|
+
const select = screen.queryByLabelText('Request Body Content Type');
|
|
489
|
+
expect(select).toBeNull();
|
|
490
|
+
|
|
491
|
+
unmount();
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('should display description even if there are no contents', async () => {
|
|
495
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithoutRequestBodyContents} />);
|
|
496
|
+
|
|
497
|
+
expect(await screen.findByText('Some body description')).toBeInTheDocument();
|
|
498
|
+
|
|
499
|
+
unmount();
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
it('should display schema for content type', async () => {
|
|
503
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithRequestBodyContents} />);
|
|
504
|
+
|
|
505
|
+
expect(await screen.findByText('some_property')).toBeInTheDocument();
|
|
506
|
+
|
|
507
|
+
unmount();
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('request body selection in Docs should update TryIt', async () => {
|
|
511
|
+
const { unmount } = render(<HttpOperation data={requestBody} />);
|
|
512
|
+
|
|
513
|
+
const body = screen.getByRole('textbox');
|
|
514
|
+
const requestSample = await screen.findByLabelText(
|
|
515
|
+
'curl --request POST \\ --url https://todos.stoplight.io/users \\ --header \'Content-Type: application/json\' \\ --data \'{ "name": "string", "age": 0 }\'',
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
expect(body).toHaveTextContent('{ "name": "string", "age": 0 }');
|
|
519
|
+
expect(requestSample).toBeInTheDocument();
|
|
520
|
+
|
|
521
|
+
const select = screen.getByLabelText('Request Body Content Type');
|
|
522
|
+
chooseOption(select, 'application/x-www-form-urlencoded');
|
|
523
|
+
const secondRequestSample = await screen.findByLabelText(
|
|
524
|
+
"curl --request POST \\ --url https://todos.stoplight.io/users \\ --header 'Content-Type: application/x-www-form-urlencoded' \\ --data-urlencode name= \\ --data-urlencode completed= \\ --data-urlencode someEnum=a",
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
expect(screen.getByLabelText('someEnum')).toBeInTheDocument();
|
|
528
|
+
expect(secondRequestSample).toBeInTheDocument();
|
|
529
|
+
|
|
530
|
+
unmount();
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
describe('Response', () => {
|
|
535
|
+
const httpOperationWithResponseBodyContents: IHttpOperation = {
|
|
536
|
+
path: '/',
|
|
537
|
+
id: 'some_id',
|
|
538
|
+
method: 'get',
|
|
539
|
+
responses: [
|
|
540
|
+
{
|
|
541
|
+
id: '?http-response-200?',
|
|
542
|
+
code: '200',
|
|
543
|
+
description: 'Hello world!',
|
|
544
|
+
contents: [
|
|
545
|
+
{
|
|
546
|
+
id: '?http-request-body-media-0?',
|
|
547
|
+
mediaType: 'application/json',
|
|
548
|
+
schema: {
|
|
549
|
+
type: 'object',
|
|
550
|
+
properties: {
|
|
551
|
+
some_property: { type: 'string' },
|
|
552
|
+
},
|
|
553
|
+
},
|
|
554
|
+
},
|
|
555
|
+
{ id: '?http-request-body-media-1?', mediaType: 'application/xml' },
|
|
556
|
+
],
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
const httpOperationWithoutResponseBodyContents: IHttpOperation = {
|
|
562
|
+
path: '/',
|
|
563
|
+
id: 'some_id',
|
|
564
|
+
method: 'get',
|
|
565
|
+
responses: [{ id: '?http-response-200?', code: '200', description: 'Hello world!' }],
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
it('should render the MarkdownViewer with description', async () => {
|
|
569
|
+
render(<HttpOperation data={httpOperationWithoutResponseBodyContents} />);
|
|
570
|
+
|
|
571
|
+
expect(await screen.findByText('Hello world!')).toBeInTheDocument();
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
it('should render select for content types', () => {
|
|
575
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithResponseBodyContents} />);
|
|
576
|
+
|
|
577
|
+
const select = screen.queryByLabelText('Response Body Content Type');
|
|
578
|
+
expect(select).not.toBeNull();
|
|
579
|
+
|
|
580
|
+
unmount();
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
it('should allow changing content type', () => {
|
|
584
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithResponseBodyContents} />);
|
|
585
|
+
|
|
586
|
+
const select = screen.getByLabelText('Response Body Content Type');
|
|
587
|
+
|
|
588
|
+
expect(select).toHaveTextContent('application/json');
|
|
589
|
+
|
|
590
|
+
chooseOption(select, 'application/xml');
|
|
591
|
+
|
|
592
|
+
expect(select).toHaveTextContent('application/xml');
|
|
593
|
+
|
|
594
|
+
unmount();
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
it('should not render select when there are no contents', () => {
|
|
598
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithoutResponseBodyContents} />);
|
|
599
|
+
|
|
600
|
+
const select = screen.queryByLabelText('Response Body Content Type');
|
|
601
|
+
expect(select).toBeNull();
|
|
602
|
+
|
|
603
|
+
unmount();
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
it('should display schema for chosen content type', async () => {
|
|
607
|
+
const { unmount } = render(<HttpOperation data={httpOperationWithResponseBodyContents} />);
|
|
608
|
+
|
|
609
|
+
const property = await screen.findByText('some_property');
|
|
610
|
+
expect(property).toBeInTheDocument();
|
|
611
|
+
|
|
612
|
+
const select = screen.getByLabelText('Response Body Content Type');
|
|
613
|
+
|
|
614
|
+
chooseOption(select, 'application/xml');
|
|
615
|
+
|
|
616
|
+
expect(screen.queryByText('some_property')).not.toBeInTheDocument();
|
|
617
|
+
|
|
618
|
+
unmount();
|
|
619
|
+
});
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
describe('Callbacks', () => {
|
|
623
|
+
it('should display callback operation', async () => {
|
|
624
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, deprecated: false }} />);
|
|
625
|
+
|
|
626
|
+
const serversButton = screen.getByRole('button', { name: /server/i });
|
|
627
|
+
userEvent.click(serversButton);
|
|
628
|
+
|
|
629
|
+
const enableItem = screen.getByRole('menuitemradio', { name: /development/i });
|
|
630
|
+
userEvent.click(enableItem);
|
|
631
|
+
|
|
632
|
+
expect(serversButton).toHaveTextContent('Development');
|
|
633
|
+
|
|
634
|
+
//operation name
|
|
635
|
+
expect(screen.queryByText('newPet')).toBeInTheDocument();
|
|
636
|
+
|
|
637
|
+
// operation header
|
|
638
|
+
expect(screen.queryByText('{$request.body#/newPetAvailableUrl}')).toBeInTheDocument();
|
|
639
|
+
expect(screen.queryAllByText(/https:\/\/todos-dev.stoplight.io/).length).toEqual(1); // server url visible only in the main operation header, not in callback
|
|
640
|
+
|
|
641
|
+
// operation body
|
|
642
|
+
expect(screen.queryByText('Callback body description')).toBeInTheDocument();
|
|
643
|
+
|
|
644
|
+
// operation response
|
|
645
|
+
expect(screen.queryByText('Your server returns this code if it accepts the callback')).toBeInTheDocument();
|
|
646
|
+
|
|
647
|
+
unmount();
|
|
648
|
+
});
|
|
649
|
+
it('should display callback selector and switch between events', () => {
|
|
650
|
+
const { unmount } = render(<HttpOperation data={{ ...httpOperation, deprecated: false }} />);
|
|
651
|
+
|
|
652
|
+
const select = screen.getByLabelText('Callback');
|
|
653
|
+
|
|
654
|
+
expect(select).toHaveTextContent('newPet - {$request.body#/newPetAvailableUrl} - post');
|
|
655
|
+
|
|
656
|
+
chooseOption(select, 'returnedPet - {$request.body#/returnedPetAvailableUrl} - post');
|
|
657
|
+
|
|
658
|
+
expect(select).toHaveTextContent('returnedPet - {$request.body#/returnedPetAvailableUrl} - post');
|
|
659
|
+
|
|
660
|
+
expect(screen.queryByText('returnedPet')).toBeInTheDocument();
|
|
661
|
+
|
|
662
|
+
unmount();
|
|
663
|
+
});
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
describe('Visibility', () => {
|
|
667
|
+
it('should hide TryIt', async () => {
|
|
668
|
+
const { unmount } = render(<HttpOperation data={httpOperation} layoutOptions={{ hideTryIt: true }} />);
|
|
669
|
+
|
|
670
|
+
expect(screen.queryByText('Send API Request')).not.toBeInTheDocument();
|
|
671
|
+
expect(await screen.findByText('Response Example')).toBeInTheDocument();
|
|
672
|
+
|
|
673
|
+
unmount();
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
it('should hide right column', () => {
|
|
677
|
+
const { unmount } = render(<HttpOperation data={httpOperation} layoutOptions={{ hideTryItPanel: true }} />);
|
|
678
|
+
|
|
679
|
+
expect(screen.queryByText('Send API Request')).not.toBeInTheDocument();
|
|
680
|
+
expect(screen.queryByText('Response Example')).not.toBeInTheDocument();
|
|
681
|
+
|
|
682
|
+
unmount();
|
|
683
|
+
});
|
|
684
|
+
it('should hide Samples', async () => {
|
|
685
|
+
const { unmount } = render(<HttpOperation data={httpOperation} layoutOptions={{ hideSamples: true }} />);
|
|
686
|
+
|
|
687
|
+
expect(screen.queryByText('Request Sample: Shell / cURL')).not.toBeInTheDocument();
|
|
688
|
+
|
|
689
|
+
unmount();
|
|
690
|
+
});
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
describe('Vendor Extensions', () => {
|
|
694
|
+
it('should call rendorExtensionAddon', async () => {
|
|
695
|
+
const vendorExtensionRenderer = jest.fn();
|
|
696
|
+
const { unmount } = render(
|
|
697
|
+
<ElementsOptionsProvider renderExtensionAddon={vendorExtensionRenderer}>
|
|
698
|
+
<HttpOperation
|
|
699
|
+
data={httpOperation}
|
|
700
|
+
layoutOptions={{
|
|
701
|
+
hideTryItPanel: true,
|
|
702
|
+
hideSecurityInfo: true,
|
|
703
|
+
hideServerInfo: true,
|
|
704
|
+
hideExport: true,
|
|
705
|
+
hideTryIt: true,
|
|
706
|
+
hideSamples: true,
|
|
707
|
+
}}
|
|
708
|
+
/>
|
|
709
|
+
</ElementsOptionsProvider>,
|
|
710
|
+
);
|
|
711
|
+
|
|
712
|
+
expect(vendorExtensionRenderer).toHaveBeenLastCalledWith(
|
|
713
|
+
expect.objectContaining({
|
|
714
|
+
nestingLevel: 1,
|
|
715
|
+
vendorExtensions: {
|
|
716
|
+
'x-enum-descriptions': expect.objectContaining({ REMINDER: 'A reminder', TASK: 'A task' }),
|
|
717
|
+
},
|
|
718
|
+
}),
|
|
719
|
+
);
|
|
720
|
+
|
|
721
|
+
unmount();
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
it('should display vendor extensions in body', async () => {
|
|
725
|
+
const vendorExtensionRenderer = jest.fn().mockImplementation(props => {
|
|
726
|
+
if ('x-stoplight-info' in props.vendorExtensions) {
|
|
727
|
+
return <div>Stoplight Information Extension</div>;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
return null;
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
const { unmount } = render(
|
|
734
|
+
<ElementsOptionsProvider renderExtensionAddon={vendorExtensionRenderer}>
|
|
735
|
+
<HttpOperation
|
|
736
|
+
data={httpOperation}
|
|
737
|
+
layoutOptions={{
|
|
738
|
+
hideTryItPanel: true,
|
|
739
|
+
hideSecurityInfo: true,
|
|
740
|
+
hideServerInfo: true,
|
|
741
|
+
hideExport: true,
|
|
742
|
+
hideTryIt: true,
|
|
743
|
+
hideSamples: true,
|
|
744
|
+
}}
|
|
745
|
+
/>
|
|
746
|
+
</ElementsOptionsProvider>,
|
|
747
|
+
);
|
|
748
|
+
|
|
749
|
+
expect(screen.queryByText('Stoplight Information Extension')).toBeInTheDocument();
|
|
750
|
+
|
|
751
|
+
unmount();
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
it('should display vendor extensions', async () => {
|
|
755
|
+
const vendorExtensionRenderer = jest.fn().mockImplementation(props => {
|
|
756
|
+
return renderExtensionRenderer(props);
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
const { unmount } = render(
|
|
760
|
+
<ElementsOptionsProvider renderExtensionAddon={vendorExtensionRenderer}>
|
|
761
|
+
<HttpOperation
|
|
762
|
+
data={httpOperation}
|
|
763
|
+
layoutOptions={{
|
|
764
|
+
hideTryItPanel: true,
|
|
765
|
+
hideSecurityInfo: true,
|
|
766
|
+
hideServerInfo: true,
|
|
767
|
+
hideExport: true,
|
|
768
|
+
hideTryIt: true,
|
|
769
|
+
}}
|
|
770
|
+
/>
|
|
771
|
+
</ElementsOptionsProvider>,
|
|
772
|
+
);
|
|
773
|
+
|
|
774
|
+
expect(screen.queryAllByRole('columnheader', { name: /Enum value/i })).toHaveLength(2);
|
|
775
|
+
expect(screen.queryAllByRole('columnheader', { name: /Description/i })).toHaveLength(2);
|
|
776
|
+
|
|
777
|
+
expect(screen.queryByText('A reminder')).toBeInTheDocument();
|
|
778
|
+
expect(screen.queryByText('A task')).toBeInTheDocument();
|
|
779
|
+
|
|
780
|
+
unmount();
|
|
781
|
+
});
|
|
782
|
+
});
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
function getDeprecatedBadge() {
|
|
786
|
+
return screen.queryByTestId('badge-deprecated');
|
|
787
|
+
}
|