*/
public function filterDay($day)
{
- // TODO: check input format
+ if (! checkDateFormat('Ymd', $day)) {
+ throw new Exception('Invalid date format');
+ }
+
$filtered = array();
foreach ($this->links as $l) {
if (startsWith($l['linkdate'], $day)) {
$link['description'] = escape($link['description']);
$link['tags'] = escape($link['tags']);
}
+
+/**
+ * Checks if a string represents a valid date
+ *
+ * @param string a string-formatted date
+ * @param format the expected DateTime format of the string
+ * @return whether the string is a valid date
+ * @see http://php.net/manual/en/class.datetime.php
+ * @see http://php.net/manual/en/datetime.createfromformat.php
+ */
+function checkDateFormat($format, $string)
+{
+ $date = DateTime::createFromFormat($format, $string);
+ return $date && $date->format($string) == $string;
+}
?>
if ($i<count($days)-1) $nextday=$days[$i+1];
}
- $linksToDisplay=$LINKSDB->filterDay($day);
+ try {
+ $linksToDisplay = $LINKSDB->filterDay($day);
+ } catch (Exception $exc) {
+ error_log($exc);
+ $linksToDisplay = [];
+ }
+
// We pre-format some fields for proper output.
foreach($linksToDisplay as $key=>$link)
{
/**
* Use an invalid date format
+ * @expectedException Exception
+ * @expectedExceptionMessageRegExp /Invalid date format/
*/
- public function testFilterInvalidDay()
+ public function testFilterInvalidDayWithChars()
{
- $this->assertEquals(
- 0,
- sizeof(self::$privateLinkDB->filterDay('Rainy day, dream away'))
- );
+ self::$privateLinkDB->filterDay('Rainy day, dream away');
+ }
- // TODO: check input format
- $this->assertEquals(
- 6,
- sizeof(self::$privateLinkDB->filterDay('20'))
- );
+ /**
+ * Use an invalid date format
+ * @expectedException Exception
+ * @expectedExceptionMessageRegExp /Invalid date format/
+ */
+ public function testFilterInvalidDayDigits()
+ {
+ self::$privateLinkDB->filterDay('20');
}
/**
$this->assertTrue(endsWith('å!ùµ', 'ùµ', false));
$this->assertTrue(endsWith('µ$åù', 'åù', true));
}
+
+ /**
+ * Check valid date strings, according to a DateTime format
+ */
+ public function testCheckValidDateFormat()
+ {
+ $this->assertTrue(checkDateFormat('Ymd', '20150627'));
+ $this->assertTrue(checkDateFormat('Y-m-d', '2015-06-27'));
+ }
+
+ /**
+ * Check erroneous date strings, according to a DateTime format
+ */
+ public function testCheckInvalidDateFormat()
+ {
+ $this->assertFalse(checkDateFormat('Ymd', '2015'));
+ $this->assertFalse(checkDateFormat('Y-m-d', '2015-06'));
+ $this->assertFalse(checkDateFormat('Ymd', 'DeLorean'));
+ }
}
?>