github.com/hattya/nazuna@v0.7.1-0.20240331055452-55e14c275c1c/remote_test.go (about) 1 // 2 // nazuna :: remote_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 "bytes" 13 "fmt" 14 "net/http" 15 "net/http/httptest" 16 "os" 17 "os/exec" 18 "path/filepath" 19 "strings" 20 "testing" 21 22 "github.com/hattya/nazuna" 23 "github.com/hattya/nazuna/internal/test" 24 ) 25 26 var remoteTests = []struct { 27 src string 28 vcs, uri, root, path string 29 }{ 30 { 31 src: "github.com/mattn/gist-vim", 32 vcs: "git", 33 uri: "https://github.com/mattn/gist-vim", 34 root: "github.com/mattn/gist-vim", 35 }, 36 { 37 src: "bitbucket.org/hattya/git", 38 vcs: "git", 39 uri: "https://bitbucket.org/hattya/git.git", 40 root: "bitbucket.org/hattya/git", 41 }, 42 { 43 src: "bitbucket.org/hattya/hg", 44 vcs: "hg", 45 uri: "https://bitbucket.org/hattya/hg", 46 root: "bitbucket.org/hattya/hg", 47 }, 48 } 49 50 func TestNewRemote(t *testing.T) { 51 s := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 52 if strings.HasPrefix(r.RequestURI, "/2.0/repositories/") { 53 l := strings.Split(r.RequestURI[18:], "/") 54 fmt.Fprintf(w, `{"owner":{"username":"%v"},"scm":"%v"}`, l[0], l[1]) 55 } 56 })) 57 defer s.Close() 58 59 save := http.DefaultClient 60 defer func() { http.DefaultClient = save }() 61 http.DefaultClient = test.NewHTTPClient(s.Listener.Addr().String()) 62 63 for _, tt := range remoteTests { 64 r, err := nazuna.NewRemote(nil, tt.src) 65 if err != nil { 66 t.Fatal(err) 67 } 68 if g, e := r.VCS, tt.vcs; g != e { 69 t.Errorf("Remove.VCS = %v, expected %v", e, g) 70 } 71 if g, e := r.URI, tt.uri; g != e { 72 t.Errorf("Remove.URI = %v, expected %v", e, g) 73 } 74 if g, e := r.Root, tt.root; g != e { 75 t.Errorf("Remove.Root = %v, expected %v", e, g) 76 } 77 if g, e := r.Path, tt.path; g != e { 78 t.Errorf("Remove.Path = %v, expected %v", e, g) 79 } 80 } 81 } 82 83 func TestNewRemoteError(t *testing.T) { 84 s := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 85 if strings.HasPrefix(r.RequestURI, "/2.0/repositories/") { 86 l := strings.Split(r.RequestURI[18:], "/") 87 if l[0] != "_" { 88 if l[1] != "_" { 89 fmt.Fprintf(w, `{"owner":{"username":"%v"},"scm":"%v"}`, l[0], l[1]) 90 } else { 91 http.NotFound(w, r) 92 } 93 } 94 } 95 })) 96 defer s.Close() 97 98 save := http.DefaultClient 99 defer func() { http.DefaultClient = save }() 100 http.DefaultClient = test.NewHTTPClient(s.Listener.Addr().String()) 101 102 if _, err := nazuna.NewRemote(nil, "github.com/hattya"); err != nazuna.ErrRemote { 103 t.Errorf("expected ErrRemote, got %v", err) 104 } 105 106 switch _, err := nazuna.NewRemote(nil, "bitbucket.org/hattya/_"); { 107 case err == nil: 108 t.Error("expected error") 109 case !strings.HasSuffix(err.Error(), "/hattya/_: 404 Not Found"): 110 t.Error("unexpected error:", err) 111 } 112 113 switch _, err := nazuna.NewRemote(nil, "bitbucket.org/_/_"); { 114 case err == nil: 115 t.Error("expected error") 116 case !strings.HasSuffix(err.Error(), "/_/_: unexpected end of JSON input"): 117 t.Error("unexpected error:", err) 118 } 119 } 120 121 func TestRemote(t *testing.T) { 122 dir := sandbox(t) 123 home := filepath.Join(dir, "home") 124 if err := mkdir(home); err != nil { 125 t.Fatal(err) 126 } 127 t.Setenv("HOME", home) 128 129 ts := httptest.NewTLSServer(http.FileServer(http.Dir(filepath.Join(dir, "public")))) 130 defer ts.Close() 131 132 git(t, "config", "--global", "user.name", "Nazuna") 133 git(t, "config", "--global", "user.email", "nazuna@example.com") 134 git(t, "config", "--global", "http.sslVerify", "false") 135 git(t, "config", "--global", "url."+ts.URL+"/gist-vim/.git.insteadOf", "https://github.com/mattn/gist-vim") 136 git(t, "init", "-q", filepath.Join(dir, "public", "gist-vim")) 137 if err := os.Chdir(filepath.Join(dir, "public", "gist-vim")); err != nil { 138 t.Fatal(err) 139 } 140 if err := touch("README.md"); err != nil { 141 t.Fatal(err) 142 } 143 git(t, "add", ".") 144 git(t, "commit", "-qm", ".") 145 git(t, "update-server-info") 146 if err := os.Chdir(dir); err != nil { 147 t.Fatal(err) 148 } 149 150 ui := new(testUI) 151 r, err := nazuna.NewRemote(ui, "github.com/mattn/gist-vim") 152 if err != nil { 153 t.Fatal(err) 154 } 155 if err := r.Update(filepath.Base(r.Root)); err == nil { 156 t.Error("expected error") 157 } 158 if err := r.Clone(home, filepath.Base(r.Root)); err != nil { 159 t.Error(err) 160 } 161 if err := r.Update(filepath.Join(home, filepath.Base(r.Root))); err != nil { 162 t.Log(ui.String()) 163 t.Error(err) 164 } 165 166 r.VCS = "cvs" 167 if err := r.Clone(home, filepath.Base(r.Root)); err == nil { 168 t.Error("expected error") 169 } 170 } 171 172 func git(t *testing.T, a ...string) { 173 t.Helper() 174 175 var b bytes.Buffer 176 cmd := exec.Command("git", a...) 177 cmd.Stdout = &b 178 cmd.Stderr = &b 179 if err := cmd.Run(); err != nil { 180 t.Log(b.String()) 181 t.Fatal(err) 182 } 183 }