Skip to content

Commit 32d7e9d

Browse files
committed
feat: for report too
1 parent 0a09481 commit 32d7e9d

File tree

3 files changed

+121
-6
lines changed

3 files changed

+121
-6
lines changed

pkg/cmd/time-entry/report/util/report.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package util
22

33
import (
4+
"errors"
45
"io"
56
"sort"
67
"time"
@@ -31,6 +32,7 @@ type ReportFlags struct {
3132
NotBillable bool
3233

3334
Description string
35+
Client string
3436
Project string
3537
TagIDs []string
3638
}
@@ -41,6 +43,12 @@ func (rf ReportFlags) Check() error {
4143
return err
4244
}
4345

46+
if rf.Client != "" && rf.Project == "" {
47+
return cmdutil.FlagErrorWrap(errors.New(
48+
"flag 'client' can't be used without flag 'project'",
49+
))
50+
}
51+
4452
return cmdutil.XorFlag(map[string]bool{
4553
"billable": rf.Billable,
4654
"not-billable": rf.NotBillable,
@@ -69,6 +77,10 @@ func AddReportFlags(
6977
"Will filter time entries using this project")
7078
_ = cmdcompl.AddSuggestionsToFlag(cmd, "project",
7179
cmdcomplutil.NewProjectAutoComplete(f))
80+
cmd.Flags().StringVarP(&rf.Client, "client", "c", "",
81+
"Will filter projects from this client")
82+
_ = cmdcompl.AddSuggestionsToFlag(cmd, "project",
83+
cmdcomplutil.NewProjectAutoComplete(f))
7284
cmd.Flags().StringSliceVarP(&rf.TagIDs, "tag", "T", []string{},
7385
"Will filter time entries using these tags")
7486
_ = cmdcompl.AddSuggestionsToFlag(cmd, "tag",
@@ -102,7 +114,7 @@ func ReportWithRange(
102114

103115
if rf.Project != "" && f.Config().IsAllowNameForID() {
104116
if rf.Project, err = search.GetProjectByName(
105-
c, workspace, rf.Project, ""); err != nil {
117+
c, workspace, rf.Project, rf.Client); err != nil {
106118
return err
107119
}
108120
}

pkg/cmd/time-entry/report/util/report_flag_test.go

+27-4
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ import (
77
"github.com/stretchr/testify/assert"
88
)
99

10-
func TestReportFlagsChecks(t *testing.T) {
10+
func TestReportBillableFlagsChecks(t *testing.T) {
1111
rf := util.NewReportFlags()
1212
rf.Billable = true
1313
rf.NotBillable = true
1414

1515
err := rf.Check()
16-
assert.Error(t, err)
17-
assert.Regexp(t,
18-
"can't be used together.*billable.*not-billable", err.Error())
16+
if assert.Error(t, err) {
17+
assert.Regexp(t,
18+
"can't be used together.*billable.*not-billable", err.Error())
19+
}
1920

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

2829
assert.NoError(t, rf.Check())
2930
}
31+
32+
func TestReportProjectFlagsChecks(t *testing.T) {
33+
rf := util.NewReportFlags()
34+
rf.Client = "me"
35+
rf.Project = ""
36+
37+
err := rf.Check()
38+
if assert.Error(t, err) {
39+
assert.Equal(t,
40+
"flag 'client' can't be used without flag 'project'", err.Error())
41+
}
42+
43+
rf.Client = ""
44+
rf.Project = "mine"
45+
46+
assert.NoError(t, rf.Check())
47+
48+
rf.Client = "me"
49+
rf.Project = "mine"
50+
51+
assert.NoError(t, rf.Check())
52+
}

pkg/cmd/time-entry/report/util/reportwithrange_test.go

+81-1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,71 @@ func TestReportWithRange(t *testing.T) {
135135
},
136136
err: "No project.*wrong' was found",
137137
},
138+
{
139+
name: "invalid client",
140+
factory: func(t *testing.T) cmdutil.Factory {
141+
f := mocks.NewMockFactory(t)
142+
f.On("GetUserID").Return("u", nil)
143+
f.On("GetWorkspaceID").Return("w", nil)
144+
145+
cf := mocks.NewMockConfig(t)
146+
f.On("Config").Return(cf)
147+
cf.On("IsAllowNameForID").Return(true)
148+
149+
c := mocks.NewMockClient(t)
150+
f.On("Client").Return(c, nil)
151+
152+
c.On("GetProjects", api.GetProjectsParam{
153+
Workspace: "w",
154+
PaginationParam: api.AllPages(),
155+
}).Return([]dto.Project{{Name: "right"}}, nil)
156+
157+
return f
158+
},
159+
flags: func(t *testing.T) util.ReportFlags {
160+
rf := util.NewReportFlags()
161+
rf.Client = "right"
162+
rf.Project = "wrong"
163+
return rf
164+
},
165+
err: "No client.*right' was found",
166+
},
167+
{
168+
name: "invalid project for client",
169+
factory: func(t *testing.T) cmdutil.Factory {
170+
f := mocks.NewMockFactory(t)
171+
f.On("GetUserID").Return("u", nil)
172+
f.On("GetWorkspaceID").Return("w", nil)
173+
174+
cf := mocks.NewMockConfig(t)
175+
f.On("Config").Return(cf)
176+
cf.On("IsAllowNameForID").Return(true)
177+
178+
c := mocks.NewMockClient(t)
179+
f.On("Client").Return(c, nil)
180+
181+
c.On("GetProjects", api.GetProjectsParam{
182+
Workspace: "w",
183+
PaginationParam: api.AllPages(),
184+
}).
185+
Return(
186+
[]dto.Project{{
187+
Name: "right",
188+
ClientName: "right",
189+
ClientID: "r1",
190+
}},
191+
nil)
192+
193+
return f
194+
},
195+
flags: func(t *testing.T) util.ReportFlags {
196+
rf := util.NewReportFlags()
197+
rf.Client = "right"
198+
rf.Project = "wrong"
199+
return rf
200+
},
201+
err: "No project.*wrong' was found for client 'right'",
202+
},
138203
{
139204
name: "range http error",
140205
factory: func(t *testing.T) cmdutil.Factory {
@@ -152,7 +217,21 @@ func TestReportWithRange(t *testing.T) {
152217
c.On("GetProjects", api.GetProjectsParam{
153218
Workspace: "w",
154219
PaginationParam: api.AllPages(),
155-
}).Return([]dto.Project{{ID: "p", Name: "right"}}, nil)
220+
}).
221+
Return([]dto.Project{
222+
{
223+
ID: "p",
224+
Name: "right",
225+
ClientName: "right",
226+
ClientID: "c1",
227+
},
228+
{
229+
ID: "p",
230+
Name: "right",
231+
ClientName: "wrong",
232+
ClientID: "c2",
233+
},
234+
}, nil)
156235

157236
c.On("LogRange", api.LogRangeParam{
158237
Workspace: "w",
@@ -169,6 +248,7 @@ func TestReportWithRange(t *testing.T) {
169248
flags: func(t *testing.T) util.ReportFlags {
170249
rf := util.NewReportFlags()
171250
rf.Project = "right"
251+
rf.Client = "right"
172252
return rf
173253
},
174254
err: "http error",

0 commit comments

Comments
 (0)