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}