package terraform import ( "strings" "testing" "github.com/hashicorp/terraform/dag" ) func TestProviderTransformer(t *testing.T) { mod := testModule(t, "transform-provider-basic") g := Graph{Path: RootModulePath} { tf := &ConfigTransformerOld{Module: mod} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } transform := &ProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformProviderBasicStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestProviderTransformer_moduleChild(t *testing.T) { g := Graph{Path: RootModulePath} { tf := &ImportStateTransformer{ Targets: []*ImportTarget{ &ImportTarget{ Addr: "module.moo.foo_instance.qux", ID: "bar", }, }, } if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { tf := &ProviderTransformer{} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformProviderModuleChildStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestCloseProviderTransformer(t *testing.T) { mod := testModule(t, "transform-provider-basic") g := Graph{Path: RootModulePath} { tf := &ConfigTransformerOld{Module: mod} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &ProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &CloseProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformCloseProviderBasicStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestCloseProviderTransformer_withTargets(t *testing.T) { mod := testModule(t, "transform-provider-basic") g := Graph{Path: RootModulePath} transforms := []GraphTransformer{ &ConfigTransformerOld{Module: mod}, &ProviderTransformer{}, &CloseProviderTransformer{}, &TargetsTransformer{ Targets: []string{"something.else"}, }, } for _, tr := range transforms { if err := tr.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(` provider.aws provider.aws (close) provider.aws `) if actual != expected { t.Fatalf("expected:%s\n\ngot:\n\n%s", expected, actual) } } func TestMissingProviderTransformer(t *testing.T) { mod := testModule(t, "transform-provider-missing") g := Graph{Path: RootModulePath} { tf := &ConfigTransformerOld{Module: mod} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &CloseProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformMissingProviderBasicStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestMissingProviderTransformer_moduleChild(t *testing.T) { g := Graph{Path: RootModulePath} // We use the import state transformer since at the time of writing // this test it is the first and only transformer that will introduce // multiple module-path nodes at a single go. { tf := &ImportStateTransformer{ Targets: []*ImportTarget{ &ImportTarget{ Addr: "module.moo.foo_instance.qux", ID: "bar", }, }, } if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformMissingProviderModuleChildStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestMissingProviderTransformer_moduleGrandchild(t *testing.T) { g := Graph{Path: RootModulePath} // We use the import state transformer since at the time of writing // this test it is the first and only transformer that will introduce // multiple module-path nodes at a single go. { tf := &ImportStateTransformer{ Targets: []*ImportTarget{ &ImportTarget{ Addr: "module.a.module.b.foo_instance.qux", ID: "bar", }, }, } if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformMissingProviderModuleGrandchildStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestParentProviderTransformer(t *testing.T) { g := Graph{Path: RootModulePath} // Introduce a cihld module { tf := &ImportStateTransformer{ Targets: []*ImportTarget{ &ImportTarget{ Addr: "module.moo.foo_instance.qux", ID: "bar", }, }, } if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } // Add the missing modules { tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } // Connect parents { tf := &ParentProviderTransformer{} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformParentProviderStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestParentProviderTransformer_moduleGrandchild(t *testing.T) { g := Graph{Path: RootModulePath} // We use the import state transformer since at the time of writing // this test it is the first and only transformer that will introduce // multiple module-path nodes at a single go. { tf := &ImportStateTransformer{ Targets: []*ImportTarget{ &ImportTarget{ Addr: "module.a.module.b.foo_instance.qux", ID: "bar", }, }, } if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } // Connect parents { tf := &ParentProviderTransformer{} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformParentProviderModuleGrandchildStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestPruneProviderTransformer(t *testing.T) { mod := testModule(t, "transform-provider-prune") g := Graph{Path: RootModulePath} { tf := &ConfigTransformerOld{Module: mod} if err := tf.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &MissingProviderTransformer{Providers: []string{"foo"}} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &ProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &CloseProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } { transform := &PruneProviderTransformer{} if err := transform.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformPruneProviderBasicStr) if actual != expected { t.Fatalf("bad:\n\n%s", actual) } } func TestDisableProviderTransformer(t *testing.T) { mod := testModule(t, "transform-provider-disable") g := Graph{Path: RootModulePath} transforms := []GraphTransformer{ &ConfigTransformerOld{Module: mod}, &MissingProviderTransformer{Providers: []string{"aws"}}, &ProviderTransformer{}, &DisableProviderTransformerOld{}, &CloseProviderTransformer{}, &PruneProviderTransformer{}, } for _, tr := range transforms { if err := tr.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformDisableProviderBasicStr) if actual != expected { t.Fatalf("expected:\n%s\n\ngot:\n%s\n", expected, actual) } } func TestDisableProviderTransformer_keep(t *testing.T) { mod := testModule(t, "transform-provider-disable-keep") g := Graph{Path: RootModulePath} transforms := []GraphTransformer{ &ConfigTransformerOld{Module: mod}, &MissingProviderTransformer{Providers: []string{"aws"}}, &ProviderTransformer{}, &DisableProviderTransformerOld{}, &CloseProviderTransformer{}, &PruneProviderTransformer{}, } for _, tr := range transforms { if err := tr.Transform(&g); err != nil { t.Fatalf("err: %s", err) } } actual := strings.TrimSpace(g.String()) expected := strings.TrimSpace(testTransformDisableProviderKeepStr) if actual != expected { t.Fatalf("expected:\n%s\n\ngot:\n%s\n", expected, actual) } } func TestGraphNodeProvider_impl(t *testing.T) { var _ dag.Vertex = new(graphNodeProvider) var _ dag.NamedVertex = new(graphNodeProvider) var _ GraphNodeProvider = new(graphNodeProvider) } func TestGraphNodeProvider_ProviderName(t *testing.T) { n := &graphNodeProvider{ProviderNameValue: "foo"} if v := n.ProviderName(); v != "foo" { t.Fatalf("bad: %#v", v) } } const testTransformProviderBasicStr = ` aws_instance.web provider.aws provider.aws ` const testTransformCloseProviderBasicStr = ` aws_instance.web provider.aws provider.aws provider.aws (close) aws_instance.web provider.aws ` const testTransformMissingProviderBasicStr = ` aws_instance.web foo_instance.web provider.aws provider.aws (close) aws_instance.web provider.aws provider.foo provider.foo (close) foo_instance.web provider.foo ` const testTransformMissingProviderModuleChildStr = ` module.moo.foo_instance.qux (import id: bar) module.moo.provider.foo provider.foo ` const testTransformMissingProviderModuleGrandchildStr = ` module.a.module.b.foo_instance.qux (import id: bar) module.a.module.b.provider.foo module.a.provider.foo provider.foo ` const testTransformParentProviderStr = ` module.moo.foo_instance.qux (import id: bar) module.moo.provider.foo provider.foo provider.foo ` const testTransformParentProviderModuleGrandchildStr = ` module.a.module.b.foo_instance.qux (import id: bar) module.a.module.b.provider.foo module.a.provider.foo module.a.provider.foo provider.foo provider.foo ` const testTransformProviderModuleChildStr = ` module.moo.foo_instance.qux (import id: bar) module.moo.provider.foo module.moo.provider.foo provider.foo ` const testTransformPruneProviderBasicStr = ` foo_instance.web provider.foo provider.foo provider.foo (close) foo_instance.web provider.foo ` const testTransformDisableProviderBasicStr = ` module.child provider.aws (disabled) var.foo provider.aws (close) module.child provider.aws (disabled) provider.aws (disabled) var.foo ` const testTransformDisableProviderKeepStr = ` aws_instance.foo provider.aws module.child provider.aws var.foo provider.aws provider.aws (close) aws_instance.foo module.child provider.aws var.foo `