github.com/shved/got@v0.0.0-20230322140632-a4bfa1e99685/main_test.go (about) 1 package main 2 3 import ( 4 "crypto/sha1" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "path" 10 "path/filepath" 11 "sort" 12 "strings" 13 "testing" 14 "time" 15 16 "github.com/shved/got/got" 17 "github.com/shved/got/misc" 18 "github.com/shved/got/object" 19 "github.com/shved/got/worktree" 20 ) 21 22 var expectedHashSums map[string]string = map[string]string{ 23 "initial state": "e3980c53eecf817099d9eed5202e33d50a84a903", 24 "repo initiated": "ff03475a2b21e13c2ad33881a5171f2aeb8f84a2", 25 "after initial commit": "898fbc176b8d57afa9653aba855e8e76cb361c70", 26 "after first change": "ec802cd71985e34ab3b7f5eede16c9446802e460", 27 "after second change": "0d5db35ed364e7c9421cb41f92ec654ba4bf2e71", 28 "after checkout to first change": "d64552265c66baedad2560c5fe5c52b7f9225227", 29 } 30 31 var commitToCheckout = "78bb45636d49ed0e1a6a9a2a54aa7a0d6eb18173" 32 33 var expectedShowLen = 112 34 var expectedLogLen = 405 35 36 var dummyAppPath string 37 38 func TestMain(m *testing.M) { 39 curDir, err := os.Getwd() 40 if err != nil { 41 log.Fatalf("get current working directory: %v", err) 42 } 43 dummyAppPath = path.Join(curDir, "test/dummy_app") 44 os.Chdir(dummyAppPath) 45 46 misc.CreateDummyApp() 47 exitCode := m.Run() 48 misc.RemoveDummyApp() 49 os.Exit(exitCode) 50 } 51 52 func TestMainWorkflow(t *testing.T) { 53 checkRepoSum(t, "initial state") 54 55 got.InitRepo() 56 got.SetRepoRoot() 57 58 checkRepoSum(t, "repo initiated") 59 60 worktree.MakeCommit("initial commit", time.Now()) 61 62 checkRepoSum(t, "after initial commit") 63 64 makeFirstChange() 65 worktree.MakeCommit("first change", time.Now().AddDate(0, 0, 1)) 66 67 checkRepoSum(t, "after first change") 68 69 makeSecondChange() 70 worktree.MakeCommit("second change", time.Now().AddDate(0, 0, 2)) 71 72 checkRepoSum(t, "after second change") 73 74 worktree.ToCommit(commitToCheckout) 75 76 checkRepoSum(t, "after checkout to first change") 77 78 head := got.ReadHead() 79 if head != commitToCheckout { 80 t.Fatalf("expected head be on %v, got %v", commitToCheckout, head) 81 } 82 83 commitInfo := object.Show(commitToCheckout) 84 if len(commitInfo) != expectedShowLen { 85 t.Fatalf("expected to have %v bytes of commit contents, got %v", expectedShowLen, len(commitInfo)) 86 } 87 88 logs := got.ReadLog() 89 if len(logs) != expectedLogLen { 90 t.Fatalf("expected to have %v bytes of logs, got %v", expectedLogLen, len(logs)) 91 } 92 } 93 94 func checkRepoSum(t *testing.T, step string) { 95 sum := repoStateHashSum() 96 if sum != expectedHashSums[step] { 97 t.Fatalf("%v: expected to have %v sum, got %v", step, expectedHashSums[step], sum) 98 } 99 100 } 101 102 func makeFirstChange() { 103 err := ioutil.WriteFile("app/views/index.html", []byte("<body>hi there!</body>"), 0644) 104 if err != nil { 105 log.Fatalf("failed to make first change") 106 } 107 } 108 109 func makeSecondChange() { 110 err := ioutil.WriteFile("app/views/index.html", []byte("new content"), 0644) 111 err = os.Remove("app/sample.file") 112 if err != nil { 113 log.Fatalf("failed to make second change") 114 } 115 } 116 117 func repoStateHashSum() string { 118 paths := readRepo() 119 sort.Sort(sort.StringSlice(paths)) 120 str := strings.Join(paths, "") 121 h := sha1.New() 122 h.Write([]byte(str)) 123 sum := h.Sum(nil) 124 return fmt.Sprintf("%x", sum) 125 } 126 127 func readRepo() []string { 128 var paths []string 129 130 repoWalker := func(path string, fi os.FileInfo, err error) error { 131 if err != nil { 132 log.Fatal(err) 133 } 134 135 if path == dummyAppPath { 136 return nil 137 } 138 139 relPath, err := filepath.Rel(dummyAppPath, path) 140 if err != nil { 141 return err 142 } 143 paths = append(paths, relPath) 144 145 return nil 146 } 147 148 err := filepath.Walk(dummyAppPath, repoWalker) 149 if err != nil { 150 log.Fatal(err) 151 } 152 153 return paths 154 }