Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
211
tests/Framework/Validation/Rules/DateFormatTest.php
Normal file
211
tests/Framework/Validation/Rules/DateFormatTest.php
Normal file
@@ -0,0 +1,211 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use App\Framework\Validation\Rules\DateFormat;
|
||||
|
||||
test('validates empty values as true (handled by Required rule)', function () {
|
||||
$rule = new DateFormat('Y-m-d');
|
||||
|
||||
expect($rule->validate(null))->toBeTrue()
|
||||
->and($rule->validate(''))->toBeTrue();
|
||||
});
|
||||
|
||||
test('validates non-string values as false', function () {
|
||||
$rule = new DateFormat('Y-m-d');
|
||||
|
||||
expect($rule->validate(123))->toBeFalse()
|
||||
->and($rule->validate(['not', 'a', 'date']))->toBeFalse()
|
||||
->and($rule->validate(new stdClass()))->toBeFalse()
|
||||
->and($rule->validate(true))->toBeFalse()
|
||||
->and($rule->validate(12.34))->toBeFalse();
|
||||
});
|
||||
|
||||
test('validates Y-m-d format correctly', function () {
|
||||
$rule = new DateFormat('Y-m-d');
|
||||
|
||||
// Valid dates
|
||||
expect($rule->validate('2024-01-15'))->toBeTrue()
|
||||
->and($rule->validate('2023-12-31'))->toBeTrue()
|
||||
->and($rule->validate('2000-02-29'))->toBeTrue() // Leap year
|
||||
->and($rule->validate('1999-01-01'))->toBeTrue();
|
||||
|
||||
// Invalid dates
|
||||
expect($rule->validate('2024-13-01'))->toBeFalse() // Invalid month
|
||||
->and($rule->validate('2024-01-32'))->toBeFalse() // Invalid day
|
||||
->and($rule->validate('2023-02-29'))->toBeFalse() // Not a leap year
|
||||
->and($rule->validate('24-01-15'))->toBeFalse() // Wrong year format
|
||||
->and($rule->validate('2024/01/15'))->toBeFalse() // Wrong separator
|
||||
->and($rule->validate('15-01-2024'))->toBeFalse() // Wrong order
|
||||
->and($rule->validate('not-a-date'))->toBeFalse();
|
||||
});
|
||||
|
||||
test('validates d.m.Y format correctly (German format)', function () {
|
||||
$rule = new DateFormat('d.m.Y');
|
||||
|
||||
// Valid dates
|
||||
expect($rule->validate('15.01.2024'))->toBeTrue()
|
||||
->and($rule->validate('31.12.2023'))->toBeTrue()
|
||||
->and($rule->validate('29.02.2000'))->toBeTrue() // Leap year
|
||||
->and($rule->validate('01.01.1999'))->toBeTrue();
|
||||
|
||||
// Invalid dates
|
||||
expect($rule->validate('32.01.2024'))->toBeFalse() // Invalid day
|
||||
->and($rule->validate('15.13.2024'))->toBeFalse() // Invalid month
|
||||
->and($rule->validate('29.02.2023'))->toBeFalse() // Not a leap year
|
||||
->and($rule->validate('15-01-2024'))->toBeFalse() // Wrong separator
|
||||
->and($rule->validate('2024.01.15'))->toBeFalse() // Wrong order
|
||||
->and($rule->validate('15/01/2024'))->toBeFalse(); // Wrong separator
|
||||
});
|
||||
|
||||
test('validates Y-m-d H:i:s format correctly (datetime)', function () {
|
||||
$rule = new DateFormat('Y-m-d H:i:s');
|
||||
|
||||
// Valid datetimes
|
||||
expect($rule->validate('2024-01-15 14:30:25'))->toBeTrue()
|
||||
->and($rule->validate('2023-12-31 23:59:59'))->toBeTrue()
|
||||
->and($rule->validate('2000-01-01 00:00:00'))->toBeTrue();
|
||||
|
||||
// Invalid datetimes
|
||||
expect($rule->validate('2024-01-15 25:30:25'))->toBeFalse() // Invalid hour
|
||||
->and($rule->validate('2024-01-15 14:60:25'))->toBeFalse() // Invalid minute
|
||||
->and($rule->validate('2024-01-15 14:30:60'))->toBeFalse() // Invalid second
|
||||
->and($rule->validate('2024-01-15'))->toBeFalse() // Missing time
|
||||
->and($rule->validate('2024-01-15T14:30:25'))->toBeFalse(); // Wrong separator
|
||||
});
|
||||
|
||||
test('validates H:i format correctly (time only)', function () {
|
||||
$rule = new DateFormat('H:i');
|
||||
|
||||
// Valid times
|
||||
expect($rule->validate('14:30'))->toBeTrue()
|
||||
->and($rule->validate('00:00'))->toBeTrue()
|
||||
->and($rule->validate('23:59'))->toBeTrue();
|
||||
|
||||
// Invalid times
|
||||
expect($rule->validate('24:00'))->toBeFalse() // Invalid hour
|
||||
->and($rule->validate('14:60'))->toBeFalse() // Invalid minute
|
||||
->and($rule->validate('14:30:25'))->toBeFalse() // Too many parts
|
||||
->and($rule->validate('14'))->toBeFalse(); // Missing minute
|
||||
});
|
||||
|
||||
test('validates custom formats correctly', function () {
|
||||
// Month/Year format
|
||||
$monthYearRule = new DateFormat('m/Y');
|
||||
expect($monthYearRule->validate('01/2024'))->toBeTrue()
|
||||
->and($monthYearRule->validate('12/2023'))->toBeTrue()
|
||||
->and($monthYearRule->validate('13/2024'))->toBeFalse() // Invalid month
|
||||
->and($monthYearRule->validate('1/2024'))->toBeFalse(); // Single digit month (strict mode)
|
||||
|
||||
// Year only format
|
||||
$yearRule = new DateFormat('Y');
|
||||
expect($yearRule->validate('2024'))->toBeTrue()
|
||||
->and($yearRule->validate('1999'))->toBeTrue()
|
||||
->and($yearRule->validate('24'))->toBeFalse() // Wrong length
|
||||
->and($yearRule->validate('abcd'))->toBeFalse(); // Not a number
|
||||
});
|
||||
|
||||
test('strict mode validates exact format match', function () {
|
||||
$strictRule = new DateFormat('d.m.Y', strict: true);
|
||||
$nonStrictRule = new DateFormat('d.m.Y', strict: false);
|
||||
|
||||
// Diese Inputs sind technisch parsebar, aber nicht exakt im erwarteten Format
|
||||
$ambiguousInputs = [
|
||||
'5.1.2024', // Single digit day/month
|
||||
'05.1.2024', // Mixed format
|
||||
'5.01.2024', // Mixed format
|
||||
];
|
||||
|
||||
foreach ($ambiguousInputs as $input) {
|
||||
expect($strictRule->validate($input))->toBeFalse("Strict mode should reject: $input");
|
||||
expect($nonStrictRule->validate($input))->toBeTrue("Non-strict mode should accept: $input");
|
||||
}
|
||||
|
||||
// Exakt formatierte Inputs sollten in beiden Modi funktionieren
|
||||
expect($strictRule->validate('05.01.2024'))->toBeTrue()
|
||||
->and($nonStrictRule->validate('05.01.2024'))->toBeTrue();
|
||||
});
|
||||
|
||||
test('timezone parameter works correctly', function () {
|
||||
$utcRule = new DateFormat('Y-m-d H:i:s', timezone: 'UTC');
|
||||
$berlinRule = new DateFormat('Y-m-d H:i:s', timezone: 'Europe/Berlin');
|
||||
|
||||
$datetime = '2024-01-15 14:30:25';
|
||||
|
||||
// Beide sollten die gleiche Eingabe als gültig akzeptieren
|
||||
expect($utcRule->validate($datetime))->toBeTrue()
|
||||
->and($berlinRule->validate($datetime))->toBeTrue();
|
||||
});
|
||||
|
||||
test('default error message includes format and example', function () {
|
||||
$rule = new DateFormat('d.m.Y');
|
||||
$messages = $rule->getErrorMessages();
|
||||
|
||||
expect($messages)->toHaveCount(1);
|
||||
$message = $messages[0];
|
||||
|
||||
expect($message)->toContain('d.m.Y')
|
||||
->and($message)->toContain('15.01.2024'); // Should contain example
|
||||
});
|
||||
|
||||
test('custom error message overrides default', function () {
|
||||
$customRule = new DateFormat('Y-m-d', message: 'Falsches Datumsformat!');
|
||||
$messages = $customRule->getErrorMessages();
|
||||
|
||||
expect($messages)->toHaveCount(1)
|
||||
->and($messages[0])->toBe('Falsches Datumsformat!');
|
||||
});
|
||||
|
||||
test('validates common international date formats', function () {
|
||||
$formats = [
|
||||
'Y-m-d' => ['2024-01-15', '2024-12-31'], // ISO format
|
||||
'd/m/Y' => ['15/01/2024', '31/12/2024'], // UK format
|
||||
'm/d/Y' => ['01/15/2024', '12/31/2024'], // US format
|
||||
'd-m-Y' => ['15-01-2024', '31-12-2024'], // Alternative EU format
|
||||
'Y/m/d' => ['2024/01/15', '2024/12/31'], // Alternative ISO format
|
||||
'j.n.Y' => ['15.1.2024', '31.12.2024'], // German without leading zeros
|
||||
'F j, Y' => ['January 15, 2024', 'December 31, 2024'], // English text format
|
||||
'j F Y' => ['15 January 2024', '31 December 2024'], // Alternative English
|
||||
];
|
||||
|
||||
foreach ($formats as $format => $validDates) {
|
||||
$rule = new DateFormat($format, strict: false); // Non-strict for text formats
|
||||
|
||||
foreach ($validDates as $date) {
|
||||
expect($rule->validate($date))->toBeTrue("Format '$format' should accept '$date'");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test('validates edge cases and special dates', function () {
|
||||
$rule = new DateFormat('Y-m-d');
|
||||
|
||||
// Leap years
|
||||
expect($rule->validate('2024-02-29'))->toBeTrue() // 2024 is leap year
|
||||
->and($rule->validate('2023-02-29'))->toBeFalse() // 2023 is not leap year
|
||||
->and($rule->validate('2000-02-29'))->toBeTrue() // 2000 is leap year
|
||||
->and($rule->validate('1900-02-29'))->toBeFalse(); // 1900 is not leap year
|
||||
|
||||
// Month boundaries
|
||||
expect($rule->validate('2024-04-31'))->toBeFalse() // April has 30 days
|
||||
->and($rule->validate('2024-04-30'))->toBeTrue()
|
||||
->and($rule->validate('2024-02-30'))->toBeFalse() // February never has 30 days
|
||||
->and($rule->validate('2024-02-28'))->toBeTrue();
|
||||
});
|
||||
|
||||
test('performance with many date validations', function () {
|
||||
$rule = new DateFormat('Y-m-d');
|
||||
$validDate = '2024-01-15';
|
||||
|
||||
$startTime = microtime(true);
|
||||
|
||||
for ($i = 0; $i < 1000; $i++) {
|
||||
$rule->validate($validDate);
|
||||
}
|
||||
|
||||
$endTime = microtime(true);
|
||||
$duration = $endTime - $startTime;
|
||||
|
||||
// Should complete 1000 validations in less than 100ms
|
||||
expect($duration)->toBeLessThan(0.1);
|
||||
});
|
||||
Reference in New Issue
Block a user