Skip to content

Commit 57feb25

Browse files
#50 Asyncapi support external files (#52)
* #50 Add support to reference external files * #50 Update pom version * #50 Fix objects creation in the contracts * #50 Reuse variable * #50 Support for external files and fix tests * #50 Update pom version * #50 Fix codacy errors and refactor tests * #50 Fix codacy issues * #50 Fix array of objects * #50 Fix codacy issue * #50 Check that there are no references and properties at the same level and refactor code * #50 Fix variables to be final
1 parent 45e1930 commit 57feb25

File tree

17 files changed

+512
-197
lines changed

17 files changed

+512
-197
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ After you have these installed, you need to add the Spring Cloud Contract Maven
3535
<dependency>
3636
<groupId>net.coru</groupId>
3737
<artifactId>scc-multiapi-converter</artifactId>
38-
<version>2.4.1</version>
38+
<version>2.6.0</version>
3939
<scope>compile</scope>
4040
</dependency>
4141
</dependencies>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>net.coru</groupId>
88
<artifactId>scc-multiapi-converter</artifactId>
9-
<version>2.5.0</version>
9+
<version>2.6.0</version>
1010
<name>SCC-MultiApi-Converter</name>
1111
<description>Generates Spring Cloud Contracts based on an OpenApi and AsyncApi document</description>
1212
<url>https://github.com/corunet/scc-multiapi-converter</url>

src/main/java/net/coru/multiapi/converter/asyncapi/AsyncApiContractConverter.java

Lines changed: 243 additions & 103 deletions
Large diffs are not rendered by default.

