-
Notifications
You must be signed in to change notification settings - Fork 270
Description
Describe the bug
One of our integration tests seem to have flagged a regression from v1 to v2. This seems to have been tackled a couple of times, first in #1470, resolved by #1503. It then looks like Warnings were noticed to be gone and added back by #2459.
The test from #1503 still passes, but it looks like the errors is not added if the reference lives in the path (I didn't dig deeper yet).
OpenApi File To Reproduce
openapi: 3.0.3
info:
title: UserAPI
version: '1.0'
description: The User API
servers:
- url: 'http://localhost:3000'
paths:
'/v1/users/{userId}':
parameters:
- $ref: '#/components/parameters/userId'
get:
summary: Get User Info by User ID
tags:
- users
responses:
'200':
description: User Found
content:
application/json:
schema:
$ref: '#/components/schemas/user'
description: Retrieve the information of the user with the matching user ID.
components:
schemas:
User:
title: User
type: object
description: ''
properties:
id:
type: integer
description: Unique identifier for the given user.
firstName:
type: string
lastName:
type: string
required:
- id
- firstName
- lastName
parameters:
userId:
name: userId
in: path
required: true
schema:
type: string
description: the id of an existing user
tags:
- name: usersExpected behavior
Since #1503 has an explicit test case containing the error I am looking for, I am assuming it is intended for there to be a "Invalid reference" error with the above file, rather than just a warning.
Screenshots/Code Snippets
Example test snippet for v1 (passes)
[Fact]
public async Task Validate_ThrowsReferenceDoesntExist_Error()
{
// Arrange
var input =
"""
[...snip, use the above example...]
""";
var reader = new OpenApiStreamReader();
await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input));
// Act
var result = await reader.ReadAsync(stream);
// Assert
(result.OpenApiDiagnostic != null && result.OpenApiDiagnostic.Errors.Any()).Should().BeTrue();
result.OpenApiDiagnostic.Errors.Should().BeEquivalentTo(new List<OpenApiError>
{
new(new OpenApiException("Invalid Reference identifier 'user'."))
});
}The v2 equivalent:
[Fact]
public async Task Validate_ThrowsReferenceDoesntExist_Error()
{
// Arrange
var input =
"""
[...snip, use the above example...]
""";
var settings = new OpenApiReaderSettings();
settings.AddYamlReader();
await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input));
// Act
var result = await OpenApiDocument.LoadAsync(stream, null, settings, CancellationToken.None);
// Assert
(result.Diagnostic != null && result.Diagnostic.Errors.Any()).Should().BeTrue();
result.Diagnostic.Errors.Should().BeEquivalentTo(new List<OpenApiError>
{
new(new OpenApiException("Invalid Reference identifier 'user'."))
});
}result.Diagnostic.Errors is empty, though the warning about the non-existent reference is there.