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  }