InfoHandlerTodayStatsUnitTest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace Tests\Unit\AppGame\Handler\Promotion;
  3. use Tests\TestCase;
  4. use App\Module\AppGame\Handler\Promotion\InfoHandler;
  5. use App\Module\UrsPromotion\Models\UrsUserRelationCache;
  6. use App\Module\UrsPromotion\Services\UrsUserMappingService;
  7. use Mockery;
  8. use Illuminate\Support\Facades\Log;
  9. /**
  10. * InfoHandler getTodayStats 方法优化单元测试
  11. *
  12. * 测试使用 UrsUserRelationCache 优化后的 getTodayStats 方法逻辑
  13. */
  14. class InfoHandlerTodayStatsUnitTest extends TestCase
  15. {
  16. private InfoHandler $handler;
  17. protected function setUp(): void
  18. {
  19. parent::setUp();
  20. $this->handler = new InfoHandler();
  21. }
  22. protected function tearDown(): void
  23. {
  24. Mockery::close();
  25. parent::tearDown();
  26. }
  27. /**
  28. * 测试优化后的 getTodayStats 方法 - 用户不存在映射关系
  29. */
  30. public function test_getTodayStats_user_not_mapped()
  31. {
  32. // Mock UrsUserMappingService::getFarmUserId 返回 null
  33. $mockService = Mockery::mock('alias:' . UrsUserMappingService::class);
  34. $mockService->shouldReceive('getFarmUserId')
  35. ->with(99999)
  36. ->once()
  37. ->andReturn(null);
  38. $result = $this->invokePrivateMethod($this->handler, 'getTodayStats', [99999]);
  39. $this->assertEquals([
  40. 'direct_new_count' => 0,
  41. 'team_new_count' => 0
  42. ], $result);
  43. }
  44. /**
  45. * 测试优化后的 getTodayStats 方法 - 有今日新增关系
  46. */
  47. public function test_getTodayStats_with_today_relations()
  48. {
  49. $ursUserId = 10001;
  50. $farmUserId = 20001;
  51. // Mock UrsUserMappingService::getFarmUserId
  52. $mockService = Mockery::mock('alias:' . UrsUserMappingService::class);
  53. $mockService->shouldReceive('getFarmUserId')
  54. ->with($ursUserId)
  55. ->once()
  56. ->andReturn($farmUserId);
  57. // Mock UrsUserRelationCache 查询结果
  58. $mockResult = (object)[
  59. 'direct_new_count' => 2,
  60. 'team_new_count' => 5
  61. ];
  62. $mockQuery = Mockery::mock();
  63. $mockQuery->shouldReceive('whereDate')
  64. ->with('created_at', today())
  65. ->once()
  66. ->andReturnSelf();
  67. $mockQuery->shouldReceive('selectRaw')
  68. ->once()
  69. ->andReturnSelf();
  70. $mockQuery->shouldReceive('first')
  71. ->once()
  72. ->andReturn($mockResult);
  73. $mockModel = Mockery::mock('alias:' . UrsUserRelationCache::class);
  74. $mockModel->shouldReceive('where')
  75. ->with('related_user_id', $farmUserId)
  76. ->once()
  77. ->andReturn($mockQuery);
  78. $result = $this->invokePrivateMethod($this->handler, 'getTodayStats', [$ursUserId]);
  79. $this->assertEquals([
  80. 'direct_new_count' => 2,
  81. 'team_new_count' => 5
  82. ], $result);
  83. }
  84. /**
  85. * 测试优化后的 getTodayStats 方法 - 无今日新增关系
  86. */
  87. public function test_getTodayStats_no_today_relations()
  88. {
  89. $ursUserId = 10001;
  90. $farmUserId = 20001;
  91. // Mock UrsUserMappingService::getFarmUserId
  92. $mockService = Mockery::mock('alias:' . UrsUserMappingService::class);
  93. $mockService->shouldReceive('getFarmUserId')
  94. ->with($ursUserId)
  95. ->once()
  96. ->andReturn($farmUserId);
  97. // Mock UrsUserRelationCache 查询结果 - 无数据
  98. $mockResult = (object)[
  99. 'direct_new_count' => 0,
  100. 'team_new_count' => 0
  101. ];
  102. $mockQuery = Mockery::mock();
  103. $mockQuery->shouldReceive('whereDate')
  104. ->with('created_at', today())
  105. ->once()
  106. ->andReturnSelf();
  107. $mockQuery->shouldReceive('selectRaw')
  108. ->once()
  109. ->andReturnSelf();
  110. $mockQuery->shouldReceive('first')
  111. ->once()
  112. ->andReturn($mockResult);
  113. $mockModel = Mockery::mock('alias:' . UrsUserRelationCache::class);
  114. $mockModel->shouldReceive('where')
  115. ->with('related_user_id', $farmUserId)
  116. ->once()
  117. ->andReturn($mockQuery);
  118. $result = $this->invokePrivateMethod($this->handler, 'getTodayStats', [$ursUserId]);
  119. $this->assertEquals([
  120. 'direct_new_count' => 0,
  121. 'team_new_count' => 0
  122. ], $result);
  123. }
  124. /**
  125. * 测试优化后的 getTodayStats 方法 - 异常处理
  126. */
  127. public function test_getTodayStats_exception_handling()
  128. {
  129. $ursUserId = 10001;
  130. // Mock UrsUserMappingService::getFarmUserId 抛出异常
  131. $mockService = Mockery::mock('alias:' . UrsUserMappingService::class);
  132. $mockService->shouldReceive('getFarmUserId')
  133. ->with($ursUserId)
  134. ->once()
  135. ->andThrow(new \Exception('Database error'));
  136. // Mock Log::error
  137. Log::shouldReceive('error')
  138. ->with('获取今日统计数据失败', [
  139. 'urs_user_id' => $ursUserId,
  140. 'error' => 'Database error'
  141. ])
  142. ->once();
  143. $result = $this->invokePrivateMethod($this->handler, 'getTodayStats', [$ursUserId]);
  144. $this->assertEquals([
  145. 'direct_new_count' => 0,
  146. 'team_new_count' => 0
  147. ], $result);
  148. }
  149. /**
  150. * 调用私有方法的辅助方法
  151. */
  152. private function invokePrivateMethod($object, $methodName, array $parameters = [])
  153. {
  154. $reflection = new \ReflectionClass(get_class($object));
  155. $method = $reflection->getMethod($methodName);
  156. $method->setAccessible(true);
  157. return $method->invokeArgs($object, $parameters);
  158. }
  159. }