10 // TestString is a Stringer-like function that outputs a string that can
11 // be used to easily compare multiple Config structures in unit tests.
13 // This function has no practical use outside of unit tests and debugging.
14 func (c *Config) TestString() string {
20 if len(c.Modules) > 0 {
21 buf.WriteString("Modules:\n\n")
22 buf.WriteString(modulesStr(c.Modules))
23 buf.WriteString("\n\n")
26 if len(c.Variables) > 0 {
27 buf.WriteString("Variables:\n\n")
28 buf.WriteString(variablesStr(c.Variables))
29 buf.WriteString("\n\n")
32 if len(c.ProviderConfigs) > 0 {
33 buf.WriteString("Provider Configs:\n\n")
34 buf.WriteString(providerConfigsStr(c.ProviderConfigs))
35 buf.WriteString("\n\n")
38 if len(c.Resources) > 0 {
39 buf.WriteString("Resources:\n\n")
40 buf.WriteString(resourcesStr(c.Resources))
41 buf.WriteString("\n\n")
44 if len(c.Outputs) > 0 {
45 buf.WriteString("Outputs:\n\n")
46 buf.WriteString(outputsStr(c.Outputs))
50 return strings.TrimSpace(buf.String())
53 func terraformStr(t *Terraform) string {
56 if b := t.Backend; b != nil {
57 result += fmt.Sprintf("backend (%s)\n", b.Type)
59 keys := make([]string, 0, len(b.RawConfig.Raw))
60 for k, _ := range b.RawConfig.Raw {
61 keys = append(keys, k)
65 for _, k := range keys {
66 result += fmt.Sprintf(" %s\n", k)
70 return strings.TrimSpace(result)
73 func modulesStr(ms []*Module) string {
75 order := make([]int, 0, len(ms))
76 ks := make([]string, 0, len(ms))
77 mapping := make(map[string]int)
78 for i, m := range ms {
84 for _, k := range ks {
85 order = append(order, mapping[k])
88 for _, i := range order {
90 result += fmt.Sprintf("%s\n", m.Id())
92 ks := make([]string, 0, len(m.RawConfig.Raw))
93 for k, _ := range m.RawConfig.Raw {
98 result += fmt.Sprintf(" source = %s\n", m.Source)
100 for _, k := range ks {
101 result += fmt.Sprintf(" %s\n", k)
105 return strings.TrimSpace(result)
108 func outputsStr(os []*Output) string {
109 ns := make([]string, 0, len(os))
110 m := make(map[string]*Output)
111 for _, o := range os {
112 ns = append(ns, o.Name)
118 for _, n := range ns {
121 result += fmt.Sprintf("%s\n", n)
123 if len(o.DependsOn) > 0 {
124 result += fmt.Sprintf(" dependsOn\n")
125 for _, d := range o.DependsOn {
126 result += fmt.Sprintf(" %s\n", d)
130 if len(o.RawConfig.Variables) > 0 {
131 result += fmt.Sprintf(" vars\n")
132 for _, rawV := range o.RawConfig.Variables {
134 str := rawV.FullKey()
137 case *ResourceVariable:
143 result += fmt.Sprintf(" %s: %s\n", kind, str)
148 return strings.TrimSpace(result)
151 // This helper turns a provider configs field into a deterministic
152 // string value for comparison in tests.
153 func providerConfigsStr(pcs []*ProviderConfig) string {
156 ns := make([]string, 0, len(pcs))
157 m := make(map[string]*ProviderConfig)
158 for _, n := range pcs {
159 ns = append(ns, n.Name)
164 for _, n := range ns {
167 result += fmt.Sprintf("%s\n", n)
169 keys := make([]string, 0, len(pc.RawConfig.Raw))
170 for k, _ := range pc.RawConfig.Raw {
171 keys = append(keys, k)
175 for _, k := range keys {
176 result += fmt.Sprintf(" %s\n", k)
179 if len(pc.RawConfig.Variables) > 0 {
180 result += fmt.Sprintf(" vars\n")
181 for _, rawV := range pc.RawConfig.Variables {
183 str := rawV.FullKey()
186 case *ResourceVariable:
192 result += fmt.Sprintf(" %s: %s\n", kind, str)
197 return strings.TrimSpace(result)
200 // This helper turns a resources field into a deterministic
201 // string value for comparison in tests.
202 func resourcesStr(rs []*Resource) string {
204 order := make([]int, 0, len(rs))
205 ks := make([]string, 0, len(rs))
206 mapping := make(map[string]int)
207 for i, r := range rs {
213 for _, k := range ks {
214 order = append(order, mapping[k])
217 for _, i := range order {
219 result += fmt.Sprintf(
224 ks := make([]string, 0, len(r.RawConfig.Raw))
225 for k, _ := range r.RawConfig.Raw {
230 for _, k := range ks {
231 result += fmt.Sprintf(" %s\n", k)
234 if len(r.Provisioners) > 0 {
235 result += fmt.Sprintf(" provisioners\n")
236 for _, p := range r.Provisioners {
238 if p.When != ProvisionerWhenCreate {
239 when = fmt.Sprintf(" (%s)", p.When.String())
242 result += fmt.Sprintf(" %s%s\n", p.Type, when)
244 if p.OnFailure != ProvisionerOnFailureFail {
245 result += fmt.Sprintf(" on_failure = %s\n", p.OnFailure.String())
248 ks := make([]string, 0, len(p.RawConfig.Raw))
249 for k, _ := range p.RawConfig.Raw {
254 for _, k := range ks {
255 result += fmt.Sprintf(" %s\n", k)
260 if len(r.DependsOn) > 0 {
261 result += fmt.Sprintf(" dependsOn\n")
262 for _, d := range r.DependsOn {
263 result += fmt.Sprintf(" %s\n", d)
267 if len(r.RawConfig.Variables) > 0 {
268 result += fmt.Sprintf(" vars\n")
270 ks := make([]string, 0, len(r.RawConfig.Variables))
271 for k, _ := range r.RawConfig.Variables {
276 for _, k := range ks {
277 rawV := r.RawConfig.Variables[k]
279 str := rawV.FullKey()
282 case *ResourceVariable:
288 result += fmt.Sprintf(" %s: %s\n", kind, str)
293 return strings.TrimSpace(result)
296 // This helper turns a variables field into a deterministic
297 // string value for comparison in tests.
298 func variablesStr(vs []*Variable) string {
300 ks := make([]string, 0, len(vs))
301 m := make(map[string]*Variable)
302 for _, v := range vs {
303 ks = append(ks, v.Name)
308 for _, k := range ks {
313 required = " (required)"
317 if v.DeclaredType != "" {
318 declaredType = fmt.Sprintf(" (%s)", v.DeclaredType)
321 if v.Default == nil || v.Default == "" {
324 if v.Description == "" {
328 result += fmt.Sprintf(
329 "%s%s%s\n %v\n %s\n",
337 return strings.TrimSpace(result)