From da85405f15dc49757df9e8d64f3e70cb7eac1699 Mon Sep 17 00:00:00 2001 From: Pierre Fenoll Date: Fri, 1 Apr 2022 19:39:16 +0200 Subject: [PATCH] test link refs Signed-off-by: Pierre Fenoll --- openapi3/loader_test.go | 14 ++ openapi3/testdata/link-example.yaml | 203 ++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 openapi3/testdata/link-example.yaml diff --git a/openapi3/loader_test.go b/openapi3/loader_test.go index 384e54d87..e33b75d72 100644 --- a/openapi3/loader_test.go +++ b/openapi3/loader_test.go @@ -438,6 +438,20 @@ paths: require.Equal(t, "link to to the father", link.Description) } +func TestLinksFromOAISpec(t *testing.T) { + loader := NewLoader() + doc, err := loader.LoadFromFile("testdata/link-example.yaml") + require.NoError(t, err) + err = doc.Validate(loader.Context) + require.NoError(t, err) + response := doc.Paths[`/2.0/repositories/{username}/{slug}`].Get.Responses.Get(200).Value + link := response.Links[`repositoryPullRequests`].Value + require.Equal(t, map[string]interface{}{ + "username": "$response.body#/owner/username", + "slug": "$response.body#/slug", + }, link.Parameters) +} + func TestResolveNonComponentsRef(t *testing.T) { spec := []byte(` openapi: 3.0.0 diff --git a/openapi3/testdata/link-example.yaml b/openapi3/testdata/link-example.yaml new file mode 100644 index 000000000..5837d705e --- /dev/null +++ b/openapi3/testdata/link-example.yaml @@ -0,0 +1,203 @@ +openapi: 3.0.0 +info: + title: Link Example + version: 1.0.0 +paths: + /2.0/users/{username}: + get: + operationId: getUserByName + parameters: + - name: username + in: path + required: true + schema: + type: string + responses: + '200': + description: The User + content: + application/json: + schema: + $ref: '#/components/schemas/user' + links: + userRepositories: + $ref: '#/components/links/UserRepositories' + /2.0/repositories/{username}: + get: + operationId: getRepositoriesByOwner + parameters: + - name: username + in: path + required: true + schema: + type: string + responses: + '200': + description: repositories owned by the supplied user + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/repository' + links: + userRepository: + $ref: '#/components/links/UserRepository' + /2.0/repositories/{username}/{slug}: + get: + operationId: getRepository + parameters: + - name: username + in: path + required: true + schema: + type: string + - name: slug + in: path + required: true + schema: + type: string + responses: + '200': + description: The repository + content: + application/json: + schema: + $ref: '#/components/schemas/repository' + links: + repositoryPullRequests: + $ref: '#/components/links/RepositoryPullRequests' + /2.0/repositories/{username}/{slug}/pullrequests: + get: + operationId: getPullRequestsByRepository + parameters: + - name: username + in: path + required: true + schema: + type: string + - name: slug + in: path + required: true + schema: + type: string + - name: state + in: query + schema: + type: string + enum: + - open + - merged + - declined + responses: + '200': + description: an array of pull request objects + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/pullrequest' + /2.0/repositories/{username}/{slug}/pullrequests/{pid}: + get: + operationId: getPullRequestsById + parameters: + - name: username + in: path + required: true + schema: + type: string + - name: slug + in: path + required: true + schema: + type: string + - name: pid + in: path + required: true + schema: + type: string + responses: + '200': + description: a pull request object + content: + application/json: + schema: + $ref: '#/components/schemas/pullrequest' + links: + pullRequestMerge: + $ref: '#/components/links/PullRequestMerge' + /2.0/repositories/{username}/{slug}/pullrequests/{pid}/merge: + post: + operationId: mergePullRequest + parameters: + - name: username + in: path + required: true + schema: + type: string + - name: slug + in: path + required: true + schema: + type: string + - name: pid + in: path + required: true + schema: + type: string + responses: + '204': + description: the PR was successfully merged +components: + links: + UserRepositories: + # returns array of '#/components/schemas/repository' + operationId: getRepositoriesByOwner + parameters: + username: $response.body#/username + UserRepository: + # returns '#/components/schemas/repository' + operationId: getRepository + parameters: + username: $response.body#/owner/username + slug: $response.body#/slug + RepositoryPullRequests: + # returns '#/components/schemas/pullrequest' + operationId: getPullRequestsByRepository + parameters: + username: $response.body#/owner/username + slug: $response.body#/slug + PullRequestMerge: + # executes /2.0/repositories/{username}/{slug}/pullrequests/{pid}/merge + operationId: mergePullRequest + parameters: + username: $response.body#/author/username + slug: $response.body#/repository/slug + pid: $response.body#/id + schemas: + user: + type: object + properties: + username: + type: string + uuid: + type: string + repository: + type: object + properties: + slug: + type: string + owner: + $ref: '#/components/schemas/user' + pullrequest: + type: object + properties: + id: + type: integer + title: + type: string + repository: + $ref: '#/components/schemas/repository' + author: + $ref: '#/components/schemas/user'