github.com/paultyng/terraform@v0.6.11-0.20180227224804-66ff8f8bed40/moduledeps/module_test.go (about) 1 package moduledeps 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 8 "github.com/hashicorp/terraform/plugin/discovery" 9 ) 10 11 func TestModuleWalkTree(t *testing.T) { 12 type walkStep struct { 13 Path []string 14 ParentName string 15 } 16 17 tests := []struct { 18 Root *Module 19 WalkOrder []walkStep 20 }{ 21 { 22 &Module{ 23 Name: "root", 24 Children: nil, 25 }, 26 []walkStep{ 27 { 28 Path: []string{"root"}, 29 ParentName: "", 30 }, 31 }, 32 }, 33 { 34 &Module{ 35 Name: "root", 36 Children: []*Module{ 37 { 38 Name: "child", 39 }, 40 }, 41 }, 42 []walkStep{ 43 { 44 Path: []string{"root"}, 45 ParentName: "", 46 }, 47 { 48 Path: []string{"root", "child"}, 49 ParentName: "root", 50 }, 51 }, 52 }, 53 { 54 &Module{ 55 Name: "root", 56 Children: []*Module{ 57 { 58 Name: "child", 59 Children: []*Module{ 60 { 61 Name: "grandchild", 62 }, 63 }, 64 }, 65 }, 66 }, 67 []walkStep{ 68 { 69 Path: []string{"root"}, 70 ParentName: "", 71 }, 72 { 73 Path: []string{"root", "child"}, 74 ParentName: "root", 75 }, 76 { 77 Path: []string{"root", "child", "grandchild"}, 78 ParentName: "child", 79 }, 80 }, 81 }, 82 { 83 &Module{ 84 Name: "root", 85 Children: []*Module{ 86 { 87 Name: "child1", 88 Children: []*Module{ 89 { 90 Name: "grandchild1", 91 }, 92 }, 93 }, 94 { 95 Name: "child2", 96 Children: []*Module{ 97 { 98 Name: "grandchild2", 99 }, 100 }, 101 }, 102 }, 103 }, 104 []walkStep{ 105 { 106 Path: []string{"root"}, 107 ParentName: "", 108 }, 109 { 110 Path: []string{"root", "child1"}, 111 ParentName: "root", 112 }, 113 { 114 Path: []string{"root", "child1", "grandchild1"}, 115 ParentName: "child1", 116 }, 117 { 118 Path: []string{"root", "child2"}, 119 ParentName: "root", 120 }, 121 { 122 Path: []string{"root", "child2", "grandchild2"}, 123 ParentName: "child2", 124 }, 125 }, 126 }, 127 } 128 129 for i, test := range tests { 130 t.Run(fmt.Sprintf("%02d", i), func(t *testing.T) { 131 wo := test.WalkOrder 132 test.Root.WalkTree(func(path []string, parent *Module, current *Module) error { 133 if len(wo) == 0 { 134 t.Fatalf("ran out of walk steps while expecting one for %#v", path) 135 } 136 step := wo[0] 137 wo = wo[1:] 138 if got, want := path, step.Path; !reflect.DeepEqual(got, want) { 139 t.Errorf("wrong path %#v; want %#v", got, want) 140 } 141 parentName := "" 142 if parent != nil { 143 parentName = parent.Name 144 } 145 if got, want := parentName, step.ParentName; got != want { 146 t.Errorf("wrong parent name %q; want %q", got, want) 147 } 148 149 if got, want := current.Name, path[len(path)-1]; got != want { 150 t.Errorf("mismatching current.Name %q and final path element %q", got, want) 151 } 152 return nil 153 }) 154 }) 155 } 156 } 157 158 func TestModuleSortChildren(t *testing.T) { 159 m := &Module{ 160 Name: "root", 161 Children: []*Module{ 162 { 163 Name: "apple", 164 }, 165 { 166 Name: "zebra", 167 }, 168 { 169 Name: "xylophone", 170 }, 171 { 172 Name: "pig", 173 }, 174 }, 175 } 176 177 m.SortChildren() 178 179 want := []string{"apple", "pig", "xylophone", "zebra"} 180 var got []string 181 for _, c := range m.Children { 182 got = append(got, c.Name) 183 } 184 185 if !reflect.DeepEqual(want, got) { 186 t.Errorf("wrong order %#v; want %#v", want, got) 187 } 188 } 189 190 func TestModulePluginRequirements(t *testing.T) { 191 m := &Module{ 192 Name: "root", 193 Providers: Providers{ 194 "foo": ProviderDependency{ 195 Constraints: discovery.ConstraintStr(">=1.0.0").MustParse(), 196 }, 197 "foo.bar": ProviderDependency{ 198 Constraints: discovery.ConstraintStr(">=2.0.0").MustParse(), 199 }, 200 "baz": ProviderDependency{ 201 Constraints: discovery.ConstraintStr(">=3.0.0").MustParse(), 202 }, 203 }, 204 } 205 206 reqd := m.PluginRequirements() 207 if len(reqd) != 2 { 208 t.Errorf("wrong number of elements in %#v; want 2", reqd) 209 } 210 if got, want := reqd["foo"].Versions.String(), ">=1.0.0,>=2.0.0"; got != want { 211 t.Errorf("wrong combination of versions for 'foo' %q; want %q", got, want) 212 } 213 if got, want := reqd["baz"].Versions.String(), ">=3.0.0"; got != want { 214 t.Errorf("wrong combination of versions for 'baz' %q; want %q", got, want) 215 } 216 }