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: MIT
4
5package test
6
7import (
8 "bytes"
9 "io/fs"
10 "os"
11 "path/filepath"
12 "testing"
13
14 "gitroot.dev/libs/golang/plugin/model"
15)
16
17type fakeServer struct {
18 t *testing.T
19 dirGit string
20 dirWeb string
21 dirCache string
22 override Override
23 NbCall nbCall
24}
25
26type Override struct {
27 PluginOption func(opts ...model.PluginOptionWith)
28 ForgeConf func() (model.ForgeConf, error)
29 Worktree func() fs.FS
30 Webcontent func() fs.FS
31 Cache func() fs.FS
32 ModifyContent func(path string, content string)
33 ModifyWebContent func(filepath, content string)
34 ReplaceWebContent func(filepath, oldContent, content string)
35 ModifyCacheContent func(filepath, content string)
36 CommitAllIfNeeded func(message string)
37 DiffWithParent func(hash string, oldFilepath string, newFilepath string) (string, error)
38 Merge func(from string, to string)
39 Commits func(from string, to string) ([]model.Commit, error)
40 Exec func(exec model.Exec) (model.ExecStatus, error)
41 Report func(level model.ReportLevel, content []string) error
42}
43
44type nbCall struct {
45 PluginOption int
46 ForgeConf int
47 Worktree int
48 Webcontent int
49 Cache int
50 ModifyContent int
51 ModifyWebContent int
52 ReplaceWebContent int
53 ModifyCacheContent int
54 CommitAllIfNeeded int
55 DiffWithParent int
56 Log int
57 LogError int
58 Merge int
59 Commits int
60 Exec int
61 Report int
62}
63
64func NewFakeServer(t *testing.T, o Override) *fakeServer {
65 dirGit, _ := os.MkdirTemp("", "gitrootPluginTestGit*")
66 dirWeb, _ := os.MkdirTemp("", "gitrootPluginTestWeb*")
67 dirCache, _ := os.MkdirTemp("", "gitrootPluginTestCache*")
68 return &fakeServer{
69 t: t,
70 dirGit: dirGit,
71 dirWeb: dirWeb,
72 dirCache: dirCache,
73 override: o,
74 NbCall: nbCall{},
75 }
76}
77
78func (s *fakeServer) PluginOption(opts ...model.PluginOptionWith) {
79 s.NbCall.PluginOption++
80 if s.override.PluginOption != nil {
81 s.override.PluginOption(opts...)
82 }
83}
84
85func (s *fakeServer) ForgeConf() (model.ForgeConf, error) {
86 s.NbCall.ForgeConf++
87 if s.override.ForgeConf != nil {
88 return s.override.ForgeConf()
89 }
90 return model.ForgeConf{Domain: "test"}, nil
91}
92
93func (s *fakeServer) Worktree() fs.FS {
94 s.NbCall.Worktree++
95 if s.override.Worktree != nil {
96 return s.override.Worktree()
97 }
98 return os.DirFS(s.dirGit)
99}
100
101func (s *fakeServer) Webcontent() fs.FS {
102 s.NbCall.Webcontent++
103 if s.override.Webcontent != nil {
104 return s.override.Webcontent()
105 }
106 return os.DirFS(s.dirWeb)
107}
108
109func (s *fakeServer) Cache() fs.FS {
110 s.NbCall.Cache++
111 if s.override.Cache != nil {
112 return s.override.Cache()
113 }
114 return os.DirFS(s.dirCache)
115}
116
117func (s *fakeServer) ModifyContent(path, content string) {
118 s.NbCall.ModifyContent++
119 if s.override.ModifyContent != nil {
120 s.override.ModifyContent(path, content)
121 } else {
122 os.MkdirAll(s.dirGit+"/"+filepath.Dir(path), fs.ModePerm)
123 if err := os.WriteFile(s.dirGit+"/"+path, []byte(content), fs.ModePerm); err != nil {
124 s.t.Fatal(err)
125 }
126 }
127}
128
129func (s *fakeServer) ModifyWebContent(path, content string) {
130 s.NbCall.ModifyWebContent++
131 if s.override.ModifyWebContent != nil {
132 s.override.ModifyWebContent(path, content)
133 } else {
134 os.MkdirAll(s.dirWeb+"/"+filepath.Dir(path), fs.ModePerm)
135 if err := os.WriteFile(s.dirWeb+"/"+path, []byte(content), fs.ModePerm); err != nil {
136 s.t.Fatal(err)
137 }
138 }
139}
140
141func (s *fakeServer) ReplaceWebContent(filepath, oldContent, content string) {
142 s.NbCall.ReplaceWebContent++
143 if s.override.ReplaceWebContent != nil {
144 s.override.ReplaceWebContent(filepath, oldContent, content)
145 } else {
146 content, err := os.ReadFile(filepath)
147 if err != nil {
148 s.t.Fatal(err)
149 }
150
151 if err := os.WriteFile(s.dirWeb+"/"+filepath, bytes.Replace(content, []byte(oldContent), []byte(content), 1), 0666); err != nil {
152 s.t.Fatal(err)
153 }
154 }
155}
156
157func (s *fakeServer) ModifyCacheContent(path, content string) {
158 s.NbCall.ModifyCacheContent++
159 if s.override.ModifyCacheContent != nil {
160 s.override.ModifyCacheContent(path, content)
161 } else {
162 os.MkdirAll(s.dirCache+"/"+filepath.Dir(path), fs.ModePerm)
163 if err := os.WriteFile(s.dirCache+"/"+path, []byte(content), fs.ModePerm); err != nil {
164 s.t.Fatal(err)
165 }
166 }
167}
168
169func (s *fakeServer) CommitAllIfNeeded(message string) {
170 s.NbCall.CommitAllIfNeeded++
171 if s.override.CommitAllIfNeeded != nil {
172 s.override.CommitAllIfNeeded(message)
173 }
174}
175
176func (s *fakeServer) DiffWithParent(hash string, oldFilepath string, newFilepath string) (string, error) {
177 s.NbCall.DiffWithParent++
178 if s.override.DiffWithParent != nil {
179 return s.override.DiffWithParent(hash, oldFilepath, newFilepath)
180 }
181 return "", nil
182}
183
184func (s *fakeServer) Log(message string) {
185 s.NbCall.Log++
186}
187
188func (s *fakeServer) LogError(message string, err error) {
189 s.NbCall.LogError++
190}
191
192func (s *fakeServer) Merge(from string, to string) {
193 s.NbCall.Merge++
194 if s.override.Merge != nil {
195 s.override.Merge(from, to)
196 }
197}
198
199func (s *fakeServer) Commits(from string, to string) ([]model.Commit, error) {
200 s.NbCall.Commits++
201 if s.override.Commits != nil {
202 return s.override.Commits(from, to)
203 }
204 return []model.Commit{}, nil
205}
206
207func (s *fakeServer) Exec(exec model.Exec) (model.ExecStatus, error) {
208 s.NbCall.Exec++
209 if s.override.Exec != nil {
210 return s.override.Exec(exec)
211 }
212 return model.ExecStatus{}, nil
213}
214
215func (s *fakeServer) Report(level model.ReportLevel, content []string) error {
216 s.NbCall.Report++
217 if s.override.Report != nil {
218 return s.override.Report(level, content)
219 }
220 return nil
221}