## Problem
The Zed module's settings parsing was broken. The previous
implementation used quote escaping:
```hcl
SETTINGS_JSON='${replace(var.settings, "\"", "\\\"")}'
```
This produced invalid JSON like `{\"theme\":\"dark\"}` which **jq could
not parse** because the backslash-escaped quotes are not valid JSON
syntax.
## Solution
Changed to use base64 encoding internally:
```hcl
locals {
settings_b64 = var.settings != "" ? base64encode(var.settings) : ""
}
# In the script:
SETTINGS_B64='${local.settings_b64}'
SETTINGS_JSON="$(echo -n "${SETTINGS_B64}" | base64 -d)"
```
**User interface remains the same** - users still provide plain JSON via
`jsonencode()` or heredoc:
```hcl
module "zed" {
source = "..."
agent_id = coder_agent.main.id
settings = jsonencode({
theme = "dark"
fontSize = 14
})
}
```
## Testing
Added comprehensive tests:
**Terraform tests (5):**
- URL generation (default, folder, agent_name)
- Settings base64 encoding verification
- Empty settings edge case
**Container e2e tests (3):**
- Creates settings file with correct JSON (including special chars:
quotes, backslashes, URLs)
- Merges with existing settings via jq
- Exits early with empty settings
Also fixed existing tests to use `override_data` for proper workspace
mocking.
---------
Signed-off-by: Muhammad Atif Ali <me@matifali.dev>
Co-authored-by: DevCats <christofer@coder.com>
115 lines
2.1 KiB
HCL
115 lines
2.1 KiB
HCL
run "default_output" {
|
|
command = apply
|
|
|
|
variables {
|
|
agent_id = "foo"
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace_owner.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
assert {
|
|
condition = output.zed_url == "zed://ssh/default.coder"
|
|
error_message = "zed_url did not match expected default URL"
|
|
}
|
|
}
|
|
|
|
run "adds_folder" {
|
|
command = apply
|
|
|
|
variables {
|
|
agent_id = "foo"
|
|
folder = "/foo/bar"
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace_owner.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
assert {
|
|
condition = output.zed_url == "zed://ssh/default.coder/foo/bar"
|
|
error_message = "zed_url did not include provided folder path"
|
|
}
|
|
}
|
|
|
|
run "adds_agent_name" {
|
|
command = apply
|
|
|
|
variables {
|
|
agent_id = "foo"
|
|
agent_name = "myagent"
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
override_data {
|
|
target = data.coder_workspace_owner.me
|
|
values = {
|
|
name = "default"
|
|
}
|
|
}
|
|
|
|
assert {
|
|
condition = output.zed_url == "zed://ssh/myagent.default.default.coder"
|
|
error_message = "zed_url did not include agent_name in hostname"
|
|
}
|
|
}
|
|
|
|
run "settings_base64_encoding" {
|
|
command = apply
|
|
|
|
variables {
|
|
agent_id = "foo"
|
|
settings = jsonencode({
|
|
theme = "dark"
|
|
fontSize = 14
|
|
})
|
|
}
|
|
|
|
# Verify settings are base64 encoded (eyJ = base64 prefix for JSON starting with {")
|
|
assert {
|
|
condition = can(regex("SETTINGS_B64='eyJ", coder_script.zed_settings.script))
|
|
error_message = "settings should be base64 encoded in the script"
|
|
}
|
|
}
|
|
|
|
run "empty_settings" {
|
|
command = apply
|
|
|
|
variables {
|
|
agent_id = "foo"
|
|
settings = ""
|
|
}
|
|
|
|
assert {
|
|
condition = can(regex("SETTINGS_B64=''", coder_script.zed_settings.script))
|
|
error_message = "empty settings should result in empty SETTINGS_B64"
|
|
}
|
|
}
|