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  }