Skip to content

Commit 31c3d15

Browse files
committed
Add unit tests
1 parent 18a48c8 commit 31c3d15

File tree

9 files changed

+391
-1
lines changed

9 files changed

+391
-1
lines changed

core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ public void dropColumnFromTable(String namespace, String table, String columnNam
871871
String addNewColumnStatement =
872872
"ALTER TABLE "
873873
+ encloseFullTableName(namespace, table)
874-
+ " DROP COLUMN"
874+
+ " DROP COLUMN "
875875
+ enclose(columnName);
876876
try (Connection connection = dataSource.getConnection()) {
877877
execute(connection, addNewColumnStatement);

core/src/test/java/com/scalar/db/storage/cassandra/CassandraAdminTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,33 @@ public void addNewColumnToTable_ShouldWorkProperly() throws ExecutionException {
865865
verify(cassandraSession).execute(alterTableQuery);
866866
}
867867

868+
@Test
869+
public void dropColumnFromTable_ShouldWorkProperly() throws ExecutionException {
870+
// Arrange
871+
String namespace = "sample_ns";
872+
String table = "tbl";
873+
String column = "c2";
874+
com.datastax.driver.core.TableMetadata tableMetadata =
875+
mock(com.datastax.driver.core.TableMetadata.class);
876+
ColumnMetadata c1 = mock(ColumnMetadata.class);
877+
when(c1.getName()).thenReturn("c1");
878+
when(c1.getType()).thenReturn(com.datastax.driver.core.DataType.text());
879+
when(tableMetadata.getPartitionKey()).thenReturn(Collections.singletonList(c1));
880+
when(tableMetadata.getClusteringColumns()).thenReturn(Collections.emptyList());
881+
when(tableMetadata.getIndexes()).thenReturn(Collections.emptyList());
882+
when(tableMetadata.getColumns()).thenReturn(Collections.singletonList(c1));
883+
when(clusterManager.getMetadata(any(), any())).thenReturn(tableMetadata);
884+
when(clusterManager.getSession()).thenReturn(cassandraSession);
885+
886+
// Act
887+
cassandraAdmin.dropColumnFromTable(namespace, table, column);
888+
889+
// Assert
890+
String alterTableQuery =
891+
SchemaBuilder.alterTable(namespace, table).dropColumn(column).getQueryString();
892+
verify(cassandraSession).execute(alterTableQuery);
893+
}
894+
868895
@Test
869896
public void getNamespacesNames_WithNonExistingKeyspaces_ShouldReturnEmptySet()
870897
throws ExecutionException {

core/src/test/java/com/scalar/db/storage/cosmos/CosmosAdminTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,49 @@ public void addNewColumnToTable_ShouldWorkProperly() throws ExecutionException {
11311131
verify(container).upsertItem(expectedCosmosTableMetadata);
11321132
}
11331133

1134+
@Test
1135+
public void dropColumnFromTable_ShouldWorkProperly() throws ExecutionException {
1136+
// Arrange
1137+
String namespace = "ns";
1138+
String table = "table";
1139+
String column1 = "c1";
1140+
String column2 = "c2";
1141+
String fullTableName = getFullTableName(namespace, table);
1142+
@SuppressWarnings("unchecked")
1143+
CosmosItemResponse<CosmosTableMetadata> response = mock(CosmosItemResponse.class);
1144+
1145+
when(client.getDatabase(METADATA_DATABASE)).thenReturn(database);
1146+
when(database.getContainer(CosmosAdmin.TABLE_METADATA_CONTAINER)).thenReturn(container);
1147+
when(container.readItem(
1148+
anyString(),
1149+
any(PartitionKey.class),
1150+
ArgumentMatchers.<Class<CosmosTableMetadata>>any()))
1151+
.thenReturn(response);
1152+
1153+
CosmosTableMetadata cosmosTableMetadata =
1154+
CosmosTableMetadata.newBuilder()
1155+
.partitionKeyNames(Sets.newLinkedHashSet(column1))
1156+
.columns(ImmutableMap.of(column1, "text", column2, "int"))
1157+
.build();
1158+
1159+
when(response.getItem()).thenReturn(cosmosTableMetadata);
1160+
1161+
// Act
1162+
admin.dropColumnFromTable(namespace, table, column2);
1163+
1164+
// Assert
1165+
verify(container)
1166+
.readItem(fullTableName, new PartitionKey(fullTableName), CosmosTableMetadata.class);
1167+
1168+
CosmosTableMetadata expectedCosmosTableMetadata =
1169+
CosmosTableMetadata.newBuilder()
1170+
.id(fullTableName)
1171+
.partitionKeyNames(Sets.newLinkedHashSet(column1))
1172+
.columns(ImmutableMap.of(column1, "text"))
1173+
.build();
1174+
verify(container).upsertItem(expectedCosmosTableMetadata);
1175+
}
1176+
11341177
@Test
11351178
public void unsupportedOperations_ShouldThrowUnsupportedException() {
11361179
// Arrange

core/src/test/java/com/scalar/db/storage/dynamo/DynamoAdminTestBase.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,73 @@ public void addNewColumnToTable_ShouldWorkProperly() throws ExecutionException {
14411441
.build());
14421442
}
14431443

1444+
@Test
1445+
public void dropColumnFromTable_ShouldWorkProperly() throws ExecutionException {
1446+
// Arrange
1447+
String column1 = "c1";
1448+
String column2 = "c2";
1449+
1450+
GetItemResponse response = mock(GetItemResponse.class);
1451+
when(client.getItem(any(GetItemRequest.class))).thenReturn(response);
1452+
when(response.item())
1453+
.thenReturn(
1454+
ImmutableMap.<String, AttributeValue>builder()
1455+
.put(
1456+
DynamoAdmin.METADATA_ATTR_TABLE,
1457+
AttributeValue.builder().s(getFullTableName()).build())
1458+
.put(
1459+
DynamoAdmin.METADATA_ATTR_COLUMNS,
1460+
AttributeValue.builder()
1461+
.m(
1462+
ImmutableMap.<String, AttributeValue>builder()
1463+
.put(column1, AttributeValue.builder().s("text").build())
1464+
.put(column2, AttributeValue.builder().s("int").build())
1465+
.build())
1466+
.build())
1467+
.put(
1468+
DynamoAdmin.METADATA_ATTR_PARTITION_KEY,
1469+
AttributeValue.builder().l(AttributeValue.builder().s(column1).build()).build())
1470+
.build());
1471+
1472+
// Act
1473+
admin.dropColumnFromTable(NAMESPACE, TABLE, column2);
1474+
1475+
// Assert
1476+
// Get metadata
1477+
Map<String, AttributeValue> key = new HashMap<>();
1478+
key.put(
1479+
DynamoAdmin.METADATA_ATTR_TABLE, AttributeValue.builder().s(getFullTableName()).build());
1480+
verify(client)
1481+
.getItem(
1482+
GetItemRequest.builder()
1483+
.tableName(getFullMetadataTableName())
1484+
.key(key)
1485+
.consistentRead(true)
1486+
.build());
1487+
1488+
// Put metadata
1489+
Map<String, AttributeValue> itemValues = new HashMap<>();
1490+
itemValues.put(
1491+
DynamoAdmin.METADATA_ATTR_TABLE, AttributeValue.builder().s(getFullTableName()).build());
1492+
Map<String, AttributeValue> columns = new HashMap<>();
1493+
1494+
columns.put(
1495+
column1, AttributeValue.builder().s(DataType.TEXT.toString().toLowerCase()).build());
1496+
1497+
itemValues.put(DynamoAdmin.METADATA_ATTR_COLUMNS, AttributeValue.builder().m(columns).build());
1498+
itemValues.put(
1499+
DynamoAdmin.METADATA_ATTR_PARTITION_KEY,
1500+
AttributeValue.builder()
1501+
.l(Collections.singletonList(AttributeValue.builder().s(column1).build()))
1502+
.build());
1503+
verify(client)
1504+
.putItem(
1505+
PutItemRequest.builder()
1506+
.tableName(getFullMetadataTableName())
1507+
.item(itemValues)
1508+
.build());
1509+
}
1510+
14441511
@Test
14451512
public void
14461513
createNamespace_WithNonExistingNamespacesTable_ShouldCreateNamespacesTableAndAddNamespace()

core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2939,6 +2939,145 @@ private void addNewColumnToTable_ForX_ShouldWorkProperly(
29392939
}
29402940
}
29412941

2942+
@Test
2943+
public void dropColumnFromTable_ForMysql_ShouldWorkProperly()
2944+
throws SQLException, ExecutionException {
2945+
dropColumnFromTable_ForX_ShouldWorkProperly(
2946+
RdbEngine.MYSQL,
2947+
"SELECT `column_name`,`data_type`,`key_type`,`clustering_order`,`indexed` FROM `"
2948+
+ METADATA_SCHEMA
2949+
+ "`.`metadata` WHERE `full_table_name`=? ORDER BY `ordinal_position` ASC",
2950+
"ALTER TABLE `ns`.`table` DROP COLUMN `c2`",
2951+
"DELETE FROM `" + METADATA_SCHEMA + "`.`metadata` WHERE `full_table_name` = 'ns.table'",
2952+
"INSERT INTO `"
2953+
+ METADATA_SCHEMA
2954+
+ "`.`metadata` VALUES ('ns.table','c1','TEXT','PARTITION',NULL,false,1)");
2955+
}
2956+
2957+
@Test
2958+
public void dropColumnFromTable_ForOracle_ShouldWorkProperly()
2959+
throws SQLException, ExecutionException {
2960+
dropColumnFromTable_ForX_ShouldWorkProperly(
2961+
RdbEngine.ORACLE,
2962+
"SELECT \"column_name\",\"data_type\",\"key_type\",\"clustering_order\",\"indexed\" FROM \""
2963+
+ METADATA_SCHEMA
2964+
+ "\".\"metadata\" WHERE \"full_table_name\"=? ORDER BY \"ordinal_position\" ASC",
2965+
"ALTER TABLE \"ns\".\"table\" DROP COLUMN \"c2\"",
2966+
"DELETE FROM \""
2967+
+ METADATA_SCHEMA
2968+
+ "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'",
2969+
"INSERT INTO \""
2970+
+ METADATA_SCHEMA
2971+
+ "\".\"metadata\" VALUES ('ns.table','c1','TEXT','PARTITION',NULL,0,1)");
2972+
}
2973+
2974+
@Test
2975+
public void dropColumnFromTable_ForPostgresql_ShouldWorkProperly()
2976+
throws SQLException, ExecutionException {
2977+
dropColumnFromTable_ForX_ShouldWorkProperly(
2978+
RdbEngine.POSTGRESQL,
2979+
"SELECT \"column_name\",\"data_type\",\"key_type\",\"clustering_order\",\"indexed\" FROM \""
2980+
+ METADATA_SCHEMA
2981+
+ "\".\"metadata\" WHERE \"full_table_name\"=? ORDER BY \"ordinal_position\" ASC",
2982+
"ALTER TABLE \"ns\".\"table\" DROP COLUMN \"c2\"",
2983+
"DELETE FROM \""
2984+
+ METADATA_SCHEMA
2985+
+ "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'",
2986+
"INSERT INTO \""
2987+
+ METADATA_SCHEMA
2988+
+ "\".\"metadata\" VALUES ('ns.table','c1','TEXT','PARTITION',NULL,false,1)");
2989+
}
2990+
2991+
@Test
2992+
public void dropColumnFromTable_ForSqlServer_ShouldWorkProperly()
2993+
throws SQLException, ExecutionException {
2994+
dropColumnFromTable_ForX_ShouldWorkProperly(
2995+
RdbEngine.SQL_SERVER,
2996+
"SELECT [column_name],[data_type],[key_type],[clustering_order],[indexed] FROM ["
2997+
+ METADATA_SCHEMA
2998+
+ "].[metadata] WHERE [full_table_name]=? ORDER BY [ordinal_position] ASC",
2999+
"ALTER TABLE [ns].[table] DROP COLUMN [c2]",
3000+
"DELETE FROM [" + METADATA_SCHEMA + "].[metadata] WHERE [full_table_name] = 'ns.table'",
3001+
"INSERT INTO ["
3002+
+ METADATA_SCHEMA
3003+
+ "].[metadata] VALUES ('ns.table','c1','TEXT','PARTITION',NULL,0,1)");
3004+
}
3005+
3006+
@Test
3007+
public void dropColumnFromTable_ForSqlite_ShouldWorkProperly()
3008+
throws SQLException, ExecutionException {
3009+
dropColumnFromTable_ForX_ShouldWorkProperly(
3010+
RdbEngine.SQLITE,
3011+
"SELECT \"column_name\",\"data_type\",\"key_type\",\"clustering_order\",\"indexed\" FROM \""
3012+
+ METADATA_SCHEMA
3013+
+ "$metadata\" WHERE \"full_table_name\"=? ORDER BY \"ordinal_position\" ASC",
3014+
"ALTER TABLE \"ns$table\" DROP COLUMN \"c2\"",
3015+
"DELETE FROM \"" + METADATA_SCHEMA + "$metadata\" WHERE \"full_table_name\" = 'ns.table'",
3016+
"INSERT INTO \""
3017+
+ METADATA_SCHEMA
3018+
+ "$metadata\" VALUES ('ns.table','c1','TEXT','PARTITION',NULL,FALSE,1)");
3019+
}
3020+
3021+
@Test
3022+
public void dropColumnFromTable_ForDb2_ShouldWorkProperly()
3023+
throws SQLException, ExecutionException {
3024+
dropColumnFromTable_ForX_ShouldWorkProperly(
3025+
RdbEngine.DB2,
3026+
"SELECT \"column_name\",\"data_type\",\"key_type\",\"clustering_order\",\"indexed\" FROM \""
3027+
+ METADATA_SCHEMA
3028+
+ "\".\"metadata\" WHERE \"full_table_name\"=? ORDER BY \"ordinal_position\" ASC",
3029+
"ALTER TABLE \"ns\".\"table\" DROP COLUMN \"c2\"",
3030+
"DELETE FROM \""
3031+
+ METADATA_SCHEMA
3032+
+ "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'",
3033+
"INSERT INTO \""
3034+
+ METADATA_SCHEMA
3035+
+ "\".\"metadata\" VALUES ('ns.table','c1','TEXT','PARTITION',NULL,false,1)");
3036+
}
3037+
3038+
private void dropColumnFromTable_ForX_ShouldWorkProperly(
3039+
RdbEngine rdbEngine, String expectedGetMetadataStatement, String... expectedSqlStatements)
3040+
throws SQLException, ExecutionException {
3041+
// Arrange
3042+
String namespace = "ns";
3043+
String table = "table";
3044+
String column1 = "c1";
3045+
String column2 = "c2";
3046+
3047+
PreparedStatement selectStatement = mock(PreparedStatement.class);
3048+
ResultSet resultSet =
3049+
mockResultSet(
3050+
new SelectAllFromMetadataTableResultSetMocker.Row(
3051+
column1, DataType.TEXT.toString(), "PARTITION", null, false),
3052+
new SelectAllFromMetadataTableResultSetMocker.Row(
3053+
column2, DataType.INT.toString(), null, null, false));
3054+
when(selectStatement.executeQuery()).thenReturn(resultSet);
3055+
3056+
when(connection.prepareStatement(any())).thenReturn(selectStatement);
3057+
List<Statement> expectedStatements = new ArrayList<>();
3058+
for (int i = 0; i < expectedSqlStatements.length; i++) {
3059+
Statement expectedStatement = mock(Statement.class);
3060+
expectedStatements.add(expectedStatement);
3061+
}
3062+
when(connection.createStatement())
3063+
.thenReturn(
3064+
expectedStatements.get(0),
3065+
expectedStatements.subList(1, expectedStatements.size()).toArray(new Statement[0]));
3066+
3067+
when(dataSource.getConnection()).thenReturn(connection);
3068+
JdbcAdmin admin = createJdbcAdminFor(rdbEngine);
3069+
3070+
// Act
3071+
admin.dropColumnFromTable(namespace, table, column2);
3072+
3073+
// Assert
3074+
verify(selectStatement).setString(1, getFullTableName(namespace, table));
3075+
verify(connection).prepareStatement(expectedGetMetadataStatement);
3076+
for (int i = 0; i < expectedSqlStatements.length; i++) {
3077+
verify(expectedStatements.get(i)).execute(expectedSqlStatements[i]);
3078+
}
3079+
}
3080+
29423081
@Test
29433082
public void getNamespaceNames_forMysql_ShouldReturnNamespaceNames() throws Exception {
29443083
getNamespaceNames_forX_ShouldReturnNamespaceNames(

core/src/test/java/com/scalar/db/storage/multistorage/MultiStorageAdminTest.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,68 @@ public void addNewColumnToTable_ForTable1InNamespace2_ShouldCallAddNewColumnOfAd
499499
verify(admin2).addNewColumnToTable(namespace, table, column, dataType);
500500
}
501501

502+
@Test
503+
public void dropColumnFromTable_ForTable1InNamespace1_ShouldCallDropColumnFromTableOfAdmin1()
504+
throws ExecutionException {
505+
// Arrange
506+
String namespace = NAMESPACE1;
507+
String table = TABLE1;
508+
String column = "c1";
509+
510+
// Act
511+
multiStorageAdmin.dropColumnFromTable(namespace, table, column);
512+
513+
// Assert
514+
verify(admin1).dropColumnFromTable(namespace, table, column);
515+
}
516+
517+
@Test
518+
public void
519+
dropColumnFromTable_ForTable2InNamespace1_ShouldShouldCallDropColumnFromTableOfAdmin2()
520+
throws ExecutionException {
521+
// Arrange
522+
String namespace = NAMESPACE1;
523+
String table = TABLE2;
524+
String column = "c1";
525+
526+
// Act
527+
multiStorageAdmin.dropColumnFromTable(namespace, table, column);
528+
529+
// Assert
530+
verify(admin2).dropColumnFromTable(namespace, table, column);
531+
}
532+
533+
@Test
534+
public void
535+
dropColumnFromTable_ForTable3InNamespace1_ShouldCallDropColumnFromTableOfDefaultAdmin()
536+
throws ExecutionException {
537+
// Arrange
538+
String namespace = NAMESPACE1;
539+
String table = TABLE3;
540+
String column = "c1";
541+
542+
// Act
543+
multiStorageAdmin.dropColumnFromTable(namespace, table, column);
544+
545+
// Assert
546+
verify(admin3).dropColumnFromTable(namespace, table, column);
547+
}
548+
549+
@Test
550+
public void dropColumnFromTable_ForTable1InNamespace2_ShouldCallDropColumnFromTableOfAdmin2()
551+
throws ExecutionException {
552+
// Arrange
553+
String namespace = NAMESPACE2;
554+
String table = TABLE1;
555+
String column = "c1";
556+
557+
// Act
558+
multiStorageAdmin.dropColumnFromTable(namespace, table, column);
559+
560+
// Assert
561+
verify(admin2).dropColumnFromTable(namespace, table, column);
562+
}
563+
502564
@Test
503565
public void
504566
getNamespaceNames_WithExistingNamespacesNotInMapping_ShouldReturnExistingNamespacesInMappingAndFromDefaultAdmin()

0 commit comments

Comments
 (0)