Christian Bongiorno
Christian Bongiorno

Reputation: 5648

How can I test validation functionality in a terraform provider

I have written some more sophisticated validation logic for fields I need to validate in a custom terraform provider. I can, of course, test these are unit tests, but that's insufficient; why if I forgot to actually apply the validator?

So, I need to actually use terraform config and have the provider do it's normal, natural thing.

Basically, I expect it to error. The documentation seems to indicate that I should do a regex match on the output. But this can't be right; it seems super brittle. Can someone tell me how this is done?

func TestValidation(t *testing.T) {
    const userBasic = `
        resource "my_user" "dude" {
            name    = "the.dude%d"
            password = "Password1" // needs a special char to pass
            email   = "the.dude%[email protected]"
            groups  = [ "readers" ]
        }
    `
    rgx, _ := regexp.Compile("abc")
    resource.UnitTest(t, resource.TestCase{
        Providers:    testAccProviders,
        Steps: []resource.TestStep{
            {
                Config: userBasic,
                ExpectError: rgx,
            },
        },
    })
}

This code obviously doesn't work. And, a lot of research isn't yielding answers.

Upvotes: 0

Views: 521

Answers (1)

Artem Yarmoliuk
Artem Yarmoliuk

Reputation: 336

Since sdk version 2.3.0 you can set ErrorCheck function on resource.TestCase to provide more complex validation for errors.

For example:

resource.UnitTest(t, resource.TestCase{
    Providers:  testAccProviders,
    ErrorCheck: func(err error) error {
        if err == nil {
            return errors.New("expected error but got none")
        }

        // your validation code here

        // some simple example with string matching
        if strings.Contains(err.Error(), "your expected error message blah") {
           return nil
        }

        // return original error if no match
        return err
    },
    Steps: []resource.TestStep{
        {
            Config: userBasic,
        },
    },
})

Upvotes: 0

Related Questions