Skip to content

Commit 7db5c2c

Browse files
jogroganclaude
andauthored
Refactor: consolidate split test files into one file per source class (#205)
* refactor: consolidate VeniceDeployerValidationTest into VeniceDeployerTest Merged all 29 tests from VeniceDeployerValidationTest.java into VeniceDeployerTest.java, removing the now-redundant second file. The merged class is package-private, carries the @SuppressFBWarnings annotation, and is organized by section using the existing comment conventions. No tests were dropped; no duplicate test names existed between the two files. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> * refactor: consolidate MySqlDeployerValidationTest into MySqlDeployerTest Merged all tests from MySqlDeployerValidationTest (1030 lines) into MySqlDeployerTest, removing true duplicates (same-assertion null-database and restore no-op tests) and consolidating shared helper methods (stubConnection, stubConnectionWithStatement, stubDefaultRowType). Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> * refactor: consolidate split test files into one file per source class Enforces the convention of one test file per production class. Eight source files are deleted and their tests folded into the canonical test for the class under test. Consolidations -------------- * AvroConverterTypeMappingTest → AvroConverterTest Parameterized primitive type-mapping tests (Rel→Avro and Avro→Rel) merged in. Adds ParameterizedTest / MethodSource / RelProtoDataType imports to AvroConverterTest. * K8sViewTableRowTest → K8sViewTableTest Inner-class Row method tests (viewPath, schemaPath, viewName, toString) merged in. No new imports required. * SubscriptionReconcilerFetchAttributesTest → SubscriptionReconcilerTest All reflection removed. The three tests that verified fetchAttributes() swallows malformed YAML are rewritten to call reconcile() with the problematic YAML placed in status.jobResources, exercising the same error-handling paths through the public API. Adds a buildPhase3Subscription() helper to avoid repetition. * ScriptImplementorInnerClassesTest → ScriptImplementorTest (util) 39 inner-class tests (Catalog, Database, Connector, CompoundIdentifier, Identifier, Seal, View, Statement, Query, Insert, DropFields, nullable column DDL) merged in. testInsertWithSuffix renamed to testInsertWithSuffixNullTargetFields to avoid collision with the existing test that covers the non-null targetFields path. * catalog/ScriptImplementorTest → catalog/HopTableTest (rename) The catalog ScriptImplementorTest was testing HopTable.implement(), not ScriptImplementor (which lives in hoptimator-util). Renamed to HopTableTest to reflect the class actually under test. Schema validation cleanup ------------------------- KafkaSchemaValidationTest, MySQLSchemaValidationTest, and VeniceSchemaValidationTest are deleted. Each is fully superseded by a quidem .id test that uses the !describe command added in #203: kafka-ddl.id, mysql-ddl.id, venice-ddl-insert-partial.id The quidem tests cover the same schema assertions and additionally verify INSERT operations and deployment specs. Net: 8 files deleted, 5 modified/created; -366 lines, no coverage loss. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent 188bb4b commit 7db5c2c

16 files changed

Lines changed: 2546 additions & 3021 deletions

File tree

hoptimator-avro/src/test/java/com/linkedin/hoptimator/avro/AvroConverterTest.java

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,27 @@
66
import org.apache.calcite.rel.type.RelDataType;
77
import org.apache.calcite.rel.type.RelDataTypeFactory;
88
import org.apache.calcite.rel.type.RelDataTypeSystem;
9+
import org.apache.calcite.rel.type.RelProtoDataType;
910
import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
1011
import org.apache.calcite.sql.type.SqlTypeName;
1112
import org.apache.calcite.util.Litmus;
1213
import org.apache.calcite.util.Pair;
1314
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.Arguments;
17+
import org.junit.jupiter.params.provider.MethodSource;
1418

1519
import java.util.Collections;
1620
import java.util.List;
1721
import java.util.Map;
1822
import java.util.Objects;
23+
import java.util.stream.Stream;
1924

2025
import static org.junit.jupiter.api.Assertions.assertEquals;
2126
import static org.junit.jupiter.api.Assertions.assertFalse;
2227
import static org.junit.jupiter.api.Assertions.assertNotNull;
2328
import static org.junit.jupiter.api.Assertions.assertNull;
29+
import static org.junit.jupiter.api.Assertions.assertThrows;
2430
import static org.junit.jupiter.api.Assertions.assertTrue;
2531

2632

@@ -497,4 +503,176 @@ public void handlesNamespaceInNestedArrayAndMapElements() {
497503
Schema reparsedSchema = parser.parse(schemaJson);
498504
assertNotNull(reparsedSchema);
499505
}
506+
507+
// --- type mapping tests (merged from AvroConverterTypeMappingTest) ---
508+
509+
private final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
510+
511+
static Stream<Arguments> relToAvroPrimitiveCases() {
512+
return Stream.of(
513+
Arguments.of("SMALLINT", SqlTypeName.SMALLINT, Schema.Type.INT),
514+
Arguments.of("TINYINT", SqlTypeName.TINYINT, Schema.Type.INT),
515+
Arguments.of("INTEGER", SqlTypeName.INTEGER, Schema.Type.INT),
516+
Arguments.of("BIGINT", SqlTypeName.BIGINT, Schema.Type.LONG),
517+
Arguments.of("VARCHAR", SqlTypeName.VARCHAR, Schema.Type.STRING),
518+
Arguments.of("CHAR", SqlTypeName.CHAR, Schema.Type.STRING),
519+
Arguments.of("FLOAT", SqlTypeName.FLOAT, Schema.Type.FLOAT),
520+
Arguments.of("DOUBLE", SqlTypeName.DOUBLE, Schema.Type.DOUBLE),
521+
Arguments.of("BOOLEAN", SqlTypeName.BOOLEAN, Schema.Type.BOOLEAN)
522+
);
523+
}
524+
525+
@ParameterizedTest(name = "{0}")
526+
@MethodSource("relToAvroPrimitiveCases")
527+
void testAvroFromRelPrimitive(String name, SqlTypeName sqlType, Schema.Type expectedAvroType) {
528+
RelDataType relType = typeFactory.createSqlType(sqlType);
529+
Schema avroSchema = AvroConverter.avro("ns", "field", relType);
530+
531+
assertNotNull(avroSchema);
532+
assertEquals(expectedAvroType, avroSchema.getType());
533+
assertFalse(avroSchema.isNullable());
534+
}
535+
536+
@ParameterizedTest(name = "{0} nullable")
537+
@MethodSource("relToAvroPrimitiveCases")
538+
void testAvroFromRelPrimitiveNullable(String name, SqlTypeName sqlType, Schema.Type expectedAvroType) {
539+
RelDataType relType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(sqlType), true);
540+
Schema avroSchema = AvroConverter.avro("ns", "field", relType);
541+
542+
assertTrue(avroSchema.isUnion());
543+
assertTrue(avroSchema.isNullable());
544+
assertTrue(avroSchema.getTypes().stream().anyMatch(t -> t.getType() == expectedAvroType));
545+
assertTrue(avroSchema.getTypes().stream().anyMatch(t -> t.getType() == Schema.Type.NULL));
546+
}
547+
548+
@Test
549+
void testAvroFromBinaryWithPrecision() {
550+
RelDataType relType = typeFactory.createSqlType(SqlTypeName.BINARY, 16);
551+
Schema avroSchema = AvroConverter.avro("ns", "hash", relType);
552+
553+
assertNotNull(avroSchema);
554+
assertEquals(Schema.Type.FIXED, avroSchema.getType());
555+
assertEquals(16, avroSchema.getFixedSize());
556+
}
557+
558+
@Test
559+
void testAvroFromVarbinaryWithoutPrecision() {
560+
RelDataType relType = typeFactory.createSqlType(SqlTypeName.VARBINARY);
561+
Schema avroSchema = AvroConverter.avro("ns", "data", relType);
562+
563+
assertNotNull(avroSchema);
564+
assertEquals(Schema.Type.BYTES, avroSchema.getType());
565+
}
566+
567+
@Test
568+
void testAvroFromMap() {
569+
RelDataType mapType = typeFactory.createMapType(
570+
typeFactory.createSqlType(SqlTypeName.VARCHAR),
571+
typeFactory.createSqlType(SqlTypeName.INTEGER));
572+
Schema avroSchema = AvroConverter.avro("ns", "myMap", mapType);
573+
574+
assertNotNull(avroSchema);
575+
assertEquals(Schema.Type.MAP, avroSchema.getType());
576+
assertEquals(Schema.Type.INT, avroSchema.getValueType().getType());
577+
}
578+
579+
@Test
580+
void testAvroFromNullType() {
581+
RelDataType nullType = typeFactory.createSqlType(SqlTypeName.NULL);
582+
Schema avroSchema = AvroConverter.avro("ns", "n", nullType);
583+
584+
assertNotNull(avroSchema);
585+
assertTrue(avroSchema.isUnion());
586+
assertEquals(1, avroSchema.getTypes().size());
587+
assertEquals(Schema.Type.NULL, avroSchema.getTypes().get(0).getType());
588+
}
589+
590+
@Test
591+
void testAvroFromUnsupportedTypeThrows() {
592+
RelDataType dateType = typeFactory.createSqlType(SqlTypeName.DATE);
593+
assertThrows(UnsupportedOperationException.class, () -> AvroConverter.avro("ns", "n", dateType));
594+
}
595+
596+
static Stream<Arguments> avroToRelPrimitiveCases() {
597+
return Stream.of(
598+
Arguments.of("INT", Schema.create(Schema.Type.INT), SqlTypeName.INTEGER),
599+
Arguments.of("LONG", Schema.create(Schema.Type.LONG), SqlTypeName.BIGINT),
600+
Arguments.of("STRING", Schema.create(Schema.Type.STRING), SqlTypeName.VARCHAR),
601+
Arguments.of("FLOAT", Schema.create(Schema.Type.FLOAT), SqlTypeName.FLOAT),
602+
Arguments.of("DOUBLE", Schema.create(Schema.Type.DOUBLE), SqlTypeName.DOUBLE),
603+
Arguments.of("BOOLEAN", Schema.create(Schema.Type.BOOLEAN), SqlTypeName.BOOLEAN),
604+
Arguments.of("BYTES", Schema.create(Schema.Type.BYTES), SqlTypeName.VARBINARY)
605+
);
606+
}
607+
608+
@ParameterizedTest(name = "{0}")
609+
@MethodSource("avroToRelPrimitiveCases")
610+
void testRelFromAvroPrimitive(String name, Schema avroSchema, SqlTypeName expectedSqlType) {
611+
RelDataType relType = AvroConverter.rel(avroSchema, typeFactory);
612+
613+
assertNotNull(relType);
614+
assertEquals(expectedSqlType, relType.getSqlTypeName());
615+
}
616+
617+
@Test
618+
void testRelFromEnum() {
619+
Schema enumSchema = Schema.createEnum("Color", null, "ns", List.of("RED", "GREEN", "BLUE"));
620+
RelDataType relType = AvroConverter.rel(enumSchema, typeFactory);
621+
622+
assertNotNull(relType);
623+
assertEquals(SqlTypeName.VARCHAR, relType.getSqlTypeName());
624+
}
625+
626+
@Test
627+
void testRelFromFixed() {
628+
Schema fixedSchema = Schema.createFixed("hash", null, "ns", 16);
629+
RelDataType relType = AvroConverter.rel(fixedSchema, typeFactory);
630+
631+
assertNotNull(relType);
632+
assertEquals(SqlTypeName.VARBINARY, relType.getSqlTypeName());
633+
assertEquals(16, relType.getPrecision());
634+
}
635+
636+
@Test
637+
void testRelFromMap() {
638+
Schema mapSchema = Schema.createMap(Schema.create(Schema.Type.INT));
639+
RelDataType relType = AvroConverter.rel(mapSchema, typeFactory);
640+
641+
assertNotNull(relType);
642+
assertNotNull(relType.getValueType());
643+
assertEquals(SqlTypeName.INTEGER, relType.getValueType().getSqlTypeName());
644+
}
645+
646+
@Test
647+
void testRelFromNullType() {
648+
Schema nullSchema = Schema.create(Schema.Type.NULL);
649+
RelDataType relType = AvroConverter.rel(nullSchema, typeFactory);
650+
651+
assertTrue(relType.isNullable());
652+
assertEquals(SqlTypeName.NULL, relType.getSqlTypeName());
653+
}
654+
655+
@Test
656+
void testRelFromProtoDataType() {
657+
Schema avroSchema = Schema.create(Schema.Type.STRING);
658+
RelDataType relType = AvroConverter.rel(avroSchema);
659+
660+
assertNotNull(relType);
661+
assertEquals(SqlTypeName.VARCHAR, relType.getSqlTypeName());
662+
}
663+
664+
@Test
665+
void testProto() {
666+
Schema avroSchema = Schema.create(Schema.Type.INT);
667+
RelProtoDataType proto = AvroConverter.proto(avroSchema);
668+
assertEquals(SqlTypeName.INTEGER, proto.apply(typeFactory).getSqlTypeName());
669+
}
670+
671+
@Test
672+
void testAvroFromRelProtoDataType() {
673+
Schema avroSchema = Schema.create(Schema.Type.STRING);
674+
Schema result = AvroConverter.avro("ns", "test", AvroConverter.proto(avroSchema));
675+
676+
assertEquals(Schema.Type.STRING, result.getType());
677+
}
500678
}

0 commit comments

Comments
 (0)