mirror of
https://github.com/status-im/migrate.git
synced 2025-02-23 00:08:06 +00:00
Merge pull request #88 from HaraldNordgren/error_output
Improve error output for missing or malformed '-database' and '-source' parameters
This commit is contained in:
commit
6092802b3a
@ -82,13 +82,13 @@ type Migrate struct {
|
|||||||
func New(sourceUrl, databaseUrl string) (*Migrate, error) {
|
func New(sourceUrl, databaseUrl string) (*Migrate, error) {
|
||||||
m := newCommon()
|
m := newCommon()
|
||||||
|
|
||||||
sourceName, err := schemeFromUrl(sourceUrl)
|
sourceName, err := sourceSchemeFromUrl(sourceUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
m.sourceName = sourceName
|
m.sourceName = sourceName
|
||||||
|
|
||||||
databaseName, err := schemeFromUrl(databaseUrl)
|
databaseName, err := databaseSchemeFromUrl(databaseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
25
util.go
25
util.go
@ -1,6 +1,7 @@
|
|||||||
package migrate
|
package migrate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
nurl "net/url"
|
nurl "net/url"
|
||||||
"strings"
|
"strings"
|
||||||
@ -43,15 +44,35 @@ func suint(n int) uint {
|
|||||||
return uint(n)
|
return uint(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
var errNoScheme = fmt.Errorf("no scheme")
|
var errNoScheme = errors.New("no scheme")
|
||||||
|
var errEmptyURL = errors.New("URL cannot be empty")
|
||||||
|
|
||||||
|
func sourceSchemeFromUrl(url string) (string, error) {
|
||||||
|
u, err := schemeFromUrl(url)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("source: %v", err)
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func databaseSchemeFromUrl(url string) (string, error) {
|
||||||
|
u, err := schemeFromUrl(url)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("database: %v", err)
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
|
||||||
// schemeFromUrl returns the scheme from a URL string
|
// schemeFromUrl returns the scheme from a URL string
|
||||||
func schemeFromUrl(url string) (string, error) {
|
func schemeFromUrl(url string) (string, error) {
|
||||||
|
if url == "" {
|
||||||
|
return "", errEmptyURL
|
||||||
|
}
|
||||||
|
|
||||||
u, err := nurl.Parse(url)
|
u, err := nurl.Parse(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(u.Scheme) == 0 {
|
if len(u.Scheme) == 0 {
|
||||||
return "", errNoScheme
|
return "", errNoScheme
|
||||||
}
|
}
|
||||||
|
83
util_test.go
83
util_test.go
@ -1,6 +1,7 @@
|
|||||||
package migrate
|
package migrate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
nurl "net/url"
|
nurl "net/url"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@ -30,3 +31,85 @@ func TestFilterCustomQuery(t *testing.T) {
|
|||||||
t.Fatalf("didn't expect x-custom")
|
t.Fatalf("didn't expect x-custom")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSourceSchemeFromUrlSuccess(t *testing.T) {
|
||||||
|
urlStr := "protocol://path"
|
||||||
|
expected := "protocol"
|
||||||
|
|
||||||
|
u, err := sourceSchemeFromUrl(urlStr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("expected no error, but received %q", err)
|
||||||
|
}
|
||||||
|
if u != expected {
|
||||||
|
t.Fatalf("expected %q, but received %q", expected, u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSourceSchemeFromUrlFailure(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
name string
|
||||||
|
urlStr string
|
||||||
|
expectErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Empty",
|
||||||
|
urlStr: "",
|
||||||
|
expectErr: errors.New("source: URL cannot be empty"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NoScheme",
|
||||||
|
urlStr: "hello",
|
||||||
|
expectErr: errors.New("source: no scheme"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
_, err := sourceSchemeFromUrl(tc.urlStr)
|
||||||
|
if err.Error() != tc.expectErr.Error() {
|
||||||
|
t.Fatalf("expected %q, but received %q", tc.expectErr, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDatabaseSchemeFromUrlSuccess(t *testing.T) {
|
||||||
|
urlStr := "protocol://path"
|
||||||
|
expected := "protocol"
|
||||||
|
|
||||||
|
u, err := databaseSchemeFromUrl(urlStr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("expected no error, but received %q", err)
|
||||||
|
}
|
||||||
|
if u != expected {
|
||||||
|
t.Fatalf("expected %q, but received %q", expected, u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDatabaseSchemeFromUrlFailure(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
name string
|
||||||
|
urlStr string
|
||||||
|
expectErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Empty",
|
||||||
|
urlStr: "",
|
||||||
|
expectErr: errors.New("database: URL cannot be empty"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NoScheme",
|
||||||
|
urlStr: "hello",
|
||||||
|
expectErr: errors.New("database: no scheme"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
_, err := databaseSchemeFromUrl(tc.urlStr)
|
||||||
|
if err.Error() != tc.expectErr.Error() {
|
||||||
|
t.Fatalf("expected %q, but received %q", tc.expectErr, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user