UrsRelationCacheTest.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace App\Module\UrsPromotion\Test;
  3. use App\Module\UrsPromotion\Logics\UrsRelationCacheLogic;
  4. use App\Module\UrsPromotion\Models\UrsUserReferral;
  5. use App\Module\UrsPromotion\Models\UrsUserRelationCache;
  6. use App\Module\UrsPromotion\Services\UrsReferralService;
  7. use App\Module\UrsPromotion\Services\UrsUserMappingService;
  8. use Illuminate\Foundation\Testing\RefreshDatabase;
  9. use Tests\TestCase;
  10. /**
  11. * URS关系缓存测试类
  12. */
  13. class UrsRelationCacheTest extends TestCase
  14. {
  15. use RefreshDatabase;
  16. private UrsRelationCacheLogic $logic;
  17. protected function setUp(): void
  18. {
  19. parent::setUp();
  20. $this->logic = new UrsRelationCacheLogic();
  21. }
  22. /**
  23. * 测试生成单个用户关系缓存
  24. */
  25. public function testGenerateUserRelationCache()
  26. {
  27. // 创建测试数据:A -> B -> C 的推荐关系
  28. $ursUserA = 1001;
  29. $ursUserB = 1002;
  30. $ursUserC = 1003;
  31. $farmUserA = 2001;
  32. $farmUserB = 2002;
  33. $farmUserC = 2003;
  34. // 模拟用户映射关系
  35. $this->mockUserMapping($ursUserA, $farmUserA);
  36. $this->mockUserMapping($ursUserB, $farmUserB);
  37. $this->mockUserMapping($ursUserC, $farmUserC);
  38. // 创建推荐关系:B推荐A,C推荐B
  39. $this->createReferral($ursUserA, $ursUserB, $farmUserA, $farmUserB);
  40. $this->createReferral($ursUserB, $ursUserC, $farmUserB, $farmUserC);
  41. // 生成用户A的关系缓存
  42. $result = $this->logic->generateUserRelationCache($ursUserA);
  43. $this->assertTrue($result);
  44. // 验证缓存数据
  45. $caches = UrsUserRelationCache::where('urs_user_id', $ursUserA)->get();
  46. $this->assertCount(2, $caches); // A应该有2个上级:B(直接)和C(间接)
  47. // 验证直接关系
  48. $directCache = $caches->where('depth', 1)->first();
  49. $this->assertNotNull($directCache);
  50. $this->assertEquals($farmUserA, $directCache->user_id);
  51. $this->assertEquals($farmUserB, $directCache->related_user_id);
  52. $this->assertEquals($ursUserA, $directCache->urs_user_id);
  53. $this->assertEquals($ursUserB, $directCache->urs_related_user_id);
  54. $this->assertEquals(1, $directCache->level);
  55. $this->assertEquals(1, $directCache->depth);
  56. // 验证间接关系
  57. $indirectCache = $caches->where('depth', 2)->first();
  58. $this->assertNotNull($indirectCache);
  59. $this->assertEquals($farmUserA, $indirectCache->user_id);
  60. $this->assertEquals($farmUserC, $indirectCache->related_user_id);
  61. $this->assertEquals($ursUserA, $indirectCache->urs_user_id);
  62. $this->assertEquals($ursUserC, $indirectCache->urs_related_user_id);
  63. $this->assertEquals(2, $indirectCache->level);
  64. $this->assertEquals(2, $indirectCache->depth);
  65. }
  66. /**
  67. * 测试清除用户关系缓存
  68. */
  69. public function testClearUserRelationCache()
  70. {
  71. $ursUserId = 1001;
  72. $farmUserId = 2001;
  73. // 创建测试缓存数据
  74. UrsUserRelationCache::create([
  75. 'user_id' => $farmUserId,
  76. 'related_user_id' => 2002,
  77. 'urs_user_id' => $ursUserId,
  78. 'urs_related_user_id' => 1002,
  79. 'level' => 1,
  80. 'path' => '2002',
  81. 'urs_path' => '1002',
  82. 'depth' => 1,
  83. ]);
  84. // 模拟用户映射
  85. $this->mockUserMapping($ursUserId, $farmUserId);
  86. // 清除缓存
  87. $result = $this->logic->clearUserRelationCache($ursUserId);
  88. $this->assertTrue($result);
  89. // 验证缓存已清除
  90. $count = UrsUserRelationCache::where('urs_user_id', $ursUserId)->count();
  91. $this->assertEquals(0, $count);
  92. }
  93. /**
  94. * 测试检查缓存完整性
  95. */
  96. public function testCheckRelationCacheIntegrity()
  97. {
  98. // 创建推荐关系但不生成缓存
  99. $this->createReferral(1001, 1002, 2001, 2002);
  100. $result = $this->logic->checkRelationCacheIntegrity();
  101. $this->assertArrayHasKey('total_users', $result);
  102. $this->assertArrayHasKey('users_with_cache', $result);
  103. $this->assertArrayHasKey('missing_users', $result);
  104. $this->assertEquals(1, $result['total_users']);
  105. $this->assertEquals(0, $result['users_with_cache']);
  106. $this->assertEquals(1, $result['missing_users']);
  107. }
  108. /**
  109. * 测试修复缓存问题
  110. */
  111. public function testFixRelationCacheIssues()
  112. {
  113. // 创建推荐关系
  114. $ursUserA = 1001;
  115. $ursUserB = 1002;
  116. $farmUserA = 2001;
  117. $farmUserB = 2002;
  118. $this->mockUserMapping($ursUserA, $farmUserA);
  119. $this->mockUserMapping($ursUserB, $farmUserB);
  120. $this->createReferral($ursUserA, $ursUserB, $farmUserA, $farmUserB);
  121. // 修复问题
  122. $result = $this->logic->fixRelationCacheIssues();
  123. $this->assertArrayHasKey('integrity', $result);
  124. $this->assertArrayHasKey('fixed', $result);
  125. $this->assertEquals(1, $result['fixed']['missing_users']);
  126. }
  127. /**
  128. * 创建推荐关系
  129. */
  130. private function createReferral(int $ursUserId, int $ursReferrerId, int $farmUserId, int $farmReferrerId): void
  131. {
  132. UrsUserReferral::create([
  133. 'urs_user_id' => $ursUserId,
  134. 'urs_referrer_id' => $ursReferrerId,
  135. 'user_id' => $farmUserId,
  136. 'referrer_id' => $farmReferrerId,
  137. 'referral_time' => now(),
  138. 'status' => UrsUserReferral::STATUS_VALID,
  139. ]);
  140. }
  141. /**
  142. * 模拟用户映射关系
  143. */
  144. private function mockUserMapping(int $ursUserId, int $farmUserId): void
  145. {
  146. // 这里应该模拟UrsUserMappingService::getFarmUserId方法
  147. // 在实际测试中,可能需要使用Mock或者创建真实的映射数据
  148. }
  149. }