@ -3575,60 +3575,114 @@ func TestContext2Validate_queryList(t *testing.T) {
// Action Validation is largely exercised in context_plan_actions_test.go
func TestContext2Validate_action ( t * testing . T ) {
tests := map [ string ] struct {
config string
wantErr string
config string
wantErr string
expectValidateCalled bool
} {
"valid config" : {
`
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
}
}
}
action "test_register" "foo" {
config {
host = "cmdb.snot"
}
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_register . foo ]
}
}
}
` ,
"" ,
true ,
} ,
"validly null config" : { // this doesn't seem likely, but let's make sure nothing panics.
`
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
}
}
}
}
}
action "test_register" "foo" {
config {
host = "cmdb.snot"
}
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_register . foo ]
}
}
}
` ,
action "test_other" "foo" {
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_other . foo ]
}
}
}
` ,
"" ,
true ,
} ,
"missing required config" : {
`
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
}
}
}
}
}
action "test_register" "foo" {
config { }
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_register . foo ]
}
}
}
` ,
"host is null" ,
action "test_register" "foo" {
config { }
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_register . foo ]
}
}
}
` ,
"Missing required argument: The argument \"host\" is required, but no definition was found." ,
false ,
} ,
"invalid required config (provider validation)" : {
`
terraform {
required_providers {
test = {
source = "hashicorp/test"
version = "1.0.0"
}
}
}
action "test_register" "foo" {
config {
host = "invalid"
}
}
resource "test_instance" "foo" {
lifecycle {
action_trigger {
events = [ after_create ]
actions = [ action . test_register . foo ]
}
}
}
` ,
"Invalid value for required argument \"host\" because I said so" ,
true ,
} ,
"invalid nil config config" : {
"invalid nil config ": {
`
terraform {
required_providers {
@ -3649,7 +3703,8 @@ resource "test_instance" "foo" {
}
}
` ,
"config is null" ,
"Missing required argument: The argument \"host\" is required, but was not set." ,
false ,
} ,
}
@ -3669,6 +3724,14 @@ resource "test_instance" "foo" {
} ,
Actions : map [ string ] * providers . ActionSchema {
"test_register" : {
ConfigSchema : & configschema . Block {
Attributes : map [ string ] * configschema . Attribute {
"host" : { Type : cty . String , Required : true } ,
"output" : { Type : cty . String , Computed : true , Optional : true } ,
} ,
} ,
} ,
"test_other" : {
ConfigSchema : & configschema . Block {
Attributes : map [ string ] * configschema . Attribute {
"host" : { Type : cty . String , Optional : true } ,
@ -3678,12 +3741,8 @@ resource "test_instance" "foo" {
} ,
} )
p . ValidateActionConfigFn = func ( r providers . ValidateActionConfigRequest ) ( resp providers . ValidateActionConfigResponse ) {
if r . Config . IsNull ( ) {
resp . Diagnostics = resp . Diagnostics . Append ( errors . New ( "config is null" ) )
return
}
if r . Config . GetAttr ( "host" ) . IsNull ( ) {
resp . Diagnostics = resp . Diagnostics . Append ( errors . New ( "host is null" ) )
if r . Config . GetAttr ( "host" ) == cty . StringVal ( "invalid" ) {
resp . Diagnostics = resp . Diagnostics . Append ( errors . New ( "Invalid value for required argument \"host\" because I said so" ) )
}
return
}
@ -3695,10 +3754,6 @@ resource "test_instance" "foo" {
} )
diags := ctx . Validate ( m , nil )
if ! p . ValidateActionConfigCalled {
t . Fatal ( "ValidateAction RPC was not called" )
}
if test . wantErr != "" {
if ! diags . HasErrors ( ) {
t . Errorf ( "unexpected success\nwant errors: %s" , test . wantErr )
@ -3710,6 +3765,13 @@ resource "test_instance" "foo" {
t . Errorf ( "unexpected error\ngot: %s" , diags . Err ( ) . Error ( ) )
}
}
if p . ValidateActionConfigCalled != test . expectValidateCalled {
if test . expectValidateCalled {
t . Fatal ( "provider Validate RPC was expected, but not called" )
} else {
t . Fatal ( "unexpected Validate RCP call" )
}
}
} )
}
}