/****************************************************************************** __ ____ __ / / ___ ____ _/ __/_____________ _/ /__ / / / _ \/ __ `/ /_/ ___/ ___/ __ `/ / _ \ / /___/ __/ /_/ / __(__ ) /__/ /_/ / / __/ /_____/\___/\__,_/_/ /____/\___/\__,_/_/\___/ (C)opyright 2026, Leafscale, LLC - https://www.leafscale.com Project: repoman Filename: tests/test_config_rename.reef Authors: Chris Tusa License: Description: Tests: rename_project registry mutation ******************************************************************************/ import config import test.framework import core.result as rg fn empty_defaults(): config.Defaults return config.Defaults { repos_root: "/r", backup_root: "/b", logdir: "/l", incus_project: "p", default_image: "img", profiles: new [string](0) } end empty_defaults fn mk_project(name: string, repo: string): config.Project return config.Project { name: name, repo: repo, image: "img", profiles: new [string](0), created: "t", last_sync: "", backup: true } end mk_project proc main() let runner = new framework.TestRunner() // Two projects: a coupled one (name==repo) and a decoupled one (name!=repo). mut projs: [config.Project] = new [config.Project](2) projs[0] = mk_project("driftohm", "driftohm") projs[1] = mk_project("portal", "leafscale-infrastructure/portal.leafscale.com") let reg0: config.Registry = config.Registry { schema: 3, host: config.Host { lan_ip: "" }, output: "quiet", defaults: empty_defaults(), projects: projs } // Coupled rename: both name and repo move. let r1 = config.rename_project(reg0, "driftohm", "mist") runner.assert_eq_bool(rg.is_ok(r1), true, "coupled rename ok") if rg.is_ok(r1) let reg1 = rg.unwrap_ok(r1) runner.assert_eq_string(reg1.projects[0].name, "mist", "coupled: name moved") runner.assert_eq_string(reg1.projects[0].repo, "mist", "coupled: repo moved in lockstep") runner.assert_eq_string(reg1.output, "quiet", "output preserved through rename_project") end if // Decoupled rename: only name moves, repo (nested path) preserved. let r2 = config.rename_project(reg0, "portal", "gateway") runner.assert_eq_bool(rg.is_ok(r2), true, "decoupled rename ok") if rg.is_ok(r2) let reg2 = rg.unwrap_ok(r2) runner.assert_eq_string(reg2.projects[1].name, "gateway", "decoupled: name moved") runner.assert_eq_string(reg2.projects[1].repo, "leafscale-infrastructure/portal.leafscale.com", "decoupled: repo dirname preserved") end if // Collision: rename onto an existing project name fails. let r3 = config.rename_project(reg0, "driftohm", "portal") runner.assert_eq_bool(rg.is_err(r3), true, "rename onto existing name rejected") // Unknown source name fails. let r4 = config.rename_project(reg0, "ghost", "whatever") runner.assert_eq_bool(rg.is_err(r4), true, "unknown source name rejected") runner.report() end main