DateHelperTest.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace Tests\Unit\Helpers;
  3. use App\Helpers\DateHelper;
  4. use Carbon\Exceptions\InvalidDateException;
  5. use PHPUnit\Framework\TestCase;
  6. class DateHelperTest extends TestCase
  7. {
  8. public function test_excel_date_to_iso_date_converts_correctly(): void
  9. {
  10. // Excel date 44927 = 2023-01-01
  11. $this->assertEquals('2023-01-01', DateHelper::excelDateToISODate(44927));
  12. // Excel date 45292 = 2024-01-01
  13. $this->assertEquals('2024-01-01', DateHelper::excelDateToISODate(45292));
  14. // Excel date 25569 = 1970-01-01 (Unix epoch)
  15. $this->assertEquals('1970-01-01', DateHelper::excelDateToISODate(25569));
  16. }
  17. public function test_iso_date_to_excel_date_converts_correctly(): void
  18. {
  19. $this->assertEquals(44927, DateHelper::ISODateToExcelDate('2023-01-01'));
  20. $this->assertEquals(45292, DateHelper::ISODateToExcelDate('2024-01-01'));
  21. $this->assertEquals(25569, DateHelper::ISODateToExcelDate('1970-01-01'));
  22. }
  23. public function test_excel_date_conversion_is_reversible(): void
  24. {
  25. $excelDate = 45000;
  26. $isoDate = DateHelper::excelDateToISODate($excelDate);
  27. $backToExcel = DateHelper::ISODateToExcelDate($isoDate);
  28. $this->assertEquals($excelDate, $backToExcel);
  29. }
  30. public function test_get_human_date_returns_text_format_by_default(): void
  31. {
  32. $result = DateHelper::getHumanDate('2024-03-15');
  33. // Should contain month name in Russian
  34. $this->assertStringContainsString('марта', $result);
  35. $this->assertStringContainsString('15', $result);
  36. $this->assertStringContainsString('2024', $result);
  37. }
  38. public function test_get_human_date_returns_numeric_format_when_requested(): void
  39. {
  40. $result = DateHelper::getHumanDate('2024-03-15', true);
  41. $this->assertEquals('15.03.2024', $result);
  42. }
  43. public function test_is_date_validates_correct_dates(): void
  44. {
  45. $this->assertTrue(DateHelper::isDate('2024-01-01'));
  46. $this->assertTrue(DateHelper::isDate('2023-12-31'));
  47. $this->assertTrue(DateHelper::isDate('1990-06-15'));
  48. }
  49. public function test_is_date_rejects_invalid_dates(): void
  50. {
  51. $this->assertFalse(DateHelper::isDate('2024-13-01')); // Invalid month
  52. $this->assertFalse(DateHelper::isDate('2024-00-01')); // Invalid month
  53. $this->assertFalse(DateHelper::isDate('2024-01-32')); // Invalid day
  54. $this->assertFalse(DateHelper::isDate('24-01-01')); // Short year
  55. $this->assertFalse(DateHelper::isDate('01-01-2024')); // Wrong format
  56. $this->assertFalse(DateHelper::isDate('not-a-date'));
  57. }
  58. public function test_get_date_for_db_formats_correctly(): void
  59. {
  60. $this->assertEquals('2024-03-15', DateHelper::getDateForDB('March 15, 2024'));
  61. $this->assertEquals('2024-03-15', DateHelper::getDateForDB('15.03.2024'));
  62. }
  63. public function test_add_months_works_correctly(): void
  64. {
  65. $this->assertEquals('2024-04-01', DateHelper::addMonths('2024-01-01', 3));
  66. $this->assertEquals('2025-01-01', DateHelper::addMonths('2024-01-01', 12));
  67. $this->assertEquals('2023-10-01', DateHelper::addMonths('2024-01-01', -3));
  68. }
  69. public function test_get_date_of_week_returns_correct_date(): void
  70. {
  71. // Week 1 of 2024, Monday
  72. $result = DateHelper::getDateOfWeek(2024, 1, 1);
  73. $this->assertEquals('2024-01-01', $result);
  74. // Week 1 of 2024, Sunday
  75. $result = DateHelper::getDateOfWeek(2024, 1, 7);
  76. $this->assertEquals('2024-01-07', $result);
  77. }
  78. public function test_get_random_date_returns_valid_date(): void
  79. {
  80. $result = DateHelper::getRandomDate(1);
  81. $this->assertTrue(DateHelper::isDate($result));
  82. }
  83. public function test_get_random_date_throws_exception_for_invalid_years(): void
  84. {
  85. $this->expectException(InvalidDateException::class);
  86. DateHelper::getRandomDate(-1);
  87. }
  88. public function test_get_human_day_of_week_returns_russian_day_name(): void
  89. {
  90. // 2024-01-01 is Monday
  91. $result = DateHelper::getHumanDayOfWeek('2024-01-01');
  92. $this->assertEquals('Понедельник', $result);
  93. // 2024-01-07 is Sunday
  94. $result = DateHelper::getHumanDayOfWeek('2024-01-07');
  95. $this->assertEquals('Воскресенье', $result);
  96. }
  97. }