package app import ( "fmt" "os" "reflect" "testing" "gitlab.com/revalus/grm/commands" "gitlab.com/revalus/grm/config" ) type FakeCommandToTest struct { triggerError bool triggerChanged bool } func (fk FakeCommandToTest) Command(repoCfg config.RepositoryConfig, cmdStatus chan commands.CommandStatus) { status := commands.CommandStatus{ Name: repoCfg.Name, Changed: false, Message: "response from fake command", Error: false, } if fk.triggerError { status.Error = true } if fk.triggerChanged { status.Changed = true } cmdStatus <- status } func prepareConfigContent() (string, string) { checkErrorDuringPreparation := func(err error) { if err != nil { fmt.Printf("Cannot prepare a temporary directory for testing! %v ", err.Error()) os.Exit(2) } } baseTmp := fmt.Sprintf("%v/grmTest", os.TempDir()) if _, ok := os.Stat(baseTmp); ok != nil { err := os.Mkdir(baseTmp, 0777) checkErrorDuringPreparation(err) } tempDir, err := os.MkdirTemp(baseTmp, "*") checkErrorDuringPreparation(err) configFilePath := fmt.Sprintf("%v/config-file.yaml", tempDir) file, err := os.Create(configFilePath) checkErrorDuringPreparation(err) defer file.Close() yamlConfig := fmt.Sprintf(` workspace: %v repositories: - src: "https://github.com/golang/example.git" tags: ['example'] `, tempDir) _, err = file.WriteString(yamlConfig) checkErrorDuringPreparation(err) return tempDir, configFilePath } func TestParseApplication(t *testing.T) { workdir, configFile := prepareConfigContent() t.Cleanup(func() { os.Remove(workdir) }) args := []string{"custom-app", "sync", "-c", configFile} grm := GitRepositoryManager{} grm.Parse(args) if workdir != grm.configuration.Workspace { t.Errorf("Expected to get %v, instead of this got %v", workdir, grm.configuration.Repositories) } if !grm.cliArguments.Sync { t.Error("The value of \"sync\" is expected to be true") } expectedRepo := config.RepositoryConfig{ Name: "example", Src: "https://github.com/golang/example.git", Dest: "example", Tags: []string{"example"}, } if !reflect.DeepEqual(expectedRepo, grm.configuration.Repositories[0]) { t.Errorf("Expected to get %v, instead of this got %v", expectedRepo, grm.configuration.Repositories[0]) } } func Example_test_sync_output() { grm := GitRepositoryManager{ configuration: config.Configuration{ Workspace: "/tmp", }, cliArguments: config.CliArguments{ Sync: true, Version: true, }, console: ConsoleOutput{ Color: false, }, } grm.Run() // Output: // Info: Synchronizing repositories // Info: All repositories are synced // Info: Current version: 0.3.0 } func Example_limit_test_tags() { grm := GitRepositoryManager{ cliArguments: config.CliArguments{ LimitTags: []string{"example"}, }, configuration: config.Configuration{ Repositories: []config.RepositoryConfig{ {Name: "example1", Tags: []string{"example"}}, {Name: "example2", Tags: []string{"example"}}, {Name: "notExample"}, }, }, console: ConsoleOutput{ Color: false, }, } fakeCommand := FakeCommandToTest{ triggerError: false, triggerChanged: false, } grm.limitTags() grm.runCommand(fakeCommand) // Output: // Repository "example1": response from fake command // Repository "example2": response from fake command } func Example_limit_name() { grm := GitRepositoryManager{ cliArguments: config.CliArguments{ LimitName: "notExample", }, configuration: config.Configuration{ Repositories: []config.RepositoryConfig{ {Name: "example1", Tags: []string{"example"}}, {Name: "example2", Tags: []string{"example"}}, {Name: "notExample"}, }, }, console: ConsoleOutput{ Color: false, }, } fakeCommand := FakeCommandToTest{ triggerError: false, triggerChanged: false, } grm.limitName() grm.runCommand(fakeCommand) // Output: // Repository "notExample": response from fake command } func Example_run_with_limit_not_existing_name() { grm := GitRepositoryManager{ cliArguments: config.CliArguments{ LimitName: "not-existing-name", }, configuration: config.Configuration{ Repositories: []config.RepositoryConfig{ {Name: "example1", Tags: []string{"example"}}, {Name: "example2", Tags: []string{"example"}}, {Name: "notExample"}, }, }, console: ConsoleOutput{ Color: false, }, } grm.Run() // Output: // Error: no repository was found with the specified name } func Example_run_with_limit_not_existing_tags() { grm := GitRepositoryManager{ cliArguments: config.CliArguments{ LimitTags: []string{"not-existing-tag"}, }, configuration: config.Configuration{ Repositories: []config.RepositoryConfig{ {Name: "example1", Tags: []string{"example"}}, {Name: "example2", Tags: []string{"example"}}, {Name: "notExample"}, }, }, console: ConsoleOutput{ Color: false, }, } grm.Run() // Output: // Error: no repository was found with the specified tags } func Example_test_status_output() { grm := GitRepositoryManager{ configuration: config.Configuration{ Workspace: "/tmp", }, cliArguments: config.CliArguments{ Status: true, }, console: ConsoleOutput{ Color: false, }, } grm.Run() // Output: // Info: Current status of repositories }