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}