Skip to content

Commit 3317477

Browse files
committed
#822 Improve schema test coverage
1 parent 047c686 commit 3317477

9 files changed

Lines changed: 595 additions & 303 deletions

src/main/org/firebirdsql/jaybird/util/CollectionUtils.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: Copyright 2023-2024 Mark Rotteveel
1+
// SPDX-FileCopyrightText: Copyright 2023-2025 Mark Rotteveel
22
// SPDX-License-Identifier: LGPL-2.1-or-later
33
package org.firebirdsql.jaybird.util;
44

@@ -69,4 +69,22 @@ public static void growToSize(final List<?> list, final int size) {
6969
return size > 0 ? list.get(size - 1) : null;
7070
}
7171

72+
/**
73+
* Concatenates two lists to a new modifiable list.
74+
*
75+
* @param list1
76+
* list 1
77+
* @param list2
78+
* list 2
79+
* @param <T>
80+
* type parameter of {@code list1}, and parent type parameter of {@code list2}
81+
* @return concatenation of {@code list1} and {@code list2}
82+
*/
83+
public static <T> List<T> concat(List<T> list1, List<? extends T> list2) {
84+
var newList = new ArrayList<T>(list1.size() + list2.size());
85+
newList.addAll(list1);
86+
newList.addAll(list2);
87+
return newList;
88+
}
89+
7290
}

src/test/org/firebirdsql/jaybird/util/CollectionUtilsTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: Copyright 2023-2024 Mark Rotteveel
1+
// SPDX-FileCopyrightText: Copyright 2023-2025 Mark Rotteveel
22
// SPDX-License-Identifier: LGPL-2.1-or-later
33
package org.firebirdsql.jaybird.util;
44

@@ -89,6 +89,14 @@ void getLast_multipleItems() {
8989
assertEquals(item2, CollectionUtils.getLast(List.of(item1, item2)));
9090
}
9191

