|
root / tests / test_config_rename.reef
test_config_rename.reef Reef 77 lines 3.2 KB
 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
74
75
76
/******************************************************************************
                __               ____                __
               / /   ___  ____ _/ __/_____________ _/ /__
              / /   / _ \/ __ `/ /_/ ___/ ___/ __ `/ / _ \
             / /___/  __/ /_/ / __(__  ) /__/ /_/ / /  __/
            /_____/\___/\__,_/_/ /____/\___/\__,_/_/\___/

    (C)opyright 2026, Leafscale, LLC -  https://www.leafscale.com

    Project: repoman
   Filename: tests/test_config_rename.reef
    Authors: Chris Tusa <chris.tusa@leafscale.com>
    License: <see LICENSE file included with this source code>
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