mirror of
https://github.com/aykhans/dodo.git
synced 2025-09-06 11:04:22 +00:00
refactor config file type
This commit is contained in:
@@ -9,7 +9,8 @@ import (
|
||||
type ConfigFileType string
|
||||
|
||||
const (
|
||||
ConfigFileTypeYAML ConfigFileType = "yaml/yml"
|
||||
ConfigFileTypeUnknown ConfigFileType = "unknown"
|
||||
ConfigFileTypeYAML ConfigFileType = "yaml/yml"
|
||||
)
|
||||
|
||||
type ConfigFileLocationType string
|
||||
@@ -25,7 +26,7 @@ type ConfigFile struct {
|
||||
locationType ConfigFileLocationType
|
||||
}
|
||||
|
||||
func (configFile ConfigFile) String() string {
|
||||
func (configFile ConfigFile) Path() string {
|
||||
return configFile.path
|
||||
}
|
||||
|
||||
@@ -41,9 +42,7 @@ func (configFile ConfigFile) LocationType() ConfigFileLocationType {
|
||||
// path or URL and returns a ConfigFile struct.
|
||||
// It determines the file's type and location (local or remote) based on the string.
|
||||
// It can return the following errors:
|
||||
// - ErrConfigFileExtensionNotFound
|
||||
// - RemoteConfigFileParseError
|
||||
// - UnknownConfigFileTypeError
|
||||
func ParseConfigFile(configFileRaw string) (*ConfigFile, error) {
|
||||
configFileParsed := &ConfigFile{
|
||||
path: configFileRaw,
|
||||
@@ -64,15 +63,12 @@ func ParseConfigFile(configFileRaw string) (*ConfigFile, error) {
|
||||
}
|
||||
|
||||
configFileExtension, _ := strings.CutPrefix(filepath.Ext(configFilePath), ".")
|
||||
if configFileExtension == "" {
|
||||
return nil, ErrConfigFileExtensionNotFound
|
||||
}
|
||||
|
||||
switch strings.ToLower(configFileExtension) {
|
||||
case "yml", "yaml":
|
||||
configFileParsed._type = ConfigFileTypeYAML
|
||||
default:
|
||||
return nil, NewUnknownConfigFileTypeError(configFileExtension)
|
||||
configFileParsed._type = ConfigFileTypeUnknown
|
||||
}
|
||||
|
||||
return configFileParsed, nil
|
||||
|
@@ -10,20 +10,25 @@ import (
|
||||
func TestConfigFile_String(t *testing.T) {
|
||||
t.Run("String returns the file path", func(t *testing.T) {
|
||||
configFile := ConfigFile{path: "/path/to/config.yaml"}
|
||||
assert.Equal(t, "/path/to/config.yaml", configFile.String())
|
||||
assert.Equal(t, "/path/to/config.yaml", configFile.Path())
|
||||
})
|
||||
|
||||
t.Run("String returns empty path", func(t *testing.T) {
|
||||
configFile := ConfigFile{path: ""}
|
||||
assert.Empty(t, configFile.String())
|
||||
assert.Empty(t, configFile.Path())
|
||||
})
|
||||
}
|
||||
|
||||
func TestConfigFile_Type(t *testing.T) {
|
||||
t.Run("Type returns the config file type", func(t *testing.T) {
|
||||
t.Run("Type returns YAML config file type", func(t *testing.T) {
|
||||
configFile := ConfigFile{_type: ConfigFileTypeYAML}
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
})
|
||||
|
||||
t.Run("Type returns Unknown config file type", func(t *testing.T) {
|
||||
configFile := ConfigFile{_type: ConfigFileTypeUnknown}
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
})
|
||||
}
|
||||
|
||||
func TestConfigFile_LocationType(t *testing.T) {
|
||||
@@ -44,7 +49,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "config.yml", configFile.String())
|
||||
assert.Equal(t, "config.yml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
@@ -54,7 +59,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "config.yaml", configFile.String())
|
||||
assert.Equal(t, "config.yaml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
@@ -68,7 +73,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, testCase, configFile.String())
|
||||
assert.Equal(t, testCase, configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
@@ -80,7 +85,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "http://example.com/config.yaml", configFile.String())
|
||||
assert.Equal(t, "http://example.com/config.yaml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
@@ -90,7 +95,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "https://example.com/path/config.yml", configFile.String())
|
||||
assert.Equal(t, "https://example.com/path/config.yml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
@@ -100,26 +105,29 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "/path/to/config.yaml", configFile.String())
|
||||
assert.Equal(t, "/path/to/config.yaml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse file without extension returns error", func(t *testing.T) {
|
||||
t.Run("Parse file without extension returns unknown type", func(t *testing.T) {
|
||||
configFile, err := ParseConfigFile("config")
|
||||
|
||||
require.Error(t, err)
|
||||
assert.Equal(t, ErrConfigFileExtensionNotFound, err)
|
||||
assert.Nil(t, configFile)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "config", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse file with unsupported extension returns error", func(t *testing.T) {
|
||||
t.Run("Parse file with unsupported extension returns unknown type", func(t *testing.T) {
|
||||
configFile, err := ParseConfigFile("config.json")
|
||||
|
||||
require.Error(t, err)
|
||||
assert.IsType(t, UnknownConfigFileTypeError{}, err)
|
||||
assert.Contains(t, err.Error(), "json")
|
||||
assert.Nil(t, configFile)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "config.json", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse remote file with invalid URL returns error", func(t *testing.T) {
|
||||
@@ -130,29 +138,34 @@ func TestParseConfigFile(t *testing.T) {
|
||||
assert.Nil(t, configFile)
|
||||
})
|
||||
|
||||
t.Run("Parse remote file without extension returns error", func(t *testing.T) {
|
||||
t.Run("Parse remote file without extension returns unknown type", func(t *testing.T) {
|
||||
configFile, err := ParseConfigFile("https://example.com/config")
|
||||
|
||||
require.Error(t, err)
|
||||
assert.Equal(t, ErrConfigFileExtensionNotFound, err)
|
||||
assert.Nil(t, configFile)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "https://example.com/config", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse remote file with unsupported extension returns error", func(t *testing.T) {
|
||||
t.Run("Parse remote file with unsupported extension returns unknown type", func(t *testing.T) {
|
||||
configFile, err := ParseConfigFile("https://example.com/config.txt")
|
||||
|
||||
require.Error(t, err)
|
||||
assert.IsType(t, UnknownConfigFileTypeError{}, err)
|
||||
assert.Contains(t, err.Error(), "txt")
|
||||
assert.Nil(t, configFile)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "https://example.com/config.txt", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse empty string returns error", func(t *testing.T) {
|
||||
t.Run("Parse empty string returns unknown type", func(t *testing.T) {
|
||||
configFile, err := ParseConfigFile("")
|
||||
|
||||
require.Error(t, err)
|
||||
assert.Equal(t, ErrConfigFileExtensionNotFound, err)
|
||||
assert.Nil(t, configFile)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Empty(t, configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeUnknown, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
|
||||
t.Run("Parse file with multiple dots in name", func(t *testing.T) {
|
||||
@@ -160,7 +173,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "config.test.yaml", configFile.String())
|
||||
assert.Equal(t, "config.test.yaml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationLocal, configFile.LocationType())
|
||||
})
|
||||
@@ -170,7 +183,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "https://example.com/path/config.yaml?version=1&format=yaml#section", configFile.String())
|
||||
assert.Equal(t, "https://example.com/path/config.yaml?version=1&format=yaml#section", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
@@ -180,7 +193,7 @@ func TestParseConfigFile(t *testing.T) {
|
||||
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, configFile)
|
||||
assert.Equal(t, "https://example.com:8080/config.yml", configFile.String())
|
||||
assert.Equal(t, "https://example.com:8080/config.yml", configFile.Path())
|
||||
assert.Equal(t, ConfigFileTypeYAML, configFile.Type())
|
||||
assert.Equal(t, ConfigFileLocationRemote, configFile.LocationType())
|
||||
})
|
||||
|
@@ -13,9 +13,6 @@ var (
|
||||
// CLI
|
||||
ErrCLINoArgs = errors.New("CLI expects arguments but received none")
|
||||
ErrCLIUnexpectedArgs = errors.New("CLI received unexpected arguments")
|
||||
|
||||
// Config File
|
||||
ErrConfigFileExtensionNotFound = errors.New("config file extension not found")
|
||||
)
|
||||
|
||||
// ======================================== General ========================================
|
||||
@@ -101,14 +98,21 @@ func (e RemoteConfigFileParseError) Unwrap() error {
|
||||
return e.error
|
||||
}
|
||||
|
||||
type UnknownConfigFileTypeError struct {
|
||||
Type string
|
||||
type ConfigFileReadError struct {
|
||||
error error
|
||||
}
|
||||
|
||||
func NewUnknownConfigFileTypeError(_type string) UnknownConfigFileTypeError {
|
||||
return UnknownConfigFileTypeError{_type}
|
||||
func NewConfigFileReadError(err error) ConfigFileReadError {
|
||||
if err == nil {
|
||||
err = ErrNoError
|
||||
}
|
||||
return ConfigFileReadError{err}
|
||||
}
|
||||
|
||||
func (e UnknownConfigFileTypeError) Error() string {
|
||||
return "Unknown config file type: " + e.Type
|
||||
func (e ConfigFileReadError) Error() string {
|
||||
return "Config file read error: " + e.error.Error()
|
||||
}
|
||||
|
||||
func (e ConfigFileReadError) Unwrap() error {
|
||||
return e.error
|
||||
}
|
||||
|
@@ -205,37 +205,6 @@ func TestNewRemoteConfigFileParseError(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestUnknownConfigFileTypeError_Error(t *testing.T) {
|
||||
t.Run("Error returns formatted message", func(t *testing.T) {
|
||||
err := NewUnknownConfigFileTypeError("json")
|
||||
|
||||
expected := "Unknown config file type: json"
|
||||
assert.Equal(t, expected, err.Error())
|
||||
})
|
||||
|
||||
t.Run("Error with empty type", func(t *testing.T) {
|
||||
err := NewUnknownConfigFileTypeError("")
|
||||
|
||||
expected := "Unknown config file type: "
|
||||
assert.Equal(t, expected, err.Error())
|
||||
})
|
||||
|
||||
t.Run("Error with special characters in type", func(t *testing.T) {
|
||||
err := NewUnknownConfigFileTypeError("type.with.dots")
|
||||
|
||||
expected := "Unknown config file type: type.with.dots"
|
||||
assert.Equal(t, expected, err.Error())
|
||||
})
|
||||
}
|
||||
|
||||
func TestNewUnknownConfigFileTypeError(t *testing.T) {
|
||||
t.Run("Creates UnknownConfigFileTypeError with correct values", func(t *testing.T) {
|
||||
err := NewUnknownConfigFileTypeError("xml")
|
||||
|
||||
assert.Equal(t, "xml", err.Type)
|
||||
})
|
||||
}
|
||||
|
||||
func TestErrorConstants(t *testing.T) {
|
||||
t.Run("ErrNoError has correct message", func(t *testing.T) {
|
||||
expected := "no error (internal)"
|
||||
@@ -251,11 +220,6 @@ func TestErrorConstants(t *testing.T) {
|
||||
expected := "CLI received unexpected arguments"
|
||||
assert.Equal(t, expected, ErrCLIUnexpectedArgs.Error())
|
||||
})
|
||||
|
||||
t.Run("ErrConfigFileExtensionNotFound has correct message", func(t *testing.T) {
|
||||
expected := "config file extension not found"
|
||||
assert.Equal(t, expected, ErrConfigFileExtensionNotFound.Error())
|
||||
})
|
||||
}
|
||||
|
||||
func TestErrorImplementsErrorInterface(t *testing.T) {
|
||||
@@ -278,9 +242,4 @@ func TestErrorImplementsErrorInterface(t *testing.T) {
|
||||
var err error = NewRemoteConfigFileParseError(errors.New("test"))
|
||||
assert.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("UnknownConfigFileTypeError implements error interface", func(t *testing.T) {
|
||||
var err error = NewUnknownConfigFileTypeError("test")
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user