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 }