2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2024 Ericsson
4 * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
21 package org.oran.smo.teiv.pgsqlgenerator.schema.data;
23 import java.lang.reflect.Constructor;
24 import java.lang.reflect.InvocationTargetException;
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.List;
29 import org.junit.jupiter.api.Assertions;
30 import org.junit.jupiter.api.BeforeEach;
31 import org.junit.jupiter.api.Test;
32 import org.mockito.MockitoAnnotations;
33 import org.springframework.beans.factory.annotation.Autowired;
34 import org.springframework.boot.test.context.SpringBootTest;
36 import org.oran.smo.teiv.pgsqlgenerator.Attribute;
37 import org.oran.smo.teiv.pgsqlgenerator.Column;
38 import org.oran.smo.teiv.pgsqlgenerator.Entity;
39 import org.oran.smo.teiv.pgsqlgenerator.UniqueConstraint;
40 import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint;
41 import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint;
42 import org.oran.smo.teiv.pgsqlgenerator.Relationship;
43 import org.oran.smo.teiv.pgsqlgenerator.Table;
44 import org.oran.smo.teiv.pgsqlgenerator.TestHelper;
45 import org.oran.smo.teiv.pgsqlgenerator.schema.model.HashInfoDataGenerator;
46 import lombok.extern.slf4j.Slf4j;
48 import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS;
49 import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS;
50 import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB;
53 @SpringBootTest(classes = { TableBuilder.class, HashInfoDataGenerator.class })
54 class TableBuilderTest {
56 private TableBuilder tableBuilder;
62 MockitoAnnotations.openMocks(this);
67 List<Entity> entities = List.of(
68 Entity.builder().entityName("Sector").attributes(
70 Attribute.builder().name("azimuth").dataType("DECIMAL").build(),
71 Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
72 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
73 Attribute.builder().name("geo-location").dataType("geography").build(),
74 Attribute.builder().name("sectorId").dataType("jsonb").build()))
75 .moduleReferenceName("").build(),
77 Entity.builder().entityName("Namespace").attributes(
79 Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
80 .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
81 Attribute.builder().name("name").dataType("TEXT").build()))
82 .moduleReferenceName("").build());
84 List<List<Relationship>> relationships = List.of(
85 List.of(Relationship.builder().name("oneToOne")
86 .aSideAssociationName("used-Sector")
87 .aSideMOType("Sector")
88 .aSideMinCardinality(0)
89 .aSideMaxCardinality(1)
90 .bSideAssociationName("used-by-Namespace")
91 .bSideMOType("Namespace")
92 .bSideMinCardinality(0)
93 .bSideMaxCardinality(1)
94 .relationshipDataLocation("A_SIDE")
95 .associationKind("BI_DIRECTIONAL")
96 .connectSameEntity(false)
97 .moduleReferenceName("").build()),
98 List.of(Relationship.builder().name("oneToMany")
99 .aSideAssociationName("used-Sector")
100 .aSideMOType("Sector")
101 .aSideMinCardinality(0)
102 .aSideMaxCardinality(1)
103 .bSideAssociationName("used-by-Namespace")
104 .bSideMOType("Namespace")
105 .bSideMinCardinality(0)
106 .bSideMaxCardinality(100)
107 .relationshipDataLocation("B_SIDE")
108 .associationKind("BI_DIRECTIONAL")
109 .connectSameEntity(false)
110 .moduleReferenceName("").build()),
111 List.of(Relationship.builder().name("manyToOne")
112 .aSideAssociationName("used-Sector")
113 .aSideMOType("Sector")
114 .aSideMinCardinality(0)
115 .aSideMaxCardinality(100)
116 .bSideAssociationName("used-by-Namespace")
117 .bSideMOType("Namespace")
118 .bSideMinCardinality(0)
119 .bSideMaxCardinality(1)
120 .relationshipDataLocation("A_SIDE")
121 .associationKind("BI_DIRECTIONAL")
122 .connectSameEntity(false)
123 .moduleReferenceName("").build()),
124 List.of(Relationship.builder().name("manyToMany")
125 .aSideAssociationName("used-Sector")
126 .aSideMOType("Sector")
127 .aSideMinCardinality(0)
128 .aSideMaxCardinality(100)
129 .bSideAssociationName("used-by-Namespace")
130 .bSideMOType("Namespace")
131 .bSideMinCardinality(0)
132 .bSideMaxCardinality(100)
133 .relationshipDataLocation("RELATION")
134 .associationKind("BI_DIRECTIONAL")
135 .connectSameEntity(false)
136 .moduleReferenceName("").build()),
137 // Relationship connecting same entity 1:1
138 List.of(Relationship.builder().name("relationshipConnectingSameEntity")
139 .aSideAssociationName("used-Sector")
140 .aSideMOType("Sector")
141 .aSideMinCardinality(0)
142 .aSideMaxCardinality(1)
143 .bSideAssociationName("used-by-Sector")
144 .bSideMOType("Sector")
145 .bSideMinCardinality(0)
146 .bSideMaxCardinality(1)
147 .relationshipDataLocation("RELATION")
148 .associationKind("BI_DIRECTIONAL")
149 .connectSameEntity(true)
150 .moduleReferenceName("").build()),
151 // Relationship connecting same entity 1:N
152 List.of(Relationship.builder().name("relationshipConnectingSameEntity")
153 .aSideAssociationName("used-Sector")
154 .aSideMOType("Sector")
155 .aSideMinCardinality(0)
156 .aSideMaxCardinality(1)
157 .bSideAssociationName("used-by-Sector")
158 .bSideMOType("Sector")
159 .bSideMinCardinality(0)
160 .bSideMaxCardinality(100)
161 .relationshipDataLocation("RELATION")
162 .associationKind("BI_DIRECTIONAL")
163 .connectSameEntity(true)
164 .moduleReferenceName("").build()),
165 // Relationship connecting same entity N:1
166 List.of(Relationship.builder().name("relationshipConnectingSameEntity")
167 .aSideAssociationName("used-Sector")
168 .aSideMOType("Sector")
169 .aSideMinCardinality(0)
170 .aSideMaxCardinality(100)
171 .bSideAssociationName("used-by-Sector")
172 .bSideMOType("Sector")
173 .bSideMinCardinality(0)
174 .bSideMaxCardinality(1)
175 .relationshipDataLocation("RELATION")
176 .associationKind("BI_DIRECTIONAL")
177 .connectSameEntity(true)
178 .moduleReferenceName("").build()),
179 // Relationship connecting same entity N:M
180 List.of(Relationship.builder().name("relationshipConnectingSameEntity")
181 .aSideAssociationName("used-Sector")
182 .aSideMOType("Sector")
183 .aSideMinCardinality(0)
184 .aSideMaxCardinality(100)
185 .bSideAssociationName("used-by-Sector")
186 .bSideMOType("Sector")
187 .bSideMinCardinality(0)
188 .bSideMaxCardinality(100)
189 .relationshipDataLocation("RELATION")
190 .associationKind("BI_DIRECTIONAL")
191 .connectSameEntity(true)
192 .moduleReferenceName("").build()));
196 void checkOneToOneRelationshipMappingTest() {
201 List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
203 Column.builder().name("azimuth").dataType("DECIMAL").build(),
204 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
205 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
206 Column.builder().name("sectorId").dataType("jsonb").build(),
207 Column.builder().name("geo-location").dataType("geography").build(),
208 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
209 Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)")
210 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector")
211 .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(),
212 Column.builder().name("REL_ID_oneToOne").dataType("VARCHAR(511)")
213 .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_oneToOne").tableName("Sector")
214 .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(),
215 Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(),
216 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
217 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(),
218 Column.builder().name(String.format("REL_CD_%s_oneToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
219 Column.builder().name(String.format("REL_CD_%s_oneToOne", DECORATORS)).dataType(JSONB).defaultValue("{}").build())).build(),
221 Table.builder().name("Namespace").columns(
223 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
224 .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
225 Column.builder().name("name").dataType("TEXT").build(),
226 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
227 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
228 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
233 List<Table> actualResult = tableBuilder.getTables(entities, relationships.get(0));
236 runTest(actualResult, expectedResult);
240 void checkOneToManyRelationshipMappingTest() {
245 List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
247 Column.builder().name("azimuth").dataType("DECIMAL").build(),
248 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
249 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
250 Column.builder().name("sectorId").dataType("jsonb").build(),
251 Column.builder().name("geo-location").dataType("geography").build(),
252 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
253 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
254 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
256 Table.builder().name("Namespace").columns(
258 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
259 .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
260 Column.builder().name("name").dataType("TEXT").build(),
261 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
262 Column.builder().name("REL_FK_used-by-Namespace").dataType("VARCHAR(511)")
263 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_used-by-Namespace")
264 .tableName("Namespace").referencedTable("Sector").columnToAddConstraintTo("REL_FK_used-by-Namespace").build())).build(),
265 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
266 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(),
267 Column.builder().name("REL_ID_oneToMany").dataType("VARCHAR(511)")
268 .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_oneToMany").tableName("Namespace")
269 .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(),
270 Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(),
271 Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
272 Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
276 List<Table> actualResult = tableBuilder.getTables(entities, relationships.get(1));
279 runTest(actualResult, expectedResult);
284 void checkManyToOneRelationshipMappingTest() {
289 List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
291 Column.builder().name("azimuth").dataType("DECIMAL").build(),
292 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
293 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
294 Column.builder().name("sectorId").dataType("jsonb").build(),
295 Column.builder().name("geo-location").dataType("geography").build(),
296 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
297 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
298 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(),
299 Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)")
300 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector")
301 .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(),
302 Column.builder().name("REL_ID_manyToOne").dataType("VARCHAR(511)")
303 .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_manyToOne").tableName("Sector")
304 .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(),
305 Column.builder().name("REL_CD_sourceIds_manyToOne").dataType("jsonb").defaultValue("[]").build(),
306 Column.builder().name(String.format("REL_CD_%s_manyToOne", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
307 Column.builder().name(String.format("REL_CD_%s_manyToOne", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
309 Table.builder().name("Namespace").columns(
311 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
312 .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
313 Column.builder().name("name").dataType("TEXT").build(),
314 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
315 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
316 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
320 List<Table> actualResult = tableBuilder.getTables(entities, relationships.get(2));
323 runTest(actualResult, expectedResult);
328 void checkManyToManyRelationshipMappingTest() {
331 List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
333 Column.builder().name("azimuth").dataType("DECIMAL").build(),
334 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
335 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
336 Column.builder().name("sectorId").dataType("jsonb").build(),
337 Column.builder().name("geo-location").dataType("geography").build(),
338 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
339 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
340 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
342 Table.builder().name("Namespace").columns(
344 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
345 .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
346 Column.builder().name("name").dataType("TEXT").build(),
347 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
348 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
349 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
351 Table.builder().name("manyToMany").columns(
353 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_manyToMany_id")
354 .tableName("manyToMany").columnToAddConstraintTo("id").build())).build(),
355 Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
356 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_aSide_Sector")
357 .tableName("manyToMany").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
358 Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)")
359 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_bSide_Namespace")
360 .tableName("manyToMany").referencedTable("Namespace").columnToAddConstraintTo("bSide_Namespace").build())).build(),
361 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
362 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
363 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
367 List<Table> actualResult = tableBuilder.getTables(entities, relationships.get(3));
370 runTest(actualResult, expectedResult);
374 void checkRelationshipConnectingSameEntityMappingTest() {
376 List<Entity> sameEntities = List.of(
378 Entity.builder().entityName("Sector").attributes(
379 List.of(Attribute.builder().name("azimuth").dataType("DECIMAL").build(),
380 Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
381 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
382 Attribute.builder().name("sectorId").dataType("jsonb").build(),
383 Attribute.builder().name("geo-location").dataType("geography").build()))
384 .moduleReferenceName("").build());
387 List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
389 Column.builder().name("azimuth").dataType("DECIMAL").build(),
390 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
391 .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
392 Column.builder().name("sectorId").dataType("jsonb").build(),
393 Column.builder().name("geo-location").dataType("geography").build(),
394 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
395 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
396 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
398 Table.builder().name("relationshipConnectingSameEntity").columns(
400 Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder()
401 .constraintName("PK_relationshipConnectingSameEntity_id").tableName("relationshipConnectingSameEntity").columnToAddConstraintTo("id")
403 Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
404 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_aSide_Sector")
405 .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
406 Column.builder().name("bSide_Sector").dataType("VARCHAR(511)")
407 .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_bSide_Sector")
408 .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("bSide_Sector").build())).build(),
409 Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
410 Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
411 Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
415 List<Table> actualResultOneToOne = tableBuilder.getTables(sameEntities, relationships.get(4));
416 List<Table> actualResultOneToMany = tableBuilder.getTables(sameEntities, relationships.get(5));
417 List<Table> actualResultManyToOne = tableBuilder.getTables(sameEntities, relationships.get(6));
418 List<Table> actualResultManyToMany = tableBuilder.getTables(sameEntities, relationships.get(7));
421 // Test relationship connecting same entity (one to one)
422 runTest(actualResultOneToOne, expectedResult);
424 // Test relationship connecting same entity (one to many)
425 runTest(actualResultOneToMany, expectedResult);
427 // Test relationship connecting same entity (many to one)
428 runTest(actualResultManyToOne, expectedResult);
430 // Test relationship connecting same entity (many to many)
431 runTest(actualResultManyToMany, expectedResult);
435 void runTest(List<Table> generatedTables, List<Table> expectedTables) {
437 List<String> allTableNamesFromGeneratedResult = TestHelper.extractTableNames(generatedTables);
438 List<String> allTableNamesFromExpectedResult = TestHelper.extractTableNames(expectedTables);
440 // Check if generatedResult contains all tables
441 Assertions.assertEquals(allTableNamesFromExpectedResult, allTableNamesFromGeneratedResult);
444 expectedTables.forEach(expectedTable -> {
445 generatedTables.stream().filter(generatedTable -> generatedTable.getName().equals(expectedTable.getName())).findFirst()
446 .ifPresent(generatedTable -> {
447 List<Column> columnsInExpected = expectedTable.getColumns();
448 List<Column> columnsInGenerated = generatedTable.getColumns();
450 // Check if all columns for each table were added correctly
451 Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size());
453 List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated);
454 List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected);
456 // Check if generatedResult contains all columns for a table
457 Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult);
459 columnsInExpected.forEach(columnInExpected -> {
460 columnsInGenerated.stream().filter(columnInGenerated -> columnInGenerated.getName().equals(columnInExpected.getName()))
461 .findFirst().ifPresent(columnInGenerated -> {
463 if (columnInExpected.getName().equals("id")) {
464 Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType());
465 Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints()));
468 // Check if each attributes' datatype is picked correctly
469 Assertions.assertEquals(columnInExpected.getDataType().replace("\"", ""), columnInGenerated.getDataType());
471 // Check if each attributes' default value is picked correctly
472 Assertions.assertEquals(columnInExpected.getDefaultValue(), columnInGenerated.getDefaultValue());
474 if (!columnInExpected.getPostgresConstraints().isEmpty()) {
476 Assertions.assertEquals(columnInExpected.getPostgresConstraints().size(), columnInGenerated.getPostgresConstraints().size());
478 List<String> expectedConstraintNames = TestHelper.extractConstraintName(columnInExpected.getPostgresConstraints());
479 List<String> actualConstraintNames = TestHelper.extractConstraintName(columnInGenerated.getPostgresConstraints());
481 // Check if constraint names in expected result match with those in actual result
482 Assertions.assertEquals(expectedConstraintNames, actualConstraintNames);
484 columnInExpected.getPostgresConstraints().forEach(constraint -> {
485 columnInGenerated.getPostgresConstraints().stream()
486 .filter(constraint1 -> constraint1.getConstraintName().equals(constraint.getConstraintName())).findFirst()
487 .ifPresent(constraint1 -> {
489 // Check table name where constraint is to be added
490 Assertions.assertEquals(constraint.getTableToAddConstraintTo(), constraint.getTableToAddConstraintTo());
492 // Check column where constraint is to be added
493 Assertions.assertEquals(constraint.getColumnToAddConstraintTo(), constraint.getColumnToAddConstraintTo());
495 if (constraint instanceof ForeignKeyConstraint expectedFk) {
496 ForeignKeyConstraint actualFK = (ForeignKeyConstraint) constraint1;
498 Assertions.assertEquals(expectedFk.getReferencedTable(), actualFK.getReferencedTable());
510 Collection<Object> addEModelPrimaryKeyConstraint() {
511 Collection<Object> eModelPrimaryKeyConstraint = new ArrayList<>();
513 Constructor<PrimaryKeyConstraint> constructor = PrimaryKeyConstraint.class.getDeclaredConstructor();
514 eModelPrimaryKeyConstraint.add(constructor.newInstance());
515 } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
516 log.error("Failure in tests --> Error while adding primary key constraint: " + e.getMessage());
518 return eModelPrimaryKeyConstraint;