diff --git a/printingpress/mock_limits_test.go b/printingpress/mock_limits_test.go index def07e3..fe53654 100644 --- a/printingpress/mock_limits_test.go +++ b/printingpress/mock_limits_test.go @@ -256,14 +256,14 @@ func TestGenerateMockWrappers(t *testing.T) { assert.NotEmpty(t, pp.generateMockAsWithLabel(mockable, "json", "mockable")) assert.NotEmpty(t, pp.generateMockAsWithLabel(schema, "json", "schema")) assert.NotEmpty(t, pp.generateMockAsWithLabel(mockable, "yaml", "mockable")) + assert.NotEmpty(t, pp.generateMockAsWithLabel(mockable, "xml", "mockable")) assert.NotEmpty(t, pp.generateSchemaMockAs(schema, "json")) assert.NotEmpty(t, pp.generateSchemaMockAsWithLabel(schema, "yaml", "schema")) + assert.NotEmpty(t, pp.generateSchemaMockAsWithLabel(schema, "xml", "schema")) assert.Empty(t, pp.generateSchemaMockAsWithLabel(schemaWithNilExample, "json", "schema")) assert.Empty(t, pp.generateMockWithLabel(&struct{}{}, "bad-mockable")) assert.Empty(t, pp.generateMockAsWithLabel(&struct{}{}, "json", "bad-mockable")) - assert.Empty(t, pp.generateMockAsWithLabel(mockable, "xml", "mockable")) assert.Empty(t, pp.generateSchemaMockAs(nil, "json")) - assert.Empty(t, pp.generateSchemaMockAsWithLabel(schema, "xml", "schema")) } func TestSafeGenerateMock_EdgeCases(t *testing.T) { diff --git a/printingpress/press.go b/printingpress/press.go index 0e44e84..c85e267 100644 --- a/printingpress/press.go +++ b/printingpress/press.go @@ -146,16 +146,16 @@ func (pp *PrintingPress) initEngine(config *pressEngineConfig) { mgYAML.SetPretty() mgYAML.DisableRequiredCheck() - // TODO: XML mock generator awaiting renderer.XML support in libopenapi - // mgXML := renderer.NewMockGenerator(renderer.XML) - // mgXML.SetPretty() - // mgXML.DisableRequiredCheck() + mgXML := renderer.NewMockGenerator(renderer.XML) + applyMockGenerationLimits(mgXML, limits) + mgXML.SetPretty() + mgXML.DisableRequiredCheck() pp.engineConfig = config pp.slugs = slugpkg.NewSlugRegistry() pp.mockGen = mg pp.mockGenYAML = mgYAML - pp.mockGenXML = nil + pp.mockGenXML = mgXML pp.rawArtifacts = newRawArtifactCache() pp.schemaArtifacts = newSchemaArtifactCache() pp.site = &Site{ diff --git a/printingpress/serializer_test.go b/printingpress/serializer_test.go index d05ad22..8159582 100644 --- a/printingpress/serializer_test.go +++ b/printingpress/serializer_test.go @@ -93,6 +93,58 @@ func TestMockLanguageForMediaType(t *testing.T) { } } +func TestCollectMediaType_GeneratesXMLMock(t *testing.T) { + spec := `openapi: "3.1.0" +info: + title: Test + version: "1.0" +paths: + /bookings: + post: + requestBody: + content: + application/xml: + schema: + $ref: '#/components/schemas/Booking' + responses: + '200': + description: ok +components: + schemas: + Booking: + type: object + xml: + name: booking + properties: + id: + type: string + example: booking-123 + passenger_name: + type: string + example: John Doe +` + doc, err := libopenapi.NewDocument([]byte(spec)) + require.NoError(t, err) + v3Doc, buildErr := doc.BuildV3Model() + require.NoError(t, buildErr) + drDoc := model.NewDrDocument(v3Doc) + pp := newPressEngine(&pressEngineConfig{DrDoc: drDoc}) + + pathItem := drDoc.V3Document.Paths.PathItems.GetOrZero("/bookings") + require.NotNil(t, pathItem) + require.NotNil(t, pathItem.Post) + require.NotNil(t, pathItem.Post.RequestBody) + content := pathItem.Post.RequestBody.Content.GetOrZero("application/xml") + require.NotNil(t, content) + + mediaType := pp.collectMediaType("application/xml", content) + require.NotNil(t, mediaType) + require.NotEmpty(t, mediaType.MockXML) + assert.Contains(t, mediaType.MockXML, "") + assert.Contains(t, mediaType.MockXML, "booking-123") + assert.Contains(t, mediaType.MockXML, "John Doe") +} + func TestCaptureSchemaArtifacts_CachesJSONAndHighlight(t *testing.T) { spec := `openapi: "3.1.0" info: diff --git a/printingpress/static/printing-press-lite.js b/printingpress/static/printing-press-lite.js index 93232db..f1a6b71 100644 --- a/printingpress/static/printing-press-lite.js +++ b/printingpress/static/printing-press-lite.js @@ -7483,7 +7483,11 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`

An error display: flex; align-items: center; gap: var(--global-padding-double); - padding: 0 0 var(--global-padding); + padding: var(--global-padding-double) 0 var(--global-padding); + } + + .media-type-ref sl-dropdown { + margin-top: 0; } .media-type-label { diff --git a/printingpress/static/printing-press.css b/printingpress/static/printing-press.css index bbe91c3..e97f394 100644 --- a/printingpress/static/printing-press.css +++ b/printingpress/static/printing-press.css @@ -1068,7 +1068,9 @@ li { margin-bottom: 2rem; } -.pp-model-card { +.pp-model-card, +.pp-model-card:visited, +.pp-model-card:active { display: flex; flex-direction: column; min-width: 0; @@ -1095,6 +1097,7 @@ li { .pp-model-card strong { display: block; + color: var(--primary-color); min-width: 0; line-height: 1.25; overflow-wrap: anywhere; diff --git a/printingpress/static/printing-press.js b/printingpress/static/printing-press.js index 6761423..442b39e 100644 --- a/printingpress/static/printing-press.js +++ b/printingpress/static/printing-press.js @@ -7483,7 +7483,11 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`

An error display: flex; align-items: center; gap: var(--global-padding-double); - padding: 0 0 var(--global-padding); + padding: var(--global-padding-double) 0 var(--global-padding); + } + + .media-type-ref sl-dropdown { + margin-top: 0; } .media-type-label { diff --git a/printingpress/ui/src/components/shared/media-type-selector.css.ts b/printingpress/ui/src/components/shared/media-type-selector.css.ts index d6ff441..3dedfd1 100644 --- a/printingpress/ui/src/components/shared/media-type-selector.css.ts +++ b/printingpress/ui/src/components/shared/media-type-selector.css.ts @@ -10,7 +10,11 @@ export default [dropdownCss, css` display: flex; align-items: center; gap: var(--global-padding-double); - padding: 0 0 var(--global-padding); + padding: var(--global-padding-double) 0 var(--global-padding); + } + + .media-type-ref sl-dropdown { + margin-top: 0; } .media-type-label {