|
9 | 9 | "context"
|
10 | 10 | gosql "database/sql"
|
11 | 11 | "encoding/base64"
|
| 12 | + gojson "encoding/json" |
12 | 13 | "fmt"
|
13 | 14 | "math/rand"
|
14 | 15 | "net/url"
|
@@ -770,6 +771,41 @@ func TestAvroSchemaNamespace(t *testing.T) {
|
770 | 771 | cdcTest(t, testFn, feedTestForceSink("kafka"), feedTestUseRootUserConnection)
|
771 | 772 | }
|
772 | 773 |
|
| 774 | +func TestAvroSchemaHasExpectedTopLevelFields(t *testing.T) { |
| 775 | + defer leaktest.AfterTest(t)() |
| 776 | + defer log.Scope(t).Close(t) |
| 777 | + |
| 778 | + testFn := func(t *testing.T, s TestServer, f cdctest.TestFeedFactory) { |
| 779 | + sqlDB := sqlutils.MakeSQLRunner(s.DB) |
| 780 | + sqlDB.Exec(t, `CREATE DATABASE movr`) |
| 781 | + sqlDB.Exec(t, `CREATE TABLE movr.drivers (id INT PRIMARY KEY, name STRING)`) |
| 782 | + sqlDB.Exec(t, |
| 783 | + `INSERT INTO movr.drivers VALUES (1, 'Alice')`, |
| 784 | + ) |
| 785 | + |
| 786 | + foo := feed(t, f, fmt.Sprintf(`CREATE CHANGEFEED FOR movr.drivers `+ |
| 787 | + `WITH format=%s`, changefeedbase.OptFormatAvro)) |
| 788 | + defer closeFeed(t, foo) |
| 789 | + |
| 790 | + assertPayloads(t, foo, []string{ |
| 791 | + `drivers: {"id":{"long":1}}->{"after":{"drivers":{"id":{"long":1},"name":{"string":"Alice"}}}}`, |
| 792 | + }) |
| 793 | + |
| 794 | + reg := foo.(*kafkaFeed).registry |
| 795 | + |
| 796 | + schemaJSON := reg.SchemaForSubject(`drivers-value`) |
| 797 | + var schema map[string]any |
| 798 | + require.NoError(t, gojson.Unmarshal([]byte(schemaJSON), &schema)) |
| 799 | + var keys []string |
| 800 | + for k := range schema { |
| 801 | + keys = append(keys, k) |
| 802 | + } |
| 803 | + require.ElementsMatch(t, keys, []string{"type", "name", "fields"}) |
| 804 | + } |
| 805 | + |
| 806 | + cdcTest(t, testFn, feedTestForceSink("kafka"), feedTestUseRootUserConnection) |
| 807 | +} |
| 808 | + |
773 | 809 | func TestTableNameCollision(t *testing.T) {
|
774 | 810 | defer leaktest.AfterTest(t)()
|
775 | 811 | defer log.Scope(t).Close(t)
|
|
0 commit comments