dev-mohit06 commented on code in PR #33711:
URL: https://github.com/apache/beam/pull/33711#discussion_r1929965153
##########
sdks/go/pkg/beam/transforms/sql/sql_test.go:
##########
@@ -94,3 +97,152 @@ func TestExpansionAddr(t *testing.T) {
t.Errorf("The function that ExpansionAddr(%v) returned did not
work correctly. For the expansionAddr field in options, got %v, want %v",
test.addr, o.expansionAddr, test.addr)
}
}
+
+// TestOutputType tests the OutputType option for setting the output type
+// in an SQL transformation in Beam. It verifies both cases: when
+// components are provided and when they are not. The test checks if
+// the 'outType' field in the options is set correctly based on the
+// output type and components.
+func TestOutputType(t *testing.T) {
+ testCases := []struct {
+ name string
+ typ reflect.Type
+ components []typex.FullType
+ wantNil bool
+ }{
+ {
+ name: "output_type_without_components",
+ typ: reflect.TypeOf(int64(0)),
+ },
+ {
+ name: "output_type_with_components",
+ typ: reflect.TypeOf(int64(0)),
+ components:
[]typex.FullType{typex.New(reflect.TypeOf(""))},
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ o := &options{}
+
+ var opt Option
+ if len(tc.components) > 0 {
+ opt = OutputType(tc.typ, tc.components...)
+ } else {
+ opt = OutputType(tc.typ)
+ }
+
+ opt(o)
+
+ var expected typex.FullType
+ if len(tc.components) > 0 {
+ expected = typex.New(tc.typ, tc.components...)
+ } else {
+ expected = typex.New(tc.typ)
+ }
+
+ opts := cmp.Options{
+ cmp.Comparer(func(x, y typex.FullType) bool {
+ // Compare only the type and components
+ return x.Type() == y.Type()
+ }),
+ }
+ if !cmp.Equal(o.outType, expected, opts) {
+ t.Errorf("OutputType() failed:\n%s",
cmp.Diff(expected, o.outType, opts))
+ }
+ })
+ }
+}
+
+// TestTransform tests the behavior of the Transform function
+// in the context of SQL transformations. It checks that the function
+// panics when an output type is missing.
+func TestTransform_MissingOutputType(t *testing.T) {
+ p := beam.NewPipeline()
+ s := p.Root()
+ col := beam.Create(s, 1, 2, 3)
+
+ defer func() {
+ r := recover()
+ if r == nil {
+ t.Error("Transform() with missing output type should
panic")
+ }
+ if msg, ok := r.(string); !ok || msg != "output type must be
specified for sql.Transform" {
+ t.Errorf("Transform() unexpected panic message: %v", r)
+ }
+ }()
+
+ Transform(s, "SELECT value FROM test", Input("test", col))
+}
+
+// TestMultipleOptions tests applying multiple options at once
+// and verifying that they are all correctly applied to the options object.
+func TestMultipleOptions(t *testing.T) {
+ p := beam.NewPipeline()
+ s := p.Root()
+ col := beam.Create(s, 1, 2, 3)
+
+ testCases := []struct {
+ name string
+ inputName string
+ dialect string
+ expansionAddr string
+ typ reflect.Type
+ customOpt sqlx.Option
+ }{
+ {
+ name: "all_options",
+ inputName: "test",
+ dialect: "zetasql",
+ expansionAddr: "localhost:8080",
+ typ: reflect.TypeOf(int64(0)),
+ customOpt: sqlx.Option{Urn: "test"},
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ o := &options{
+ inputs: make(map[string]beam.PCollection),
+ }
+
+ opts := []Option{
+ Input(tc.inputName, col),
+ Dialect(tc.dialect),
+ ExpansionAddr(tc.expansionAddr),
+ OutputType(tc.typ),
+ }
+
+ // Apply all options
+ for _, opt := range opts {
+ opt(o)
+ }
+ o.Add(tc.customOpt)
+
+ // Verify all fields
+ if got, ok := o.inputs[tc.inputName]; !ok {
+ t.Errorf("Input option with name %q not applied
correctly: got nothing, want PCollection", tc.inputName)
+ } else if !reflect.DeepEqual(got, col) {
Review Comment:
Thank you, @lostluck, for pointing this out. I appreciate the feedback! I’ll
make sure to use cmp instead of reflect.DeepEqual throughout the PR, as
suggested. I’ll also take the opportunity to consolidate checks where possible
by constructing the desired end state and using cmp.Diff for mismatched field
detection.
Apologies for missing this earlier—I’ll apply the changes consistently
across the PR. Let me know if there are any additional considerations!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]