92+
@Test
93+
void concat() {
94+
var list1 = List.of("item1", "item2");
95+
var list2 = List.of("item3", "item4");
96+
97+
assertEquals(List.of("item1", "item2", "item3", "item4"), CollectionUtils.concat(list1, list2));
98+
}
99+
92100
static Stream<Arguments> listFactories() {
93101
return Stream.of(
94102
Arguments.of(factory(ArrayList::new)),

src/test/org/firebirdsql/jdbc/FBDatabaseMetaDataAbstractKeysTest.java

Lines changed: 87 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
import java.sql.DatabaseMetaData;
1313
import java.sql.ResultSet;
1414
import java.sql.SQLException;
15+
import java.util.ArrayList;
1516
import java.util.Arrays;
1617
import java.util.EnumMap;
1718
import java.util.List;
1819
import java.util.Map;
1920

2021
import static java.util.Collections.unmodifiableMap;
2122
import static org.firebirdsql.common.FBTestProperties.getConnectionViaDriverManager;
23+
import static org.firebirdsql.common.FBTestProperties.getDefaultSupportInfo;
2224
import static org.firebirdsql.common.FBTestProperties.ifSchemaElse;
2325
import static org.firebirdsql.common.assertions.ResultSetAssertions.assertNextRow;
2426
import static org.firebirdsql.common.assertions.ResultSetAssertions.assertNoNextRow;
@@ -35,66 +37,86 @@ abstract class FBDatabaseMetaDataAbstractKeysTest {
3537
private static final String UNNAMED_PK_INDEX_PREFIX = "RDB$PRIMARY";
3638
private static final String UNNAMED_FK_INDEX_PREFIX = "RDB$FOREIGN";
3739

38-
//@formatter:off
3940
@RegisterExtension
4041
static final UsesDatabaseExtension.UsesDatabaseForAll usesDatabase = UsesDatabaseExtension.usesDatabaseForAll(
41-
"""
42-
create table TABLE_1 (
43-
ID integer constraint PK_TABLE_1 primary key
44-
)""",
45-
"""
46-
create table TABLE_2 (
47-
ID1 integer not null,
48-
ID2 integer not null,
49-
TABLE_1_ID integer constraint FK_TABLE_2_TO_1 references TABLE_1 (ID),
50-
constraint PK_TABLE_2 unique (ID1, ID2) using index ALT_INDEX_NAME_2
51-
)""",
52-
"""
53-
create table TABLE_3 (
54-
ID integer constraint PK_TABLE_3 primary key using index ALT_INDEX_NAME_3,
55-
TABLE_2_ID1 integer,
56-
TABLE_2_ID2 integer,
57-
constraint FK_TABLE_3_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
58-
on delete cascade on update set default
59-
)""",
60-
"""
61-
create table TABLE_4 (
62-
ID integer primary key using index ALT_INDEX_NAME_4,
63-
TABLE_2_ID1 integer,
64-
TABLE_2_ID2 integer,
65-
constraint FK_TABLE_4_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
66-
on delete set default on update set null
67-
)""",
68-
"""
69-
create table TABLE_5 (
70-
ID integer primary key,
71-
TABLE_2_ID1 integer,
72-
TABLE_2_ID2 integer,
73-
foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
74-
on delete set null on update no action using index ALT_INDEX_NAME_5
75-
)""",
76-
"""
77-
create table TABLE_6 (
78-
ID integer primary key,
79-
TABLE_2_ID1 integer,
80-
TABLE_2_ID2 integer,
81-
foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
82-
on delete no action on update cascade
83-
)""",
84-
"""
85-
create table TABLE_7 (
86-
ID integer primary key,
87-
TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade
88-
)"""
89-
);
90-
//@formatter:on
42+
dbInitStatements());
9143

9244
protected static final MetadataResultSetDefinition keysDefinition =
9345
new MetadataResultSetDefinition(KeysMetaData.class);
9446

9547
protected static Connection con;
9648
protected static DatabaseMetaData dbmd;
9749

50+
private static List<String> dbInitStatements() {
51+
var statements = new ArrayList<>(Arrays.asList(
52+
"""
53+
create table TABLE_1 (
54+
ID integer constraint PK_TABLE_1 primary key
55+
)""",
56+
"""
57+
create table TABLE_2 (
58+
ID1 integer not null,
59+
ID2 integer not null,
60+
TABLE_1_ID integer constraint FK_TABLE_2_TO_1 references TABLE_1 (ID),
61+
constraint PK_TABLE_2 unique (ID1, ID2) using index ALT_INDEX_NAME_2
62+
)""",
63+
"""
64+
create table TABLE_3 (
65+
ID integer constraint PK_TABLE_3 primary key using index ALT_INDEX_NAME_3,
66+
TABLE_2_ID1 integer,
67+
TABLE_2_ID2 integer,
68+
constraint FK_TABLE_3_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
69+
on delete cascade on update set default
70+
)""",
71+
"""
72+
create table TABLE_4 (
73+
ID integer primary key using index ALT_INDEX_NAME_4,
74+
TABLE_2_ID1 integer,
75+
TABLE_2_ID2 integer,
76+
constraint FK_TABLE_4_TO_2 foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
77+
on delete set default on update set null
78+
)""",
79+
"""
80+
create table TABLE_5 (
81+
ID integer primary key,
82+
TABLE_2_ID1 integer,
83+
TABLE_2_ID2 integer,
84+
foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
85+
on delete set null on update no action using index ALT_INDEX_NAME_5
86+
)""",
87+
"""
88+
create table TABLE_6 (
89+
ID integer primary key,
90+
TABLE_2_ID1 integer,
91+
TABLE_2_ID2 integer,
92+
foreign key (TABLE_2_ID1, TABLE_2_ID2) references TABLE_2 (ID1, ID2)
93+
on delete no action on update cascade
94+
)"""
95+
));
96+
if (!getDefaultSupportInfo().supportsSchemas()) {
97+
statements.add("""
98+
create table TABLE_7 (
99+
ID integer primary key,
100+
TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade
101+
)""");
102+
} else {
103+
statements.add("create schema OTHER_SCHEMA");
104+
statements.add("""
105+
create table OTHER_SCHEMA.TABLE_8 (
106+
ID integer primary key,
107+
TABLE_1_ID integer constraint FK_TABLE_8_TO_1 references PUBLIC.TABLE_1 (ID)
108+
)""");
109+
statements.add("""
110+
create table TABLE_7 (
111+
ID integer primary key,
112+
TABLE_6_ID integer constraint FK_TABLE_7_TO_6 references TABLE_6 (ID) on update cascade,
113+
TABLE_8_ID integer constraint FK_TABLE_7_TO_8 references OTHER_SCHEMA.TABLE_8 (ID) on delete cascade
114+
)""");
115+
}
116+
117+
return statements;
118+
}
119+
98120
@BeforeAll
99121
static void setupAll() throws SQLException {
100122
con = getConnectionViaDriverManager();
@@ -163,13 +185,26 @@ protected static List<Map<KeysMetaData, Object>> table6Fks() {
163185
UNNAMED_CONSTRAINT_PREFIX, "ALT_INDEX_NAME_2", UNNAMED_FK_INDEX_PREFIX));
164186
}
165187

166-
protected static List<Map<KeysMetaData, Object>> table7Fks() {
188+
protected static List<Map<KeysMetaData, Object>> table7to6Fks() {
167189
return List.of(
168190
createKeysTestData("TABLE_6", "ID", "TABLE_7", "TABLE_6_ID", 1, DatabaseMetaData.importedKeyCascade,
169191
DatabaseMetaData.importedKeyNoAction, UNNAMED_CONSTRAINT_PREFIX, "FK_TABLE_7_TO_6",
170192
UNNAMED_PK_INDEX_PREFIX, "FK_TABLE_7_TO_6"));
171193
}
172194

195+
protected static List<Map<KeysMetaData, Object>> table7to8Fks() {
196+
return List.of(createKeysTestData("OTHER_SCHEMA", "TABLE_8", "ID", "PUBLIC", "TABLE_7", "TABLE_8_ID", 1,
197+
DatabaseMetaData.importedKeyNoAction, DatabaseMetaData.importedKeyCascade,
198+
UNNAMED_CONSTRAINT_PREFIX, "FK_TABLE_7_TO_8", UNNAMED_PK_INDEX_PREFIX, "FK_TABLE_7_TO_8"));
199+
}
200+
201+
protected static List<Map<KeysMetaData, Object>> table8Fks() {
202+
return List.of(
203+
createKeysTestData("PUBLIC", "TABLE_1", "ID", "OTHER_SCHEMA", "TABLE_8", "TABLE_1_ID", 1,
204+
DatabaseMetaData.importedKeyNoAction, DatabaseMetaData.importedKeyNoAction,
205+
"PK_TABLE_1", "FK_TABLE_8_TO_1", "PK_TABLE_1", "FK_TABLE_8_TO_1"));
206+
}
207+
173208
protected void validateExpectedKeys(ResultSet keys, List<Map<KeysMetaData, Object>> expectedKeys)
174209
throws Exception {
175210
for (Map<KeysMetaData, Object> expectedColumn : expectedKeys) {

0 commit comments

Comments
 (0)