src: test create command validates name

This commit is contained in:
Luke Kingland 2021-06-23 21:54:44 +09:00
parent 1591fa6759
commit 4222e34aa6
No known key found for this signature in database
GPG Key ID: 4896F75BAF2E1966
3 changed files with 80 additions and 3 deletions

View File

@ -55,7 +55,7 @@ kn func create --runtime quarkus myfunc
# Create a function project that uses a CloudEvent based function signature
kn func create --template events myfunc
`,
SuggestFor: []string{"inti", "new"},
SuggestFor: []string{"vreate", "creaet", "craete", "new"},
PreRunE: bindEnv("runtime", "template", "repositories", "confirm"),
}

71
cmd/create_test.go Normal file
View File

@ -0,0 +1,71 @@
package cmd
import (
"errors"
"io/ioutil"
"os"
"testing"
fn "github.com/boson-project/func"
"github.com/boson-project/func/utils"
)
// TestCreateValidatesName ensures that the create command only accepts
// DNS-1123 labels for Function name.
func TestCreateValidatesName(t *testing.T) {
defer fromTempDir(t)()
// Create a new Create command with a fn.Client construtor
// which returns a default (noop) client suitable for tests.
cmd := NewCreateCmd(func(string, bool) *fn.Client {
return fn.New()
})
// Execute the command with a function name containing invalid characters.
cmd.SetArgs([]string{"invalid!"})
err := cmd.Execute()
// Confirm the expected error is returned
var e utils.ErrInvalidFunctionName
if !errors.As(err, &e) {
t.Fatalf("Did not receive ErrInvalidFunctionName. Got %v", err)
}
}
// Helpers ----
// change directory into a new temp directory.
// returned is a closure which cleans up; intended to be run as a defer:
// defer within(t, /some/path)()
func fromTempDir(t *testing.T) func() {
t.Helper()
tmp := mktmp(t) // create temp directory
owd := pwd(t) // original working directory
cd(t, tmp) // change to the temp directory
return func() { // return a deferable cleanup closure
os.RemoveAll(tmp) // remove temp directory
cd(t, owd) // change director back to original
}
}
func mktmp(t *testing.T) string {
d, err := ioutil.TempDir("", "dir")
if err != nil {
t.Fatal(err)
}
return d
}
func pwd(t *testing.T) string {
d, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
return d
}
func cd(t *testing.T, dir string) {
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
}

View File

@ -7,6 +7,12 @@ import (
"k8s.io/apimachinery/pkg/util/validation"
)
// ErrInvalidName indicates the name did not pass funciton name validation.
type ErrInvalidFunctionName error
// ErrInvalidEnvVarName indicates the name did not pass env var name validation.
type ErrInvalidEnvVarName error
// ValidateFunctionName validatest that the input name is a valid function name, ie. valid DNS-1123 label.
// It must consist of lower case alphanumeric characters or '-' and start and end with an alphanumeric character
// (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')
@ -18,7 +24,7 @@ func ValidateFunctionName(name string) error {
// and must start and end with an alphanumeric character (e.g. 'my-name',
// or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')"
// Let's reuse it for our purposes, ie. replace "DNS-1123 label" substring with "function name"
return errors.New(strings.Replace(strings.Join(errs, ""), "a DNS-1123 label", "Function name", 1))
return ErrInvalidFunctionName(errors.New(strings.Replace(strings.Join(errs, ""), "a DNS-1123 label", "Function name", 1)))
}
return nil
@ -29,7 +35,7 @@ func ValidateFunctionName(name string) error {
// (e.g. 'my.env-name', or 'MY_ENV.NAME', or 'MyEnvName1', regex used for validation is '[-._a-zA-Z][-._a-zA-Z0-9]*'))
func ValidateEnvVarName(name string) error {
if errs := validation.IsEnvVarName(name); len(errs) > 0 {
return errors.New(strings.Join(errs, ""))
return ErrInvalidEnvVarName(errors.New(strings.Join(errs, "")))
}
return nil