@@ -924,3 +924,119 @@ read_until:
924
924
require .Equal (t , expected , sequenceNumbers )
925
925
batchMu .Unlock ()
926
926
}
927
+
928
+ func TestIntegrationPostgresMetadata (t * testing.T ) {
929
+ t .Parallel ()
930
+ integration .CheckSkip (t )
931
+ pool , err := dockertest .NewPool ("" )
932
+ require .NoError (t , err )
933
+
934
+ var (
935
+ resource * dockertest.Resource
936
+ db * sql.DB
937
+ )
938
+
939
+ resource , db , err = ResourceWithPostgreSQLVersion (t , pool , "16" )
940
+ require .NoError (t , err )
941
+ require .NoError (t , resource .Expire (120 ))
942
+
943
+ hostAndPort := resource .GetHostPort ("5432/tcp" )
944
+ hostAndPortSplited := strings .Split (hostAndPort , ":" )
945
+ password := "l]YLSc|4[i56%{gY"
946
+
947
+ require .NoError (t , err )
948
+
949
+ _ , err = db .Exec (`INSERT INTO "FlightsCompositePK" ("Seq", "Name", "CreatedAt") VALUES ($1, $2, $3);` , 1 , "delta" , "2006-01-02T15:04:05Z07:00" )
950
+ require .NoError (t , err )
951
+ _ , err = db .Exec (`INSERT INTO flights (name, created_at) VALUES ($1, $2);` , "delta" , "2006-01-02T15:04:05Z07:00" )
952
+ require .NoError (t , err )
953
+
954
+ databaseURL := fmt .Sprintf ("user=user_name password=%s dbname=dbname sslmode=disable host=%s port=%s" , password , hostAndPortSplited [0 ], hostAndPortSplited [1 ])
955
+ template := fmt .Sprintf (`
956
+ postgres_cdc:
957
+ dsn: %s
958
+ slot_name: test_slot_native_decoder
959
+ stream_snapshot: true
960
+ snapshot_batch_size: 5
961
+ schema: public
962
+ tables:
963
+ - '"FlightsCompositePK"'
964
+ - flights
965
+ ` , databaseURL )
966
+
967
+ streamOutBuilder := service .NewStreamBuilder ()
968
+ require .NoError (t , streamOutBuilder .SetLoggerYAML (`level: TRACE` ))
969
+ require .NoError (t , streamOutBuilder .AddInputYAML (template ))
970
+ require .NoError (t , streamOutBuilder .AddProcessorYAML (`mapping: 'root = @'` ))
971
+
972
+ var outBatches []any
973
+ var outBatchMut sync.Mutex
974
+ require .NoError (t , streamOutBuilder .AddBatchConsumerFunc (func (c context.Context , batch service.MessageBatch ) error {
975
+ outBatchMut .Lock ()
976
+ defer outBatchMut .Unlock ()
977
+ for _ , msg := range batch {
978
+ data , err := msg .AsStructured ()
979
+ require .NoError (t , err )
980
+ d := data .(map [string ]any )
981
+ if _ , ok := d ["lsn" ]; ok {
982
+ d ["lsn" ] = "XXX/XXX" // Consistent LSN for assertions below
983
+ }
984
+ outBatches = append (outBatches , data )
985
+ }
986
+ return nil
987
+ }))
988
+
989
+ streamOut , err := streamOutBuilder .Build ()
990
+ require .NoError (t , err )
991
+
992
+ license .InjectTestService (streamOut .Resources ())
993
+
994
+ go func () {
995
+ _ = streamOut .Run (context .Background ())
996
+ }()
997
+
998
+ assert .Eventually (t , func () bool {
999
+ outBatchMut .Lock ()
1000
+ defer outBatchMut .Unlock ()
1001
+ return len (outBatches ) == 2
1002
+ }, time .Second * 25 , time .Millisecond * 100 )
1003
+
1004
+ _ , err = db .Exec (`INSERT INTO "FlightsCompositePK" ("Seq", "Name", "CreatedAt") VALUES ($1, $2, $3);` , 2 , "bravo" , "2006-01-02T15:04:05Z07:00" )
1005
+ require .NoError (t , err )
1006
+ _ , err = db .Exec (`INSERT INTO flights (name, created_at) VALUES ($1, $2);` , "bravo" , "2006-01-02T15:04:05Z07:00" )
1007
+ require .NoError (t , err )
1008
+
1009
+ assert .EventuallyWithT (t , func (c * assert.CollectT ) {
1010
+ outBatchMut .Lock ()
1011
+ defer outBatchMut .Unlock ()
1012
+ assert .Len (c , outBatches , 4 , "got: %#v" , outBatches )
1013
+ }, time .Second * 25 , time .Millisecond * 100 )
1014
+
1015
+ require .ElementsMatch (
1016
+ t ,
1017
+ outBatches ,
1018
+ []any {
1019
+ map [string ]any {
1020
+ "operation" : "read" ,
1021
+ "table" : "FlightsCompositePK" ,
1022
+ },
1023
+ map [string ]any {
1024
+ "operation" : "read" ,
1025
+ "table" : "flights" ,
1026
+ },
1027
+ map [string ]any {
1028
+ "operation" : "insert" ,
1029
+ "table" : "flights" ,
1030
+ "lsn" : "XXX/XXX" ,
1031
+ },
1032
+ map [string ]any {
1033
+ "operation" : "insert" ,
1034
+ "table" : "FlightsCompositePK" ,
1035
+ "lsn" : "XXX/XXX" ,
1036
+ },
1037
+ },
1038
+ )
1039
+
1040
+ require .NoError (t , streamOut .StopWithin (time .Second * 10 ))
1041
+
1042
+ }
0 commit comments