From 0da37b404d7443533443a55bac04d0562f59de7b Mon Sep 17 00:00:00 2001 From: Kareem Ebrahim Date: Thu, 11 Apr 2024 13:25:21 +0200 Subject: [PATCH] =?UTF-8?q?test:=20mysql=20logic=20=E2=9C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/database_test.go | 142 ----------------------- internal/db/mysql_test.go | 165 ++++++++++++++++++++++++++ internal/db/tables_test.go | 216 ----------------------------------- 3 files changed, 165 insertions(+), 358 deletions(-) delete mode 100644 internal/db/database_test.go create mode 100644 internal/db/mysql_test.go delete mode 100644 internal/db/tables_test.go diff --git a/internal/db/database_test.go b/internal/db/database_test.go deleted file mode 100644 index c7cca4e..0000000 --- a/internal/db/database_test.go +++ /dev/null @@ -1,142 +0,0 @@ -package db_test - -// import ( -// "context" -// "log" -// "github.com/kareemmahlees/meta-x/internal" -// "github.com/kareemmahlees/meta-x/internal/db" -// "github.com/kareemmahlees/meta-x/lib" -// "github.com/kareemmahlees/meta-x/utils" -// "testing" - -// "github.com/jmoiron/sqlx" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/suite" -// ) - -// type DatabaseTestSuite struct { -// suite.Suite -// providers []string -// pgContainer *utils.PostgresContainer -// pgConnection *sqlx.DB -// mysqlContainer *utils.MySQLContainer -// mysqlConnection *sqlx.DB -// sqliteConnection *sqlx.DB -// ctx context.Context -// } - -// func (suite *DatabaseTestSuite) getConnection(provider string) *sqlx.DB { -// switch provider { -// case lib.SQLITE3: -// return suite.sqliteConnection -// case lib.PSQL: -// return suite.pgConnection -// case lib.MYSQL: -// return suite.mysqlConnection -// default: -// return suite.sqliteConnection -// } -// } - -// func (suite *DatabaseTestSuite) SetupSuite() { -// suite.ctx = context.Background() - -// var err error - -// suite.sqliteConnection, err = internal.InitDBConn(lib.SQLITE3, ":memory:") -// if err != nil { -// log.Fatal(err) -// } - -// pgContainer, err := utils.CreatePostgresContainer(suite.ctx) -// if err != nil { -// log.Fatal(err) -// } -// suite.pgContainer = pgContainer -// suite.pgConnection, err = internal.InitDBConn(lib.PSQL, pgContainer.ConnectionString) -// if err != nil { -// log.Fatal(err) -// } - -// mysqlContainer, err := utils.CreateMySQLContainer(suite.ctx) -// if err != nil { -// log.Fatal(err) -// } -// suite.mysqlContainer = mysqlContainer -// suite.mysqlConnection, err = internal.InitDBConn(lib.MYSQL, mysqlContainer.ConnectionString) -// if err != nil { -// log.Fatal(err) -// } - -// suite.providers = []string{lib.SQLITE3, lib.PSQL, lib.MYSQL} -// } - -// func (suite *DatabaseTestSuite) TearDownSuite() { -// if err := suite.pgContainer.Terminate(suite.ctx); err != nil { -// log.Fatalf("error terminating postgres container: %s", err) -// } - -// if err := suite.mysqlContainer.Terminate(suite.ctx); err != nil { -// log.Fatalf("error terminating mysql container: %s", err) -// } -// suite.sqliteConnection.Close() -// suite.pgConnection.Close() -// suite.mysqlConnection.Close() - -// } - -// func (suite *DatabaseTestSuite) TestListDatabases() { -// t := suite.T() - -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) - -// var dbs []*string -// var err error - -// switch provider { -// case lib.SQLITE3: -// dbs, err = db.ListDatabasesSqlite(suite.sqliteConnection) -// case lib.PSQL, lib.MYSQL: -// dbs, err = db.ListDatabasesPgMySQL(con, provider) -// } - -// assert.Nil(t, err) -// assert.Greater(t, len(dbs), 0) - -// switch provider { -// // we reverse the order here to intentionally make the query fail -// case lib.SQLITE3: -// _, err = db.ListDatabasesPgMySQL(suite.sqliteConnection, provider) -// case lib.PSQL, lib.MYSQL: -// _, err = db.ListDatabasesSqlite(con) -// } -// assert.NotNil(t, err) -// } -// } - -// func (suite *DatabaseTestSuite) TestCreateDatabase() { -// t := suite.T() - -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) - -// var err error - -// switch provider { -// case lib.PSQL, lib.MYSQL: -// err = db.CreatePgMysqlDatabase(con, provider, "metax") -// assert.Nil(t, err) -// } - -// switch provider { -// case lib.PSQL, lib.MYSQL: -// err = db.CreatePgMysqlDatabase(con, provider, "true") -// assert.NotNil(t, err) -// } -// } -// } - -// func TestDatabaseTestSuite(t *testing.T) { -// suite.Run(t, new(DatabaseTestSuite)) -// } diff --git a/internal/db/mysql_test.go b/internal/db/mysql_test.go new file mode 100644 index 0000000..21c6e00 --- /dev/null +++ b/internal/db/mysql_test.go @@ -0,0 +1,165 @@ +package db + +import ( + "context" + "log" + "testing" + + "github.com/jmoiron/sqlx" + "github.com/kareemmahlees/meta-x/lib" + "github.com/kareemmahlees/meta-x/models" + "github.com/kareemmahlees/meta-x/utils" + "github.com/stretchr/testify/suite" +) + +type MySQLTestSuite struct { + suite.Suite + mysqlContainer *utils.MySQLContainer + mysqlConnection *sqlx.DB + mysqlProvider *mysqlProvider + ctx context.Context +} + +func (suite *MySQLTestSuite) SetupSuite() { + suite.ctx = context.Background() + + mysqlContainer, err := utils.CreateMySQLContainer(suite.ctx) + if err != nil { + log.Fatal(err) + } + suite.mysqlContainer = mysqlContainer + + mysqlConfig := utils.NewMySQLConfig(&mysqlContainer.ConnectionString, nil) + conn, err := InitDBConn(lib.MYSQL, mysqlConfig) + if err != nil { + log.Fatal(err) + } + suite.mysqlConnection = conn + + mysqlProvider := NewMySQLProvider(conn) + suite.mysqlProvider = mysqlProvider +} + +func (suite *MySQLTestSuite) TearDownSuite() { + if err := suite.mysqlContainer.Terminate(suite.ctx); err != nil { + log.Fatalf("error terminating postgres container: %s", err) + } + suite.mysqlConnection.Close() +} + +func (suite *MySQLTestSuite) BeforeTest(suiteName, testName string) { + queryString := "CREATE TABLE test ( name varchar(255) );" + _, _ = suite.mysqlConnection.Exec(queryString) +} + +func (suite *MySQLTestSuite) AfterTest(suiteName, testName string) { + queryString := "DROP TABLE test;" + _, _ = suite.mysqlConnection.Exec(queryString) +} + +func (suite *MySQLTestSuite) TestListDBs() { + assert := suite.Assert() + + dbs, err := suite.mysqlProvider.ListDBs() + + assert.Nil(err) + assert.Greater(len(dbs), 0) + +} +func (suite *MySQLTestSuite) TestCreateDB() { + assert := suite.Assert() + + err := suite.mysqlProvider.CreateDB("metax") + assert.Nil(err) + + err = suite.mysqlProvider.CreateDB("true") + assert.NotNil(err) + +} +func (suite *MySQLTestSuite) TestGetTable() { + assert := suite.Assert() + + tableInfo, err := suite.mysqlProvider.GetTable("test") + + assert.Nil(err) + assert.NotEmpty(tableInfo) + assert.Equal(tableInfo[0].Name, "name") + assert.Equal(tableInfo[0].Type, "varchar(255)") + +} +func (suite *MySQLTestSuite) TestListTables() { + assert := suite.Assert() + + result, err := suite.mysqlProvider.ListTables() + + assert.Nil(err) + assert.NotEmpty(result) + +} +func (suite *MySQLTestSuite) TestCreateTable() { + assert := suite.Assert() + + err := suite.mysqlProvider.CreateTable("test_create_table", []models.CreateTablePayload{ + { + ColName: "test", + Type: "varchar(255)", + Default: "defaultText", + Unique: true, + Nullable: false, + }, + }) + assert.Nil(err) + + result, _ := suite.mysqlProvider.ListTables() + convertedResult := utils.SliceOfPointersToSliceOfValues(result) + assert.Contains(convertedResult, "test_create_table") + + err = suite.mysqlProvider.CreateTable("123456", nil) + assert.NotNil(err) + +} +func (suite *MySQLTestSuite) TestDeleteTable() { + assert := suite.Assert() + err := suite.mysqlProvider.DeleteTable("test") + assert.Nil(err) + + result, _ := suite.mysqlProvider.ListTables() + assert.NotContains(result, "test") + +} +func (suite *MySQLTestSuite) TestAddColumn() { + assert := suite.Assert() + + err := suite.mysqlProvider.AddColumn("test", models.AddModifyColumnPayload{ + ColName: "test1", + Type: "int", + }) + assert.Nil(err) + + result, _ := suite.mysqlProvider.GetTable("test") + assert.NotEmpty(result) + +} +func (suite *MySQLTestSuite) TestUpdateColumn() { + assert := suite.Assert() + + err := suite.mysqlProvider.UpdateColumn("test", models.AddModifyColumnPayload{ + ColName: "name", + Type: "varchar(255)", + }) + assert.Nil(err) + +} +func (suite *MySQLTestSuite) TestDeleteColumn() { + assert := suite.Assert() + + err := suite.mysqlProvider.DeleteColumn("test", models.DeleteColumnPayload{ + ColName: "name", + }) + assert.Error(err) + +} + +func TestMySQLTestSuite(t *testing.T) { + suite.Run(t, new(MySQLTestSuite)) +} diff --git a/internal/db/tables_test.go b/internal/db/tables_test.go deleted file mode 100644 index 08870c2..0000000 --- a/internal/db/tables_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package db_test - -// import ( -// "context" -// "fmt" -// "log" -// "reflect" -// "testing" - -// "github.com/kareemmahlees/meta-x/internal" -// "github.com/kareemmahlees/meta-x/internal/db" -// "github.com/kareemmahlees/meta-x/lib" -// "github.com/kareemmahlees/meta-x/models" -// "github.com/kareemmahlees/meta-x/utils" - -// "github.com/jmoiron/sqlx" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/suite" -// ) - -// type TablesTestSuite struct { -// suite.Suite -// providers []string -// pgContainer *utils.PostgresContainer -// pgConnection *sqlx.DB -// mysqlContainer *utils.MySQLContainer -// mysqlConnection *sqlx.DB -// sqliteConnection *sqlx.DB -// ctx context.Context -// } - -// func (suite *TablesTestSuite) getConnection(provider string) *sqlx.DB { -// switch provider { -// case lib.SQLITE3: -// return suite.sqliteConnection -// case lib.PSQL: -// return suite.pgConnection -// case lib.MYSQL: -// return suite.mysqlConnection -// default: -// return suite.sqliteConnection -// } -// } - -// func (suite *TablesTestSuite) SetupSuite() { -// suite.ctx = context.Background() - -// suite.sqliteConnection, _ = internal.InitDBConn(lib.SQLITE3, ":memory:") - -// pgContainer, err := utils.CreatePostgresContainer(suite.ctx) -// if err != nil { -// log.Fatal(err) -// } -// suite.pgContainer = pgContainer -// suite.pgConnection, _ = internal.InitDBConn(lib.PSQL, pgContainer.ConnectionString) - -// mysqlContainer, err := utils.CreateMySQLContainer(suite.ctx) -// if err != nil { -// log.Fatal(err) -// } -// suite.mysqlContainer = mysqlContainer -// suite.mysqlConnection, _ = internal.InitDBConn(lib.MYSQL, mysqlContainer.ConnectionString) - -// suite.providers = []string{lib.SQLITE3, lib.PSQL, lib.MYSQL} -// } - -// func (suite *TablesTestSuite) TearDownSuite() { -// if err := suite.pgContainer.Terminate(suite.ctx); err != nil { -// log.Fatalf("error terminating postgres container: %s", err) -// } - -// if err := suite.mysqlContainer.Terminate(suite.ctx); err != nil { -// log.Fatalf("error terminating mysql container: %s", err) -// } -// suite.sqliteConnection.Close() -// suite.pgConnection.Close() -// suite.mysqlConnection.Close() - -// } - -// func (suite *TablesTestSuite) BeforeTest(suiteName, testName string) { -// queryString := "CREATE TABLE test ( name varchar(255) );" -// _, _ = suite.sqliteConnection.Exec(queryString) -// _, _ = suite.pgConnection.Exec(queryString) -// _, _ = suite.mysqlConnection.Exec(queryString) -// } - -// func (suite *TablesTestSuite) AfterTest(suiteName, testName string) { -// queryString := "DROP TABLE test;" -// _, _ = suite.sqliteConnection.Exec(queryString) -// _, _ = suite.pgConnection.Exec(queryString) -// _, _ = suite.mysqlConnection.Exec(queryString) -// } - -// func (suite *TablesTestSuite) TestDescribeTable() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) -// tableInfo, err := db.GetTableInfo(con, "test", provider) - -// assert.Nil(t, err) -// assert.NotEmpty(t, tableInfo) -// assert.Equal(t, tableInfo[0].Name, "name") -// switch provider { -// case lib.PSQL: -// assert.Equal(t, tableInfo[0].Type, "character varying") -// default: -// assert.Equal(t, tableInfo[0].Type, "varchar(255)") -// } -// } -// } - -// func (suite *TablesTestSuite) TestListTable() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) -// result, err := db.ListTables(con, provider) -// assert.Nil(t, err) -// assert.NotEmpty(t, result) -// assert.IsType(t, reflect.Slice, reflect.TypeOf(result).Kind()) -// } - -// } - -// func (suite *TablesTestSuite) TestCreateTable() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) - -// err := db.CreateTable(con, "test_create_table", []models.CreateTablePayload{ -// { -// ColName: "test", -// Type: "varchar(255)", -// Default: "defaultText", -// Unique: true, -// Nullable: false, -// }, -// }) -// assert.Nil(t, err) - -// result, _ := db.ListTables(con, provider) -// convertedResult := utils.SliceOfPointersToSliceOfValues(result) -// assert.Contains(t, convertedResult, "test_create_table") - -// err = db.CreateTable(con, "123456", nil) -// assert.NotNil(t, err) -// } -// } - -// func (suite *TablesTestSuite) TestAddColumn() { -// t := suite.T() -// for idx, provider := range suite.providers { -// con := suite.getConnection(provider) -// err := db.AddColumn(con, "test", models.AddModifyColumnPayload{ -// ColName: fmt.Sprintf("test%d", idx), -// Type: "int", -// }) -// assert.Nil(t, err) - -// result, _ := db.GetTableInfo(con, "test", provider) -// assert.Greater(t, len(result), 1) -// } -// } - -// func (suite *TablesTestSuite) TestModifyColumn() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) -// err := db.UpdateColumn(con, provider, "test", models.AddModifyColumnPayload{ -// ColName: "name", -// Type: "varchar(255)", -// }) -// switch provider { -// case lib.MYSQL, lib.PSQL: -// assert.Nil(t, err) -// case lib.SQLITE3: -// assert.Error(t, err) -// } -// } -// } - -// func (suite *TablesTestSuite) TestDeleteColumn() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) -// err := db.DeleteColumn(con, "test", models.DeleteColumnPayload{ -// ColName: "name", -// }) -// switch provider { -// case lib.SQLITE3, lib.MYSQL: -// assert.Error(t, err) -// default: -// assert.Nil(t, err) -// result, _ := db.GetTableInfo(con, "test", provider) -// assert.Zero(t, len(result)) -// } - -// } -// } - -// func (suite *TablesTestSuite) TestDeleteTable() { -// t := suite.T() -// for _, provider := range suite.providers { -// con := suite.getConnection(provider) -// err := db.DeleteTable(con, "test") -// assert.Nil(t, err) - -// result, _ := db.ListTables(con, provider) -// assert.NotContains(t, result, "test") -// } - -// } - -// func TestTablesTestSuite(t *testing.T) { -// suite.Run(t, new(TablesTestSuite)) -// }