/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 Lesser General Public License for more details. * * Copyright (c) 2002-2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.dialogs.scheduling; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ListBox; import com.google.gwtmockito.GwtMockitoTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.pentaho.gwt.widgets.client.controls.TimePicker; import org.pentaho.gwt.widgets.client.utils.CronParseException; import org.pentaho.gwt.widgets.client.utils.TimeUtil; import java.util.Calendar; import java.util.Date; import static org.junit.Assert.*; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.*; @RunWith( GwtMockitoTestRunner.class ) public class ScheduleEditorTest { private ScheduleEditor scheduleEditor; @Before public void setUp() throws Exception { scheduleEditor = mock( ScheduleEditor.class ); } @Test public void testGetDurationValues() throws Exception { doCallRealMethod().when( scheduleEditor ).getDurationValues(); final int daysListBoxItemText = 1; final int hoursListBoxItemText = 2; final int minutesListBoxItemText = 3; // block final String block = Style.Display.BLOCK.getCssName(); scheduleEditor.daysListBox = prepareLB( daysListBoxItemText, block ); scheduleEditor.hoursListBox = prepareLB( hoursListBoxItemText, block ); scheduleEditor.minutesListBox = prepareLB( minutesListBoxItemText, block ); ScheduleEditor.DurationValues durationValues = scheduleEditor.getDurationValues(); assertEquals( daysListBoxItemText, durationValues.days ); assertEquals( hoursListBoxItemText, durationValues.hours ); assertEquals( minutesListBoxItemText, durationValues.minutes ); // none final String none = Style.Display.NONE.getCssName(); scheduleEditor.daysListBox = prepareLB( daysListBoxItemText, none ); scheduleEditor.hoursListBox = prepareLB( hoursListBoxItemText, none ); scheduleEditor.minutesListBox = prepareLB( minutesListBoxItemText, none ); durationValues = scheduleEditor.getDurationValues(); assertEquals( 0, durationValues.days ); assertEquals( 0, durationValues.hours ); assertEquals( 0, durationValues.minutes ); } @Test public void testSetDurationFields() throws Exception { doCallRealMethod().when( scheduleEditor ).setDurationFields( anyLong() ); scheduleEditor.daysListBox = mock( ListBox.class ); scheduleEditor.hoursListBox = mock( ListBox.class ); scheduleEditor.minutesListBox = mock( ListBox.class ); scheduleEditor.blockoutEndTimePicker = mock( TimePicker.class ); int days = 2; int hours = 15; int minutes = 20; scheduleEditor.setDurationFields( days * ScheduleEditor.TIME.DAY.getTime() + hours * ScheduleEditor.TIME.HOUR.getTime() + minutes * ScheduleEditor.TIME.MINUTE.getTime() ); verify( scheduleEditor.daysListBox ).setSelectedIndex( days ); verify( scheduleEditor.hoursListBox ).setSelectedIndex( hours ); verify( scheduleEditor.minutesListBox ).setSelectedIndex( minutes ); verify( scheduleEditor.blockoutEndTimePicker, never() ).setHour( anyInt() ); scheduleEditor.setDurationFields( hours * ScheduleEditor.TIME.HOUR.getTime() + minutes * ScheduleEditor.TIME.MINUTE.getTime() ); verify( scheduleEditor.daysListBox ).setSelectedIndex( 0 ); verify( scheduleEditor.hoursListBox, times( 2 ) ).setSelectedIndex( hours ); verify( scheduleEditor.minutesListBox, times( 2 ) ).setSelectedIndex( minutes ); verify( scheduleEditor.blockoutEndTimePicker ).setHour( "3" ); verify( scheduleEditor.blockoutEndTimePicker ).setMinute( String.valueOf( minutes ) ); verify( scheduleEditor.blockoutEndTimePicker ).setTimeOfDay( TimeUtil.TimeOfDay.PM ); } @Test public void testReset() throws Exception { doCallRealMethod().when( scheduleEditor ).reset( any( Date.class ) ); scheduleEditor.runOnceEditor = mock( RunOnceEditor.class ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); scheduleEditor.cronEditor = mock( CronEditor.class ); final Date now = new Date(); scheduleEditor.reset( now ); verify( scheduleEditor.runOnceEditor ).reset( now ); verify( scheduleEditor.recurrenceEditor ).reset( now ); verify( scheduleEditor.cronEditor ).reset( now ); verify( scheduleEditor ).setScheduleType( ScheduleEditor.ScheduleType.RUN_ONCE ); } @Test public void testGetCronString() throws Exception { doCallRealMethod().when( scheduleEditor ).getCronString(); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.RUN_ONCE ); assertNull( scheduleEditor.getCronString() ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); final String reCronString = "reCronString"; when( scheduleEditor.recurrenceEditor.getCronString() ).thenReturn( reCronString ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.SECONDS ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MINUTES ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.HOURS ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.DAILY ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.WEEKLY ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MONTHLY ); assertEquals( reCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.YEARLY ); assertEquals( reCronString, scheduleEditor.getCronString() ); scheduleEditor.cronEditor = mock( CronEditor.class ); final String ceCronString = "ceCronString"; when( scheduleEditor.cronEditor.getCronString() ).thenReturn( ceCronString ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.CRON ); assertEquals( ceCronString, scheduleEditor.getCronString() ); when( scheduleEditor.getScheduleType() ).thenReturn( null ); try { scheduleEditor.getCronString(); fail(); } catch ( RuntimeException re ) { // expected } } @Test public void testSetCronString() throws Exception { doCallRealMethod().when( scheduleEditor ).setCronString( anyString() ); try { scheduleEditor.setCronString( "cronString" ); fail(); } catch ( CronParseException e ) { // expected } scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); final RecurrenceEditor.TemporalValue temporalValue = RecurrenceEditor.TemporalValue.DAILY; when( scheduleEditor.recurrenceEditor.getTemporalState() ).thenReturn( temporalValue ); final ScheduleEditor.ScheduleType scheduleType = ScheduleEditor.ScheduleType.DAILY; when( scheduleEditor.temporalValueToScheduleType( temporalValue ) ).thenReturn( scheduleType ); scheduleEditor.cronEditor = mock( CronEditor.class ); final String cronStr = "0 33 6 ? * 1"; scheduleEditor.setCronString( cronStr ); verify( scheduleEditor.recurrenceEditor ).inititalizeWithRecurrenceString( anyString() ); verify( scheduleEditor ).setScheduleType( scheduleType ); verify( scheduleEditor.cronEditor ).setCronString( cronStr ); final String cronStr1 = cronStr + " 1"; scheduleEditor.setCronString( cronStr1 ); verify( scheduleEditor.recurrenceEditor ).inititalizeWithRecurrenceString( anyString() ); // prev, not at this time verify( scheduleEditor ).setScheduleType( ScheduleEditor.ScheduleType.CRON ); verify( scheduleEditor.cronEditor ).setCronString( cronStr1 ); } @Test public void testSetRepeatInSecs() throws Exception { doCallRealMethod().when( scheduleEditor ).setRepeatInSecs( anyInt() ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); final RecurrenceEditor.TemporalValue temporalValue = RecurrenceEditor.TemporalValue.DAILY; when( scheduleEditor.recurrenceEditor.getTemporalState() ).thenReturn( temporalValue ); final ScheduleEditor.ScheduleType scheduleType = ScheduleEditor.ScheduleType.DAILY; when( scheduleEditor.temporalValueToScheduleType( temporalValue ) ).thenReturn( scheduleType ); final int repeatInSecs = 5; scheduleEditor.setRepeatInSecs( repeatInSecs ); verify( scheduleEditor.recurrenceEditor ).inititalizeWithRepeatInSecs( repeatInSecs ); verify( scheduleEditor ).setScheduleType( scheduleType ); } @Test public void testGetScheduleType() throws Exception { doCallRealMethod().when( scheduleEditor ).getScheduleType(); scheduleEditor.scheduleCombo = mock( ListBox.class ); final ScheduleEditor.ScheduleType scheduleType = ScheduleEditor.ScheduleType.DAILY; final String selectedTypeStr = scheduleType.toString(); when( scheduleEditor.scheduleCombo.getValue( anyInt() ) ).thenReturn( selectedTypeStr ); assertEquals( scheduleType, scheduleEditor.getScheduleType() ); } @Test public void testSetScheduleType() throws Exception { doCallRealMethod().when( scheduleEditor ).setScheduleType( any( ScheduleEditor.ScheduleType.class ) ); final ScheduleEditor.ScheduleType scheduleType = ScheduleEditor.ScheduleType.DAILY; scheduleEditor.scheduleCombo = mock( ListBox.class ); when( scheduleEditor.scheduleCombo.getItemCount() ).thenReturn( 5 ); when( scheduleEditor.scheduleCombo.getItemText( anyInt() ) ).thenReturn( "" ); final int index = 3; when( scheduleEditor.scheduleCombo.getItemText( index ) ).thenReturn( scheduleType.toString() ); scheduleEditor.setScheduleType( scheduleType ); verify( scheduleEditor.scheduleCombo ).setSelectedIndex( index ); } @Test public void testSetStartTime() throws Exception { doCallRealMethod().when( scheduleEditor ).setStartTime( anyString() ); scheduleEditor.runOnceEditor = mock( RunOnceEditor.class ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); final String startTime = "startTime"; scheduleEditor.setStartTime( startTime ); verify( scheduleEditor.runOnceEditor ).setStartTime( startTime ); verify( scheduleEditor.recurrenceEditor ).setStartTime( startTime ); } @Test public void testGetStartTime() throws Exception { doCallRealMethod().when( scheduleEditor ).getStartTime(); final String startTimeROE = "startTimeROE"; scheduleEditor.runOnceEditor = mock( RunOnceEditor.class ); when( scheduleEditor.runOnceEditor.getStartTime() ).thenReturn( startTimeROE ); final String startTimeRE = "startTimeRE"; scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); when( scheduleEditor.recurrenceEditor.getStartTime() ).thenReturn( startTimeRE ); final String startTimeCE = "startTimeC"; scheduleEditor.cronEditor = mock( CronEditor.class ); when( scheduleEditor.cronEditor.getStartTime() ).thenReturn( startTimeCE ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.RUN_ONCE ); assertEquals( startTimeROE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.SECONDS ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MINUTES ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.HOURS ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.DAILY ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.WEEKLY ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MONTHLY ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.YEARLY ); assertEquals( startTimeRE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.CRON ); assertEquals( startTimeCE, scheduleEditor.getStartTime() ); when( scheduleEditor.getScheduleType() ).thenReturn( null ); try { scheduleEditor.getStartTime(); fail(); } catch ( RuntimeException e ) { // expected } } @Test public void testSetStartDate() throws Exception { doCallRealMethod().when( scheduleEditor ).setStartDate( any( Date.class ) ); scheduleEditor.runOnceEditor = mock( RunOnceEditor.class ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); scheduleEditor.cronEditor = mock( CronEditor.class ); final Date startDate = new Date(); scheduleEditor.setStartDate( startDate ); verify( scheduleEditor.runOnceEditor ).setStartDate( startDate ); verify( scheduleEditor.recurrenceEditor ).setStartDate( startDate ); verify( scheduleEditor.cronEditor ).setStartDate( startDate ); } @Test public void testGetStartDate() throws Exception { doCallRealMethod().when( scheduleEditor ).getStartDate(); Date date = new Date(); scheduleEditor.runOnceEditor = mock( RunOnceEditor.class ); Calendar calendarRequest = Calendar.getInstance(); calendarRequest.setTime( date ); when( scheduleEditor.runOnceEditor.getStartDate() ).thenReturn( calendarRequest.getTime() ); when( scheduleEditor.runOnceEditor.getStartTime() ).thenReturn( "2:50:33 " + TimeUtil.TimeOfDay.PM.toString() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.RUN_ONCE ); final Date startDate = scheduleEditor.getStartDate(); Calendar calendarResponse = Calendar.getInstance(); calendarResponse.setTime( startDate ); assertEquals( calendarRequest.get( Calendar.YEAR ), calendarResponse.get( Calendar.YEAR ) ); assertEquals( calendarRequest.get( Calendar.MONTH ), calendarResponse.get( Calendar.MONTH ) ); assertEquals( calendarRequest.get( Calendar.DATE ), calendarResponse.get( Calendar.DATE ) ); assertEquals( 14, calendarResponse.get( Calendar.HOUR_OF_DAY ) ); assertEquals( 50, calendarResponse.get( Calendar.MINUTE ) ); assertEquals( 0, calendarResponse.get( Calendar.SECOND ) ); date = new Date(); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); when( scheduleEditor.recurrenceEditor.getStartDate() ).thenReturn( date ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.SECONDS ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MINUTES ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.HOURS ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.DAILY ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.WEEKLY ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MONTHLY ); assertEquals( date, scheduleEditor.getStartDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.YEARLY ); assertEquals( date, scheduleEditor.getStartDate() ); date = new Date(); scheduleEditor.cronEditor = mock( CronEditor.class ); when( scheduleEditor.cronEditor.getStartDate() ).thenReturn( date ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.CRON ); assertEquals( date, scheduleEditor.getStartDate() ); } @Test public void testSetEndDate() throws Exception { doCallRealMethod().when( scheduleEditor ).setEndDate( any( Date.class ) ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); scheduleEditor.cronEditor = mock( CronEditor.class ); final Date endDate = new Date(); scheduleEditor.setEndDate( endDate ); verify( scheduleEditor.recurrenceEditor ).setEndDate( endDate ); verify( scheduleEditor.cronEditor ).setEndDate( endDate ); } @Test public void testGetEndDate() throws Exception { doCallRealMethod().when( scheduleEditor ).getEndDate(); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.RUN_ONCE ); assertNull( scheduleEditor.getEndDate() ); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); Date date = new Date(); when( scheduleEditor.recurrenceEditor.getEndDate() ).thenReturn( date ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.SECONDS ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MINUTES ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.HOURS ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.DAILY ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.MONTHLY ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.WEEKLY ); assertEquals( date, scheduleEditor.getEndDate() ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.YEARLY ); assertEquals( date, scheduleEditor.getEndDate() ); date = new Date(); scheduleEditor.cronEditor = mock( CronEditor.class ); when( scheduleEditor.cronEditor.getEndDate() ).thenReturn( date ); when( scheduleEditor.getScheduleType() ).thenReturn( ScheduleEditor.ScheduleType.CRON ); assertEquals( date, scheduleEditor.getEndDate() ); } @Test public void testSetNoEndDate() throws Exception { doCallRealMethod().when( scheduleEditor ).setNoEndDate(); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); scheduleEditor.cronEditor = mock( CronEditor.class ); scheduleEditor.setNoEndDate(); verify( scheduleEditor.recurrenceEditor ).setNoEndDate(); verify( scheduleEditor.cronEditor ).setNoEndDate(); } @Test public void testSetEndBy() throws Exception { doCallRealMethod().when( scheduleEditor ).setEndBy(); scheduleEditor.recurrenceEditor = mock( RecurrenceEditor.class ); scheduleEditor.cronEditor = mock( CronEditor.class ); scheduleEditor.setEndBy(); verify( scheduleEditor.recurrenceEditor ).setEndBy(); verify( scheduleEditor.cronEditor ).setEndBy(); } private ListBox prepareLB( int itemText, String display ) { final ListBox lb = mock( ListBox.class ); final Element element = mock( Element.class ); final Style style = mock( Style.class ); when( style.getDisplay() ).thenReturn( display ); when( element.getStyle() ).thenReturn( style ); when( lb.getElement() ).thenReturn( element ); when( lb.getItemText( anyInt() ) ).thenReturn( String.valueOf( itemText ) ); return lb; } }