Skip to content

Commit

Permalink
feat: for report too
Browse files Browse the repository at this point in the history
  • Loading branch information
lucassabreu committed Feb 9, 2024
1 parent 0a09481 commit 32d7e9d
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 6 deletions.
14 changes: 13 additions & 1 deletion pkg/cmd/time-entry/report/util/report.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package util

import (
"errors"
"io"
"sort"
"time"
Expand Down Expand Up @@ -31,6 +32,7 @@ type ReportFlags struct {
NotBillable bool

Description string
Client string
Project string
TagIDs []string
}
Expand All @@ -41,6 +43,12 @@ func (rf ReportFlags) Check() error {
return err
}

if rf.Client != "" && rf.Project == "" {
return cmdutil.FlagErrorWrap(errors.New(
"flag 'client' can't be used without flag 'project'",
))
}

return cmdutil.XorFlag(map[string]bool{
"billable": rf.Billable,
"not-billable": rf.NotBillable,
Expand Down Expand Up @@ -69,6 +77,10 @@ func AddReportFlags(
"Will filter time entries using this project")
_ = cmdcompl.AddSuggestionsToFlag(cmd, "project",
cmdcomplutil.NewProjectAutoComplete(f))
cmd.Flags().StringVarP(&rf.Client, "client", "c", "",
"Will filter projects from this client")
_ = cmdcompl.AddSuggestionsToFlag(cmd, "project",
cmdcomplutil.NewProjectAutoComplete(f))
cmd.Flags().StringSliceVarP(&rf.TagIDs, "tag", "T", []string{},
"Will filter time entries using these tags")
_ = cmdcompl.AddSuggestionsToFlag(cmd, "tag",
Expand Down Expand Up @@ -102,7 +114,7 @@ func ReportWithRange(

if rf.Project != "" && f.Config().IsAllowNameForID() {
if rf.Project, err = search.GetProjectByName(
c, workspace, rf.Project, ""); err != nil {
c, workspace, rf.Project, rf.Client); err != nil {
return err
}
}
Expand Down
31 changes: 27 additions & 4 deletions pkg/cmd/time-entry/report/util/report_flag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@ import (
"github.com/stretchr/testify/assert"
)

func TestReportFlagsChecks(t *testing.T) {
func TestReportBillableFlagsChecks(t *testing.T) {
rf := util.NewReportFlags()
rf.Billable = true
rf.NotBillable = true

err := rf.Check()
assert.Error(t, err)
assert.Regexp(t,
"can't be used together.*billable.*not-billable", err.Error())
if assert.Error(t, err) {
assert.Regexp(t,
"can't be used together.*billable.*not-billable", err.Error())
}

rf.Billable = false
rf.NotBillable = true
Expand All @@ -27,3 +28,25 @@ func TestReportFlagsChecks(t *testing.T) {

assert.NoError(t, rf.Check())
}

func TestReportProjectFlagsChecks(t *testing.T) {
rf := util.NewReportFlags()
rf.Client = "me"
rf.Project = ""

err := rf.Check()
if assert.Error(t, err) {
assert.Equal(t,
"flag 'client' can't be used without flag 'project'", err.Error())
}

rf.Client = ""
rf.Project = "mine"

assert.NoError(t, rf.Check())

rf.Client = "me"
rf.Project = "mine"

assert.NoError(t, rf.Check())
}
82 changes: 81 additions & 1 deletion pkg/cmd/time-entry/report/util/reportwithrange_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,71 @@ func TestReportWithRange(t *testing.T) {
},
err: "No project.*wrong' was found",
},
{
name: "invalid client",
factory: func(t *testing.T) cmdutil.Factory {
f := mocks.NewMockFactory(t)
f.On("GetUserID").Return("u", nil)
f.On("GetWorkspaceID").Return("w", nil)

cf := mocks.NewMockConfig(t)
f.On("Config").Return(cf)
cf.On("IsAllowNameForID").Return(true)

c := mocks.NewMockClient(t)
f.On("Client").Return(c, nil)

c.On("GetProjects", api.GetProjectsParam{
Workspace: "w",
PaginationParam: api.AllPages(),
}).Return([]dto.Project{{Name: "right"}}, nil)

return f
},
flags: func(t *testing.T) util.ReportFlags {
rf := util.NewReportFlags()
rf.Client = "right"
rf.Project = "wrong"
return rf
},
err: "No client.*right' was found",
},
{
name: "invalid project for client",
factory: func(t *testing.T) cmdutil.Factory {
f := mocks.NewMockFactory(t)
f.On("GetUserID").Return("u", nil)
f.On("GetWorkspaceID").Return("w", nil)

cf := mocks.NewMockConfig(t)
f.On("Config").Return(cf)
cf.On("IsAllowNameForID").Return(true)

c := mocks.NewMockClient(t)
f.On("Client").Return(c, nil)

c.On("GetProjects", api.GetProjectsParam{
Workspace: "w",
PaginationParam: api.AllPages(),
}).
Return(
[]dto.Project{{
Name: "right",
ClientName: "right",
ClientID: "r1",
}},
nil)

return f
},
flags: func(t *testing.T) util.ReportFlags {
rf := util.NewReportFlags()
rf.Client = "right"
rf.Project = "wrong"
return rf
},
err: "No project.*wrong' was found for client 'right'",
},
{
name: "range http error",
factory: func(t *testing.T) cmdutil.Factory {
Expand All @@ -152,7 +217,21 @@ func TestReportWithRange(t *testing.T) {
c.On("GetProjects", api.GetProjectsParam{
Workspace: "w",
PaginationParam: api.AllPages(),
}).Return([]dto.Project{{ID: "p", Name: "right"}}, nil)
}).
Return([]dto.Project{
{
ID: "p",
Name: "right",
ClientName: "right",
ClientID: "c1",
},
{
ID: "p",
Name: "right",
ClientName: "wrong",
ClientID: "c2",
},
}, nil)

c.On("LogRange", api.LogRangeParam{
Workspace: "w",
Expand All @@ -169,6 +248,7 @@ func TestReportWithRange(t *testing.T) {
flags: func(t *testing.T) util.ReportFlags {
rf := util.NewReportFlags()
rf.Project = "right"
rf.Client = "right"
return rf
},
err: "http error",
Expand Down

0 comments on commit 32d7e9d

Please sign in to comment.