1 use Test::More tests => 40;
8 use Support::TestSetup;
12 use_ok 'SL::DB::TimeRecording';
14 use SL::Dev::ALL qw(:ALL);
16 Support::TestSetup::login();
19 my ($s1, $e1, $s2, $e2);
22 foreach (qw(TimeRecording Customer)) {
23 "SL::DB::Manager::${_}"->delete_all(all => 1);
25 SL::DB::Manager::Employee->delete_all(where => [ '!login' => 'unittests' ]);
28 ########################################
30 $s1 = DateTime->now_local;
35 @time_recordings = ();
36 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1);
38 ok( $time_recordings[0]->is_time_in_wrong_order, 'same start and end detected' );
39 ok( !$time_recordings[0]->is_time_overlapping, 'not overlapping if only one time recording entry in db' );
42 $time_recordings[0]->end_time(undef);
43 ok( !$time_recordings[0]->is_time_in_wrong_order, 'order ok if no end' );
45 ########################################
46 # ------------s1-----e1-----
47 # --s2---e2-----------------
49 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
50 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
51 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
52 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 11, minute => 0);
56 @time_recordings = ();
57 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
58 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2)->save;
60 ok( !$time_recordings[0]->is_time_overlapping, 'not overlapping: completely before 1' );
61 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: completely before 2' );
64 # -------s1-----e1----------
65 # --s2---e2-----------------
67 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
68 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
69 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
70 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
74 @time_recordings = ();
75 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
76 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2)->save;
78 ok( !$time_recordings[0]->is_time_overlapping, 'not overlapping: before 1' );
79 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: before 2' );
81 # ---s1-----e1--------------
82 # ---------------s2---e2----
84 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
85 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
86 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 13, minute => 0);
87 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
91 @time_recordings = ();
92 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
93 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2)->save;
95 ok( !$time_recordings[0]->is_time_overlapping, 'not overlapping: completely after 1' );
96 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: completely after 2' );
98 # ---s1-----e1--------------
99 # ----------s2---e2---------
100 # -> does not overlap
101 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
102 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
103 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
104 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
108 @time_recordings = ();
109 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
110 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2)->save;
112 ok( !$time_recordings[0]->is_time_overlapping, 'not overlapping: after 1' );
113 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: after 2' );
115 # -------s1-----e1----------
116 # ---s2-----e2--------------
118 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
119 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
120 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 9, minute => 0);
121 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
125 @time_recordings = ();
126 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
127 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
129 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: start before, end inbetween' );
131 # -------s1-----e1----------
132 # -----------s2-----e2------
134 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
135 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
136 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
137 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
141 @time_recordings = ();
142 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
143 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
145 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: start inbetween, end after' );
147 # ---s1---------e1----------
148 # ------s2---e2-------------
150 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
151 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
152 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
153 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
157 @time_recordings = ();
158 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
159 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
161 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: completely inbetween' );
164 # ------s1---e1-------------
165 # ---s2---------e2----------
167 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
168 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
169 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
170 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
174 @time_recordings = ();
175 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
176 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
178 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: completely oudside' );
181 # ---s1---e1----------------
182 # ---s2---------e2----------
184 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
185 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
186 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
187 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
191 @time_recordings = ();
192 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
193 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
195 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: same start, end outside' );
197 # ---s1------e1-------------
198 # ------s2---e2-------------
200 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
201 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
202 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
203 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
207 @time_recordings = ();
208 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
209 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
211 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: start after, same end' );
213 # ---s1------e1-------------
214 # ------s2------------------
217 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
218 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
219 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
224 @time_recordings = ();
225 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
226 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
228 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: start inbetween, no end' );
230 # ---s1------e1-------------
231 # ---s2---------------------
234 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
235 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
236 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
241 @time_recordings = ();
242 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
243 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
245 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: same start, no end' );
247 # -------s1------e1---------
248 # ---s2---------------------
250 # -> does not overlap
251 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
252 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
253 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
258 @time_recordings = ();
259 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
260 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
262 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: start before, no end' );
264 # -------s1------e1---------
265 # -------------------s2-----
267 # -> does not overlap
268 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
269 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
270 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 16, minute => 0);
275 @time_recordings = ();
276 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
277 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
279 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: start after, no end' );
281 # -------s1------e1---------
282 # ---------------s2---------
284 # -> does not overlap
286 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
287 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
288 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
293 @time_recordings = ();
294 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
295 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
297 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: same start as other end, no end' );
299 # -------s1------e1---------
300 # -----------e2-------------
303 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
304 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
306 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
310 @time_recordings = ();
311 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
312 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
314 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: no start, end inbetween' );
316 # -------s1------e1---------
317 # ---------------e2---------
320 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
321 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
323 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
327 @time_recordings = ();
328 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
329 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
331 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: no start, same end' );
333 # -------s1------e1---------
334 # --e2----------------------
336 # -> does not overlap
337 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
338 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
340 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
344 @time_recordings = ();
345 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
346 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
348 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no start, end before' );
350 # -------s1------e1---------
351 # -------------------e2-----
353 # -> does not overlap
354 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
355 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
357 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 17, minute => 0);
361 @time_recordings = ();
362 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
363 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
365 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no start, end after' );
367 # -------s1------e1---------
368 # -------e2-----------------
370 # -> does not overlap
371 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
372 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
374 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
378 @time_recordings = ();
379 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
380 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
382 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no start, same end as other start' );
384 # ----s1--------------------
385 # ----s2-----e2-------------
388 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
390 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
391 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
395 @time_recordings = ();
396 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
397 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
399 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: no end in db, same start' );
401 # --------s1----------------
402 # ----s2-----e2-------------
404 # -> does not overlap
405 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
407 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
408 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
412 @time_recordings = ();
413 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
414 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
416 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, enclosing' );
418 # ---s1---------------------
419 # ---------s2-----e2--------
421 # -> does not overlap
422 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
424 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
425 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
429 @time_recordings = ();
430 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
431 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
433 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, completely after' );
435 # ---------s1---------------
436 # --------------------------
438 # -> does not overlap
439 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
446 @time_recordings = ();
447 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
448 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
450 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, no times in object' );
452 # ---------s1---------------
453 # -----s2-------------------
455 # -> does not overlap
456 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
458 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
463 @time_recordings = ();
464 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
465 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
467 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, start before, no end in object' );
469 # ---------s1---------------
470 # -------------s2-----------
472 # -> does not overlap
473 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
475 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
480 @time_recordings = ();
481 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
482 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
484 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, start after, no end in object' );
486 # ---------s1---------------
487 # ---------s2---------------
490 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
492 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
497 @time_recordings = ();
498 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
499 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
501 ok( $time_recordings[1]->is_time_overlapping, 'overlapping: no end in db, same start' );
503 # ---------s1---------------
504 # ---e2---------------------
506 # -> does not overlap
507 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
510 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
514 @time_recordings = ();
515 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
516 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
518 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, no start in object, end before' );
520 # ---------s1---------------
521 # ---------------e2---------
523 # -> does not overlap
524 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
527 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
531 @time_recordings = ();
532 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
533 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
535 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, no start in object, end after' );
537 # ---------s1---------------
538 # ---------e2---------------
540 # -> does not overlap
541 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
544 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 12, minute => 0);
548 @time_recordings = ();
549 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
550 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
552 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping: no end in db, no start in object, same end' );
554 ########################################
555 # not overlapping if different staff_member
556 $s1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 10, minute => 0);
557 $e1 = DateTime->new(year => 2020, month => 11, day => 15, hour => 15, minute => 0);
558 $s2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 11, minute => 0);
559 $e2 = DateTime->new(year => 2020, month => 11, day => 15, hour => 14, minute => 0);
563 @time_recordings = ();
564 push @time_recordings, new_time_recording(start_time => $s1, end_time => $e1)->save;
565 push @time_recordings, new_time_recording(start_time => $s2, end_time => $e2);
567 ok( $time_recordings[1]->is_time_overlapping, 'overlapping if same staff member' );
568 $time_recordings[1]->update_attributes(staff_member => SL::DB::Employee->new(
569 'login' => 'testuser',
570 'name' => 'Test User',
572 ok( !$time_recordings[1]->is_time_overlapping, 'not overlapping if different staff member' );
579 # set emacs to perl mode