Files
coder/provisioner/terraform/executor_internal_test.go
Spike Curtis 60d5002eb6 refactor: change template archive extraction to be on provisioner (#9264)
* refactor provisionersdk protocol

Signed-off-by: Spike Curtis <spike@coder.com>

* refactor provisioners to use new protocol

Signed-off-by: Spike Curtis <spike@coder.com>

* refactor provisionerd to use new protocol

Signed-off-by: Spike Curtis <spike@coder.com>

* refactor tests & proto renames

* Fixes from self-review

Signed-off-by: Spike Curtis <spike@coder.com>

* appease fmt & link

Signed-off-by: Spike Curtis <spike@coder.com>

* code review fixes & e2e fixes

Signed-off-by: Spike Curtis <spike@coder.com>

* More fmt

Signed-off-by: Spike Curtis <spike@coder.com>

* Code review fixes

Signed-off-by: Spike Curtis <spike@coder.com>

* new gen; use uuid for session workdir

Signed-off-by: Spike Curtis <spike@coder.com>

* Revert nix-based gen CI task until dogfood is on nix

Signed-off-by: Spike Curtis <spike@coder.com>

* revert deleting dogfood Docker stuff

Signed-off-by: Spike Curtis <spike@coder.com>

* Revert "revert deleting dogfood Docker stuff"

This reverts commit 9762158167.

---------

Signed-off-by: Spike Curtis <spike@coder.com>
2023-08-25 06:10:15 +00:00

176 lines
5.1 KiB
Go

package terraform
import (
"encoding/json"
"testing"
tfjson "github.com/hashicorp/terraform-json"
"github.com/stretchr/testify/require"
"github.com/coder/coder/v2/provisionersdk/proto"
)
type mockLogger struct {
logs []*proto.Log
}
var _ logSink = &mockLogger{}
func (m *mockLogger) ProvisionLog(l proto.LogLevel, o string) {
m.logs = append(m.logs, &proto.Log{Level: l, Output: o})
}
func TestLogWriter_Mainline(t *testing.T) {
t.Parallel()
logr := &mockLogger{}
writer, doneLogging := logWriter(logr, proto.LogLevel_INFO)
_, err := writer.Write([]byte(`Sitting in an English garden
Waiting for the sun
If the sun don't come you get a tan
From standing in the English rain`))
require.NoError(t, err)
err = writer.Close()
require.NoError(t, err)
<-doneLogging
expected := []*proto.Log{
{Level: proto.LogLevel_INFO, Output: "Sitting in an English garden"},
{Level: proto.LogLevel_INFO, Output: "Waiting for the sun"},
{Level: proto.LogLevel_INFO, Output: "If the sun don't come you get a tan"},
{Level: proto.LogLevel_INFO, Output: "From standing in the English rain"},
}
require.Equal(t, expected, logr.logs)
}
func TestOnlyDataResources(t *testing.T) {
t.Parallel()
tests := []struct {
name string
stateMod *tfjson.StateModule
expected *tfjson.StateModule
}{
{
name: "empty state module",
stateMod: &tfjson.StateModule{},
expected: &tfjson.StateModule{},
},
{
name: "only data resources",
stateMod: &tfjson.StateModule{
Resources: []*tfjson.StateResource{
{Name: "cat", Type: "coder_parameter", Mode: "data", Address: "cat-address"},
{Name: "cow", Type: "foobaz", Mode: "data", Address: "cow-address"},
},
ChildModules: []*tfjson.StateModule{
{
Resources: []*tfjson.StateResource{
{Name: "child-cat", Type: "coder_parameter", Mode: "data", Address: "child-cat-address"},
{Name: "child-dog", Type: "foobar", Mode: "data", Address: "child-dog-address"},
},
Address: "child-module-1",
},
},
Address: "fake-module",
},
expected: &tfjson.StateModule{
Resources: []*tfjson.StateResource{
{Name: "cat", Type: "coder_parameter", Mode: "data", Address: "cat-address"},
{Name: "cow", Type: "foobaz", Mode: "data", Address: "cow-address"},
},
ChildModules: []*tfjson.StateModule{
{
Resources: []*tfjson.StateResource{
{Name: "child-cat", Type: "coder_parameter", Mode: "data", Address: "child-cat-address"},
{Name: "child-dog", Type: "foobar", Mode: "data", Address: "child-dog-address"},
},
Address: "child-module-1",
},
},
Address: "fake-module",
},
},
{
name: "only non-data resources",
stateMod: &tfjson.StateModule{
Resources: []*tfjson.StateResource{
{Name: "cat", Type: "coder_parameter", Mode: "foobar", Address: "cat-address"},
{Name: "cow", Type: "foobaz", Mode: "foo", Address: "cow-address"},
},
ChildModules: []*tfjson.StateModule{
{
Resources: []*tfjson.StateResource{
{Name: "child-cat", Type: "coder_parameter", Mode: "foobar", Address: "child-cat-address"},
{Name: "child-dog", Type: "foobar", Mode: "foobaz", Address: "child-dog-address"},
},
Address: "child-module-1",
},
},
Address: "fake-module",
},
expected: &tfjson.StateModule{
Address: "fake-module",
ChildModules: []*tfjson.StateModule{
{Address: "child-module-1"},
},
},
},
{
name: "mixed resources",
stateMod: &tfjson.StateModule{
Resources: []*tfjson.StateResource{
{Name: "cat", Type: "coder_parameter", Mode: "data", Address: "cat-address"},
{Name: "dog", Type: "foobar", Mode: "magic", Address: "dog-address"},
{Name: "cow", Type: "foobaz", Mode: "data", Address: "cow-address"},
},
ChildModules: []*tfjson.StateModule{
{
Resources: []*tfjson.StateResource{
{Name: "child-cat", Type: "coder_parameter", Mode: "data", Address: "child-cat-address"},
{Name: "child-dog", Type: "foobar", Mode: "data", Address: "child-dog-address"},
{Name: "child-cow", Type: "foobaz", Mode: "magic", Address: "child-cow-address"},
},
Address: "child-module-1",
},
},
Address: "fake-module",
},
expected: &tfjson.StateModule{
Resources: []*tfjson.StateResource{
{Name: "cat", Type: "coder_parameter", Mode: "data", Address: "cat-address"},
{Name: "cow", Type: "foobaz", Mode: "data", Address: "cow-address"},
},
ChildModules: []*tfjson.StateModule{
{
Resources: []*tfjson.StateResource{
{Name: "child-cat", Type: "coder_parameter", Mode: "data", Address: "child-cat-address"},
{Name: "child-dog", Type: "foobar", Mode: "data", Address: "child-dog-address"},
},
Address: "child-module-1",
},
},
Address: "fake-module",
},
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
filtered := onlyDataResources(*tt.stateMod)
expected, err := json.Marshal(tt.expected)
require.NoError(t, err)
got, err := json.Marshal(filtered)
require.NoError(t, err)
require.Equal(t, string(expected), string(got))
})
}
}