getMethod('formatRelativeTime'); $method->setAccessible(true); return [$controller, $method]; } /** * 测试空值处理 */ public function testFormatRelativeTimeWithNull() { [$controller, $method] = $this->getController(); $result = $method->invoke($controller, null); $this->assertEquals('无', $result); $result = $method->invoke($controller, ''); $this->assertEquals('无', $result); } /** * 测试已过期时间 */ public function testFormatRelativeTimeWithPastTime() { [$controller, $method] = $this->getController(); $pastTime = Carbon::now()->subHours(1); $result = $method->invoke($controller, $pastTime); $this->assertStringContainsString('已过期', $result); $this->assertStringContainsString('text-danger', $result); } /** * 测试秒级时间差 */ public function testFormatRelativeTimeWithSeconds() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addSeconds(30); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('秒后', $result); $this->assertStringContainsString('text-warning', $result); } /** * 测试分钟级时间差 */ public function testFormatRelativeTimeWithMinutes() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addMinutes(30); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('分钟后', $result); $this->assertStringContainsString('text-info', $result); } /** * 测试小时级时间差 */ public function testFormatRelativeTimeWithHours() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addHours(5); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('小时后', $result); $this->assertStringContainsString('text-primary', $result); // 测试整数小时不显示小数 $this->assertStringContainsString('5小时后', $result); } /** * 测试小时级时间差的小数位数优化 */ public function testFormatRelativeTimeHoursDecimalOptimization() { [$controller, $method] = $this->getController(); // 测试3.5小时 $futureTime = Carbon::now()->addMinutes(210); // 3.5小时 $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('3.5小时后', $result); $this->assertStringNotContainsString('3.50', $result); // 测试3.97小时应该显示为4.0小时 $futureTime = Carbon::now()->addMinutes(238); // 约3.97小时 $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('小时后', $result); // 应该四舍五入到1位小数 $this->assertStringNotContainsString('3.97', $result); } /** * 测试天级时间差 */ public function testFormatRelativeTimeWithDays() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addDays(3); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('天后', $result); $this->assertStringContainsString('text-secondary', $result); } /** * 测试超过7天的时间差 */ public function testFormatRelativeTimeWithWeeks() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addDays(10); $result = $method->invoke($controller, $futureTime); // 超过7天应该显示具体日期 $this->assertStringContainsString($futureTime->format('Y-m-d H:i:s'), $result); } /** * 测试字符串时间输入 */ public function testFormatRelativeTimeWithStringInput() { [$controller, $method] = $this->getController(); $futureTimeString = Carbon::now()->addHours(2)->toDateTimeString(); $result = $method->invoke($controller, $futureTimeString); $this->assertStringContainsString('小时后', $result); $this->assertStringContainsString('text-primary', $result); } /** * 测试无效时间格式 */ public function testFormatRelativeTimeWithInvalidFormat() { [$controller, $method] = $this->getController(); $result = $method->invoke($controller, 'invalid-date-format'); $this->assertStringContainsString('时间格式错误', $result); $this->assertStringContainsString('text-muted', $result); } /** * 测试边界情况 - 正好1分钟 */ public function testFormatRelativeTimeExactlyOneMinute() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addMinutes(1); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('分钟后', $result); $this->assertStringContainsString('text-info', $result); } /** * 测试边界情况 - 正好1小时 */ public function testFormatRelativeTimeExactlyOneHour() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addHours(1); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('小时后', $result); $this->assertStringContainsString('text-primary', $result); } /** * 测试边界情况 - 正好1天 */ public function testFormatRelativeTimeExactlyOneDay() { [$controller, $method] = $this->getController(); $futureTime = Carbon::now()->addDays(1); $result = $method->invoke($controller, $futureTime); $this->assertStringContainsString('天后', $result); $this->assertStringContainsString('text-secondary', $result); } }