github.com/hattya/nazuna@v0.7.1-0.20240331055452-55e14c275c1c/repository_test.go (about)

     1  //
     2  // nazuna :: repository_test.go
     3  //
     4  //   Copyright (c) 2013-2022 Akinori Hattori <hattya@gmail.com>
     5  //
     6  //   SPDX-License-Identifier: MIT
     7  //
     8  
     9  package nazuna_test
    10  
    11  import (
    12  	"os"
    13  	"os/exec"
    14  	"path/filepath"
    15  	"reflect"
    16  	"strings"
    17  	"testing"
    18  
    19  	"github.com/hattya/nazuna"
    20  )
    21  
    22  func TestOpen(t *testing.T) {
    23  	sandbox(t)
    24  
    25  	if err := mkdir(".nzn", "r", ".git"); err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	repo, err := nazuna.Open(nil, ".")
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	if err := repo.Flush(); err != nil {
    33  		t.Error(err)
    34  	}
    35  	data, err := os.ReadFile(filepath.Join(".nzn", "r", "nazuna.json"))
    36  	if err != nil {
    37  		t.Fatal(err)
    38  	}
    39  	if g, e := string(data), "[]\n"; g != e {
    40  		t.Errorf("expected %q, got %q", e, g)
    41  	}
    42  }
    43  
    44  func TestOpenError(t *testing.T) {
    45  	sandbox(t)
    46  
    47  	// no repository
    48  	switch _, err := nazuna.Open(nil, "."); {
    49  	case err == nil:
    50  		t.Error("expected error")
    51  	case !strings.HasPrefix(err.Error(), "no repository found "):
    52  		t.Error("unexpected error:", err)
    53  	}
    54  	// unknown vcs
    55  	if err := mkdir(".nzn", "r"); err != nil {
    56  		t.Fatal(err)
    57  	}
    58  	switch _, err := nazuna.Open(nil, "."); {
    59  	case err == nil:
    60  		t.Error("expected error")
    61  	case !strings.HasPrefix(err.Error(), "unknown vcs for directory "):
    62  		t.Error("unexpected error:", err)
    63  	}
    64  	// unmarshal error
    65  	if err := mkdir(".nzn", "r", ".git"); err != nil {
    66  		t.Fatal(err)
    67  	}
    68  	if err := mkdir(".nzn", "r", "nazuna.json"); err != nil {
    69  		t.Fatal(err)
    70  	}
    71  	if _, err := nazuna.Open(nil, "."); err == nil {
    72  		t.Error("expected error")
    73  	}
    74  }
    75  
    76  func TestNewLayer(t *testing.T) {
    77  	repo := init_(t)
    78  
    79  	layers := []*nazuna.Layer{
    80  		{Name: "a"},
    81  		{Name: "z"},
    82  	}
    83  	for _, l := range layers {
    84  		l.SetRepo(repo)
    85  	}
    86  	if _, err := repo.NewLayer("z"); err != nil {
    87  		t.Error(err)
    88  	}
    89  	if _, err := repo.NewLayer("a"); err != nil {
    90  		t.Error(err)
    91  	}
    92  	if !reflect.DeepEqual(repo.Layers, layers) {
    93  		t.Error("unexpected order")
    94  	}
    95  
    96  	repo.Layers = nil
    97  	layers = []*nazuna.Layer{{Name: "abst"}}
    98  	abst := layers[0]
    99  	abst.Layers = []*nazuna.Layer{
   100  		{Name: "a"},
   101  		{Name: "z"},
   102  	}
   103  	abst.SetRepo(repo)
   104  	for _, l := range abst.Layers {
   105  		l.SetRepo(repo)
   106  		l.SetAbst(abst)
   107  	}
   108  	if _, err := repo.NewLayer("abst/z"); err != nil {
   109  		t.Error(err)
   110  	}
   111  	if _, err := repo.NewLayer("abst/a"); err != nil {
   112  		t.Error(err)
   113  	}
   114  	if !reflect.DeepEqual(repo.Layers, layers) {
   115  		t.Error("expected to sort by Layer.Name")
   116  	}
   117  }
   118  
   119  func TestNewLayerError(t *testing.T) {
   120  	repo := init_(t)
   121  
   122  	if _, err := repo.NewLayer("layer"); err != nil {
   123  		t.Fatal(err)
   124  	}
   125  	for _, n := range []string{
   126  		"",
   127  		"/",
   128  		"//",
   129  		"layer/layer",
   130  		"layer",
   131  	} {
   132  		if _, err := repo.NewLayer(n); err == nil {
   133  			t.Error("expected error")
   134  		}
   135  	}
   136  }
   137  
   138  func TestRepositoryPaths(t *testing.T) {
   139  	repo := init_(t)
   140  
   141  	rdir := filepath.Join(repo.Root(), ".nzn", "r")
   142  	if g, e := repo.PathFor(nil, "file"), filepath.Join(rdir, "file"); g != e {
   143  		t.Errorf("expected %q, got %q", e, g)
   144  	}
   145  	l, err := repo.NewLayer("layer")
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  	if g, e := repo.PathFor(l, "file"), filepath.Join(rdir, l.Path(), "file"); g != e {
   150  		t.Errorf("expected %q, got %q", e, g)
   151  	}
   152  
   153  	subroot := filepath.Join(repo.Root(), ".nzn", "sub")
   154  	if g, e := repo.SubrepoFor("subrepo"), filepath.Join(subroot, "subrepo"); g != e {
   155  		t.Errorf("expected %q, got %q", e, g)
   156  	}
   157  }
   158  
   159  var findPathTests = []struct {
   160  	typ, path string
   161  }{
   162  	{"", "_"},
   163  	{"dir", "dir"},
   164  	{"file", filepath.Join("dir", "file")},
   165  	{"alias", "alias"},
   166  	{"link", "link"},
   167  	{"subrepo", "subrepo"},
   168  }
   169  
   170  func TestFindPath(t *testing.T) {
   171  	repo := init_(t)
   172  
   173  	l, err := repo.NewLayer("layer")
   174  	if err != nil {
   175  		t.Fatal(err)
   176  	}
   177  	if err := mkdir(repo.PathFor(l, "dir")); err != nil {
   178  		t.Fatal(err)
   179  	}
   180  	if err := touch(repo.PathFor(l, filepath.Join("dir", "file"))); err != nil {
   181  		t.Fatal(err)
   182  	}
   183  	if err := repo.Add("."); err != nil {
   184  		t.Fatal(err)
   185  	}
   186  	if err := l.NewAlias("a", "alias"); err != nil {
   187  		t.Fatal(err)
   188  	}
   189  	if _, err := l.NewLink(nil, "l", "link"); err != nil {
   190  		t.Fatal(err)
   191  	}
   192  	if _, err := l.NewSubrepo("github.com/hattya/nazuna", "subrepo"); err != nil {
   193  		t.Fatal(err)
   194  	}
   195  
   196  	for _, tt := range findPathTests {
   197  		if g, e := repo.Find(l, tt.path), tt.typ; g != e {
   198  			t.Errorf("expected %v, got %v", e, g)
   199  		}
   200  	}
   201  }
   202  
   203  func init_(t *testing.T) *nazuna.Repository {
   204  	t.Helper()
   205  
   206  	dir := sandbox(t)
   207  	rdir := filepath.Join(dir, ".nzn", "r")
   208  	if err := mkdir(rdir); err != nil {
   209  		t.Fatal("init:", err)
   210  	}
   211  	cmd := exec.Command("git", "init", "-q")
   212  	cmd.Dir = rdir
   213  	if err := cmd.Run(); err != nil {
   214  		t.Fatal("init:", err)
   215  	}
   216  	repo, err := nazuna.Open(new(testUI), dir)
   217  	if err != nil {
   218  		t.Fatal("init:", err)
   219  	}
   220  	return repo
   221  }