github.com/abdfnx/gh-api@v0.0.0-20210414084727-f5432eec23b8/git/url_test.go (about)

     1  package git
     2  
     3  import "testing"
     4  
     5  func TestIsURL(t *testing.T) {
     6  	tests := []struct {
     7  		name string
     8  		url  string
     9  		want bool
    10  	}{
    11  		{
    12  			name: "scp-like",
    13  			url:  "git@example.com:owner/repo",
    14  			want: true,
    15  		},
    16  		{
    17  			name: "scp-like with no user",
    18  			url:  "example.com:owner/repo",
    19  			want: false,
    20  		},
    21  		{
    22  			name: "ssh",
    23  			url:  "ssh://git@example.com/owner/repo",
    24  			want: true,
    25  		},
    26  		{
    27  			name: "git",
    28  			url:  "git://example.com/owner/repo",
    29  			want: true,
    30  		},
    31  		{
    32  			name: "https",
    33  			url:  "https://example.com/owner/repo.git",
    34  			want: true,
    35  		},
    36  		{
    37  			name: "no protocol",
    38  			url:  "example.com/owner/repo",
    39  			want: false,
    40  		},
    41  	}
    42  	for _, tt := range tests {
    43  		t.Run(tt.name, func(t *testing.T) {
    44  			if got := IsURL(tt.url); got != tt.want {
    45  				t.Errorf("IsURL() = %v, want %v", got, tt.want)
    46  			}
    47  		})
    48  	}
    49  }
    50  
    51  func TestParseURL(t *testing.T) {
    52  	type url struct {
    53  		Scheme string
    54  		User   string
    55  		Host   string
    56  		Path   string
    57  	}
    58  	tests := []struct {
    59  		name    string
    60  		url     string
    61  		want    url
    62  		wantErr bool
    63  	}{
    64  		{
    65  			name: "HTTPS",
    66  			url:  "https://example.com/owner/repo.git",
    67  			want: url{
    68  				Scheme: "https",
    69  				User:   "",
    70  				Host:   "example.com",
    71  				Path:   "/owner/repo.git",
    72  			},
    73  		},
    74  		{
    75  			name: "HTTP",
    76  			url:  "http://example.com/owner/repo.git",
    77  			want: url{
    78  				Scheme: "http",
    79  				User:   "",
    80  				Host:   "example.com",
    81  				Path:   "/owner/repo.git",
    82  			},
    83  		},
    84  		{
    85  			name: "git",
    86  			url:  "git://example.com/owner/repo.git",
    87  			want: url{
    88  				Scheme: "git",
    89  				User:   "",
    90  				Host:   "example.com",
    91  				Path:   "/owner/repo.git",
    92  			},
    93  		},
    94  		{
    95  			name: "ssh",
    96  			url:  "ssh://git@example.com/owner/repo.git",
    97  			want: url{
    98  				Scheme: "ssh",
    99  				User:   "git",
   100  				Host:   "example.com",
   101  				Path:   "/owner/repo.git",
   102  			},
   103  		},
   104  		{
   105  			name: "ssh with port",
   106  			url:  "ssh://git@example.com:443/owner/repo.git",
   107  			want: url{
   108  				Scheme: "ssh",
   109  				User:   "git",
   110  				Host:   "example.com",
   111  				Path:   "/owner/repo.git",
   112  			},
   113  		},
   114  		{
   115  			name: "git+ssh",
   116  			url:  "git+ssh://example.com/owner/repo.git",
   117  			want: url{
   118  				Scheme: "ssh",
   119  				User:   "",
   120  				Host:   "example.com",
   121  				Path:   "/owner/repo.git",
   122  			},
   123  		},
   124  		{
   125  			name: "scp-like",
   126  			url:  "git@example.com:owner/repo.git",
   127  			want: url{
   128  				Scheme: "ssh",
   129  				User:   "git",
   130  				Host:   "example.com",
   131  				Path:   "/owner/repo.git",
   132  			},
   133  		},
   134  		{
   135  			name: "scp-like, leading slash",
   136  			url:  "git@example.com:/owner/repo.git",
   137  			want: url{
   138  				Scheme: "ssh",
   139  				User:   "git",
   140  				Host:   "example.com",
   141  				Path:   "/owner/repo.git",
   142  			},
   143  		},
   144  		{
   145  			name: "file protocol",
   146  			url:  "file:///example.com/owner/repo.git",
   147  			want: url{
   148  				Scheme: "file",
   149  				User:   "",
   150  				Host:   "",
   151  				Path:   "/example.com/owner/repo.git",
   152  			},
   153  		},
   154  		{
   155  			name: "file path",
   156  			url:  "/example.com/owner/repo.git",
   157  			want: url{
   158  				Scheme: "",
   159  				User:   "",
   160  				Host:   "",
   161  				Path:   "/example.com/owner/repo.git",
   162  			},
   163  		},
   164  		{
   165  			name: "Windows file path",
   166  			url:  "C:\\example.com\\owner\\repo.git",
   167  			want: url{
   168  				Scheme: "c",
   169  				User:   "",
   170  				Host:   "",
   171  				Path:   "",
   172  			},
   173  		},
   174  	}
   175  	for _, tt := range tests {
   176  		t.Run(tt.name, func(t *testing.T) {
   177  			u, err := ParseURL(tt.url)
   178  			if (err != nil) != tt.wantErr {
   179  				t.Fatalf("got error: %v", err)
   180  			}
   181  			if u.Scheme != tt.want.Scheme {
   182  				t.Errorf("expected scheme %q, got %q", tt.want.Scheme, u.Scheme)
   183  			}
   184  			if u.User.Username() != tt.want.User {
   185  				t.Errorf("expected user %q, got %q", tt.want.User, u.User.Username())
   186  			}
   187  			if u.Host != tt.want.Host {
   188  				t.Errorf("expected host %q, got %q", tt.want.Host, u.Host)
   189  			}
   190  			if u.Path != tt.want.Path {
   191  				t.Errorf("expected path %q, got %q", tt.want.Path, u.Path)
   192  			}
   193  		})
   194  	}
   195  }