github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/tests/generate_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "path" 8 "strings" 9 "testing" 10 11 "github.com/taubyte/tau-cli/common" 12 "gotest.tools/v3/assert" 13 ) 14 15 func obfuscateToken() func() { 16 prevToken := Token 17 Token = "<git-token>" 18 err := os.Setenv("TAU_TEST_GIT_TOKEN", Token) 19 if err != nil { 20 log.Fatalf("unset token failed with: %s", err) 21 } 22 23 return func() { 24 Token = prevToken 25 err := os.Setenv("TAU_TEST_GIT_TOKEN", prevToken) 26 if err != nil { 27 log.Fatalf("reset token failed with: %s", err) 28 } 29 } 30 } 31 32 // This will generate a directory ./generate which contains all of the bash friendly commands created by the tests 33 func TestGenerate(t *testing.T) { 34 defer obfuscateToken()() 35 36 var ( 37 generateDir = "./test_commands" 38 ) 39 40 spiders := []*testSpider{ 41 createApplicationMonkey(), 42 createAuthMonkey(), 43 createDatabaseMonkey(), 44 createDomainMonkey(), 45 createFunctionMonkey(), 46 createGitMonkey(), 47 createLibraryMonkey(), 48 createMessagingMonkey(), 49 createProjectMonkey(), 50 createServiceMonkey(), 51 createSmartopsMonkey(), 52 createStorageMonkey(), 53 createWebsiteMonkey(), 54 } 55 56 os.RemoveAll(generateDir) 57 err := os.Mkdir(generateDir, common.DefaultDirPermission) 58 assert.NilError(t, err) 59 60 for _, spider := range spiders { 61 spiderDir := path.Join(generateDir, spider.testName) 62 err = os.Mkdir(spiderDir, common.DefaultDirPermission) 63 assert.NilError(t, err) 64 65 for _, monkey := range spider.tests { 66 // Ignoring fail tests 67 for _, child := range monkey.children { 68 if child.exitCode != 0 { 69 monkey.exitCode = 1 70 break 71 } 72 } 73 if monkey.exitCode != 0 { 74 continue 75 } 76 77 err = writeMonkey(path.Join(spiderDir, monkey.name), monkey) 78 assert.NilError(t, err) 79 } 80 } 81 } 82 83 func writeMonkey(dir string, monkey testMonkey) error { 84 file, err := os.Create(strings.ReplaceAll(dir, " ", "_") + ".sh") 85 if err != nil { 86 return err 87 } 88 defer file.Close() 89 90 err = writePreRun(file, monkey) 91 if err != nil { 92 return err 93 } 94 95 err = writeChildren(file, monkey) 96 if err != nil { 97 return err 98 } 99 100 err = writeWithHeader("# command", file, [][]string{monkey.args}) 101 if err != nil { 102 return err 103 } 104 105 return nil 106 } 107 108 func cleanArgsForDocs(args []string) string { 109 var newArgs string 110 for idx, arg := range args { 111 if idx > 0 { 112 newArgs += " " 113 } 114 115 var new string 116 // If it contains spaces, wrap it with "" 117 if strings.Contains(arg, " ") { 118 new = fmt.Sprintf(`"%s"`, arg) 119 } else { 120 new = arg 121 } 122 123 // Initialize the start of parsing options so we can add " \\\n\t" 124 if strings.HasPrefix(new, "--") { 125 new = "\\\n " + new 126 } 127 128 newArgs += new 129 } 130 131 return "tau " + newArgs 132 } 133 134 func writeWithHeader(header string, file *os.File, argsSlice [][]string) error { 135 fmt.Fprintln(file, header) 136 for _, args := range argsSlice { 137 fmt.Fprint(file, cleanArgsForDocs(args), "\n\n") 138 } 139 140 return nil 141 } 142 143 func writePreRun(file *os.File, monkey testMonkey) error { 144 if len(monkey.preRun) == 0 { 145 return nil 146 } 147 148 return writeWithHeader("# pre-run", file, monkey.preRun) 149 } 150 151 func writeChildren(file *os.File, monkey testMonkey) error { 152 if len(monkey.children) == 0 { 153 return nil 154 } 155 156 argsSlice := make([][]string, len(monkey.children)) 157 for idx, child := range monkey.children { 158 argsSlice[idx] = child.args 159 } 160 161 return writeWithHeader("# children", file, argsSlice) 162 }