Skip to content

Commit

Permalink
add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
radeksimko committed Oct 11, 2023
1 parent f7b88b7 commit 796c86b
Show file tree
Hide file tree
Showing 3 changed files with 325 additions and 4 deletions.
219 changes: 219 additions & 0 deletions internal/terraform/module/module_ops_mock_responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@

package module

import (
"github.com/hashicorp/go-version"
"github.com/hashicorp/hcl-lang/lang"
tfregistry "github.com/hashicorp/terraform-schema/registry"
"github.com/zclconf/go-cty/cty"
)

// puppetModuleVersionsMockResponse represents response from https://registry.terraform.io/v1/modules/puppetlabs/deployment/ec/versions
var puppetModuleVersionsMockResponse = `{
"modules": [
Expand Down Expand Up @@ -270,3 +277,215 @@ var puppetModuleDataMockResponse = `{
"0.0.8"
]
}`

// labelNullModuleVersionsMockResponse represents response for
// versions of module that suffers from "unreliable" input data, as described in
// https://github.com/hashicorp/vscode-terraform/issues/1582
// It is a shortened response from https://registry.terraform.io/v1/modules/cloudposse/label/null/versions
var labelNullModuleVersionsMockResponse = `{
"modules": [
{
"source": "cloudposse/label/null",
"versions": [
{
"version": "0.25.0",
"root": {
"providers": [],
"dependencies": []
},
"submodules": []
},
{
"version": "0.26.0",
"root": {
"providers": [],
"dependencies": []
},
"submodules": []
}
]
}
]
}`

// labelNullModuleDataOldMockResponse represents response for
// a module that suffers from "unreliable" input data, as described in
// https://github.com/hashicorp/vscode-terraform/issues/1582
// It is a shortened response from https://registry.terraform.io/v1/modules/cloudposse/label/null/0.25.0
var labelNullModuleDataOldMockResponse = `{
"id": "cloudposse/label/null/0.25.0",
"owner": "osterman",
"namespace": "cloudposse",
"name": "label",
"version": "0.25.0",
"provider": "null",
"provider_logo_url": "/images/providers/generic.svg?2",
"description": "Terraform Module to define a consistent naming convention by (namespace, stage, name, [attributes])",
"source": "https://github.com/cloudposse/terraform-null-label",
"tag": "0.25.0",
"published_at": "2021-08-25T17:47:04.039843Z",
"downloads": 52863192,
"verified": false,
"root": {
"path": "",
"name": "label",
"empty": false,
"inputs": [
{
"name": "environment",
"type": "string",
"default": "",
"required": true
},
{
"name": "label_order",
"type": "list(string)",
"default": "",
"required": true
},
{
"name": "descriptor_formats",
"type": "any",
"default": "{}",
"required": false
}
],
"outputs": [
{
"name": "id"
}
],
"dependencies": [],
"provider_dependencies": [],
"resources": []
},
"submodules": [],
"examples": [],
"providers": [
"null",
"terraform"
],
"versions": [
"0.25.0",
"0.26.0"
]
}`

// labelNullModuleDataOldMockResponse represents response for
// a module that does NOT suffer from "unreliable" input data,
// as described in https://github.com/hashicorp/vscode-terraform/issues/1582
// This is for comparison with the unreliable input data.
var labelNullModuleDataNewMockResponse = `{
"id": "cloudposse/label/null/0.26.0",
"owner": "osterman",
"namespace": "cloudposse",
"name": "label",
"version": "0.26.0",
"provider": "null",
"provider_logo_url": "/images/providers/generic.svg?2",
"description": "Terraform Module to define a consistent naming convention by (namespace, stage, name, [attributes])",
"source": "https://github.com/cloudposse/terraform-null-label",
"tag": "0.26.0",
"published_at": "2023-10-11T10:47:04.039843Z",
"downloads": 10000,
"verified": false,
"root": {
"path": "",
"name": "label",
"empty": false,
"inputs": [
{
"name": "environment",
"type": "string",
"default": "",
"required": true
},
{
"name": "label_order",
"type": "list(string)",
"default": "null",
"required": false
},
{
"name": "descriptor_formats",
"type": "any",
"default": "{}",
"required": false
}
],
"outputs": [
{
"name": "id"
}
],
"dependencies": [],
"provider_dependencies": [],
"resources": []
},
"submodules": [],
"examples": [],
"providers": [
"null",
"terraform"
],
"versions": [
"0.25.0",
"0.26.0"
]
}`

var labelNullExpectedOldModuleData = &tfregistry.ModuleData{
Version: version.Must(version.NewVersion("0.25.0")),
Inputs: []tfregistry.Input{
{
Name: "environment",
Type: cty.String,
Description: lang.Markdown(""),
},
{
Name: "label_order",
Type: cty.DynamicPseudoType,
Description: lang.Markdown(""),
},
{
Name: "descriptor_formats",
Type: cty.DynamicPseudoType,
Description: lang.Markdown(""),
},
},
Outputs: []tfregistry.Output{
{
Name: "id",
Description: lang.Markdown(""),
},
},
}

var labelNullExpectedNewModuleData = &tfregistry.ModuleData{
Version: version.Must(version.NewVersion("0.26.0")),
Inputs: []tfregistry.Input{
{
Name: "environment",
Type: cty.String,
Description: lang.Markdown(""),
Required: true,
},
{
Name: "label_order",
Type: cty.DynamicPseudoType,
Description: lang.Markdown(""),
Default: cty.NullVal(cty.DynamicPseudoType),
},
{
Name: "descriptor_formats",
Type: cty.DynamicPseudoType,
Description: lang.Markdown(""),
},
},
Outputs: []tfregistry.Output{
{
Name: "id",
Description: lang.Markdown(""),
},
},
}
99 changes: 95 additions & 4 deletions internal/terraform/module/module_ops_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,98 @@ func TestGetModuleDataFromRegistry_singleModule(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(expectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
if diff := cmp.Diff(puppetExpectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
t.Fatalf("metadata mismatch: %s", diff)
}
}
func TestGetModuleDataFromRegistry_unreliableInputs(t *testing.T) {
ctx := context.Background()
ss, err := state.NewStateStore()
if err != nil {
t.Fatal(err)
}

testData, err := filepath.Abs("testdata")
if err != nil {
t.Fatal(err)
}
modPath := filepath.Join(testData, "unreliable-inputs-module")

err = ss.Modules.Add(modPath)
if err != nil {
t.Fatal(err)
}

fs := filesystem.NewFilesystem(ss.DocumentStore)
ctx = lsctx.WithDocumentContext(ctx, lsctx.Document{})
err = ParseModuleConfiguration(ctx, fs, ss.Modules, modPath)
if err != nil {
t.Fatal(err)
}

err = LoadModuleMetadata(ctx, ss.Modules, modPath)
if err != nil {
t.Fatal(err)
}

regClient := registry.NewClient()
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/v1/modules/cloudposse/label/null/versions" {
w.Write([]byte(labelNullModuleVersionsMockResponse))
return
}
if r.RequestURI == "/v1/modules/cloudposse/label/null/0.25.0" {
w.Write([]byte(labelNullModuleDataOldMockResponse))
return
}
if r.RequestURI == "/v1/modules/cloudposse/label/null/0.26.0" {
w.Write([]byte(labelNullModuleDataNewMockResponse))
return
}
http.Error(w, fmt.Sprintf("unexpected request: %q", r.RequestURI), 400)
}))
regClient.BaseURL = srv.URL
t.Cleanup(srv.Close)

err = GetModuleDataFromRegistry(ctx, regClient, ss.Modules, ss.RegistryModules, modPath)
if err != nil {
t.Fatal(err)
}

addr, err := tfaddr.ParseModuleSource("cloudposse/label/null")
if err != nil {
t.Fatal(err)
}

oldCons := version.MustConstraints(version.NewConstraint("0.25.0"))
exists, err := ss.RegistryModules.Exists(addr, oldCons)
if err != nil {
t.Fatal(err)
}
if !exists {
t.Fatalf("expected cached metadata to exist for %q %q", addr, oldCons)
}
meta, err := ss.Modules.RegistryModuleMeta(addr, oldCons)
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(labelNullExpectedOldModuleData, meta, ctydebug.CmpOptions); diff != "" {
t.Fatalf("metadata mismatch: %s", diff)
}

mewCons := version.MustConstraints(version.NewConstraint("0.26.0"))
exists, err = ss.RegistryModules.Exists(addr, mewCons)
if err != nil {
t.Fatal(err)
}
if !exists {
t.Fatalf("expected cached metadata to exist for %q %q", addr, mewCons)
}
meta, err = ss.Modules.RegistryModuleMeta(addr, mewCons)
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(labelNullExpectedNewModuleData, meta, ctydebug.CmpOptions); diff != "" {
t.Fatalf("metadata mismatch: %s", diff)
}
}
Expand Down Expand Up @@ -188,7 +279,7 @@ func TestGetModuleDataFromRegistry_moduleNotFound(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(expectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
if diff := cmp.Diff(puppetExpectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
t.Fatalf("metadata mismatch: %s", diff)
}

Expand Down Expand Up @@ -292,12 +383,12 @@ func TestGetModuleDataFromRegistry_apiTimeout(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(expectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
if diff := cmp.Diff(puppetExpectedModuleData, meta, ctydebug.CmpOptions); diff != "" {
t.Fatalf("metadata mismatch: %s", diff)
}
}

var expectedModuleData = &tfregistry.ModuleData{
var puppetExpectedModuleData = &tfregistry.ModuleData{
Version: version.Must(version.NewVersion("0.0.8")),
Inputs: []tfregistry.Input{
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module "label" {
source = "cloudposse/label/null"
version = "0.25.0"

}

module "label_two" {
source = "cloudposse/label/null"
version = "0.26.0"

}

0 comments on commit 796c86b

Please sign in to comment.