DateHelperTest.php 4.4 KB

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