Skip to content

Commit d057ade

Browse files
committed
improve test api builder to handle multiple documents
1 parent 5ef1131 commit d057ade

File tree

2 files changed

+67
-33
lines changed

2 files changed

+67
-33
lines changed

openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,29 @@ package io.openapiparser.support
77

88
import io.openapiparser.*
99
import io.openapiprocessor.jsonschema.support.Types
10-
import io.openapiprocessor.jsonschema.reader.StringReader
11-
import io.openapiprocessor.jsonschema.reader.UriReader
1210
import io.openapiprocessor.jsonschema.schema.Bucket
1311
import io.openapiprocessor.jsonschema.schema.DocumentLoader
1412
import io.openapiprocessor.jsonschema.schema.DocumentStore
1513
import io.openapiprocessor.jsonschema.schema.Resolver
1614
import io.openapiprocessor.jsonschema.schema.SchemaVersion
1715
import io.openapiprocessor.snakeyaml.SnakeYamlConverter
1816
import io.openapiprocessor.interfaces.Converter
19-
import io.openapiprocessor.interfaces.Reader
2017
import java.net.URI
2118
import io.openapiparser.model.v30.OpenApi as OpenApi30
2219
import io.openapiparser.model.v31.OpenApi as OpenApi31
2320

2421
class ApiBuilder {
25-
private var api: String? = null
26-
private lateinit var apiUri: URI
22+
private val reader = TestReader()
2723
private var converter: Converter = SnakeYamlConverter()
2824
private var documents: DocumentStore = DocumentStore()
2925

30-
fun withApi(api: String): ApiBuilder {
31-
return withYaml("file:///any", api.trimIndent())
32-
}
33-
34-
fun withApi(api: URI): ApiBuilder {
35-
apiUri = api
26+
fun withApi(apiYaml: String): ApiBuilder {
27+
reader.addApi(URI("file:///openapi.yaml"), apiYaml.trimIndent())
3628
return this
3729
}
3830

39-
fun withResource(api: String): ApiBuilder {
40-
apiUri = this::class.java.getResource(api)!!.toURI()
31+
fun withApi(uri: String, apiYaml: String): ApiBuilder {
32+
reader.addApi(URI(uri), apiYaml.trimIndent())
4133
return this
4234
}
4335

@@ -46,59 +38,69 @@ class ApiBuilder {
4638
return this
4739
}
4840

41+
fun withDocument(uri: URI, document: Any): ApiBuilder {
42+
documents.addId(uri, document)
43+
return this
44+
}
45+
4946
fun buildParser(): OpenApiParser {
50-
return OpenApiParser(documents, DocumentLoader(getReader(), converter))
47+
return OpenApiParser(documents, DocumentLoader(reader, converter))
5148
}
5249

5350
fun buildOpenApi30(): OpenApi30 {
51+
return buildOpenApi30("file:///openapi.yaml")
52+
}
53+
54+
fun buildOpenApi30(uri: String): OpenApi30 {
55+
var source = URI(uri)
56+
if (!source.isAbsolute) {
57+
source = this::class.java.getResource(uri)!!.toURI()
58+
}
59+
5460
val resolver = createResolver()
55-
val result = resolver.resolve(apiUri, Resolver.Settings(SchemaVersion.Draft4))
61+
val result = resolver.resolve(source, Resolver.Settings(SchemaVersion.Draft4))
5662

5763
return OpenApi30(
5864
Context(result.scope, result.registry),
5965
Bucket(result.scope, Types.asMap(result.document)!!))
6066
}
6167

6268
fun buildOpenApi31(): OpenApi31 {
69+
return buildOpenApi31("file:///openapi.yaml")
70+
}
71+
72+
fun buildOpenApi31(uri: String): OpenApi31 {
73+
var source = URI(uri)
74+
if (!source.isAbsolute) {
75+
source = this::class.java.getResource(uri)!!.toURI()
76+
}
77+
6378
val resolver = createResolver()
64-
val result = resolver.resolve(apiUri, Resolver.Settings(SchemaVersion.Draft201909))
79+
val result = resolver.resolve(source, Resolver.Settings(SchemaVersion.Draft201909))
6580

6681
return OpenApi31(
6782
Context(result.scope, result.registry),
6883
Bucket(result.scope, Types.asMap(result.document)!!))
6984
}
7085

7186
fun <T> build(clazz: Class<T>): T {
72-
return build { c, n -> clazz
87+
return build30 { c, n -> clazz
7388
.getDeclaredConstructor(Context::class.java, Bucket::class.java)
7489
.newInstance(c, n)
7590
}
7691
}
7792

78-
private fun <T> build(factory: (context: Context, bucket: Bucket) -> T): T {
93+
private fun <T> build30(factory: (context: Context, bucket: Bucket) -> T): T {
7994
val resolver = createResolver()
80-
val result = resolver.resolve(apiUri, Resolver.Settings(SchemaVersion.Draft4))
95+
val result = resolver.resolve(URI("file:///openapi.yaml"), Resolver.Settings(SchemaVersion.Draft4))
8196

8297
return factory(
8398
Context(result.scope, result.registry),
8499
Bucket(result.scope, Types.asMap(result.document)!!))
85100
}
86101

87102
private fun createResolver(): Resolver {
88-
return Resolver(documents, DocumentLoader(getReader(), converter))
89-
}
90-
91-
private fun withYaml(baseUri: String, api: String): ApiBuilder {
92-
this.apiUri = URI(baseUri)
93-
this.api = api
94-
return this
95-
}
96-
97-
private fun getReader(): Reader {
98-
if (api == null) {
99-
return UriReader()
100-
}
101-
return StringReader(api!!)
103+
return Resolver(documents, DocumentLoader(reader, converter))
102104
}
103105
}
104106

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright 2024 https://github.com/openapi-processor/openapi-parser
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiparser.support
7+
8+
import io.openapiprocessor.interfaces.Reader
9+
import io.openapiprocessor.jsonschema.reader.UriReader
10+
import java.io.ByteArrayInputStream
11+
import java.io.InputStream
12+
import java.net.URI
13+
import java.nio.charset.StandardCharsets
14+
15+
class TestReader: Reader {
16+
private val uriReader = UriReader()
17+
18+
private val apis = mutableMapOf<URI, String>()
19+
private val resources = mutableSetOf<URI>()
20+
21+
override fun read(uri: URI): InputStream {
22+
if (apis.contains(uri)) {
23+
return ByteArrayInputStream(apis[uri]?.toByteArray(StandardCharsets.UTF_8))
24+
}
25+
26+
return uriReader.read(uri)
27+
}
28+
29+
fun addApi(uri: URI, content: String) {
30+
apis[uri] = content
31+
}
32+
}

0 commit comments

Comments
 (0)