mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
c7fe6b9160
The CLI config can be written in both native HCL and HCL JSON syntaxes, so the provider_installation block must be expressible using JSON too. Our previous checks to approximate HCL 2-level strictness were too strict for HCL JSON where things are more ambiguous even in HCL 2, so this includes some additional relaxations if we detect that we're decoding an AST produced from a JSON file. This is still subject to the quirky ways HCL 1 handles JSON though, so the JSON value must be structured in a way that doesn't trigger HCL's heuristics that try to guess what is a block and what is an attribute. (This is the issue that HCL 2 fixes by always decoding using a schema; there's more context on this in: https://log.martinatkins.me/2019/04/25/hcl-json/ )
71 lines
2.6 KiB
Go
71 lines
2.6 KiB
Go
package cliconfig
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestLoadConfig_providerInstallation(t *testing.T) {
|
|
for _, configFile := range []string{"provider-installation", "provider-installation.json"} {
|
|
t.Run(configFile, func(t *testing.T) {
|
|
got, diags := loadConfigFile(filepath.Join(fixtureDir, configFile))
|
|
if diags.HasErrors() {
|
|
t.Errorf("unexpected diagnostics: %s", diags.Err().Error())
|
|
}
|
|
|
|
want := &Config{
|
|
ProviderInstallation: []*ProviderInstallation{
|
|
{
|
|
Methods: []*ProviderInstallationMethod{
|
|
{
|
|
Location: ProviderInstallationFilesystemMirror("/tmp/example1"),
|
|
Include: []string{"example.com/*/*"},
|
|
},
|
|
{
|
|
Location: ProviderInstallationNetworkMirror("https://tf-Mirror.example.com/"),
|
|
Include: []string{"registry.terraform.io/*/*"},
|
|
Exclude: []string{"registry.Terraform.io/foobar/*"},
|
|
},
|
|
{
|
|
Location: ProviderInstallationFilesystemMirror("/tmp/example2"),
|
|
},
|
|
{
|
|
Location: ProviderInstallationDirect,
|
|
Exclude: []string{"example.com/*/*"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("wrong result\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLoadConfig_providerInstallationErrors(t *testing.T) {
|
|
_, diags := loadConfigFile(filepath.Join(fixtureDir, "provider-installation-errors"))
|
|
want := `7 problems:
|
|
|
|
- Invalid provider_installation method block: Unknown provider installation method "not_a_thing" at 2:3.
|
|
- Invalid provider_installation method block: Invalid filesystem_mirror block at 1:1: "path" argument is required.
|
|
- Invalid provider_installation method block: Invalid network_mirror block at 1:1: "url" argument is required.
|
|
- Invalid provider_installation method block: The items inside the provider_installation block at 1:1 must all be blocks.
|
|
- Invalid provider_installation method block: The blocks inside the provider_installation block at 1:1 may not have any labels.
|
|
- Invalid provider_installation block: The provider_installation block at 9:1 must not have any labels.
|
|
- Invalid provider_installation block: The provider_installation block at 11:1 must not be introduced with an equals sign.`
|
|
|
|
// The above error messages include only line/column location information
|
|
// and not file location information because HCL 1 does not store
|
|
// information about the filename a location belongs to. (There is a field
|
|
// for it in token.Pos but it's always an empty string in practice.)
|
|
|
|
if got := diags.Err().Error(); got != want {
|
|
t.Errorf("wrong diagnostics\ngot:\n%s\nwant:\n%s", got, want)
|
|
}
|
|
}
|