| 119 | } |
| 120 | |
| 121 | func TestBuildJSONFormat(t *testing.T) { |
| 122 | rootDir := t.TempDir() |
| 123 | require.NoError(t, os.WriteFile(filepath.Join(rootDir, "CLAUDE.md"), []byte("content"), 0o600)) |
| 124 | |
| 125 | data, err := Build(rootDir, []DiscoveredFile{ |
| 126 | {Path: "CLAUDE.md", Kind: ConfigFileKindInstruction}, |
| 127 | }, "claude", nil) |
| 128 | require.NoError(t, err) |
| 129 | |
| 130 | // Verify it marshals to valid JSON with top-level fields (no envelope) |
| 131 | jsonData, err := json.Marshal(data) |
| 132 | require.NoError(t, err) |
| 133 | |
| 134 | var raw map[string]any |
| 135 | require.NoError(t, json.Unmarshal(jsonData, &raw)) |
| 136 | |
| 137 | assert.NotNil(t, raw["agent"]) |
| 138 | assert.NotNil(t, raw["config_hash"]) |
| 139 | assert.NotNil(t, raw["config_files"]) |
| 140 | // Ensure no envelope fields |
| 141 | assert.Nil(t, raw["chainloop.material.evidence.id"]) |
| 142 | assert.Nil(t, raw["data"]) |
| 143 | |
| 144 | // Verify kind is present in config_files |
| 145 | files := raw["config_files"].([]any) |
| 146 | require.Len(t, files, 1) |
| 147 | file := files[0].(map[string]any) |
| 148 | assert.Equal(t, "instruction", file["kind"]) |
| 149 | } |
| 150 | |
| 151 | func TestBuildRejectsSymlinksEscapingRoot(t *testing.T) { |
| 152 | rootDir := t.TempDir() |