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]

Reply via email to