GridHelperDateTimeTest.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace Tests\Unit\UCore;
  3. use Tests\TestCase;
  4. use Carbon\Carbon;
  5. class GridHelperDateTimeTest extends TestCase
  6. {
  7. /**
  8. * 测试columnDateTime方法的时间格式化功能
  9. */
  10. public function testColumnDateTimeFormatting()
  11. {
  12. // 测试数据
  13. $testCases = [
  14. // 时间戳 (考虑时区,使用实际的时间戳转换结果)
  15. ['input' => 1640995200, 'expected' => date('Y-m-d H:i:s', 1640995200)],
  16. // Carbon实例
  17. ['input' => Carbon::parse('2023-06-15 14:30:45'), 'expected' => '2023-06-15 14:30:45'],
  18. // DateTime对象
  19. ['input' => new \DateTime('2023-12-25 23:59:59'), 'expected' => '2023-12-25 23:59:59'],
  20. // 字符串格式
  21. ['input' => '2023-07-20 10:15:30', 'expected' => '2023-07-20 10:15:30'],
  22. // 空值
  23. ['input' => null, 'expected' => '-'],
  24. ['input' => '', 'expected' => '-'],
  25. // 零值 (考虑时区)
  26. ['input' => 0, 'expected' => date('Y-m-d H:i:s', 0)],
  27. ];
  28. foreach ($testCases as $case) {
  29. $result = $this->simulateColumnDateTimeDisplay($case['input']);
  30. $inputStr = is_object($case['input']) ? get_class($case['input']) : var_export($case['input'], true);
  31. $this->assertEquals($case['expected'], $result,
  32. "输入 {$inputStr} 应该输出 {$case['expected']},实际输出 {$result}");
  33. }
  34. }
  35. /**
  36. * 测试优化后的columnCreatedAt和columnUpdatedAt方法
  37. */
  38. public function testOptimizedCreatedAtAndUpdatedAt()
  39. {
  40. // 测试创建时间格式化
  41. $createdAtTestCases = [
  42. ['input' => '2023-01-01 12:00:00', 'expected' => '2023-01-01 12:00:00'],
  43. ['input' => 1672574400, 'expected' => date('Y-m-d H:i:s', 1672574400)],
  44. ['input' => null, 'expected' => '-'],
  45. ];
  46. foreach ($createdAtTestCases as $case) {
  47. $result = $this->simulateColumnDateTimeDisplay($case['input']);
  48. $this->assertEquals($case['expected'], $result,
  49. "columnCreatedAt 输入 {$case['input']} 应该输出 {$case['expected']},实际输出 {$result}");
  50. }
  51. // 测试更新时间格式化
  52. $updatedAtTestCases = [
  53. ['input' => '2023-12-31 23:59:59', 'expected' => '2023-12-31 23:59:59'],
  54. ['input' => 1704067199, 'expected' => date('Y-m-d H:i:s', 1704067199)],
  55. ['input' => '', 'expected' => '-'],
  56. ];
  57. foreach ($updatedAtTestCases as $case) {
  58. $result = $this->simulateColumnDateTimeDisplay($case['input']);
  59. $this->assertEquals($case['expected'], $result,
  60. "columnUpdatedAt 输入 {$case['input']} 应该输出 {$case['expected']},实际输出 {$result}");
  61. }
  62. }
  63. /**
  64. * 模拟columnDateTime的display回调函数
  65. */
  66. private function simulateColumnDateTimeDisplay($value)
  67. {
  68. // 这里复制columnDateTime方法中display回调的逻辑
  69. // 检查空值(但不包括0,因为0是有效的时间戳)
  70. if (is_null($value) || $value === '') {
  71. return '-';
  72. }
  73. // 如果是时间戳,转换为日期时间字符串
  74. if (is_numeric($value)) {
  75. return date('Y-m-d H:i:s', $value);
  76. }
  77. // 如果是Carbon实例或DateTime对象
  78. if ($value instanceof \Carbon\Carbon || $value instanceof \DateTime) {
  79. return $value->format('Y-m-d H:i:s');
  80. }
  81. // 如果是字符串,尝试转换为标准格式
  82. if (is_string($value)) {
  83. try {
  84. $date = new \DateTime($value);
  85. return $date->format('Y-m-d H:i:s');
  86. } catch (\Exception $e) {
  87. return $value; // 如果转换失败,返回原值
  88. }
  89. }
  90. return $value;
  91. }
  92. }