github.com/hartzell/terraform@v0.8.6-0.20180503104400-0cc9e050ecd4/helper/customdiff/computed_test.go (about)

     1  package customdiff
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/terraform/helper/schema"
     7  )
     8  
     9  func TestComputedIf(t *testing.T) {
    10  	t.Run("true", func(t *testing.T) {
    11  		var condCalls int
    12  		var gotOld, gotNew string
    13  
    14  		provider := testProvider(
    15  			map[string]*schema.Schema{
    16  				"foo": {
    17  					Type:     schema.TypeString,
    18  					Optional: true,
    19  				},
    20  				"comp": {
    21  					Type:     schema.TypeString,
    22  					Computed: true,
    23  				},
    24  			},
    25  			ComputedIf("comp", func(d *schema.ResourceDiff, meta interface{}) bool {
    26  				// When we set "ForceNew", our CustomizeDiff function is actually
    27  				// called a second time to construct the "create" portion of
    28  				// the replace diff. On the second call, the old value is masked
    29  				// as "" to suggest that the object is being created rather than
    30  				// updated.
    31  
    32  				condCalls++
    33  				old, new := d.GetChange("foo")
    34  				gotOld = old.(string)
    35  				gotNew = new.(string)
    36  
    37  				return true
    38  			}),
    39  		)
    40  
    41  		diff, err := testDiff(
    42  			provider,
    43  			map[string]string{
    44  				"foo":  "bar",
    45  				"comp": "old",
    46  			},
    47  			map[string]string{
    48  				"foo": "baz",
    49  			},
    50  		)
    51  
    52  		if err != nil {
    53  			t.Fatalf("Diff failed with error: %s", err)
    54  		}
    55  
    56  		if condCalls != 1 {
    57  			t.Fatalf("Wrong number of conditional callback calls %d; want %d", condCalls, 1)
    58  		} else {
    59  			if got, want := gotOld, "bar"; got != want {
    60  				t.Errorf("wrong old value %q on first call; want %q", got, want)
    61  			}
    62  			if got, want := gotNew, "baz"; got != want {
    63  				t.Errorf("wrong new value %q on first call; want %q", got, want)
    64  			}
    65  		}
    66  
    67  		if !diff.Attributes["comp"].NewComputed {
    68  			t.Error("Attribute 'comp' is not marked as NewComputed")
    69  		}
    70  	})
    71  	t.Run("false", func(t *testing.T) {
    72  		var condCalls int
    73  		var gotOld, gotNew string
    74  
    75  		provider := testProvider(
    76  			map[string]*schema.Schema{
    77  				"foo": {
    78  					Type:     schema.TypeString,
    79  					Optional: true,
    80  				},
    81  				"comp": {
    82  					Type:     schema.TypeString,
    83  					Computed: true,
    84  				},
    85  			},
    86  			ComputedIf("comp", func(d *schema.ResourceDiff, meta interface{}) bool {
    87  				condCalls++
    88  				old, new := d.GetChange("foo")
    89  				gotOld = old.(string)
    90  				gotNew = new.(string)
    91  
    92  				return false
    93  			}),
    94  		)
    95  
    96  		diff, err := testDiff(
    97  			provider,
    98  			map[string]string{
    99  				"foo":  "bar",
   100  				"comp": "old",
   101  			},
   102  			map[string]string{
   103  				"foo": "baz",
   104  			},
   105  		)
   106  
   107  		if err != nil {
   108  			t.Fatalf("Diff failed with error: %s", err)
   109  		}
   110  
   111  		if condCalls != 1 {
   112  			t.Fatalf("Wrong number of conditional callback calls %d; want %d", condCalls, 1)
   113  		} else {
   114  			if got, want := gotOld, "bar"; got != want {
   115  				t.Errorf("wrong old value %q on first call; want %q", got, want)
   116  			}
   117  			if got, want := gotNew, "baz"; got != want {
   118  				t.Errorf("wrong new value %q on first call; want %q", got, want)
   119  			}
   120  		}
   121  
   122  		if diff.Attributes["comp"] != nil && diff.Attributes["comp"].NewComputed {
   123  			t.Error("Attribute 'foo' is marked as NewComputed, but should not be")
   124  		}
   125  	})
   126  }