1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
/******************************************************************************
__ ____ __
/ / ___ ____ _/ __/_____________ _/ /__
/ / / _ \/ __ `/ /_/ ___/ ___/ __ `/ / _ \
/ /___/ __/ /_/ / __(__ ) /__/ /_/ / / __/
/_____/\___/\__,_/_/ /____/\___/\__,_/_/\___/
(C)opyright 2026, Leafscale, LLC - https://www.leafscale.com
Project: repoman
Filename: tests/test_config_parse.reef
Authors: Chris Tusa <chris.tusa@leafscale.com>
License: <see LICENSE file included with this source code>
Description: Tests: registry TOML parsing
******************************************************************************/
import config
import test.framework
import core.result_generic as rg
proc main()
let runner = new framework.TestRunner()
let toml_input: string = "[repoman]\nschema = 1\noutput = \"verbose\"\n\n[defaults]\nrepos_root = \"/home/u/repos\"\nbackup_root = \"/nfs/repos\"\nlogdir = \"/var/log/repoman\"\nincus_project = \"repoman\"\ndefault_image = \"images:ubuntu/26.04/cloud\"\nprofiles = [\"default\", \"claude-share\"]\n\n[[project]]\nname = \"isurus\"\nrepo = \"isurus-project\"\nimage = \"images:ubuntu/26.04/cloud\"\nprofiles = [\"default\"]\ncreated = \"2026-04-28T15:00:00Z\"\nlast_sync = \"\"\nbackup = true\n"
let r = config.parse_registry(toml_input)
runner.assert_eq_bool(rg.is_ok(r), true, "parse succeeds")
if rg.is_ok(r)
let reg = rg.unwrap_ok(r)
runner.assert_eq_int(reg.schema, 3, "schema after parse = 3 (migrated)")
runner.assert_eq_string(reg.output, "verbose", "output preserved")
runner.assert_eq_string(reg.defaults.repos_root, "/home/u/repos", "repos_root")
runner.assert_eq_string(reg.defaults.backup_root, "/nfs/repos", "backup_root")
runner.assert_eq_string(reg.defaults.logdir, "/var/log/repoman", "logdir preserved")
runner.assert_eq_string(reg.defaults.incus_project, "repoman", "incus_project")
runner.assert_eq_string(reg.defaults.default_image, "images:ubuntu/26.04/cloud", "default_image")
runner.assert_eq_int(reg.defaults.profiles.length(), 2, "defaults.profiles count")
runner.assert_eq_string(reg.defaults.profiles[0], "default", "defaults.profiles[0]")
runner.assert_eq_string(reg.defaults.profiles[1], "claude-share", "defaults.profiles[1]")
runner.assert_eq_int(reg.projects.length(), 1, "1 project")
let p = reg.projects[0]
runner.assert_eq_string(p.name, "isurus", "project.name")
runner.assert_eq_string(p.repo, "isurus-project", "project.repo")
runner.assert_eq_string(p.image, "images:ubuntu/26.04/cloud", "project.image")
runner.assert_eq_int(p.profiles.length(), 1, "project.profiles count")
runner.assert_eq_string(p.profiles[0], "default", "project.profiles[0]")
runner.assert_eq_string(p.last_sync, "", "project.last_sync")
runner.assert_eq_bool(p.backup, true, "project.backup")
end if
// schema rejection
let bad_schema: string = "[repoman]\nschema = 99\n[defaults]\nrepos_root = \"/r\"\nbackup_root = \"/b\"\nincus_project = \"x\"\ndefault_image = \"y\"\nprofiles = []\n"
let r2 = config.parse_registry(bad_schema)
runner.assert_eq_bool(rg.is_err(r2), true, "schema 99 rejected")
// Forward-compatibility: registry without output/logdir loads with defaults
let legacy: string = "[repoman]\nschema = 1\n\n[defaults]\nrepos_root = \"/r\"\nbackup_root = \"/b\"\nincus_project = \"p\"\ndefault_image = \"img\"\nprofiles = []\n"
let r3 = config.parse_registry(legacy)
runner.assert_eq_bool(rg.is_ok(r3), true, "legacy registry parses")
if rg.is_ok(r3)
let reg3 = rg.unwrap_ok(r3)
runner.assert_eq_string(reg3.output, "quiet", "output defaults to quiet when missing")
runner.assert_eq_string(reg3.defaults.logdir, "~/.local/state/repoman", "logdir defaults when missing")
end if
// Invalid output value rejected
let bad_output: string = "[repoman]\nschema = 1\noutput = \"loud\"\n[defaults]\nrepos_root = \"/r\"\nbackup_root = \"/b\"\nincus_project = \"p\"\ndefault_image = \"img\"\nprofiles = []\n"
let r4 = config.parse_registry(bad_output)
runner.assert_eq_bool(rg.is_err(r4), true, "invalid output value rejected")
runner.report()
end main
|