From 02ba460b3ab3fdfa0839532b5492e3c2965f15e5 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 18 Aug 2021 22:34:28 +0200 Subject: [PATCH] Add tests to build mysql args --- dump_mysql.go | 19 ++++++-- dump_mysql_test.go | 118 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 dump_mysql_test.go diff --git a/dump_mysql.go b/dump_mysql.go index 224a958..0db5984 100644 --- a/dump_mysql.go +++ b/dump_mysql.go @@ -15,8 +15,7 @@ func NewMysqlDumper(container *types.ContainerJSON) *MysqlDumper { } } -func (m *MysqlDumper) Dump() error { - fmt.Printf("Dumping mysql database from container %s...\n", m.Container.Name) +func (m *MysqlDumper) buildDumpArgs() []string { env := parseEnv(m.Container.Config.Env) user := "root" @@ -41,5 +40,19 @@ func (m *MysqlDumper) Dump() error { host := m.Container.NetworkSettings.DefaultNetworkSettings.IPAddress - return runAndSaveCommand(getDumpFilename(m.Container.Name), "mysqldump", "--lock-tables=0", "--dump-date", "-u", user, "-p"+pw, "--port", port, "-h", host, db) + args := []string{"--lock-tables=0", "--dump-date", "-u", user} + + if pw != "" { + args = append(args, "-p"+pw) + } + + return append(args, "--port", port, "-h", host, db) +} + +func (m *MysqlDumper) Dump() error { + fmt.Printf("Dumping mysql database from container %s...\n", m.Container.Name) + + args := m.buildDumpArgs() + + return runAndSaveCommand(getDumpFilename(m.Container.Name), "mysqldump", args...) } diff --git a/dump_mysql_test.go b/dump_mysql_test.go new file mode 100644 index 0000000..43af186 --- /dev/null +++ b/dump_mysql_test.go @@ -0,0 +1,118 @@ +package main + +import ( + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "reflect" + "testing" +) + +func TestMysqlDumper_buildDumpArgs(t *testing.T) { + nw := &types.NetworkSettings{ + DefaultNetworkSettings: types.DefaultNetworkSettings{ + IPAddress: "1.2.3.4", + }, + } + tests := []struct { + name string + container *types.ContainerJSON + want []string + }{ + { + name: "values for everything", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_USER=loremipsum", + "MYSQL_DATABASE=ipsum", + "MYSQL_PASSWORD=notapassword", + "MYSQL_PORT=1234", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "loremipsum", "-p" + "notapassword", "--port", "1234", "-h", "1.2.3.4", "ipsum"}, + }, + { + name: "no user", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_DATABASE=ipsum", + "MYSQL_PASSWORD=notapassword", + "MYSQL_PORT=1234", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "root", "-p" + "notapassword", "--port", "1234", "-h", "1.2.3.4", "ipsum"}, + }, + { + name: "no password", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_USER=loremipsum", + "MYSQL_DATABASE=ipsum", + "MYSQL_PORT=1234", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "loremipsum", "--port", "1234", "-h", "1.2.3.4", "ipsum"}, + }, + { + name: "no password, but root", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_USER=loremipsum", + "MYSQL_DATABASE=ipsum", + "MYSQL_PORT=1234", + "MYSQL_ROOT_PASSWORD=roooot", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "loremipsum", "-p" + "roooot", "--port", "1234", "-h", "1.2.3.4", "ipsum"}, + }, + { + name: "no port", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_USER=loremipsum", + "MYSQL_DATABASE=ipsum", + "MYSQL_PASSWORD=notapassword", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "loremipsum", "-p" + "notapassword", "--port", "3306", "-h", "1.2.3.4", "ipsum"}, + }, + { + name: "no db", + container: &types.ContainerJSON{ + NetworkSettings: nw, + Config: &container.Config{ + Env: []string{ + "MYSQL_USER=loremipsum", + "MYSQL_PASSWORD=notapassword", + "MYSQL_PORT=1234", + }, + }, + }, + want: []string{"--lock-tables=0", "--dump-date", "-u", "loremipsum", "-p" + "notapassword", "--port", "1234", "-h", "1.2.3.4", "--all-databases"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := &MysqlDumper{ + Container: tt.container, + } + if got := m.buildDumpArgs(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("buildDumpArgs() = %v, want %v", got, tt.want) + } + }) + } +}