blob: 911d0e8e44c42162e6a4d145feb1041b709d370c [file]
package backup_test
import (
"database/sql"
"database/sql/driver"
"fmt"
"github.com/DATA-DOG/go-sqlmock"
"github.com/apache/cloudberry-backup/backup"
"github.com/apache/cloudberry-go-libs/structmatcher"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("backup internal tests", func() {
Describe("generateLockQueries", func() {
It("batches tables together and generates lock queries", func() {
tables := make([]backup.Relation, 0)
for i := 0; i < 200; i++ {
tables = append(tables, backup.Relation{0, 0, "public", fmt.Sprintf("foo%d", i)})
}
batchSize := 100
lockQueries := backup.GenerateTableBatches(tables, batchSize)
Expect(len(lockQueries)).To(Equal(2))
})
It("batches up remaining leftover tables together in a single lock query", func() {
tables := make([]backup.Relation, 0)
for i := 0; i < 101; i++ {
tables = append(tables, backup.Relation{0, 0, "public", fmt.Sprintf("foo%d", i)})
}
batchSize := 50
lockQueries := backup.GenerateTableBatches(tables, batchSize)
Expect(len(lockQueries)).To(Equal(3))
})
})
Describe("GetAllViews", func() {
It("GetAllViews properly handles NULL view definitions", func() {
columnDefHeader := []string{"attrelid", "attnum", "name", "attnotnull", "atthasdef", "type", "encoding", "attstattarget", "storagetype", "defaultval", "comment", "privileges", "kind", "options", "fdwoptions", "collation", "securitylabelprovider", "securitylabel", "attgenerated", "isinherited"}
fakeColumnDef := sqlmock.NewRows(columnDefHeader)
mock.ExpectQuery(`SELECT (.*)`).WillReturnRows(fakeColumnDef)
header := []string{"oid", "schema", "name", "options", "definition", "tablespace", "ismaterialized"}
rowOne := []driver.Value{"1", "mock_schema", "mock_table", "mock_options", "mock_def", "mock_tablespace", false}
rowTwo := []driver.Value{"2", "mock_schema2", "mock_table2", "mock_options2", nil, "mock_tablespace2", false}
fakeRows := sqlmock.NewRows(header).AddRow(rowOne...).AddRow(rowTwo...)
mock.ExpectQuery(`SELECT (.*)`).WillReturnRows(fakeRows)
headerDistPol := []string{"oid", "value"}
fakeRowsDistPol := sqlmock.NewRows(headerDistPol)
mock.ExpectQuery(`SELECT (.*)`).WillReturnRows(fakeRowsDistPol)
result := backup.GetAllViews(connectionPool)
// Expect the GetAllViews function to return only the 1st row since the 2nd row has a NULL view definition
expectedResult := []backup.View{{Oid: 1, Schema: "mock_schema", Name: "mock_table", Options: "mock_options",
Definition: sql.NullString{String: "mock_def", Valid: true}, Tablespace: "mock_tablespace", IsMaterialized: false}}
Expect(result).To(HaveLen(1))
structmatcher.ExpectStructsToMatch(&expectedResult[0], &result[0])
})
})
})