Skip to content

Commit 7730028

Browse files
committed
Fail when inspect cannot open a browser
Treat browser launch as part of read-only inspect commands. Return a handled error so scripts do not mistake an unopened page for success.
1 parent d07de6d commit 7730028

4 files changed

Lines changed: 88 additions & 0 deletions

File tree

cmd/project/inspect.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func inspectProject(_ *cobra.Command, args []string) error {
4242
err = launch.Browser(routes.ProjectUrl(project))
4343
if err != nil {
4444
printer.ErrorText(fmt.Sprintf("Error opening browser: %+v", err))
45+
return openerrors.ErrHandled
4546
}
4647
} else {
4748
printer.Project(project)

cmd/project/inspect_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package project
2+
3+
import (
4+
"errors"
5+
"net/http"
6+
"net/http/httptest"
7+
"net/url"
8+
"strings"
9+
"testing"
10+
11+
openerrors "github.com/opf/openproject-cli/components/errors"
12+
"github.com/opf/openproject-cli/components/printer"
13+
"github.com/opf/openproject-cli/components/requests"
14+
"github.com/opf/openproject-cli/components/routes"
15+
)
16+
17+
func TestInspectBrowserFailureReturnsError(t *testing.T) {
18+
server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
19+
if request.Method != http.MethodGet {
20+
t.Errorf("request method = %s, want GET", request.Method)
21+
}
22+
response.Header().Set("Content-Type", "application/json")
23+
_, _ = response.Write([]byte(`{"id":1,"identifier":"example","name":"Example"}`))
24+
}))
25+
t.Cleanup(server.Close)
26+
27+
host, err := url.Parse(server.URL)
28+
if err != nil {
29+
t.Fatal(err)
30+
}
31+
requests.Init(host, "", false)
32+
routes.Init(host)
33+
34+
testingPrinter := &printer.TestingPrinter{}
35+
printer.Init(testingPrinter)
36+
t.Setenv("PATH", t.TempDir())
37+
openInBrowser = true
38+
t.Cleanup(func() {
39+
openInBrowser = false
40+
})
41+
42+
err = inspectProject(nil, []string{"1"})
43+
if !errors.Is(err, openerrors.ErrHandled) {
44+
t.Fatalf("inspectProject error = %v, want ErrHandled", err)
45+
}
46+
if count := strings.Count(testingPrinter.ErrResult, "[ERROR]"); count != 1 {
47+
t.Errorf("error diagnostic count = %d, want 1; stderr: %q", count, testingPrinter.ErrResult)
48+
}
49+
}

cmd/workpackage/inspect.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func inspectWorkPackage(_ *cobra.Command, args []string) error {
5252
err = launch.Browser(routes.WorkPackageUrl(workPackage))
5353
if err != nil {
5454
printer.ErrorText(fmt.Sprintf("Error opening browser: %+v", err))
55+
return openerrors.ErrHandled
5556
}
5657
} else {
5758
printer.WorkPackage(workPackage)

cmd/workpackage/inspect_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package workpackage
2+
3+
import (
4+
"errors"
5+
"net/http"
6+
"strings"
7+
"testing"
8+
9+
openerrors "github.com/opf/openproject-cli/components/errors"
10+
)
11+
12+
func TestInspectBrowserFailureReturnsError(t *testing.T) {
13+
testingPrinter, requestCount := initWorkPackageTestServer(t, func(response http.ResponseWriter, request *http.Request) {
14+
if request.Method != http.MethodGet {
15+
t.Errorf("request method = %s, want GET", request.Method)
16+
}
17+
response.Header().Set("Content-Type", "application/json")
18+
_, _ = response.Write([]byte(`{"id":42,"displayId":"42","subject":"Example"}`))
19+
})
20+
21+
t.Setenv("PATH", t.TempDir())
22+
inspectOpenInBrowser = true
23+
t.Cleanup(func() {
24+
inspectOpenInBrowser = false
25+
})
26+
27+
err := inspectWorkPackage(nil, []string{"42"})
28+
if !errors.Is(err, openerrors.ErrHandled) {
29+
t.Fatalf("inspectWorkPackage error = %v, want ErrHandled", err)
30+
}
31+
if *requestCount != 1 {
32+
t.Errorf("request count = %d, want 1", *requestCount)
33+
}
34+
if count := strings.Count(testingPrinter.ErrResult, "[ERROR]"); count != 1 {
35+
t.Errorf("error diagnostic count = %d, want 1; stderr: %q", count, testingPrinter.ErrResult)
36+
}
37+
}

0 commit comments

Comments
 (0)