Fix triggered_by field in ScheduleDowntimeForm is not a select box
refs #4496
This commit is contained in:
parent
a44d17f0a6
commit
95d7a8a553
|
@ -35,6 +35,7 @@ use \Icinga\Web\Form\Element\DateTimePicker;
|
||||||
use \Icinga\Protocol\Commandpipe\Downtime;
|
use \Icinga\Protocol\Commandpipe\Downtime;
|
||||||
use \Icinga\Protocol\Commandpipe\Comment;
|
use \Icinga\Protocol\Commandpipe\Comment;
|
||||||
use \Icinga\Util\DateTimeFactory;
|
use \Icinga\Util\DateTimeFactory;
|
||||||
|
use \Monitoring\Backend;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Form for scheduling downtimes
|
* Form for scheduling downtimes
|
||||||
|
@ -51,6 +52,8 @@ class ScheduleDowntimeForm extends WithChildrenCommandForm
|
||||||
*/
|
*/
|
||||||
const TYPE_FLEXIBLE = 'flexible';
|
const TYPE_FLEXIBLE = 'flexible';
|
||||||
|
|
||||||
|
private $downtimes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize form
|
* Initialize form
|
||||||
*/
|
*/
|
||||||
|
@ -72,6 +75,55 @@ class ScheduleDowntimeForm extends WithChildrenCommandForm
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch all available downtimes from the database
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getCurrentDowntimes()
|
||||||
|
{
|
||||||
|
if (isset($this->downtimes)) {
|
||||||
|
return $this->downtimes;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cfg = $this->getConfiguration();
|
||||||
|
$preferences = $this->getUserPreferences();
|
||||||
|
$downtimes = Backend::getInstance($this->getRequest()->getParam('backend'))->select()
|
||||||
|
->from('downtime', array(
|
||||||
|
'host_name',
|
||||||
|
'service_description',
|
||||||
|
'downtime_scheduled_start_time',
|
||||||
|
'downtime_internal_downtime_id',
|
||||||
|
))->fetchAll();
|
||||||
|
|
||||||
|
$options = array();
|
||||||
|
foreach ($downtimes as $downtime)
|
||||||
|
{
|
||||||
|
$dt = DateTimeFactory::create($downtime->downtime_scheduled_start_time);
|
||||||
|
$date_format = $preferences->get('app.dateFormat', $cfg->get('app.dateFormat', 'd/m/Y'));
|
||||||
|
$time_format = $preferences->get('app.timeFormat', $cfg->get('app.timeFormat', 'g:i A'));
|
||||||
|
$label = sprintf(
|
||||||
|
'ID %s: %s%s starting @ %s',
|
||||||
|
$downtime->downtime_internal_downtime_id,
|
||||||
|
$downtime->host_name,
|
||||||
|
!empty($downtime->service_description) ? ' (' . $downtime->service_description . ')' : '',
|
||||||
|
$dt->format($date_format . ' ' . $time_format)
|
||||||
|
);
|
||||||
|
$options[$downtime->downtime_internal_downtime_id] = $label;
|
||||||
|
}
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the downtimes displayed by this form (used for testing)
|
||||||
|
*
|
||||||
|
* @param array $downtimes list of strings
|
||||||
|
*/
|
||||||
|
public function setCurrentDowntimes($downtimes)
|
||||||
|
{
|
||||||
|
$this->downtimes = $downtimes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the form's elements
|
* Create the form's elements
|
||||||
*/
|
*/
|
||||||
|
@ -108,25 +160,12 @@ class ScheduleDowntimeForm extends WithChildrenCommandForm
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
$this->addElement(
|
$this->addElement(
|
||||||
'text',
|
'select',
|
||||||
'triggered',
|
'triggered',
|
||||||
array(
|
array(
|
||||||
'label' => t('Triggered by'),
|
'label' => t('Triggered by'),
|
||||||
'value' => 0,
|
|
||||||
'required' => true,
|
'required' => true,
|
||||||
'validators' => array(
|
'multiOptions' => $this->getCurrentDowntimes()
|
||||||
array(
|
|
||||||
'Digits',
|
|
||||||
true
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'GreaterThan',
|
|
||||||
true,
|
|
||||||
array(
|
|
||||||
'min' => -1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,409 @@
|
||||||
|
<?php
|
||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
/**
|
||||||
|
* This file is part of Icinga 2 Web.
|
||||||
|
*
|
||||||
|
* Icinga 2 Web - Head for multiple monitoring backends.
|
||||||
|
* Copyright (C) 2013 Icinga Development Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* @copyright 2013 Icinga Development Team <info@icinga.org>
|
||||||
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2
|
||||||
|
* @author Icinga Development Team <info@icinga.org>
|
||||||
|
*/
|
||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
|
||||||
|
namespace Test\Monitoring\Forms\Command;
|
||||||
|
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
require_once realpath(__DIR__ . '/../../../../../../../library/Icinga/Test/BaseTestCase.php');
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
|
use Icinga\Test\BaseTestCase;
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
require_once 'Zend/Validate/Digits.php';
|
||||||
|
require_once 'Zend/Validate/GreaterThan.php';
|
||||||
|
require_once BaseTestCase::$libDir . '/Web/Form.php';
|
||||||
|
require_once BaseTestCase::$libDir . '/Util/DateTimeFactory.php';
|
||||||
|
require_once BaseTestCase::$libDir . '/Util/ConfigAwareFactory.php';
|
||||||
|
require_once BaseTestCase::$moduleDir . '/monitoring/application/forms/Command/ScheduleDowntimeForm.php';
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
|
use \DateTimeZone;
|
||||||
|
use \Icinga\Util\DateTimeFactory;
|
||||||
|
use \Monitoring\Form\Command\ScheduleDowntimeForm; // Used by constant FORM_CLASS
|
||||||
|
|
||||||
|
class ScheduleDowntimeFormTest extends BaseTestCase
|
||||||
|
{
|
||||||
|
const FORM_CLASS = 'Monitoring\Form\Command\ScheduleDowntimeForm';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the default time zone
|
||||||
|
*
|
||||||
|
* Utilizes singleton DateTimeFactory
|
||||||
|
*
|
||||||
|
* @backupStaticAttributes enabled
|
||||||
|
*/
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
date_default_timezone_set('UTC');
|
||||||
|
DateTimeFactory::setConfig(array('timezone' => new DateTimeZone('UTC')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCorrectFormElementCreation()
|
||||||
|
{
|
||||||
|
$formFixed = $this->createForm(self::FORM_CLASS);
|
||||||
|
$formFixed->setCurrentDowntimes(array('foo'));
|
||||||
|
$formFixed->buildForm();
|
||||||
|
$formFlexible = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'type' => 'flexible'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$formFlexible->setCurrentDowntimes(array('foo'));
|
||||||
|
$formFlexible->buildForm();
|
||||||
|
|
||||||
|
$form = $this->createForm(self::FORM_CLASS);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->buildForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCorrectValidationWithChildrend()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
'btn_submit' => 'foo',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertTrue(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Asserting a correct fixed downtime form to be considered valid'
|
||||||
|
);
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FLEXIBLE,
|
||||||
|
'hours' => '10',
|
||||||
|
'minutes' => '10',
|
||||||
|
'btn_submit' => 'foo'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertTrue(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Asserting a correct flexible downtime form to be considered valid'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMissingFlexibleDurationRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FLEXIBLE,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert missing hours and minutes in downtime form to cause failing validation'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMissingAuthorRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => '',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert missing author to cause validation errors in fixed downtime'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMissingCommentRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => '',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert missing comment to cause validation errors in fixed downtime'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidTriggeredFieldValueRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => 'OK',
|
||||||
|
'triggered' => 'HAHA',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert invalid trigger field to cause validation to fail'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidStartTimeRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => 'OK',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert incorrect start time to cause validation errors in fixed downtime'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidEndTimeRecognition()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => 'OK',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => 'DING',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert invalid endtime to cause validation errors in fixed downtime'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testInvalidHoursValueRecognitionInFlexibleDowntime()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => 'OK',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FLEXIBLE,
|
||||||
|
'hours' => '-1',
|
||||||
|
'minutes' => '12',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert negative hours to cause validation errors in flexible downtime'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidMinutesValueRecognitionInFlexibleDowntime()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'OK',
|
||||||
|
'comment' => 'OK',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FLEXIBLE,
|
||||||
|
'hours' => '12',
|
||||||
|
'minutes' => 'DING',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(true);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert non numeric valud to cause validation errors in flexible downtime '
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCorrectScheduleDowntimeWithoutChildrenForm()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
'btn_submit' => 'foo',
|
||||||
|
'childobjects' => '0',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(false);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertTrue(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert a correct schedule downtime without children form to be considered valid'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIncorrectChildObjectsRecognition() {
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
'childobjects' => 'AHA',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(false);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert and incorrect (non-numeric) childobjects value to cause validation errors'
|
||||||
|
);
|
||||||
|
|
||||||
|
$form = $this->createForm(
|
||||||
|
self::FORM_CLASS,
|
||||||
|
array(
|
||||||
|
'author' => 'TEST_AUTHOR',
|
||||||
|
'comment' => 'DING DING',
|
||||||
|
'triggered' => '0',
|
||||||
|
'starttime' => '17/07/2013 10:30 AM',
|
||||||
|
'endtime' => '18/07/2013 10:30 AM',
|
||||||
|
'type' => ScheduleDowntimeForm::TYPE_FIXED,
|
||||||
|
'hours' => '',
|
||||||
|
'minutes' => '',
|
||||||
|
'childobjects' => '4',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$form->setWithChildren(false);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
|
||||||
|
$this->assertFalse(
|
||||||
|
$form->isSubmittedAndValid(),
|
||||||
|
'Assert and incorrect (numeric) childobjects value to cause validation errors'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testTimeRange()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(self::FORM_CLASS);
|
||||||
|
$form->setCurrentDowntimes(array('foo'));
|
||||||
|
$form->buildForm();
|
||||||
|
|
||||||
|
$time1 = $form->getElement('starttime')->getValue();
|
||||||
|
$time2 = $form->getElement('endtime')->getValue();
|
||||||
|
|
||||||
|
$this->assertEquals(3600, ($time2 - $time1));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue