oh-my-posh/src/segments/pulumi_test.go
2024-07-04 11:05:24 +02:00

238 lines
7.1 KiB
Go

package segments
import (
"errors"
"path/filepath"
"testing"
cache_ "github.com/jandedobbeleer/oh-my-posh/src/cache/mock"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
"github.com/stretchr/testify/assert"
testify_ "github.com/stretchr/testify/mock"
)
func TestPulumi(t *testing.T) {
cases := []struct {
Case string
YAMLConfig string
JSONConfig string
HasCommand bool
FetchStack bool
Stack string
StackError error
HasWorkspaceFolder bool
WorkSpaceFile string
FetchAbout bool
About string
AboutError error
AboutCache string
ExpectedString string
ExpectedEnabled bool
}{
{
Case: "no pulumi command",
ExpectedEnabled: false,
HasCommand: false,
},
{
Case: "pulumi command is present, but no pulumi file",
ExpectedEnabled: false,
HasCommand: true,
},
{
Case: "pulumi file YAML is present",
ExpectedString: "\U000f0d46",
ExpectedEnabled: true,
HasCommand: true,
YAMLConfig: `
name: oh-my-posh
runtime: golang
description: A Console App
`,
},
{
Case: "pulumi file JSON is present",
ExpectedString: "\U000f0d46",
ExpectedEnabled: true,
HasCommand: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
},
{
Case: "no stack present",
ExpectedString: "\U000f0d46 1337",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
},
{
Case: "pulumi stack",
ExpectedString: "\U000f0d46 1337",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
},
{
Case: "pulumi URL",
ExpectedString: "\U000f0d46 1337 :: posh-user@s3://test-pulumi-state-test",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
About: `{ "backend": { "url": "s3://test-pulumi-state-test", "user":"posh-user" } }`,
},
{
Case: "pulumi URL - cache",
ExpectedString: "\U000f0d46 1337 :: posh-user@s3://test-pulumi-state-test",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
AboutCache: `{ "url": "s3://test-pulumi-state-test", "user":"posh-user" }`,
},
// Error flows
{
Case: "pulumi file JSON error",
ExpectedString: "\U000f0d46",
ExpectedEnabled: true,
FetchStack: true,
HasCommand: true,
JSONConfig: `{`,
},
{
Case: "pulumi workspace file JSON error",
ExpectedString: "\U000f0d46",
ExpectedEnabled: true,
FetchStack: true,
HasCommand: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{`,
HasWorkspaceFolder: true,
},
{
Case: "pulumi URL, no fetch_stack set",
ExpectedString: "\U000f0d46",
ExpectedEnabled: true,
HasCommand: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
},
{
Case: "pulumi URL - cache error",
ExpectedString: "\U000f0d46 1337 :: posh-user@s3://test-pulumi-state-test-output",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
AboutCache: `{`,
About: `{ "backend": { "url": "s3://test-pulumi-state-test-output", "user":"posh-user" } }`,
},
{
Case: "pulumi URL - about error",
ExpectedString: "\U000f0d46 1337",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
AboutError: errors.New("error"),
},
{
Case: "pulumi URL - about decode error",
ExpectedString: "\U000f0d46 1337",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
About: `{`,
},
{
Case: "pulumi URL - about backend is nil",
ExpectedString: "\U000f0d46 1337",
ExpectedEnabled: true,
HasCommand: true,
HasWorkspaceFolder: true,
FetchStack: true,
FetchAbout: true,
JSONConfig: `{ "name": "oh-my-posh" }`,
WorkSpaceFile: `{ "stack": "1337" }`,
About: `{}`,
},
}
for _, tc := range cases {
env := new(mock.Environment)
env.On("HasCommand", "pulumi").Return(tc.HasCommand)
env.On("RunCommand", "pulumi", []string{"stack", "ls", "--json"}).Return(tc.Stack, tc.StackError)
env.On("RunCommand", "pulumi", []string{"about", "--json"}).Return(tc.About, tc.AboutError)
env.On("Pwd").Return("/home/foobar/Work/oh-my-posh/pulumi/projects/awesome-project")
env.On("Home").Return(filepath.Clean("/home/foobar"))
env.On("Error", testify_.Anything)
env.On("Debug", testify_.Anything)
env.On("DebugF", testify_.Anything, testify_.Anything)
env.On("HasFiles", pulumiYAML).Return(len(tc.YAMLConfig) > 0)
env.On("FileContent", pulumiYAML).Return(tc.YAMLConfig, nil)
env.On("HasFiles", pulumiJSON).Return(len(tc.JSONConfig) > 0)
env.On("FileContent", pulumiJSON).Return(tc.JSONConfig, nil)
env.On("PathSeparator").Return("/")
env.On("HasFolder", filepath.Clean("/home/foobar/.pulumi/workspaces")).Return(tc.HasWorkspaceFolder)
workspaceFile := "oh-my-posh-c62b7b6786c5c5a85896576e46a25d7c9f888e92-workspace.json"
env.On("HasFilesInDir", filepath.Clean("/home/foobar/.pulumi/workspaces"), workspaceFile).Return(len(tc.WorkSpaceFile) > 0)
env.On("FileContent", filepath.Clean("/home/foobar/.pulumi/workspaces/"+workspaceFile)).Return(tc.WorkSpaceFile, nil)
cache := &cache_.Cache{}
cache.On("Get", "pulumi-oh-my-posh-1337-c62b7b6786c5c5a85896576e46a25d7c9f888e92-about").Return(tc.AboutCache, len(tc.AboutCache) > 0)
cache.On("Set", testify_.Anything, testify_.Anything, testify_.Anything)
env.On("Cache").Return(cache)
pulumi := &Pulumi{
env: env,
props: properties.Map{
FetchStack: tc.FetchStack,
FetchAbout: tc.FetchAbout,
},
}
assert.Equal(t, tc.ExpectedEnabled, pulumi.Enabled(), tc.Case)
if !tc.ExpectedEnabled {
continue
}
var got = renderTemplate(env, pulumi.Template(), pulumi)
assert.Equal(t, tc.ExpectedString, got, tc.Case)
}
}