GitRoot

craft your forge, build your project, grow your community freely
 1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
 2//
 3// SPDX-License-Identifier: EUPL-1.2
 4
 5package plugin
 6
 7import (
 8	"embed"
 9	"testing"
10
11	"github.com/go-git/go-git/v5/plumbing"
12	"gitroot.dev/libs/golang/glob"
13	pluginLib "gitroot.dev/libs/golang/plugin"
14)
15
16//go:embed *
17var fakeFs embed.FS
18
19type dataCheckBranchTest struct {
20	name       string
21	pr         PluginRun
22	branch     string
23	shouldBeOk bool
24}
25
26func TestCheckBranch(t *testing.T) {
27	data := []dataCheckBranchTest{
28		{name: "empty", pr: buildPluginRun([]string{}, buildPluginWriteRight("")), branch: "main", shouldBeOk: false},
29		{name: "main ok", pr: buildPluginRun([]string{"main"}, buildPluginWriteRight("")), branch: "main", shouldBeOk: true},
30		{name: "main2 ko", pr: buildPluginRun([]string{"main"}, buildPluginWriteRight("")), branch: "main2", shouldBeOk: false},
31		{name: "multiple ok", pr: buildPluginRun([]string{"*"}, buildPluginWriteRight("")), branch: "main", shouldBeOk: true},
32		{name: "multiple ko", pr: buildPluginRun([]string{"*", "!main"}, buildPluginWriteRight("")), branch: "main", shouldBeOk: false},
33	}
34
35	for _, d := range data {
36		pr := d.pr
37		ok := checkBranch(pr, plumbing.NewBranchReferenceName(d.branch))
38		if ok != d.shouldBeOk {
39			t.Fatalf("%s fail with %t should be %t", d.name, ok, d.shouldBeOk)
40		}
41	}
42}
43
44type dataCheckRightWriteTest struct {
45	name       string
46	pr         PluginRun
47	path       string
48	shouldBeOk bool
49}
50
51func TestCheckRightWrite(t *testing.T) {
52	data := []dataCheckRightWriteTest{
53		{name: "empty", pr: buildPluginRun([]string{}, buildPluginWriteRight("")), path: "main", shouldBeOk: false},
54		{name: "add notExisting", pr: buildPluginRun([]string{}, buildPluginWriteRight("notExisting", pluginLib.PluginWriteRightCanAdd)), path: "notExisting", shouldBeOk: true},
55		{name: "add existing with right", pr: buildPluginRun([]string{}, buildPluginWriteRight("runtime.go", pluginLib.PluginWriteRightCanAdd)), path: "runtime.go", shouldBeOk: false},
56		{name: "add notExisting without right", pr: buildPluginRun([]string{}, buildPluginWriteRight("notExisting", pluginLib.PluginWriteRightCanAdd)), path: "runtime.go", shouldBeOk: false},
57		{name: "mod notExisting with right", pr: buildPluginRun([]string{}, buildPluginWriteRight("notExisting", pluginLib.PluginWriteRightCanMod)), path: "notExisting", shouldBeOk: false},
58		{name: "mod notExisting without right", pr: buildPluginRun([]string{}, buildPluginWriteRight("notExisting", pluginLib.PluginWriteRightCanDel)), path: "notExisting", shouldBeOk: false},
59		{name: "mod existing with right", pr: buildPluginRun([]string{}, buildPluginWriteRight("runtime.go", pluginLib.PluginWriteRightCanMod)), path: "runtime.go", shouldBeOk: true},
60	}
61
62	for _, d := range data {
63		pr := d.pr
64		ok, err := checkWrite(pr.write.git, fakeFs, d.path)
65		if ok != d.shouldBeOk {
66			t.Fatalf("%s fail with %t and %s should be %t", d.name, ok, err, d.shouldBeOk)
67		}
68	}
69}
70
71func buildPluginRun(branches []string, rights []PluginWriteRight) PluginRun {
72	return PluginRun{
73		PluginRun: pluginLib.PluginRun{
74			Path:   "**/*",
75			Branch: branches,
76			When:   pluginLib.PluginRunWhenAll,
77			Write: pluginLib.PluginWrite{
78				Git: []pluginLib.PluginWriteRight{},
79				Web: []pluginLib.PluginWriteRight{},
80			},
81			Configuration: nil,
82		},
83		write: PluginWrite{
84			git: rights,
85			web: []PluginWriteRight{},
86		},
87	}
88}
89
90func buildPluginWriteRight(path string, can ...pluginLib.PluginWriteRightCan) []PluginWriteRight {
91	if path == "" {
92		return []PluginWriteRight{}
93	}
94	g, _ := glob.NewGlob(path)
95	return []PluginWriteRight{
96		{glob: g, PluginWriteRight: pluginLib.PluginWriteRight{Path: path, Can: can}},
97	}
98}