import { fromJS } from "immutable" import { createXMLExample, sampleFromSchema, memoizedCreateXMLExample, memoizedSampleFromSchema } from "corePlugins/samples/fn" describe("sampleFromSchema", () => { it("handles Immutable.js objects for nested schemas", function () { let definition = fromJS({ "type": "object", "properties": { "json": { "type": "object", "example": { "a": "string" }, "properties": { "a": { "type": "string" } } } } }) let expected = { json: { a: "string" } } expect(sampleFromSchema(definition, { includeReadOnly: false })).toEqual(expected) }) it("returns object with no readonly fields for parameter", function () { let definition = { type: "object", properties: { id: { type: "integer" }, readOnlyDog: { readOnly: true, type: "string" } }, xml: { name: "animals" } } let expected = { id: 0 } expect(sampleFromSchema(definition, { includeReadOnly: false })).toEqual(expected) }) it("returns object with readonly fields for parameter, with includeReadOnly", function () { let definition = { type: "object", properties: { id: { type: "integer" }, readOnlyDog: { readOnly: true, type: "string" } }, xml: { name: "animals" } } let expected = { id: 0, readOnlyDog: "string" } expect(sampleFromSchema(definition, { includeReadOnly: true })).toEqual(expected) }) it("returns object without deprecated fields for parameter", function () { let definition = { type: "object", properties: { id: { type: "integer" }, deprecatedProperty: { deprecated: true, type: "string" } }, xml: { name: "animals" } } let expected = { id: 0 } expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns object without writeonly fields for parameter", function () { let definition = { type: "object", properties: { id: { type: "integer" }, writeOnlyDog: { writeOnly: true, type: "string" } }, xml: { name: "animals" } } let expected = { id: 0 } expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns object with writeonly fields for parameter, with includeWriteOnly", function () { let definition = { type: "object", properties: { id: { type: "integer" }, writeOnlyDog: { writeOnly: true, type: "string" } }, xml: { name: "animals" } } let expected = { id: 0, writeOnlyDog: "string" } expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected) }) it("returns object without any $$ref fields at the root schema level", function () { let definition = { type: "object", properties: { message: { type: "string" } }, example: { value: { message: "Hello, World!" }, $$ref: "#/components/examples/WelcomeExample" }, $$ref: "#/components/schemas/Welcome" } let expected = { "value": { "message": "Hello, World!" } } expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected) }) it("returns object without any $$ref fields at nested schema levels", function () { let definition = { type: "object", properties: { message: { type: "string" } }, example: { a: { value: { message: "Hello, World!" }, $$ref: "#/components/examples/WelcomeExample" } }, $$ref: "#/components/schemas/Welcome" } let expected = { a: { "value": { "message": "Hello, World!" } } } expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected) }) it("returns object with any $$ref fields that appear to be user-created", function () { let definition = { type: "object", properties: { message: { type: "string" } }, example: { $$ref: { value: { message: "Hello, World!" }, $$ref: "#/components/examples/WelcomeExample" } }, $$ref: "#/components/schemas/Welcome" } let expected = { $$ref: { "value": { "message": "Hello, World!" } } } expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected) }) it("returns example value for date-time property", () => { let definition = { type: "string", format: "date-time" } // 0-20 chops off milliseconds // necessary because test latency can cause failures // it would be better to mock Date globally and expect a string - KS 11/18 let expected = new Date().toISOString().substring(0, 20) expect(sampleFromSchema(definition)).toContain(expected) }) it("returns example value for date property", () => { let definition = { type: "string", format: "date" } let expected = new Date().toISOString().substring(0, 10) expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns a UUID for a string with format=uuid", () => { let definition = { type: "string", format: "uuid" } let expected = "3fa85f64-5717-4562-b3fc-2c963f66afa6" expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns a hostname for a string with format=hostname", () => { let definition = { type: "string", format: "hostname" } let expected = "example.com" expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns an IPv4 address for a string with format=ipv4", () => { let definition = { type: "string", format: "ipv4" } let expected = "198.51.100.42" expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns an IPv6 address for a string with format=ipv6", () => { let definition = { type: "string", format: "ipv6" } let expected = "2001:0db8:5b96:0000:0000:426f:8e17:642a" expect(sampleFromSchema(definition)).toEqual(expected) }) describe("for array type", () => { it("returns array with sample of array type", () => { let definition = { type: "array", items: { type: "integer" } } let expected = [ 0 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns string for example for array that has example of type string", () => { let definition = { type: "array", items: { type: "string" }, example: "dog" } let expected = "dog" expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of examples for array that has examples", () => { let definition = { type: "array", items: { type: "string", }, example: [ "dog", "cat" ] } let expected = [ "dog", "cat" ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for oneOf type", () => { let definition = { type: "array", items: { type: "string", oneOf: [ { type: "integer" } ] } } let expected = [ 0 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for oneOf types", () => { let definition = { type: "array", items: { type: "string", oneOf: [ { type: "string" }, { type: "integer" } ] } } let expected = [ "string", 0 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for oneOf examples", () => { let definition = { type: "array", items: { type: "string", oneOf: [ { type: "string", example: "dog" }, { type: "integer", example: 1 } ] } } let expected = [ "dog", 1 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for anyOf type", () => { let definition = { type: "array", items: { type: "string", anyOf: [ { type: "integer" } ] } } let expected = [ 0 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for anyOf types", () => { let definition = { type: "array", items: { type: "string", anyOf: [ { type: "string" }, { type: "integer" } ] } } let expected = [ "string", 0 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns array of samples for anyOf examples", () => { let definition = { type: "array", items: { type: "string", anyOf: [ { type: "string", example: "dog" }, { type: "integer", example: 1 } ] } } let expected = [ "dog", 1 ] expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns null for a null example", () => { let definition = { "type": "object", "properties": { "foo": { "type": "string", "nullable": true, "example": null } } } let expected = { foo: null } expect(sampleFromSchema(definition)).toEqual(expected) }) it("returns null for a null object-level example", () => { let definition = { "type": "object", "properties": { "foo": { "type": "string", "nullable": true } }, "example": { "foo": null } } let expected = { foo: null } expect(sampleFromSchema(definition)).toEqual(expected) }) }) it("should use overrideExample when defined", () => { const definition = { type: "object", properties: { foo: { type: "string" } }, example: { foo: null } } const expected = { foo: "override" } expect(sampleFromSchema(definition, {}, expected)).toEqual(expected) }) }) describe("createXMLExample", function () { let sut = createXMLExample describe("simple types with xml property", function () { it("returns tag string when passing type string and xml:{name: \"newtagname\"}", function () { let definition = { type: "string", xml: { name: "newtagname" } } expect(sut(definition)).toEqual("\nstring") }) it("returns tag string when passing type string and xml:{name: \"newtagname\", prefix:\"test\"}", function () { let definition = { type: "string", xml: { name: "newtagname", prefix: "test" } } expect(sut(definition)).toEqual("\nstring") }) it("returns tag string when passing type string and xml:{\"namespace\": \"http://swagger.io/schema/sample\", \"prefix\": \"sample\"}", function () { let definition = { type: "string", xml: { namespace: "http://swagger.io/schema/sample", prefix: "sample", name: "name" } } expect(sut(definition)).toEqual("\nstring") }) it("returns tag string when passing type string and xml:{\"namespace\": \"http://swagger.io/schema/sample\"}", function () { let definition = { type: "string", xml: { namespace: "http://swagger.io/schema/sample", name: "name" } } expect(sut(definition)).toEqual("\nstring") }) it("returns tag test when passing default value", function () { let expected = "\ntest" let definition = { type: "string", "default": "test", xml: { name: "newtagname" } } expect(sut(definition)).toEqual(expected) }) it("returns default value when enum provided", function () { let expected = "\none" let definition = { type: "string", "default": "one", "enum": ["two", "one"], xml: { name: "newtagname" } } expect(sut(definition)).toEqual(expected) }) it("returns example value when provided", function () { let expected = "\ntwo" let definition = { type: "string", "default": "one", "example": "two", "enum": ["two", "one"], xml: { name: "newtagname" } } expect(sut(definition)).toEqual(expected) }) it("sets first enum if provided", function () { let expected = "\none" let definition = { type: "string", "enum": ["one", "two"], xml: { name: "newtagname" } } expect(sut(definition)).toEqual(expected) }) }) describe("array", function () { it("returns tag string when passing string items", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string" }, xml: { name: "tagname" } } expect(sut(definition)).toEqual(expected) }) it("returns tag string when passing string items with name", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string", xml: { name: "animal" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns tag string when passing string items with name", function () { let expected = "\n\n\tstring\n" let definition = { type: "array", items: { type: "string", xml: { name: "animal" } }, xml: { wrapped: true, name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("return correct nested wrapped array", function () { let expected = "\n\n\tstring\n" let definition = { type: "array", items: { type: "array", items: { type: "string" }, xml: { name: "dog" } }, xml: { wrapped: true, name: "aliens" } } expect(sut(definition)).toEqual(expected) }) it("return correct nested wrapped array with xml", function () { let expected = "\n\n\t\n\t\tstring\n\t\n" let definition = { type: "array", items: { type: "array", items: { type: "string", xml: { name: "dog" } }, xml: { name: "dogs", wrapped: true } }, xml: { wrapped: true, name: "aliens" } } expect(sut(definition)).toEqual(expected) }) it("adds namespace to array", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string", xml: { name: "dog", namespace: "test" } }, xml: { name: "aliens", namespace: "test_new" } } expect(sut(definition)).toEqual(expected) }) it("adds prefix to array", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string", xml: { name: "dog", prefix: "test" } }, xml: { name: "aliens", prefix: "test_new" } } expect(sut(definition)).toEqual(expected) }) it("adds prefix to array with no xml in items", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string" }, xml: { name: "dog", prefix: "test" } } expect(sut(definition)).toEqual(expected) }) it("adds namespace to array with no xml in items", function () { let expected = "\nstring" let definition = { type: "array", items: { type: "string" }, xml: { name: "dog", namespace: "test" } } expect(sut(definition)).toEqual(expected) }) it("adds namespace to array with wrapped", function () { let expected = "\n\n\tstring\n" let definition = { type: "array", items: { type: "string", xml: { name: "dog" } }, xml: { wrapped: true, name: "aliens", namespace: "test" } } expect(sut(definition)).toEqual(expected) }) it("adds prefix to array with wrapped", function () { let expected = "\n\n\tstring\n" let definition = { type: "array", items: { type: "string", xml: { name: "dog" } }, xml: { wrapped: true, name: "aliens", prefix: "test" } } expect(sut(definition)).toEqual(expected) }) it("returns wrapped array when type is not passed", function () { let expected = "\n\n\tstring\n" let definition = { items: { type: "string", xml: { name: "animal" } }, xml: { wrapped: true, name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with default values", function () { let expected = "\none\ntwo" let definition = { items: { type: "string", xml: { name: "animal" } }, "default": ["one", "two"], xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with default values with wrapped=true", function () { let expected = "\n\n\tone\n\ttwo\n" let definition = { items: { type: "string", xml: { name: "animal" } }, "default": ["one", "two"], xml: { wrapped: true, name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with default values", function () { let expected = "\none" let definition = { items: { type: "string", "enum": ["one", "two"], xml: { name: "animal" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with default values with wrapped=true", function () { let expected = "\n\n\t1\n\t2\n" let definition = { items: { "enum": ["one", "two"], type: "string", xml: { name: "animal" } }, "default": ["1", "2"], xml: { wrapped: true, name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with example values with ", function () { let expected = "\n\n\t1\n\t2\n" let definition = { type: "object", properties: { "animal": { "type": "array", "items": { "type": "string" }, "example": [ "1", "2" ] } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array with example values with wrapped=true", function () { let expected = "\n\n\t1\n\t2\n" let definition = { type: "array", items: { type: "string", xml: { name: "animal" } }, "example": [ "1", "2" ], xml: { wrapped: true, name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns array of objects with example values with wrapped=true", function () { let expected = `\n\n\t\n\t\t1\n\t\tArthur Dent\n\t\n\t\n\t\t2\n\t\tFord Prefect\n\t\n` let definition = { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "name": { "type": "string" } }, "xml": { "name": "user" } }, "xml": { "name": "users", "wrapped": true }, "example": [ { "id": 1, "name": "Arthur Dent" }, { "id": 2, "name": "Ford Prefect" } ] } expect(sut(definition)).toEqual(expected) }) }) describe("object", function () { it("returns object with 2 properties", function () { let expected = "\n\n\tstring\n\t0\n" let definition = { type: "object", properties: { alien: { type: "string" }, dog: { type: "integer" } }, xml: { name: "aliens" } } expect(sut(definition)).toEqual(expected) }) it("returns object with integer property and array property", function () { let expected = "\n\n\tstring\n\t0\n" let definition = { type: "object", properties: { aliens: { type: "array", items: { type: "string" } }, dog: { type: "integer" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns nested objects", function () { let expected = "\n\n\t\n\t\tstring\n\t\n\tstring\n" let definition = { type: "object", properties: { aliens: { type: "object", properties: { alien: { type: "string", xml: { name: "alien" } } } }, dog: { type: "string" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with no readonly fields for parameter", function () { let expected = "\n\n\t0\n" let definition = { type: "object", properties: { id: { type: "integer" }, dog: { readOnly: true, type: "string" } }, xml: { name: "animals" } } expect(sut(definition, { includeReadOnly: false })).toEqual(expected) }) it("returns object with readonly fields for parameter, with includeReadOnly", function () { let expected = "\n\n\t0\n\tstring\n" let definition = { type: "object", properties: { id: { type: "integer" }, dog: { readOnly: true, type: "string" } }, xml: { name: "animals" } } expect(sut(definition, { includeReadOnly: true })).toEqual(expected) }) it("returns object without writeonly fields for parameter", function () { let expected = "\n\n\t0\n" let definition = { type: "object", properties: { id: { type: "integer" }, dog: { writeOnly: true, type: "string" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with writeonly fields for parameter, with includeWriteOnly", function () { let expected = "\n\n\t0\n\tstring\n" let definition = { type: "object", properties: { id: { type: "integer" }, dog: { writeOnly: true, type: "string" } }, xml: { name: "animals" } } expect(sut(definition, { includeWriteOnly: true })).toEqual(expected) }) it("returns object with passed property as attribute", function () { let expected = "\n\n\tstring\n" let definition = { type: "object", properties: { id: { type: "integer", xml: { attribute: true } }, dog: { type: "string" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with passed property as attribute with custom name", function () { let expected = "\n\n\tstring\n" let definition = { type: "object", properties: { id: { type: "integer", xml: { attribute: true, name: "test" } }, dog: { type: "string" } }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with example values in attribute", function () { let expected = "\n\n\tadmin\n" let definition = { type: "object", properties: { id: { type: "integer", xml: { attribute: true } }, role:{ type: "string" } }, xml: { name: "user" }, example: { id: 42, role: "admin" } } expect(sut(definition)).toEqual(expected) }) it("returns object with enum values in attribute", function () { let expected = "\n\n\tstring\n" let definition = { type: "object", properties: { id: { type: "string", "enum": ["one", "two"], xml: { attribute: true } }, role:{ type: "string" } }, xml: { name: "user" } } expect(sut(definition)).toEqual(expected) }) it("returns object with default values in attribute", function () { let expected = "\n\n\tstring\n" let definition = { type: "object", properties: { id: { type: "string", "default": "one", xml: { attribute: true } }, role:{ type: "string" } }, xml: { name: "user" } } expect(sut(definition)).toEqual(expected) }) it("returns object with default values in attribute", function () { let expected = "\n\n\tstring\n" let definition = { type: "object", properties: { id: { type: "string", "example": "one", xml: { attribute: true } }, role:{ type: "string" } }, xml: { name: "user" } } expect(sut(definition)).toEqual(expected) }) it("returns object with example value", function () { let expected = "\n\n\t42\n\tadmin\n" let definition = { type: "object", properties: { id: { type: "integer" }, role:{ type: "string" } }, xml: { name: "user" }, example: { id: 42, role: "admin" } } expect(sut(definition)).toEqual(expected) }) it("returns object with additional props", function () { let expected = "\n\n\tstring\n\tstring\n\tstring\n\tstring\n" let definition = { type: "object", properties: { dog: { type: "string" } }, additionalProperties: { type: "string" }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with additional props =true", function () { let expected = "\n\n\tstring\n\tAnything can be here\n" let definition = { type: "object", properties: { dog: { type: "string" } }, additionalProperties: true, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("returns object with 2 properties with no type passed but properties", function () { let expected = "\n\n\tstring\n\t0\n" let definition = { properties: { alien: { type: "string" }, dog: { type: "integer" } }, xml: { name: "aliens" } } expect(sut(definition)).toEqual(expected) }) it("returns object with additional props with no type passed", function () { let expected = "\n\n\tstring\n\tstring\n\tstring\n" let definition = { additionalProperties: { type: "string" }, xml: { name: "animals" } } expect(sut(definition)).toEqual(expected) }) it("should use overrideExample when defined", () => { const expected = "\n\n\toverride\n" const definition = { type: "object", properties: { foo: { type: "string", xml: { name: "foo" } } }, example: { foo: null }, xml: { name: "bar" } } const overrideExample = { foo: "override" } expect(sut(definition, {}, overrideExample)).toEqual(expected) }) }) }) describe("memoizedSampleFromSchema", () => { it("should sequentially update memoized overrideExample", () => { const definition = { type: "object", properties: { foo: { type: "string" } }, example: { foo: null } } const expected = { foo: "override" } expect(memoizedSampleFromSchema(definition, {}, expected)).toEqual(expected) const updatedExpected = { foo: "cat" } expect(memoizedSampleFromSchema(definition, {}, updatedExpected)).toEqual(updatedExpected) }) }) describe("memoizedCreateXMLExample", () => { it("should sequentially update memoized overrideExample", () => { const expected = "\n\n\toverride\n" const definition = { type: "object", properties: { foo: { type: "string", xml: { name: "foo" } } }, example: { foo: null }, xml: { name: "bar" } } const overrideExample = { foo: "override" } expect(memoizedCreateXMLExample(definition, {}, overrideExample)).toEqual(expected) const updatedOverrideExample = { foo: "cat" } const updatedExpected = "\n\n\tcat\n" expect(memoizedCreateXMLExample(definition, {}, updatedOverrideExample)).toEqual(updatedExpected) }) })