diff --git a/cmd/deploy_test.go b/cmd/deploy_test.go index 6be3cf48ae..38e2109723 100644 --- a/cmd/deploy_test.go +++ b/cmd/deploy_test.go @@ -449,6 +449,20 @@ func TestDeploy_Envs(t *testing.T) { } // TODO: create and test typed errors for ErrEnvNotExist etc. + + cmd = NewDeployCmd(NewTestClient()) + cmd.SetArgs([]string{"--env=DOES_NOT_EXIST-"}) + err = cmd.Execute() + + var e *fn.ErrEnvNotExist + if !errors.As(err, &e) { + t.Fatalf("expected ErrEnvNotExist, got '%v'", err) + } + + if e.Name != "DOES_NOT_EXIST" { + t.Fatalf("expected env name 'DOES_NOT_EXIST', got '%v'", e.Name) + } + } // TestDeploy_FunctionContext ensures that the function contextually relevant diff --git a/cmd/root.go b/cmd/root.go index a2bbc3ab35..b7137225b8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -298,13 +298,18 @@ func mergeEnvs(envs []fn.Env, envToUpdate *util.OrderedMap, envToRemove []string } for _, name := range envToRemove { + found := false for i, envVar := range envs { if *envVar.Name == name { envs = append(envs[:i], envs[i+1:]...) counter++ + found = true break } } + if !found { + return nil, 0, &fn.ErrEnvNotExist{Name: name} + } } errMsg := fn.ValidateEnvs(envs) diff --git a/pkg/functions/errors.go b/pkg/functions/errors.go index b454e29fb2..a4b908840c 100644 --- a/pkg/functions/errors.go +++ b/pkg/functions/errors.go @@ -79,3 +79,11 @@ type ErrRunTimeout struct { func (e ErrRunTimeout) Error() string { return fmt.Sprintf("timed out waiting for function to be ready for %s", e.Timeout) } + +type ErrEnvNotExist struct { + Name string +} + +func (e ErrEnvNotExist) Error() string { + return fmt.Sprintf("environment variable %q does not exist", e.Name) +}