TestUrsDtoCommand.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace App\Module\UrsPromotion\Commands;
  3. use App\Module\UrsPromotion\Dtos\UrsUserMappingDto;
  4. use App\Module\UrsPromotion\Dtos\UrsUserReferralDto;
  5. use App\Module\UrsPromotion\Dtos\UrsUserTalentDto;
  6. use App\Module\UrsPromotion\Models\UrsUserMapping;
  7. use App\Module\UrsPromotion\Models\UrsUserReferral;
  8. use App\Module\UrsPromotion\Services\UrsUserMappingService;
  9. use App\Module\UrsPromotion\Services\UrsReferralService;
  10. use App\Module\UrsPromotion\Services\UrsTalentService;
  11. use Illuminate\Console\Command;
  12. /**
  13. * URS推广模块DTO测试命令
  14. *
  15. * 测试DTO类的创建和使用是否正常
  16. */
  17. class TestUrsDtoCommand extends Command
  18. {
  19. /**
  20. * 命令签名
  21. */
  22. protected $signature = 'urs:test-dto';
  23. /**
  24. * 命令描述
  25. */
  26. protected $description = '测试URS推广模块DTO功能';
  27. /**
  28. * 执行命令
  29. */
  30. public function handle()
  31. {
  32. $this->info('开始测试URS推广模块DTO功能...');
  33. try {
  34. // 测试1:创建测试数据
  35. $this->createTestData();
  36. // 测试2:直接从模型创建DTO
  37. $this->testDirectDtoCreation();
  38. // 测试3:通过服务层获取DTO
  39. $this->testServiceDtoReturn();
  40. // 测试4:测试其他服务的DTO返回
  41. $this->testOtherServiceDtos();
  42. $this->info('✅ 所有DTO测试通过!');
  43. } catch (\Exception $e) {
  44. $this->error('❌ DTO测试失败:' . $e->getMessage());
  45. $this->error('错误堆栈:' . $e->getTraceAsString());
  46. }
  47. }
  48. /**
  49. * 测试直接从模型创建DTO
  50. */
  51. private function testDirectDtoCreation()
  52. {
  53. $this->info('测试1:直接从模型创建DTO');
  54. // 查找一个映射记录
  55. $mapping = UrsUserMapping::first();
  56. if (!$mapping) {
  57. $this->warn('没有找到映射记录,跳过此测试');
  58. return;
  59. }
  60. // 创建DTO
  61. $dto = UrsUserMappingDto::fromModel($mapping);
  62. // 验证DTO属性
  63. $this->info("DTO ID: {$dto->id}");
  64. $this->info("URS用户ID: {$dto->ursUserId}");
  65. $this->info("农场用户ID: {$dto->userId}");
  66. $this->info("状态: {$dto->statusText}");
  67. // 测试DTO的toArray方法
  68. $array = $dto->toArray();
  69. $this->info('DTO转数组成功,包含 ' . count($array) . ' 个字段');
  70. $this->info('✅ 直接DTO创建测试通过');
  71. }
  72. /**
  73. * 测试通过服务层获取DTO
  74. */
  75. private function testServiceDtoReturn()
  76. {
  77. $this->info('测试2:通过服务层获取DTO');
  78. // 查找一个映射记录
  79. $mapping = UrsUserMapping::first();
  80. if (!$mapping) {
  81. $this->warn('没有找到映射记录,跳过此测试');
  82. return;
  83. }
  84. // 通过服务层获取DTO
  85. $dto = UrsUserMappingService::getMappingDetail($mapping->urs_user_id);
  86. if (!$dto) {
  87. throw new \Exception('服务层返回了null');
  88. }
  89. if (!($dto instanceof UrsUserMappingDto)) {
  90. throw new \Exception('服务层返回的不是UrsUserMappingDto实例');
  91. }
  92. $this->info("服务层返回DTO ID: {$dto->id}");
  93. $this->info("URS用户ID: {$dto->ursUserId}");
  94. $this->info("状态文本: {$dto->statusText}");
  95. $this->info('✅ 服务层DTO返回测试通过');
  96. }
  97. /**
  98. * 创建测试数据
  99. */
  100. private function createTestData()
  101. {
  102. $this->info('创建测试数据...');
  103. // 创建测试映射关系
  104. $mapping = UrsUserMapping::firstOrCreate(
  105. ['urs_user_id' => 9001],
  106. [
  107. 'user_id' => 8001,
  108. 'mapping_time' => now(),
  109. 'status' => UrsUserMapping::STATUS_VALID,
  110. ]
  111. );
  112. // 创建测试推荐关系
  113. UrsUserReferral::firstOrCreate(
  114. ['urs_user_id' => 9002],
  115. [
  116. 'urs_referrer_id' => 9001,
  117. 'referral_time' => now(),
  118. 'status' => UrsUserReferral::STATUS_VALID,
  119. ]
  120. );
  121. $this->info('测试数据创建完成');
  122. }
  123. /**
  124. * 测试其他服务的DTO返回
  125. */
  126. private function testOtherServiceDtos()
  127. {
  128. $this->info('测试4:测试其他服务的DTO返回');
  129. // 测试推荐关系服务
  130. try {
  131. $referralDto = UrsReferralService::createReferral(9003, 9001);
  132. if (!($referralDto instanceof UrsUserReferralDto)) {
  133. throw new \Exception('UrsReferralService::createReferral 返回的不是UrsUserReferralDto实例');
  134. }
  135. $this->info("推荐关系DTO创建成功: URS用户{$referralDto->ursUserId} <- URS推荐人{$referralDto->ursReferrerId}");
  136. } catch (\Exception $e) {
  137. $this->warn('推荐关系测试跳过: ' . $e->getMessage());
  138. }
  139. // 测试达人等级服务
  140. try {
  141. $talentDto = UrsTalentService::updateTalentLevel(9001);
  142. if (!($talentDto instanceof UrsUserTalentDto)) {
  143. throw new \Exception('UrsTalentService::updateTalentLevel 返回的不是UrsUserTalentDto实例');
  144. }
  145. $this->info("达人等级DTO更新成功: 等级{$talentDto->talentLevel}, 直推{$talentDto->directCount}人");
  146. } catch (\Exception $e) {
  147. $this->warn('达人等级测试跳过: ' . $e->getMessage());
  148. }
  149. // 测试获取达人信息
  150. try {
  151. $talentInfoDto = UrsTalentService::getTalentInfo(9001);
  152. if ($talentInfoDto && !($talentInfoDto instanceof UrsUserTalentDto)) {
  153. throw new \Exception('UrsTalentService::getTalentInfo 返回的不是UrsUserTalentDto实例');
  154. }
  155. if ($talentInfoDto) {
  156. $this->info("达人信息DTO获取成功: {$talentInfoDto->talentName}");
  157. } else {
  158. $this->info("达人信息DTO为空(正常情况)");
  159. }
  160. } catch (\Exception $e) {
  161. $this->warn('达人信息测试跳过: ' . $e->getMessage());
  162. }
  163. $this->info('✅ 其他服务DTO测试通过');
  164. }
  165. }