Skip to content

Commit 378bd51

Browse files
Replace pattern placeholders when generating urls (#426)
1 parent fb3f682 commit 378bd51

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

server/generator.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,14 @@ func (g *DataGenerator) maybeDereference(schema *spec.Schema, context string) (*
454454

455455
func (g *DataGenerator) generateURLForListableResource(schema *spec.Schema, params *GenerateParams) string {
456456
var val string
457+
const regexPlaceholder = "[^/]+"
457458
if strings.HasPrefix(schema.Pattern, "^") {
458-
// Many listable resources have a URL pattern of the form "^/v1/whatevers";
459-
// we cut off the "^" to leave the URL.
459+
// Many listable resources have a URL pattern of the form "^/v1/tax/calculations/[^/]+/line_items";
460+
// we cut off the "^" to leave the URL and replace placeholders with ids.
460461
val = schema.Pattern[1:]
462+
if strings.Index(val, regexPlaceholder) != -1 {
463+
val = strings.Replace(val, regexPlaceholder, "id_123", 1)
464+
}
461465
} else if params.example != nil {
462466
// If an example was provided, we can assume it has the correct format
463467
example := params.example.value.(map[string]interface{})

server/generator_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
)
1414

1515
var listSchema *spec.Schema
16+
var listSchemaWithPlaceholder *spec.Schema
1617
var searchResultSchema *spec.Schema
1718
var verbose bool
1819

@@ -41,6 +42,30 @@ func init() {
4142
},
4243
}
4344

45+
listSchemaWithPlaceholder = &spec.Schema{
46+
Type: "object",
47+
Properties: map[string]*spec.Schema{
48+
"data": {
49+
Items: &spec.Schema{
50+
Ref: "#/components/schemas/charge",
51+
},
52+
},
53+
"has_more": {
54+
Type: "boolean",
55+
},
56+
"object": {
57+
Enum: []interface{}{"list"},
58+
},
59+
"total_count": {
60+
Type: "integer",
61+
},
62+
"url": {
63+
Type: "string",
64+
Pattern: "^/v1/charges/[^/]+/nested_list",
65+
},
66+
},
67+
}
68+
4469
searchResultSchema = &spec.Schema{
4570
Type: "object",
4671
Properties: map[string]*spec.Schema{
@@ -339,6 +364,40 @@ func TestGenerateResponseData(t *testing.T) {
339364
data.(map[string]interface{})["customer"])
340365
}
341366

367+
// injected ID in list url
368+
{
369+
generator := DataGenerator{
370+
testSpec.Components.Schemas,
371+
&spec.Fixtures{
372+
Resources: map[spec.ResourceID]interface{}{
373+
spec.ResourceID("charge"): map[string]interface{}{"id": "ch_123"},
374+
spec.ResourceID("with_charges_list"): map[string]interface{}{
375+
"charges_list": map[string]interface{}{
376+
"url": "/v1/charges",
377+
},
378+
},
379+
},
380+
},
381+
verbose,
382+
}
383+
data, err := generator.Generate(&GenerateParams{
384+
Schema: &spec.Schema{
385+
Type: "object",
386+
Properties: map[string]*spec.Schema{
387+
"charges_list": listSchemaWithPlaceholder,
388+
},
389+
XResourceID: "with_charges_list",
390+
},
391+
})
392+
assert.Nil(t, err)
393+
chargesList := data.(map[string]interface{})["charges_list"]
394+
assert.Equal(t, "list", chargesList.(map[string]interface{})["object"])
395+
assert.Equal(t, "/v1/charges/id_123/nested_list", chargesList.(map[string]interface{})["url"])
396+
assert.Equal(t,
397+
testFixtures.Resources["charge"].(map[string]interface{})["id"],
398+
chargesList.(map[string]interface{})["data"].([]interface{})[0].(map[string]interface{})["id"])
399+
}
400+
342401
// injected secondary ID
343402
{
344403
generator := DataGenerator{testSpec.Components.Schemas, &spec.Fixtures{

0 commit comments

Comments
 (0)