| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- namespace Tests\Unit\AppGame\Handler\Promotion;
- use Tests\TestCase;
- use App\Module\UrsPromotion\Models\UrsUserRelationCache;
- use App\Module\UrsPromotion\Services\UrsUserMappingService;
- use App\Module\User\Models\UserInfo;
- use Illuminate\Support\Facades\DB;
- use Carbon\Carbon;
- /**
- * getActiveStats 方法优化逻辑测试
- *
- * 测试使用 UrsUserRelationCache 和 UserInfo JOIN 查询优化后的活跃统计逻辑
- */
- class ActiveStatsLogicTest extends TestCase
- {
- /**
- * 测试优化后的活跃统计查询逻辑
- */
- public function test_optimized_active_stats_query_logic()
- {
- // 模拟查询逻辑
- $farmUserId = 20001;
- $activeThreshold = Carbon::now()->subHours(24);
- // 验证查询构建逻辑
- $query = UrsUserRelationCache::where('related_user_id', $farmUserId)
- ->where('depth', '<=', 3)
- ->join('kku_user_infos', 'kku_urs_promotion_user_relation_cache.user_id', '=', 'kku_user_infos.user_id')
- ->where('kku_user_infos.last_activity_time', '>=', $activeThreshold)
- ->selectRaw('
- COUNT(CASE WHEN depth = 1 THEN 1 END) as direct_active_count,
- COUNT(*) as team_active_count
- ');
- $actualSql = $query->toSql();
- // 验证SQL包含关键元素
- $this->assertStringContainsString('COUNT(CASE WHEN depth = 1 THEN 1 END)', $actualSql);
- $this->assertStringContainsString('COUNT(*) as team_active_count', $actualSql);
- $this->assertStringContainsString('inner join', $actualSql);
- $this->assertStringContainsString('related_user_id', $actualSql);
- $this->assertStringContainsString('`depth` <=', $actualSql);
- $this->assertStringContainsString('last_activity_time', $actualSql);
- }
- /**
- * 测试查询参数绑定
- */
- public function test_active_stats_query_bindings()
- {
- $farmUserId = 20001;
- $activeThreshold = Carbon::now()->subHours(24);
-
- $query = UrsUserRelationCache::where('related_user_id', $farmUserId)
- ->where('depth', '<=', 3)
- ->join('kku_user_infos', 'kku_urs_promotion_user_relation_cache.user_id', '=', 'kku_user_infos.user_id')
- ->where('kku_user_infos.last_activity_time', '>=', $activeThreshold)
- ->selectRaw('
- COUNT(CASE WHEN depth = 1 THEN 1 END) as direct_active_count,
- COUNT(*) as team_active_count
- ');
-
- $bindings = $query->getBindings();
-
- // 验证绑定参数
- $this->assertEquals($farmUserId, $bindings[0]);
- $this->assertEquals(3, $bindings[1]);
- $this->assertEquals($activeThreshold->format('Y-m-d H:i:s'), $bindings[2]);
- }
- /**
- * 测试优化前后的性能对比逻辑
- */
- public function test_active_stats_performance_comparison_logic()
- {
- // 优化前:需要多次查询
- // 1. 调用 UrsReferralService::getTeamMembers() - 1次查询
- // 2. 对每个团队成员调用 UrsUserMappingService::getFarmUserId() - N次查询
- // 3. 对每个团队成员调用 UserActivityService::getLastActivityTime() - N次查询
- // 总计:1 + 2N 次查询
- // 优化后:只需要1次查询
- // 1. 直接 JOIN 查询 UrsUserRelationCache 和 UserInfo 表 - 1次查询
- // 总计:1次查询
- $this->assertTrue(true, '活跃统计优化后查询次数从 1+2N 减少到 1');
- }
- /**
- * 测试活跃时间阈值逻辑
- */
- public function test_active_threshold_logic()
- {
- $now = Carbon::now();
- $activeThreshold = $now->copy()->subHours(24); // 使用copy避免修改原对象
- // 24小时内的时间应该被认为是活跃的
- $recentTime = $now->copy()->subHours(12);
- $this->assertTrue($recentTime->gte($activeThreshold), '12小时前的活动应该被认为是活跃的');
- // 超过24小时的时间不应该被认为是活跃的
- $oldTime = $now->copy()->subHours(30);
- $this->assertFalse($oldTime->gte($activeThreshold), '30小时前的活动不应该被认为是活跃的');
- }
- /**
- * 测试查询结果处理逻辑
- */
- public function test_active_stats_result_processing_logic()
- {
- // 模拟查询结果
- $mockResult = (object)[
- 'direct_active_count' => '3', // 数据库返回字符串
- 'team_active_count' => '8' // 数据库返回字符串
- ];
- // 模拟处理逻辑
- $directActiveCount = $mockResult->direct_active_count ?? 0;
- $teamActiveCount = $mockResult->team_active_count ?? 0;
- $result = [
- 'direct_active_count' => (int)$directActiveCount,
- 'team_active_count' => (int)$teamActiveCount
- ];
- // 验证结果格式
- $this->assertEquals([
- 'direct_active_count' => 3,
- 'team_active_count' => 8
- ], $result);
-
- // 验证数据类型
- $this->assertIsInt($result['direct_active_count']);
- $this->assertIsInt($result['team_active_count']);
- }
- /**
- * 测试空结果处理逻辑
- */
- public function test_active_stats_empty_result_processing_logic()
- {
- // 模拟空查询结果
- $mockResult = null;
- // 模拟处理逻辑
- $directActiveCount = $mockResult->direct_active_count ?? 0;
- $teamActiveCount = $mockResult->team_active_count ?? 0;
- $result = [
- 'direct_active_count' => (int)$directActiveCount,
- 'team_active_count' => (int)$teamActiveCount
- ];
- // 验证空结果处理
- $this->assertEquals([
- 'direct_active_count' => 0,
- 'team_active_count' => 0
- ], $result);
- }
- /**
- * 测试层级统计逻辑
- */
- public function test_active_stats_depth_counting_logic()
- {
- // 验证层级统计逻辑
- // depth = 1: 直推关系
- // depth <= 3: 团队关系(包含直推、间推、三推)
-
- $this->assertTrue(1 <= 3, 'depth=1 应该被包含在团队活跃统计中');
- $this->assertTrue(2 <= 3, 'depth=2 应该被包含在团队活跃统计中');
- $this->assertTrue(3 <= 3, 'depth=3 应该被包含在团队活跃统计中');
- $this->assertFalse(4 <= 3, 'depth=4 不应该被包含在团队活跃统计中');
- }
- /**
- * 测试JOIN查询逻辑
- */
- public function test_join_query_logic()
- {
- // 验证JOIN查询的表关联逻辑
- $relationTable = 'kku_urs_promotion_user_relation_cache';
- $userInfoTable = 'kku_user_infos';
- $joinCondition = 'kku_urs_promotion_user_relation_cache.user_id = kku_user_infos.user_id';
-
- // 模拟JOIN查询构建
- $this->assertStringContainsString($relationTable, $joinCondition);
- $this->assertStringContainsString($userInfoTable, $joinCondition);
- $this->assertStringContainsString('user_id', $joinCondition);
- }
- }
|