Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add support of additional data type formats #210

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 8 additions & 1 deletion filters/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -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':
Expand Down Expand Up @@ -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);
}
}
Expand Down
123 changes: 123 additions & 0 deletions tests/__snapshots__/additional-formats.test.js.snap
Original file line number Diff line number Diff line change
@@ -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 \\");
}
}"
`;
32 changes: 32 additions & 0 deletions tests/additional-formats.test.js
Original file line number Diff line number Diff line change
@@ -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();
}
});
});
40 changes: 40 additions & 0 deletions tests/mocks/additional-type-formats.yml
Original file line number Diff line number Diff line change
@@ -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