diff --git a/Makefile b/Makefile index 1184e5e..40656fa 100644 --- a/Makefile +++ b/Makefile @@ -74,6 +74,11 @@ clean: generate-mocks: # Mockery version v2.50.0 - @mockery --name=ShellWrapper --dir=wrappers --output=wrappers --outpkg=wrappers --filename=shell_wrapper_mock.go --structname=ShellWrapperMock - @mockery --name=FileSystemWrapper --dir=wrappers --output=wrappers --outpkg=wrappers --filename=file_system_wrapper_mock.go --structname=FileSystemWrapperMock - # @mockery --name=FileSystemWrapper --dir=cmd/wrappers --output=cmd/wrappers --outpkg=wrappers --filename=file_system_repo_mock.go --structname=FileSystemWrapperMock + # Wrapper + @mockery --name=ShellWrapper --dir=wrappers --output=wrappers --outpkg=wrappers --filename=shellWrapper_mock.go --structname=ShellWrapperMock + @mockery --name=FileSystemWrapper --dir=wrappers --output=wrappers --outpkg=wrappers --filename=fileSystemWrapper_mock.go --structname=FileSystemWrapperMock + # Repository + @mockery --name=SystemRepo --dir=cmd/repository --output=cmd/repository --outpkg=repository --filename=system_mock.go --structname=SystemRepoMock + @mockery --name=ProjectRepo --dir=cmd/repository --output=cmd/repository --outpkg=repository --filename=project_mock.go --structname=ProjectRepoMock + # Helpers + @mockery --name=ProjectHelper --dir=cmd/helpers --output=cmd/helpers --outpkg=helpers --filename=projectHelper_mock.go --structname=ProjectHelperMock diff --git a/cmd/helpers/projectHelper_mock.go b/cmd/helpers/projectHelper_mock.go new file mode 100644 index 0000000..0f81bc8 --- /dev/null +++ b/cmd/helpers/projectHelper_mock.go @@ -0,0 +1,243 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package helpers + +import ( + mock "github.com/stretchr/testify/mock" + models "github.com/tech-thinker/gozen/models" +) + +// ProjectHelperMock is an autogenerated mock type for the ProjectHelper type +type ProjectHelperMock struct { + mock.Mock +} + +// CreateRestAPI provides a mock function with given fields: project +func (_m *ProjectHelperMock) CreateRestAPI(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for CreateRestAPI") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// CreategRPCAPI provides a mock function with given fields: project +func (_m *ProjectHelperMock) CreategRPCAPI(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for CreategRPCAPI") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InitProject provides a mock function with given fields: project +func (_m *ProjectHelperMock) InitProject(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for InitProject") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupConfig provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupConfig(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupConfig") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupConstants provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupConstants(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupConstants") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupDocker provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupDocker(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupDocker") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupEnv provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupEnv(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupEnv") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupLogger provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupLogger(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupLogger") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupModel provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupModel(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupModel") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupRepository provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupRepository(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupRepository") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupService provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupService(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupService") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetupUtils provides a mock function with given fields: project +func (_m *ProjectHelperMock) SetupUtils(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for SetupUtils") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewProjectHelperMock creates a new instance of ProjectHelperMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProjectHelperMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ProjectHelperMock { + mock := &ProjectHelperMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cmd/repository/project_mock.go b/cmd/repository/project_mock.go new file mode 100644 index 0000000..c1c9f56 --- /dev/null +++ b/cmd/repository/project_mock.go @@ -0,0 +1,45 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package repository + +import ( + mock "github.com/stretchr/testify/mock" + models "github.com/tech-thinker/gozen/models" +) + +// ProjectRepoMock is an autogenerated mock type for the ProjectRepo type +type ProjectRepoMock struct { + mock.Mock +} + +// Create provides a mock function with given fields: project +func (_m *ProjectRepoMock) Create(project models.Project) error { + ret := _m.Called(project) + + if len(ret) == 0 { + panic("no return value specified for Create") + } + + var r0 error + if rf, ok := ret.Get(0).(func(models.Project) error); ok { + r0 = rf(project) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewProjectRepoMock creates a new instance of ProjectRepoMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProjectRepoMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ProjectRepoMock { + mock := &ProjectRepoMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cmd/repository/system.go b/cmd/repository/system.go index 3271260..c0202e8 100644 --- a/cmd/repository/system.go +++ b/cmd/repository/system.go @@ -11,10 +11,15 @@ import ( "github.com/tech-thinker/gozen/wrappers" ) +// SystemRepo is an interface that defines methods for interacting with the system. This includes writing files, executing shell commands, and managing the file system. type SystemRepo interface { + // Write generates code from a template and writes it to a file. Write(appDir string, templatePath string, destination string, data interface{}) error + // WriteAll generates code from multiple templates and writes them to their respective files. WriteAll(appDir string, fileConfigs []models.FileConfig, data interface{}) error + // ExecShell executes a shell command with arguments and returns the output as a string slice. ExecShell(command string, args ...string) ([]string, error) + // ExecShellRaw executes a shell command with arguments and returns the raw byte output. ExecShellRaw(command string, args ...string) ([]byte, error) } diff --git a/cmd/repository/system_mock.go b/cmd/repository/system_mock.go new file mode 100644 index 0000000..f087091 --- /dev/null +++ b/cmd/repository/system_mock.go @@ -0,0 +1,137 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package repository + +import ( + mock "github.com/stretchr/testify/mock" + models "github.com/tech-thinker/gozen/models" +) + +// SystemRepoMock is an autogenerated mock type for the SystemRepo type +type SystemRepoMock struct { + mock.Mock +} + +// ExecShell provides a mock function with given fields: command, args +func (_m *SystemRepoMock) ExecShell(command string, args ...string) ([]string, error) { + _va := make([]interface{}, len(args)) + for _i := range args { + _va[_i] = args[_i] + } + var _ca []interface{} + _ca = append(_ca, command) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ExecShell") + } + + var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(string, ...string) ([]string, error)); ok { + return rf(command, args...) + } + if rf, ok := ret.Get(0).(func(string, ...string) []string); ok { + r0 = rf(command, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + if rf, ok := ret.Get(1).(func(string, ...string) error); ok { + r1 = rf(command, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ExecShellRaw provides a mock function with given fields: command, args +func (_m *SystemRepoMock) ExecShellRaw(command string, args ...string) ([]byte, error) { + _va := make([]interface{}, len(args)) + for _i := range args { + _va[_i] = args[_i] + } + var _ca []interface{} + _ca = append(_ca, command) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ExecShellRaw") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(string, ...string) ([]byte, error)); ok { + return rf(command, args...) + } + if rf, ok := ret.Get(0).(func(string, ...string) []byte); ok { + r0 = rf(command, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(string, ...string) error); ok { + r1 = rf(command, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Write provides a mock function with given fields: appDir, templatePath, destination, data +func (_m *SystemRepoMock) Write(appDir string, templatePath string, destination string, data interface{}) error { + ret := _m.Called(appDir, templatePath, destination, data) + + if len(ret) == 0 { + panic("no return value specified for Write") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, string, interface{}) error); ok { + r0 = rf(appDir, templatePath, destination, data) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// WriteAll provides a mock function with given fields: appDir, fileConfigs, data +func (_m *SystemRepoMock) WriteAll(appDir string, fileConfigs []models.FileConfig, data interface{}) error { + ret := _m.Called(appDir, fileConfigs, data) + + if len(ret) == 0 { + panic("no return value specified for WriteAll") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, []models.FileConfig, interface{}) error); ok { + r0 = rf(appDir, fileConfigs, data) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewSystemRepoMock creates a new instance of SystemRepoMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSystemRepoMock(t interface { + mock.TestingT + Cleanup(func()) +}) *SystemRepoMock { + mock := &SystemRepoMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cmd/service/createApp.go b/cmd/service/createApp.go index 9f71b99..b30f820 100644 --- a/cmd/service/createApp.go +++ b/cmd/service/createApp.go @@ -18,13 +18,17 @@ type appService struct { func (cmd *appService) CreateApp(project models.Project) error { // Create project - cmd.projectRepo.Create(project) + err := cmd.projectRepo.Create(project) + if err != nil { + return err + } // Generating basic codes - err := cmd.projectHelper.InitProject(project) + err = cmd.projectHelper.InitProject(project) if err != nil { return err } + err = cmd.projectHelper.SetupEnv(project) if err != nil { return err