(t *testing.T)
| 38 | ) |
| 39 | |
| 40 | func TestGhostSchemaUpdate(t *testing.T) { |
| 41 | const databaseName = "testGhostSchemaUpdate" |
| 42 | |
| 43 | t.Parallel() |
| 44 | a := require.New(t) |
| 45 | ctx := context.Background() |
| 46 | ctl := &controller{} |
| 47 | ctx, err := ctl.StartServerWithExternalPg(ctx) |
| 48 | a.NoError(err) |
| 49 | defer ctl.Close(ctx) |
| 50 | |
| 51 | mysqlContainer, err := getMySQLContainer(ctx) |
| 52 | defer func() { |
| 53 | mysqlContainer.Close(ctx) |
| 54 | }() |
| 55 | a.NoError(err) |
| 56 | |
| 57 | mysqlDB := mysqlContainer.db |
| 58 | |
| 59 | _, err = mysqlDB.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS %v", databaseName)) |
| 60 | a.NoError(err) |
| 61 | |
| 62 | _, err = mysqlDB.Exec("DROP USER IF EXISTS bytebase") |
| 63 | a.NoError(err) |
| 64 | _, err = mysqlDB.Exec("CREATE USER 'bytebase' IDENTIFIED WITH mysql_native_password BY 'bytebase'") |
| 65 | a.NoError(err) |
| 66 | |
| 67 | _, err = mysqlDB.Exec("GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, PROCESS, REFERENCES, SELECT, SHOW DATABASES, SHOW VIEW, TRIGGER, UPDATE, USAGE, REPLICATION CLIENT, REPLICATION SLAVE, LOCK TABLES, RELOAD ON *.* to bytebase") |
| 68 | a.NoError(err) |
| 69 | |
| 70 | instanceResponse, err := ctl.instanceServiceClient.CreateInstance(ctx, connect.NewRequest(&v1pb.CreateInstanceRequest{ |
| 71 | InstanceId: generateRandomString("instance"), |
| 72 | Instance: &v1pb.Instance{ |
| 73 | Title: "mysqlInstance", |
| 74 | Engine: v1pb.Engine_MYSQL, |
| 75 | Environment: new("environments/prod"), |
| 76 | Activation: true, |
| 77 | DataSources: []*v1pb.DataSource{{Type: v1pb.DataSourceType_ADMIN, Host: mysqlContainer.host, Port: mysqlContainer.port, Username: "bytebase", Password: "bytebase", Id: "admin"}}, |
| 78 | }, |
| 79 | })) |
| 80 | a.NoError(err) |
| 81 | instance := instanceResponse.Msg |
| 82 | |
| 83 | // Create backup database for MySQL. |
| 84 | backupDBName := common.BackupDatabaseNameOfEngine(storepb.Engine_MYSQL) |
| 85 | err = ctl.createDatabase(ctx, ctl.project, instance, nil /* environment */, backupDBName, "") |
| 86 | a.NoError(err) |
| 87 | |
| 88 | err = ctl.createDatabase(ctx, ctl.project, instance, nil /* environment */, databaseName, "") |
| 89 | a.NoError(err) |
| 90 | |
| 91 | databaseResponse, err := ctl.databaseServiceClient.GetDatabase(ctx, connect.NewRequest(&v1pb.GetDatabaseRequest{ |
| 92 | Name: fmt.Sprintf("%s/databases/%s", instance.Name, databaseName), |
| 93 | })) |
| 94 | a.NoError(err) |
| 95 | database := databaseResponse.Msg |
| 96 | |
| 97 | sheet1Response, err := ctl.sheetServiceClient.CreateSheet(ctx, connect.NewRequest(&v1pb.CreateSheetRequest{ |
nothing calls this directly
no test coverage detected