diff --git a/filters/all.js b/filters/all.js index 3e5c6f035..55ef4d59a 100644 --- a/filters/all.js +++ b/filters/all.js @@ -79,8 +79,15 @@ function toJavaType(str, isRequired) { resultType = 'java.time.OffsetDateTime'; break; case 'string': case 'password': + case 'email': + case 'uri': + case 'hostname': + case 'ipv4': + case 'ipv6': case 'byte': resultType = 'String'; break; + case 'uuid': + resultType = 'java.util.UUID'; break; case 'float': resultType = 'float'; break; case 'number': @@ -108,7 +115,7 @@ filter.isProtocol = isProtocol; function isObjectType(schemas){ var res = []; for (let obj of schemas) { - if (obj._json['type'] === 'object' && !obj._json['x-parser-schema-id'].startsWith('<')) { + if (obj._json['type'] === 'object' && obj._json['x-parser-schema-id'] && !obj._json['x-parser-schema-id'].startsWith('<')) { res.push(obj); } } diff --git a/tests/__snapshots__/additional-formats.test.js.snap b/tests/__snapshots__/additional-formats.test.js.snap new file mode 100644 index 000000000..f1935873f --- /dev/null +++ b/tests/__snapshots__/additional-formats.test.js.snap @@ -0,0 +1,123 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`template integration tests for additional formats of data types should generate DTO file with proper type classes 1`] = ` +"package com.asyncapi.model; + +import javax.validation.constraints.*; +import javax.validation.Valid; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.util.List; +import java.util.Objects; + + +public class SongPayload { + + private @Valid java.util.UUID id; + + private @Valid String title; + + private @Valid String uri; + + private @Valid String email; + + + + + /** + * ID + */ + @JsonProperty(\\"id\\") + public java.util.UUID getId() { + return id; + } + + public void setId(java.util.UUID id) { + this.id = id; + } + + + /** + * Title of a song + */ + @JsonProperty(\\"title\\") + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + + /** + * URI of a song + */ + @JsonProperty(\\"uri\\") + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + + /** + * Author email + */ + @JsonProperty(\\"email\\") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SongPayload songPayload = (SongPayload) o; + return + Objects.equals(this.id, songPayload.id) && + Objects.equals(this.title, songPayload.title) && + Objects.equals(this.uri, songPayload.uri) && + Objects.equals(this.email, songPayload.email); + } + + @Override + public int hashCode() { + return Objects.hash(id, title, uri, email); + } + + @Override + public String toString() { + return \\"class SongPayload {\\\\n\\" + + + \\" id: \\" + toIndentedString(id) + \\"\\\\n\\" + + \\" title: \\" + toIndentedString(title) + \\"\\\\n\\" + + \\" uri: \\" + toIndentedString(uri) + \\"\\\\n\\" + + \\" email: \\" + toIndentedString(email) + \\"\\\\n\\" + + \\"}\\"; + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return \\"null\\"; + } + return o.toString().replace(\\"\\\\n\\", \\"\\\\n \\"); + } +}" +`; diff --git a/tests/additional-formats.test.js b/tests/additional-formats.test.js new file mode 100644 index 000000000..b995450eb --- /dev/null +++ b/tests/additional-formats.test.js @@ -0,0 +1,32 @@ +const path = require('path'); +const Generator = require('@asyncapi/generator'); +const { readFile } = require('fs').promises; + +const MAIN_TEST_RESULT_PATH = path.join('tests', 'temp', 'integrationTestResult'); + +const generateFolderName = () => { + // you always want to generate to new directory to make sure test runs in clear environment + return path.resolve(MAIN_TEST_RESULT_PATH, Date.now().toString()); +}; + +describe('template integration tests for additional formats of data types', () => { + + jest.setTimeout(30000); + + it('should generate DTO file with proper type classes', async() => { + const outputDir = generateFolderName(); + const params = {}; + const kafkaExamplePath = './mocks/additional-type-formats.yml'; + + const generator = new Generator(path.normalize('./'), outputDir, { forceWrite: true, templateParams: params }); + await generator.generateFromFile(path.resolve('tests', kafkaExamplePath)); + + const expectedFiles = [ + '/src/main/java/com/asyncapi/model/SongPayload.java' + ]; + for (const index in expectedFiles) { + const file = await readFile(path.join(outputDir, expectedFiles[index]), 'utf8'); + expect(file).toMatchSnapshot(); + } + }); +}); diff --git a/tests/mocks/additional-type-formats.yml b/tests/mocks/additional-type-formats.yml new file mode 100644 index 000000000..91e29f37b --- /dev/null +++ b/tests/mocks/additional-type-formats.yml @@ -0,0 +1,40 @@ +asyncapi: 2.0.0 +info: + title: Record Label Service + version: 1.0.0 + description: This service is in charge of processing music +servers: + production: + url: 'my-kafka-hostname:9092' + protocol: kafka + description: Production Instance 1 +channels: + song.released: + publish: + message: + $ref: '#/components/messages/song' + subscribe: + message: + $ref: '#/components/messages/song' +components: + messages: + song: + payload: + $id: SongPayload + type: object + properties: + id: + description: ID + type: string + format: uuid + title: + description: Title of a song + type: string + uri: + description: URI of a song + type: string + format: uri + email: + description: Author email + type: string + format: email \ No newline at end of file