mirror of
https://github.com/coder/coder.git
synced 2026-06-03 04:58:23 +00:00
6ccd20d45f
Completes the final piece of the puzzle. Support the pre-creation flow from the agent side.
252 lines
6.9 KiB
Go
252 lines
6.9 KiB
Go
package codersdk_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/coder/coder/v2/codersdk"
|
|
)
|
|
|
|
func TestProvisionerJobLogText(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.ProvisionerJobLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelInfo,
|
|
Source: codersdk.LogSourceProvisioner,
|
|
Stage: "Planning",
|
|
Output: "Terraform init complete",
|
|
}
|
|
result := log.Text()
|
|
require.Equal(t, "2024-01-28T10:30:00Z [info] [provisioner|Planning] Terraform init complete", result)
|
|
}
|
|
|
|
func TestProvisionerJobLogTextEmptyOutput(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.ProvisionerJobLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelInfo,
|
|
Source: codersdk.LogSourceProvisioner,
|
|
Stage: "Planning",
|
|
Output: "",
|
|
}
|
|
result := log.Text()
|
|
require.Equal(t, "2024-01-28T10:30:00Z [info] [provisioner|Planning] ", result)
|
|
}
|
|
|
|
func TestProvisionerJobLogTextSpecialChars(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.ProvisionerJobLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelInfo,
|
|
Source: codersdk.LogSourceProvisioner,
|
|
Stage: "Applying",
|
|
Output: "\033[32mSuccess!\033[0m Unicode: 你好世界",
|
|
}
|
|
result := log.Text()
|
|
require.Equal(t, "2024-01-28T10:30:00Z [info] [provisioner|Applying] \033[32mSuccess!\033[0m Unicode: 你好世界", result)
|
|
}
|
|
|
|
func TestWorkspaceAgentLogText(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.WorkspaceAgentLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelInfo,
|
|
Output: "Agent started successfully",
|
|
SourceID: uuid.New(),
|
|
}
|
|
result := log.Text("main", "startup_script")
|
|
require.Equal(t, "2024-01-28T10:30:00Z [info] [agent.main|startup_script] Agent started successfully", result)
|
|
}
|
|
|
|
func TestWorkspaceAgentLogTextEmptySourceAndAgent(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.WorkspaceAgentLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelWarn,
|
|
Output: "Warning message",
|
|
SourceID: uuid.New(),
|
|
}
|
|
result := log.Text("", "")
|
|
require.Equal(t, "2024-01-28T10:30:00Z [warn] [agent] Warning message", result)
|
|
}
|
|
|
|
func TestWorkspaceAgentLogTextMultiline(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.WorkspaceAgentLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelInfo,
|
|
Output: "Line 1\nLine 2\nLine 3",
|
|
SourceID: uuid.New(),
|
|
}
|
|
result := log.Text("main", "startup_script")
|
|
require.Equal(t, "2024-01-28T10:30:00Z [info] [agent.main|startup_script] Line 1\nLine 2\nLine 3", result)
|
|
}
|
|
|
|
func TestWorkspaceAgentLogTextSpecialChars(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := time.Date(2024, 1, 28, 10, 30, 0, 0, time.UTC)
|
|
log := codersdk.WorkspaceAgentLog{
|
|
CreatedAt: ts,
|
|
Level: codersdk.LogLevelDebug,
|
|
Output: "\033[31mError!\033[0m 🚀 Unicode: 日本語",
|
|
SourceID: uuid.New(),
|
|
}
|
|
result := log.Text("main", "startup_script")
|
|
require.Equal(t, "2024-01-28T10:30:00Z [debug] [agent.main|startup_script] \033[31mError!\033[0m 🚀 Unicode: 日本語", result)
|
|
}
|
|
|
|
func TestWorkspaceAgentDevcontainerEquals(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
agentID := uuid.New()
|
|
|
|
base := codersdk.WorkspaceAgentDevcontainer{
|
|
ID: uuid.New(),
|
|
Name: "test-dc",
|
|
WorkspaceFolder: "/workspace",
|
|
Status: codersdk.WorkspaceAgentDevcontainerStatusRunning,
|
|
Dirty: false,
|
|
Container: &codersdk.WorkspaceAgentContainer{ID: "container-123"},
|
|
Agent: &codersdk.WorkspaceAgentDevcontainerAgent{ID: agentID, Name: "agent-1"},
|
|
Error: "",
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
modify func(*codersdk.WorkspaceAgentDevcontainer)
|
|
wantEqual bool
|
|
}{
|
|
{
|
|
name: "identical",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {},
|
|
wantEqual: true,
|
|
},
|
|
{
|
|
name: "different ID",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.ID = uuid.New() },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Name",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.Name = "other-dc" },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different WorkspaceFolder",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.WorkspaceFolder = "/other" },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different SubagentID (one valid, one nil)",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {
|
|
d.SubagentID = uuid.NullUUID{Valid: true, UUID: uuid.New()}
|
|
},
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different SubagentID UUIDs",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {
|
|
d.SubagentID = uuid.NullUUID{Valid: true, UUID: uuid.New()}
|
|
},
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Status",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {
|
|
d.Status = codersdk.WorkspaceAgentDevcontainerStatusStopped
|
|
},
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Dirty",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.Dirty = true },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Container (one nil)",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.Container = nil },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Container IDs",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {
|
|
d.Container = &codersdk.WorkspaceAgentContainer{ID: "different-container"}
|
|
},
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Agent (one nil)",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.Agent = nil },
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Agent values",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) {
|
|
d.Agent = &codersdk.WorkspaceAgentDevcontainerAgent{ID: agentID, Name: "agent-2"}
|
|
},
|
|
wantEqual: false,
|
|
},
|
|
{
|
|
name: "different Error",
|
|
modify: func(d *codersdk.WorkspaceAgentDevcontainer) { d.Error = "some error" },
|
|
wantEqual: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
modified := base
|
|
tt.modify(&modified)
|
|
require.Equal(t, tt.wantEqual, base.Equals(modified))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestWorkspaceAgentDevcontainerIsTerraformDefined(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
t.Run("SubagentID Valid", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dc := codersdk.WorkspaceAgentDevcontainer{
|
|
ID: uuid.New(),
|
|
Name: "test-dc",
|
|
WorkspaceFolder: "/workspace",
|
|
SubagentID: uuid.NullUUID{Valid: true, UUID: uuid.New()},
|
|
}
|
|
|
|
require.True(t, dc.IsTerraformDefined())
|
|
})
|
|
|
|
t.Run("SubagentID Null", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dc := codersdk.WorkspaceAgentDevcontainer{
|
|
ID: uuid.New(),
|
|
Name: "test-dc",
|
|
WorkspaceFolder: "/workspace",
|
|
SubagentID: uuid.NullUUID{Valid: false},
|
|
}
|
|
|
|
require.False(t, dc.IsTerraformDefined())
|
|
})
|
|
}
|