@@ -2,6 +2,7 @@ package in_test
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"io"
6
7
"testing"
7
8
"time"
@@ -150,6 +151,157 @@ func TestNewCmdIn_ShouldNotSetBillable_WhenNotAsked(t *testing.T) {
150
151
return
151
152
}
152
153
154
+ t .Fatalf ("err: %s" , err )
155
+ })
156
+ }
157
+ }
158
+
159
+ func TestNewCmdIn_ShouldLookupProject_WithAndWithoutClient (t * testing.T ) {
160
+ defaultStart := timehlp .Today ().Add (8 * time .Hour )
161
+
162
+ projects := []dto.Project {
163
+ {ID : "p1" , Name : "first" , ClientID : "c1" , ClientName : "other" },
164
+ {ID : "p2" , Name : "second" , ClientID : "c2" , ClientName : "me" },
165
+ {ID : "p3" , Name : "second" , ClientID : "c3" , ClientName : "clockify" },
166
+ {ID : "p4" , Name : "third" },
167
+ {ID : "p5" , Name : "notonclient" , ClientID : "c3" , ClientName : "clockify" },
168
+ }
169
+
170
+ tts := []struct {
171
+ name string
172
+ args []string
173
+ param api.CreateTimeEntryParam
174
+ err error
175
+ }{
176
+ {
177
+ name : "only project" ,
178
+ args : []string {"-s=08:00" , "-p=first" },
179
+ param : api.CreateTimeEntryParam {
180
+ Workspace : w .ID ,
181
+ Start : defaultStart ,
182
+ ProjectID : projects [0 ].ID ,
183
+ },
184
+ },
185
+ {
186
+ name : "project and client" ,
187
+ args : []string {"-s=08:00" , "-p=second" , "-c=me" },
188
+ param : api.CreateTimeEntryParam {
189
+ Workspace : w .ID ,
190
+ Start : defaultStart ,
191
+ ProjectID : projects [1 ].ID ,
192
+ },
193
+ },
194
+ {
195
+ name : "project and other client" ,
196
+ args : []string {"-s=08:00" , "-p=second" , "-c=clockify" },
197
+ param : api.CreateTimeEntryParam {
198
+ Workspace : w .ID ,
199
+ Start : defaultStart ,
200
+ ProjectID : projects [2 ].ID ,
201
+ },
202
+ },
203
+ {
204
+ name : "project without client" ,
205
+ args : []string {"-s=08:00" , "-p=third" },
206
+ param : api.CreateTimeEntryParam {
207
+ Workspace : w .ID ,
208
+ Start : defaultStart ,
209
+ ProjectID : projects [3 ].ID ,
210
+ },
211
+ },
212
+ {
213
+ name : "project does not exist" ,
214
+ args : []string {"-s=08:00" , "-p=notfound" },
215
+ err : errors .New (
216
+ "No project with id or name containing 'notfound' " +
217
+ "was found" ),
218
+ },
219
+ {
220
+ name : "project does not exist in this client" ,
221
+ args : []string {"-s=08:00" , "-p=notonclient" , "-c=me" },
222
+ err : errors .New (
223
+ "No project with id or name containing 'notonclient' " +
224
+ "was found for client 'me'" ),
225
+ },
226
+ }
227
+
228
+ for i := range tts {
229
+ tt := & tts [i ]
230
+
231
+ t .Run (tt .name , func (t * testing.T ) {
232
+ f := mocks .NewMockFactory (t )
233
+
234
+ f .EXPECT ().GetUserID ().Return ("u" , nil )
235
+ f .EXPECT ().GetWorkspaceID ().Return (w .ID , nil )
236
+
237
+ f .EXPECT ().Config ().Return (& mocks.SimpleConfig {
238
+ AllowNameForID : true ,
239
+ })
240
+
241
+ c := mocks .NewMockClient (t )
242
+ f .EXPECT ().Client ().Return (c , nil )
243
+
244
+ c .EXPECT ().GetProjects (api.GetProjectsParam {
245
+ Workspace : w .ID ,
246
+ PaginationParam : api .AllPages (),
247
+ }).
248
+ Return (projects , nil )
249
+
250
+ c .EXPECT ().GetTimeEntryInProgress (api.GetTimeEntryInProgressParam {
251
+ Workspace : w .ID ,
252
+ UserID : "u" ,
253
+ }).
254
+ Return (nil , nil )
255
+
256
+ if tt .err == nil {
257
+ c .EXPECT ().GetProject (api.GetProjectParam {
258
+ Workspace : w .ID ,
259
+ ProjectID : tt .param .ProjectID ,
260
+ }).
261
+ Return (& dto.Project {ID : tt .param .ProjectID }, nil )
262
+
263
+ f .EXPECT ().GetWorkspace ().Return (w , nil )
264
+
265
+ c .EXPECT ().Out (api.OutParam {
266
+ Workspace : w .ID ,
267
+ UserID : "u" ,
268
+ End : tt .param .Start ,
269
+ }).Return (api .ErrorNotFound )
270
+
271
+ c .EXPECT ().CreateTimeEntry (tt .param ).
272
+ Return (dto.TimeEntryImpl {ID : "te" }, nil )
273
+ }
274
+
275
+ called := false
276
+ cmd := in .NewCmdIn (f , func (
277
+ _ dto.TimeEntryImpl , _ io.Writer , _ util.OutputFlags ) error {
278
+ called = true
279
+ return nil
280
+ })
281
+
282
+ cmd .SilenceUsage = true
283
+ cmd .SilenceErrors = true
284
+
285
+ out := bytes .NewBufferString ("" )
286
+ cmd .SetOut (out )
287
+ cmd .SetErr (out )
288
+
289
+ cmd .SetArgs (append (tt .args , "-q" ))
290
+ _ , err := cmd .ExecuteC ()
291
+
292
+ if tt .err != nil {
293
+ assert .EqualError (t , err , tt .err .Error ())
294
+ return
295
+ }
296
+
297
+ t .Cleanup (func () {
298
+ assert .True (t , called )
299
+ })
300
+
301
+ if assert .NoError (t , err ) {
302
+ return
303
+ }
304
+
153
305
t .Fatalf ("err: %s" , err )
154
306
})
155
307
}
0 commit comments