/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo MES * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.mes.basic.shift; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import java.util.List; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.qcadoo.commons.dateTime.DateRange; import com.qcadoo.commons.dateTime.TimeRange; import com.qcadoo.mes.basic.constants.ShiftFields; import com.qcadoo.mes.basic.constants.ShiftTimetableExceptionFields; import com.qcadoo.mes.basic.constants.TimetableExceptionType; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.EntityList; public class ShiftTest { @Mock private Entity shiftEntity; @Before public final void init() { MockitoAnnotations.initMocks(this); given(shiftEntity.copy()).willReturn(shiftEntity); EntityList emptyEntityList = mockEntityList(Lists.<Entity> newArrayList()); given(shiftEntity.getHasManyField(Mockito.anyString())).willReturn(emptyEntityList); } @Test public final void shouldParseTimeTableExceptions() { // given String hours = "6:00-12:00, 21:30-2:30"; given(shiftEntity.getStringField(ShiftFields.MONDAY_HOURS)).willReturn(hours); given(shiftEntity.getBooleanField(ShiftFields.MONDAY_WORKING)).willReturn(true); DateTime mondayMidnight = new DateTime(2013, 9, 2, 0, 0); DateTime freeTimeBegin = mondayMidnight.plusHours(8); DateTime freeTimeEnd = freeTimeBegin.plusHours(4); Entity freeTime = mockTimetableException(TimetableExceptionType.FREE_TIME, freeTimeBegin, freeTimeEnd); DateTime workTimeBegin = mondayMidnight.plusHours(20); DateTime workTimeEnd = workTimeBegin.plusHours(2); Entity workTime = mockTimetableException(TimetableExceptionType.WORK_TIME, workTimeBegin, workTimeEnd); EntityList timetableExceptionsList = mockEntityList(Lists.newArrayList(freeTime, workTime)); given(shiftEntity.getHasManyField(ShiftFields.TIMETABLE_EXCEPTIONS)).willReturn(timetableExceptionsList); // when Shift shift = new Shift(shiftEntity); // then assertTrue(shift.worksAt(DateTimeConstants.MONDAY, new LocalTime(10, 30))); assertFalse(shift.worksAt(DateTimeConstants.SUNDAY, new LocalTime(12, 0))); assertFalse(shift.worksAt(DateTimeConstants.MONDAY, new LocalTime(12, 01))); assertFalse(shift.worksAt(freeTimeBegin.plusHours(1).toDate())); assertTrue(shift.worksAt(freeTimeBegin.minusHours(1).toDate())); assertTrue(shift.worksAt(workTimeBegin.plusHours(1).toDate())); assertFalse(shift.worksAt(workTimeBegin.minusHours(1).toDate())); assertEquals(Optional.of(new DateRange(mondayMidnight.plusHours(6).toDate(), mondayMidnight.plusHours(12).toDate())), shift.findWorkTimeAt(mondayMidnight.plusHours(7).toDate())); assertFalse(shift.findWorkTimeAt(mondayMidnight.plusDays(2).toDate()).isPresent()); assertFalse(shift.findWorkTimeAt(mondayMidnight.plusHours(9).toDate()).isPresent()); } @Test public final void shouldReturnWorkingHoursForDay() { // given String hours = "6:00-12:00, 21:30-2:30"; given(shiftEntity.getStringField(ShiftFields.MONDAY_HOURS)).willReturn(hours); given(shiftEntity.getBooleanField(ShiftFields.MONDAY_WORKING)).willReturn(true); LocalDate mondayDate = new LocalDate(2013, 9, 2); // when Shift shift = new Shift(shiftEntity); List<TimeRange> timeRanges = shift.findWorkTimeAt(mondayDate); // then List<TimeRange> expectedTimeRanges = ImmutableList.of(new TimeRange(new LocalTime(6, 0), new LocalTime(12, 0)), new TimeRange(new LocalTime(21, 30), new LocalTime(2, 30))); assertEquals(expectedTimeRanges, timeRanges); } private EntityList mockEntityList(final List<Entity> entities) { EntityList entityList = mock(EntityList.class); given(entityList.iterator()).willReturn(entities.iterator()); given(entityList.isEmpty()).willReturn(entities.isEmpty()); return entityList; } private Entity mockTimetableException(final TimetableExceptionType type, final DateTime from, final DateTime to) { Entity timetableException = mock(Entity.class); given(timetableException.getStringField(ShiftTimetableExceptionFields.TYPE)).willReturn(type.getStringValue()); given(timetableException.getDateField(ShiftTimetableExceptionFields.FROM_DATE)).willReturn(from.toDate()); given(timetableException.getDateField(ShiftTimetableExceptionFields.TO_DATE)).willReturn(to.toDate()); return timetableException; } }