github.com/ns1/terraform@v0.7.10-0.20161109153551-8949419bef40/terraform/transform_reference_test.go (about) 1 package terraform 2 3 import ( 4 "reflect" 5 "sort" 6 "strings" 7 "testing" 8 9 "github.com/hashicorp/terraform/dag" 10 ) 11 12 func TestReferenceTransformer_simple(t *testing.T) { 13 g := Graph{Path: RootModulePath} 14 g.Add(&graphNodeRefParentTest{ 15 NameValue: "A", 16 Names: []string{"A"}, 17 }) 18 g.Add(&graphNodeRefChildTest{ 19 NameValue: "B", 20 Refs: []string{"A"}, 21 }) 22 23 tf := &ReferenceTransformer{} 24 if err := tf.Transform(&g); err != nil { 25 t.Fatalf("err: %s", err) 26 } 27 28 actual := strings.TrimSpace(g.String()) 29 expected := strings.TrimSpace(testTransformRefBasicStr) 30 if actual != expected { 31 t.Fatalf("bad:\n\n%s", actual) 32 } 33 } 34 35 func TestReferenceTransformer_self(t *testing.T) { 36 g := Graph{Path: RootModulePath} 37 g.Add(&graphNodeRefParentTest{ 38 NameValue: "A", 39 Names: []string{"A"}, 40 }) 41 g.Add(&graphNodeRefChildTest{ 42 NameValue: "B", 43 Refs: []string{"A", "B"}, 44 }) 45 46 tf := &ReferenceTransformer{} 47 if err := tf.Transform(&g); err != nil { 48 t.Fatalf("err: %s", err) 49 } 50 51 actual := strings.TrimSpace(g.String()) 52 expected := strings.TrimSpace(testTransformRefBasicStr) 53 if actual != expected { 54 t.Fatalf("bad:\n\n%s", actual) 55 } 56 } 57 58 func TestReferenceTransformer_path(t *testing.T) { 59 g := Graph{Path: RootModulePath} 60 g.Add(&graphNodeRefParentTest{ 61 NameValue: "A", 62 Names: []string{"A"}, 63 }) 64 g.Add(&graphNodeRefChildTest{ 65 NameValue: "B", 66 Refs: []string{"A"}, 67 }) 68 g.Add(&graphNodeRefParentTest{ 69 NameValue: "child.A", 70 PathValue: []string{"root", "child"}, 71 Names: []string{"A"}, 72 }) 73 g.Add(&graphNodeRefChildTest{ 74 NameValue: "child.B", 75 PathValue: []string{"root", "child"}, 76 Refs: []string{"A"}, 77 }) 78 79 tf := &ReferenceTransformer{} 80 if err := tf.Transform(&g); err != nil { 81 t.Fatalf("err: %s", err) 82 } 83 84 actual := strings.TrimSpace(g.String()) 85 expected := strings.TrimSpace(testTransformRefPathStr) 86 if actual != expected { 87 t.Fatalf("bad:\n\n%s", actual) 88 } 89 } 90 91 func TestReferenceMapReferences(t *testing.T) { 92 cases := map[string]struct { 93 Nodes []dag.Vertex 94 Check dag.Vertex 95 Result []string 96 }{ 97 "simple": { 98 Nodes: []dag.Vertex{ 99 &graphNodeRefParentTest{ 100 NameValue: "A", 101 Names: []string{"A"}, 102 }, 103 }, 104 Check: &graphNodeRefChildTest{ 105 NameValue: "foo", 106 Refs: []string{"A"}, 107 }, 108 Result: []string{"A"}, 109 }, 110 } 111 112 for tn, tc := range cases { 113 t.Run(tn, func(t *testing.T) { 114 rm := NewReferenceMap(tc.Nodes) 115 result, _ := rm.References(tc.Check) 116 117 var resultStr []string 118 for _, v := range result { 119 resultStr = append(resultStr, dag.VertexName(v)) 120 } 121 122 sort.Strings(resultStr) 123 sort.Strings(tc.Result) 124 if !reflect.DeepEqual(resultStr, tc.Result) { 125 t.Fatalf("bad: %#v", resultStr) 126 } 127 }) 128 } 129 } 130 131 func TestReferenceMapReferencedBy(t *testing.T) { 132 cases := map[string]struct { 133 Nodes []dag.Vertex 134 Check dag.Vertex 135 Result []string 136 }{ 137 "simple": { 138 Nodes: []dag.Vertex{ 139 &graphNodeRefChildTest{ 140 NameValue: "A", 141 Refs: []string{"A"}, 142 }, 143 &graphNodeRefChildTest{ 144 NameValue: "B", 145 Refs: []string{"A"}, 146 }, 147 &graphNodeRefChildTest{ 148 NameValue: "C", 149 Refs: []string{"B"}, 150 }, 151 }, 152 Check: &graphNodeRefParentTest{ 153 NameValue: "foo", 154 Names: []string{"A"}, 155 }, 156 Result: []string{"A", "B"}, 157 }, 158 } 159 160 for tn, tc := range cases { 161 t.Run(tn, func(t *testing.T) { 162 rm := NewReferenceMap(tc.Nodes) 163 result := rm.ReferencedBy(tc.Check) 164 165 var resultStr []string 166 for _, v := range result { 167 resultStr = append(resultStr, dag.VertexName(v)) 168 } 169 170 sort.Strings(resultStr) 171 sort.Strings(tc.Result) 172 if !reflect.DeepEqual(resultStr, tc.Result) { 173 t.Fatalf("bad: %#v", resultStr) 174 } 175 }) 176 } 177 } 178 179 type graphNodeRefParentTest struct { 180 NameValue string 181 PathValue []string 182 Names []string 183 } 184 185 func (n *graphNodeRefParentTest) Name() string { return n.NameValue } 186 func (n *graphNodeRefParentTest) ReferenceableName() []string { return n.Names } 187 func (n *graphNodeRefParentTest) Path() []string { return n.PathValue } 188 189 type graphNodeRefChildTest struct { 190 NameValue string 191 PathValue []string 192 Refs []string 193 } 194 195 func (n *graphNodeRefChildTest) Name() string { return n.NameValue } 196 func (n *graphNodeRefChildTest) References() []string { return n.Refs } 197 func (n *graphNodeRefChildTest) Path() []string { return n.PathValue } 198 199 const testTransformRefBasicStr = ` 200 A 201 B 202 A 203 ` 204 205 const testTransformRefPathStr = ` 206 A 207 B 208 A 209 child.A 210 child.B 211 child.A 212 `