mirror of
https://github.com/netbirdio/netbird.git
synced 2025-01-23 14:28:51 +01:00
92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
package migration_test
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/netbirdio/netbird/management/server"
|
|
"github.com/netbirdio/netbird/management/server/migration"
|
|
"github.com/netbirdio/netbird/route"
|
|
)
|
|
|
|
func setupDatabase(t *testing.T) *gorm.DB {
|
|
t.Helper()
|
|
|
|
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{
|
|
PrepareStmt: true,
|
|
})
|
|
|
|
require.NoError(t, err, "Failed to open database")
|
|
return db
|
|
}
|
|
|
|
func TestMigrateFieldFromGobToJSON_EmptyDB(t *testing.T) {
|
|
db := setupDatabase(t)
|
|
err := migration.MigrateFieldFromGobToJSON[server.Account, net.IPNet](db, "network_net")
|
|
require.NoError(t, err, "Migration should not fail for an empty database")
|
|
}
|
|
|
|
func TestMigrateFieldFromGobToJSON_WithGobData(t *testing.T) {
|
|
db := setupDatabase(t)
|
|
|
|
err := db.AutoMigrate(&server.Account{}, &route.Route{})
|
|
require.NoError(t, err, "Failed to auto-migrate tables")
|
|
|
|
_, ipnet, err := net.ParseCIDR("10.0.0.0/24")
|
|
require.NoError(t, err, "Failed to parse CIDR")
|
|
|
|
type network struct {
|
|
server.Network
|
|
Net net.IPNet `gorm:"serializer:gob"`
|
|
}
|
|
|
|
type account struct {
|
|
server.Account
|
|
Network *network `gorm:"embedded;embeddedPrefix:network_"`
|
|
}
|
|
|
|
err = db.Save(&account{Account: server.Account{Id: "123"}, Network: &network{Net: *ipnet}}).Error
|
|
require.NoError(t, err, "Failed to insert Gob data")
|
|
|
|
var gobStr string
|
|
err = db.Model(&server.Account{}).Select("network_net").First(&gobStr).Error
|
|
assert.NoError(t, err, "Failed to fetch Gob data")
|
|
|
|
err = gob.NewDecoder(strings.NewReader(gobStr)).Decode(&ipnet)
|
|
require.NoError(t, err, "Failed to decode Gob data")
|
|
|
|
err = migration.MigrateFieldFromGobToJSON[server.Account, net.IPNet](db, "network_net")
|
|
require.NoError(t, err, "Migration should not fail with Gob data")
|
|
|
|
var jsonStr string
|
|
db.Model(&server.Account{}).Select("network_net").First(&jsonStr)
|
|
assert.JSONEq(t, `{"IP":"10.0.0.0","Mask":"////AA=="}`, jsonStr, "Data should be migrated")
|
|
}
|
|
|
|
func TestMigrateFieldFromGobToJSON_WithJSONData(t *testing.T) {
|
|
db := setupDatabase(t)
|
|
|
|
err := db.AutoMigrate(&server.Account{}, &route.Route{})
|
|
require.NoError(t, err, "Failed to auto-migrate tables")
|
|
|
|
_, ipnet, err := net.ParseCIDR("10.0.0.0/24")
|
|
require.NoError(t, err, "Failed to parse CIDR")
|
|
|
|
err = db.Save(&server.Account{Network: &server.Network{Net: *ipnet}}).Error
|
|
require.NoError(t, err, "Failed to insert JSON data")
|
|
|
|
err = migration.MigrateFieldFromGobToJSON[server.Account, net.IPNet](db, "network_net")
|
|
require.NoError(t, err, "Migration should not fail with JSON data")
|
|
|
|
var jsonStr string
|
|
db.Model(&server.Account{}).Select("network_net").First(&jsonStr)
|
|
assert.JSONEq(t, `{"IP":"10.0.0.0","Mask":"////AA=="}`, jsonStr, "Data should be unchanged")
|
|
}
|