src/main/java/net/coru/multiapi/converter/utils/BasicTypeConstants.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public final class BasicTypeConstants {
5252

5353
public static final String PROPERTIES = "properties";
5454

55+
public static final String SCHEMA = "schema";
56+
5557
public static final String SCHEMAS = "schemas";
5658

5759
public static final String FORMAT = "format";
@@ -62,6 +64,8 @@ public final class BasicTypeConstants {
6264

6365
public static final String TYPE = "type";
6466

67+
public static final String PAYLOAD = "payload";
68+
6569
public static final RegexProperty STRING_REGEX = RegexPatterns.alphaNumeric();
6670

6771
public static final RegexProperty INT_REGEX = RegexPatterns.positiveInt();

src/test/java/net/coru/multiapi/converter/asyncapi/AsyncApiContractConverterTest.java

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ void fileIsAcceptedTrue() {
3737
@Test
3838
@DisplayName("AsyncApi: Check if a contract is returned")
3939
void convertFromTest() {
40-
Collection<Contract> contracts;
41-
File file = new File(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
42-
contracts = multiApiContractConverter.convertFrom(file);
43-
List<Contract> contractList = new ArrayList<>(contracts);
40+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
4441

4542
assertThat(contractList).hasSize(2);
4643

@@ -60,9 +57,7 @@ void convertFromTest() {
6057
@Test
6158
@DisplayName("AsyncApi: Check if Input is being processed okay")
6259
void testInput() {
63-
File file = new File(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
64-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
65-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
60+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
6661
Map<String, Object> order = asyncApiContractConverterTestFixtures.createOrder();
6762

6863
Contract publishContract = contractList.get(0);
@@ -79,9 +74,7 @@ void testInput() {
7974
@Test
8075
@DisplayName("AsyncApi: Check if OutputMessage is being processed okay")
8176
void testOutputMessage() {
82-
File file = new File(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
83-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
84-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
77+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.EVENT_API_FILE);
8578
Map<String, Object> order = asyncApiContractConverterTestFixtures.createOrder();
8679

8780
Contract publishContract = contractList.get(0);
@@ -105,9 +98,7 @@ void testOutputMessage() {
10598
@Test
10699
@DisplayName("AsyncApi: Check if the enum logic is being processed okay")
107100
void testEnums() {
108-
File file = new File(asyncApiContractConverterTestFixtures.TEST_ENUMS_FILE);
109-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
110-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
101+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_ENUMS_FILE);
111102

112103
for (int i = 0; i < contractList.size(); i++) {
113104
Contract contract = contractList.get(i);
@@ -128,9 +119,7 @@ void testEnums() {
128119
@Test
129120
@DisplayName("AsyncApi: Check if complex objects are being processed okay")
130121
void testComplexObjects() {
131-
File file = new File(asyncApiContractConverterTestFixtures.TEST_COMPLEX_OBJECTS_FILE);
132-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
133-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
122+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_COMPLEX_OBJECTS_FILE);
134123

135124
for (int i = 0; i < contractList.size(); i++) {
136125
Contract contract = contractList.get(i);
@@ -150,17 +139,15 @@ void testComplexObjects() {
150139
} else {
151140
assertThat(nameValue).containsEntry(asyncApiContractConverterTestFixtures.COMPANY_NAME, asyncApiContractConverterTestFixtures.CORUNET);
152141
assertThat(nameValue).containsEntry(asyncApiContractConverterTestFixtures.REFERENCE_NAME, 3324);
153-
assertThat(addressValue).containsEntry(asyncApiContractConverterTestFixtures.STREET, "Calle Sor Joaquina");
142+
assertThat(addressValue).containsEntry(asyncApiContractConverterTestFixtures.STREET, asyncApiContractConverterTestFixtures.STREET_VALUE);
154143
}
155144
}
156145
}
157146

158147
@Test
159148
@DisplayName("AsyncApi: Check if arrays are being processed okay")
160149
void testArrays() {
161-
File file = new File(asyncApiContractConverterTestFixtures.TEST_ARRAYS_FILE);
162-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
163-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
150+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_ARRAYS_FILE);
164151

165152
for (int i = 0; i < contractList.size(); i++) {
166153
Contract contract = contractList.get(i);
@@ -189,9 +176,7 @@ void testArrays() {
189176
@Test
190177
@DisplayName("AsyncApi: Check if arrays with reference to an object are being processed okay")
191178
void testArraysWithRef() {
192-
File file = new File(asyncApiContractConverterTestFixtures.TEST_ARRAYS_REF_FILE);
193-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
194-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
179+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_ARRAYS_REF_FILE);
195180

196181
for (int i = 0; i < contractList.size(); i++) {
197182
Contract contract = contractList.get(i);
@@ -215,9 +200,7 @@ void testArraysWithRef() {
215200
@Test
216201
@DisplayName("AsyncApi: Check if basic types are being processed okay")
217202
void testBasicTypes() {
218-
File file = new File(asyncApiContractConverterTestFixtures.TEST_BASIC_TYPES_FILE);
219-
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
220-
ArrayList<Contract> contractList = new ArrayList<>(contracts);
203+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_BASIC_TYPES_FILE);
221204

222205
for (int i = 0; i < contractList.size(); i++) {
223206
Contract contract = contractList.get(i);
@@ -244,7 +227,62 @@ void testBasicTypes() {
244227
assertThat(orderValue).containsEntry(asyncApiContractConverterTestFixtures.BOOLEAN_TYPE, true);
245228
}
246229
}
230+
}
231+
232+
@Test
233+
@DisplayName("AsyncApi: Check if references to external files work correctly")
234+
void testExternalFiles() {
235+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_EXTERNAL_FILE);
236+
237+
for (int i = 0; i < contractList.size(); i++) {
238+
Contract contract = contractList.get(i);
239+
240+
Map<String, Object> bodyValue = (Map<String, Object>) contract.getOutputMessage().getBody().getClientValue();
241+
assertThat(bodyValue.get(asyncApiContractConverterTestFixtures.ORDER)).isNotNull();
242+
Map<String, Object> orderValue = (Map<String, Object>) bodyValue.get(asyncApiContractConverterTestFixtures.ORDER);
243+
List<Integer> amount = (ArrayList<Integer>) orderValue.get(asyncApiContractConverterTestFixtures.AMOUNT);
244+
245+
if (i == 0) {
246+
assertThat(orderValue.get(asyncApiContractConverterTestFixtures.COMPANY_NAME)).isNotNull().isInstanceOf(String.class);
247+
assertThat(orderValue.get(asyncApiContractConverterTestFixtures.IS_SENT)).isNotNull().isInstanceOf(Boolean.class);
248+
assertThat(amount).isNotNull().isInstanceOf(ArrayList.class);
249+
} else {
250+
assertThat(orderValue).containsEntry(asyncApiContractConverterTestFixtures.COMPANY_NAME, asyncApiContractConverterTestFixtures.CORUNET);
251+
assertThat(orderValue).containsEntry(asyncApiContractConverterTestFixtures.IS_SENT, true);
252+
assertThat(amount).isEqualTo(asyncApiContractConverterTestFixtures.INT_ARRAY_VALUES);
253+
}
254+
}
255+
}
256+
257+
@Test
258+
@DisplayName("AsyncApi: Check if references to external files work correctly with multiple schemas")
259+
void testExternalFilesWithMultipleSchemas() {
260+
List<Contract> contractList = getContracts(asyncApiContractConverterTestFixtures.TEST_EXTERNAL_FILE_MULTIPLE_SCHEMAS);
261+
262+
for (int i = 0; i < contractList.size(); i++) {
263+
Contract contract = contractList.get(i);
247264

265+
Map<String, Object> bodyValue = (Map<String, Object>) contract.getOutputMessage().getBody().getClientValue();
266+
assertThat(bodyValue.get(asyncApiContractConverterTestFixtures.ORDERS)).isNotNull();
267+
Map<String, Object> ordersValue = (Map<String, Object>) bodyValue.get(asyncApiContractConverterTestFixtures.ORDERS);
268+
assertThat(ordersValue.get(asyncApiContractConverterTestFixtures.ORDER_LINE)).isNotNull();
269+
Map<String, Object> orderLineValue = (Map<String, Object>) ordersValue.get(asyncApiContractConverterTestFixtures.ORDER_LINE);
270+
assertThat(orderLineValue.get(asyncApiContractConverterTestFixtures.ORDER)).isNotNull();
271+
Map<String, Object> orderValue = (Map<String, Object>) orderLineValue.get(asyncApiContractConverterTestFixtures.ORDER);
272+
273+
if (i == 0) {
274+
assertThat(orderValue.get(asyncApiContractConverterTestFixtures.COMPANY_NAME)).isNotNull().isInstanceOf(String.class);
275+
} else {
276+
assertThat(orderValue).containsEntry(asyncApiContractConverterTestFixtures.COMPANY_NAME, asyncApiContractConverterTestFixtures.CORUNET);
277+
}
278+
}
279+
}
280+
281+
private List<Contract> getContracts(String filePath) {
282+
File file = new File(filePath);
283+
Collection<Contract> contracts = multiApiContractConverter.convertFrom(file);
284+
List<Contract> contractList = new ArrayList<>(contracts);
285+
return contractList;
248286
}
249287

250288
}

src/test/java/net/coru/multiapi/converter/asyncapi/AsyncApiContractConverterTestFixtures.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public class AsyncApiContractConverterTestFixtures {
2424

2525
public final String TEST_ENUMS_FILE = "src/test/resources/asyncapi/testEnums.yml";
2626

27+
public final String TEST_EXTERNAL_FILE = "src/test/resources/asyncapi/testExternalFiles.yml";
28+
29+
public final String TEST_EXTERNAL_FILE_MULTIPLE_SCHEMAS = "src/test/resources/asyncapi/testExternalFilesWithMultipleSchemas.yml";
30+
2731
public final String PUBLISH_NAME = "publishOperation";
2832

2933
public final String TRIGGERED_BY = "publishOperation()";
@@ -42,6 +46,10 @@ public class AsyncApiContractConverterTestFixtures {
4246

4347
public final String ORDER = "order";
4448

49+
public final String ORDERS = "orders";
50+
51+
public final String ORDER_LINE = "orderLine";
52+
4553
public final String EMPLOYEES = "employees";
4654

4755
public final String INT_ARRAY = "intArray";
@@ -60,6 +68,8 @@ public class AsyncApiContractConverterTestFixtures {
6068

6169
public final String STREET = "street";
6270

71+
public final String STREET_VALUE = "Calle Sor Joaquina";
72+
6373
public final String AMOUNT = "amount";
6474

6575
public final String INTEGER_TYPE = "integerType";
@@ -76,6 +86,8 @@ public class AsyncApiContractConverterTestFixtures {
7686

7787
public final String BOOLEAN_TYPE = "booleanType";
7888

89+
public final String IS_SENT = "isSent";
90+
7991
public final List<Integer> INT_ARRAY_VALUES = List.of(1, 2, 3);
8092

8193
public final List<Double> DOUBLE_ARRAY_VALUES = List.of(1.25, 2.5, 3.75);

src/test/resources/asyncapi/event-api.yml

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,21 @@ components:
4242
messages:
4343
OrderCreated:
4444
payload:
45-
$ref: '#/components/schemas/OrderCreated'
45+
$ref: '#/components/schemas/OrderCreatedSchema'
4646
CreateOrder:
4747
payload:
48-
$ref: '#/components/schemas/CreateOrder'
48+
$ref: '#/components/schemas/CreateOrderSchema'
4949
schemas:
50-
CreateOrder:
50+
CreateOrderSchema:
5151
type: object
5252
properties:
5353
order:
54-
type: object
55-
properties:
56-
$ref: '#/components/schemas/Order'
57-
OrderCreated:
54+
$ref: '#/components/schemas/Order'
55+
OrderCreatedSchema:
5856
type: object
5957
properties:
6058
order:
61-
type: object
62-
properties:
63-
$ref: '#/components/schemas/Order'
59+
$ref: '#/components/schemas/Order'
6460
Order:
6561
type: object
6662
properties:
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
components:
2+
schemas:
3+
Orders:
4+
type: object
5+
properties:
6+
orderLine:
7+
$ref: './externalfiles/thirdSchema.yml#/components/schemas/OrderLine'
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
components:
2+
schemas:
3+
Order:
4+
type: object
5+
properties:
6+
companyName:
7+
type: string
8+
example: Corunet
9+
isSent:
10+
type: boolean
11+
example: true
12+
amount:
13+
type: array
14+
items:
15+
type: integer
16+
format: int32
17+
example: [ 1, 2, 3 ]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
components:
2+
schemas:
3+
OrderLine:
4+
type: object
5+
properties:
6+
order:
7+
$ref: '#/components/schemas/Order'
8+
9+
Order:
10+
type: object
11+
properties:
12+
companyName:
13+
type: string
14+
example: Corunet

0 commit comments

Comments
 (0)