Skip to content

Commit

Permalink
addrs: ModuleSourceRemote.String correctly handles query string in URL
Browse files Browse the repository at this point in the history
Previously it would append the "subdir" portion onto the query string, producing an invalid result.
  • Loading branch information
fatahfattah authored Aug 31, 2022
1 parent ba113ff commit 8a31f0a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
11 changes: 9 additions & 2 deletions internal/addrs/module_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,10 +316,17 @@ func parseModuleSourceRemote(raw string) (ModuleSourceRemote, error) {
func (s ModuleSourceRemote) moduleSource() {}

func (s ModuleSourceRemote) String() string {
base := s.Package.String()

if s.Subdir != "" {
return s.Package.String() + "//" + s.Subdir
// Address contains query string
if strings.Contains(base, "?") {
parts := strings.SplitN(base, "?", 2)
return parts[0] + "//" + s.Subdir + "?" + parts[1]
}
return base + "//" + s.Subdir
}
return s.Package.String()
return base
}

func (s ModuleSourceRemote) ForDisplay() string {
Expand Down
57 changes: 57 additions & 0 deletions internal/addrs/module_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,13 @@ func TestParseModuleSource(t *testing.T) {
Subdir: "bleep/bloop",
},
},
"git over HTTPS, URL-style, subdir, query parameters": {
input: "git::https://example.com/code/baz.git//bleep/bloop?otherthing=blah",
want: ModuleSourceRemote{
Package: ModulePackage("git::https://example.com/code/baz.git?otherthing=blah"),
Subdir: "bleep/bloop",
},
},
"git over SSH, URL-style": {
input: "git::ssh://[email protected]/code/baz.git",
want: ModuleSourceRemote{
Expand Down Expand Up @@ -401,6 +408,56 @@ func TestModuleSourceRemoteFromRegistry(t *testing.T) {
})
}

func TestParseModuleSourceRemote(t *testing.T) {

tests := map[string]struct {
input string
wantString string
wantForDisplay string
wantErr string
}{
"git over HTTPS, URL-style, query parameters": {
// Query parameters should be correctly appended after the Package
input: `git::https://example.com/code/baz.git?otherthing=blah`,
wantString: `git::https://example.com/code/baz.git?otherthing=blah`,
wantForDisplay: `git::https://example.com/code/baz.git?otherthing=blah`,
},
"git over HTTPS, URL-style, subdir, query parameters": {
// Query parameters should be correctly appended after the Package and Subdir
input: `git::https://example.com/code/baz.git//bleep/bloop?otherthing=blah`,
wantString: `git::https://example.com/code/baz.git//bleep/bloop?otherthing=blah`,
wantForDisplay: `git::https://example.com/code/baz.git//bleep/bloop?otherthing=blah`,
},
}

for name, test := range tests {
t.Run(name, func(t *testing.T) {
remote, err := parseModuleSourceRemote(test.input)

if test.wantErr != "" {
switch {
case err == nil:
t.Errorf("unexpected success\nwant error: %s", test.wantErr)
case err.Error() != test.wantErr:
t.Errorf("wrong error messages\ngot: %s\nwant: %s", err.Error(), test.wantErr)
}
return
}

if err != nil {
t.Fatalf("unexpected error: %s", err.Error())
}

if got, want := remote.String(), test.wantString; got != want {
t.Errorf("wrong String() result\ngot: %s\nwant: %s", got, want)
}
if got, want := remote.ForDisplay(), test.wantForDisplay; got != want {
t.Errorf("wrong ForDisplay() result\ngot: %s\nwant: %s", got, want)
}
})
}
}

func TestParseModuleSourceRegistry(t *testing.T) {
// We test parseModuleSourceRegistry alone here, in addition to testing
// it indirectly as part of TestParseModuleSource, because general
Expand Down

0 comments on commit 8a31f0a

Please sign in to comment.