@@ -131,4 +131,65 @@ public static void ValidateSchemaReferencesAreInvalid()
131
131
Assert . Equal ( "The schema reference '#/components/schemas/Pet' does not point to an existing schema." , error . Message ) ;
132
132
Assert . Equal ( "#/paths/~1pets/get/responses/200/content/application~1json/schema/$ref" , error . Pointer ) ;
133
133
}
134
+
135
+ [ Fact ]
136
+ public static void ValidateCircularSchemaReferencesAreDetected ( )
137
+ {
138
+ // Arrange
139
+ var document = new OpenApiDocument
140
+ {
141
+ Components = new OpenApiComponents ( ) ,
142
+ Info = new OpenApiInfo
143
+ {
144
+ Title = "Infinite Document" ,
145
+ Version = "1.0.0"
146
+ } ,
147
+ Paths = [ ] ,
148
+ Workspace = new ( )
149
+ } ;
150
+
151
+ document . AddComponent ( "Cycle" , new OpenApiSchema
152
+ {
153
+ Type = JsonSchemaType . Object ,
154
+ Properties = new Dictionary < string , IOpenApiSchema > ( )
155
+ {
156
+ [ "self" ] = new OpenApiSchemaReference ( "#/components/schemas/Cycle/properties/self" , document )
157
+ }
158
+ } ) ;
159
+
160
+ document . Paths . Add ( "/cycle" , new OpenApiPathItem
161
+ {
162
+ Operations = new Dictionary < HttpMethod , OpenApiOperation > ( )
163
+ {
164
+ [ HttpMethod . Get ] = new OpenApiOperation
165
+ {
166
+ Responses = new ( )
167
+ {
168
+ [ "200" ] = new OpenApiResponse
169
+ {
170
+ Description = "OK" ,
171
+ Content = new Dictionary < string , OpenApiMediaType > ( )
172
+ {
173
+ [ "application/json" ] = new OpenApiMediaType
174
+ {
175
+ Schema = new OpenApiSchemaReference ( "Cycle" , document )
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ } ) ;
183
+
184
+ // Act
185
+ var errors = document . Validate ( ValidationRuleSet . GetDefaultRuleSet ( ) ) ;
186
+ var result = ! errors . Any ( ) ;
187
+
188
+ // Assert
189
+ Assert . False ( result ) ;
190
+ Assert . NotNull ( errors ) ;
191
+ var error = Assert . Single ( errors ) ;
192
+ Assert . Equal ( "Circular reference detected while resolving schema: #/components/schemas/Cycle/properties/self" , error . Message ) ;
193
+ Assert . Equal ( "#/components/schemas/Cycle/properties/self/$ref" , error . Pointer ) ;
194
+ }
134
195
}
0 commit comments