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  }