blob: 22136be97cac32f9c8fe97265cb2fe8fb1bec12e [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package mocking
import (
"testing"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/configs"
)
func TestPackageOverrides(t *testing.T) {
mustResourceInstance := func(s string) addrs.AbsResourceInstance {
addr, diags := addrs.ParseAbsResourceInstanceStr(s)
if len(diags) > 0 {
t.Fatal(diags)
}
return addr
}
primary := mustResourceInstance("test_instance.primary")
secondary := mustResourceInstance("test_instance.secondary")
tertiary := mustResourceInstance("test_instance.tertiary")
testrun := mustResourceInstance("test_instance.test_run")
testfile := mustResourceInstance("test_instance.test_file")
provider := mustResourceInstance("test_instance.provider")
// Add a single override to the test run.
run := &configs.TestRun{
Overrides: addrs.MakeMap[addrs.Targetable, *configs.Override](),
}
run.Overrides.Put(primary, &configs.Override{
Target: &addrs.Target{
Subject: testrun,
},
})
// Add a unique item to the test file, and duplicate the test run data.
file := &configs.TestFile{
Overrides: addrs.MakeMap[addrs.Targetable, *configs.Override](),
}
file.Overrides.Put(primary, &configs.Override{
Target: &addrs.Target{
Subject: testfile,
},
})
file.Overrides.Put(secondary, &configs.Override{
Target: &addrs.Target{
Subject: testfile,
},
})
// Add all data from the file and run block are duplicating here, and then
// a unique one.
config := &configs.Config{
Module: &configs.Module{
ProviderConfigs: map[string]*configs.Provider{
"mock": {
Mock: true,
MockData: &configs.MockData{
Overrides: addrs.MakeMap[addrs.Targetable, *configs.Override](),
},
},
"real": {},
},
},
}
config.Module.ProviderConfigs["mock"].MockData.Overrides.Put(primary, &configs.Override{
Target: &addrs.Target{
Subject: provider,
},
})
config.Module.ProviderConfigs["mock"].MockData.Overrides.Put(secondary, &configs.Override{
Target: &addrs.Target{
Subject: provider,
},
})
config.Module.ProviderConfigs["mock"].MockData.Overrides.Put(tertiary, &configs.Override{
Target: &addrs.Target{
Subject: provider,
},
})
overrides := PackageOverrides(run, file, config)
// We now expect that the run and file overrides took precedence.
first, pOk := overrides.GetResourceOverride(primary, addrs.AbsProviderConfig{
Provider: addrs.Provider{
Type: "mock",
},
})
second, sOk := overrides.GetResourceOverride(secondary, addrs.AbsProviderConfig{
Provider: addrs.Provider{
Type: "mock",
},
})
third, tOk := overrides.GetResourceOverride(tertiary, addrs.AbsProviderConfig{
Provider: addrs.Provider{
Type: "mock",
},
})
if !pOk || !sOk || !tOk {
t.Fatalf("expected to find all overrides, but got %t %t %t", pOk, sOk, tOk)
}
if !first.Target.Subject.(addrs.AbsResourceInstance).Equal(testrun) {
t.Errorf("expected %s but got %s for primary", testrun, first.Target.Subject)
}
if !second.Target.Subject.(addrs.AbsResourceInstance).Equal(testfile) {
t.Errorf("expected %s but got %s for primary", testfile, second.Target.Subject)
}
if !third.Target.Subject.(addrs.AbsResourceInstance).Equal(provider) {
t.Errorf("expected %s but got %s for primary", provider, third.Target.Subject)
}
// Also, final sanity check.
_, ok := overrides.providerOverrides["real"]
if ok {
t.Errorf("shouldn't have stored the real provider but did")
}
}