SowHandlerTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. namespace Tests\Unit\AppGame;
  3. use Tests\TestCase;
  4. use App\Module\AppGame\Handler\Land\SowHandler;
  5. use App\Module\Farm\Validations\CropPlantValidation;
  6. use App\Module\Farm\Validators\SeedLandTypeValidator;
  7. use App\Module\Farm\Models\FarmLand;
  8. use App\Module\Farm\Enums\LAND_TYPE;
  9. use App\Module\Farm\Enums\LAND_STATUS;
  10. use Uraus\Kku\Request\RequestLandSow;
  11. use Uraus\Kku\Response\ResponseLandSow;
  12. /**
  13. * SowHandler单元测试
  14. *
  15. * 重点测试玫瑰种子的土地类型限制功能
  16. */
  17. class SowHandlerTest extends TestCase
  18. {
  19. /**
  20. * 测试用户ID
  21. */
  22. private int $testUserId = 1;
  23. /**
  24. * 玫瑰种子物品ID
  25. */
  26. private int $roseSeedItemId = 17;
  27. /**
  28. * 设置测试环境
  29. */
  30. protected function setUp(): void
  31. {
  32. parent::setUp();
  33. }
  34. /**
  35. * 测试RequestLandSow请求对象结构
  36. */
  37. public function testRequestLandSowStructure()
  38. {
  39. $request = new RequestLandSow();
  40. // 测试设置土地ID
  41. $request->setLandId(1);
  42. $this->assertEquals(1, $request->getLandId());
  43. // 测试设置种子物品ID
  44. $request->setItemId(17);
  45. $this->assertEquals(17, $request->getItemId());
  46. // 测试设置种子实例ID
  47. $request->setItemInstanceId(100);
  48. $this->assertEquals(100, $request->getItemInstanceId());
  49. }
  50. /**
  51. * 测试ResponseLandSow响应对象结构
  52. */
  53. public function testResponseLandSowStructure()
  54. {
  55. $response = new ResponseLandSow();
  56. $this->assertInstanceOf(ResponseLandSow::class, $response);
  57. }
  58. /**
  59. * 测试SowHandler类结构
  60. */
  61. public function testSowHandlerStructure()
  62. {
  63. $this->assertTrue(class_exists(SowHandler::class));
  64. // 验证SowHandler是BaseHandler的子类
  65. $reflection = new \ReflectionClass(SowHandler::class);
  66. $this->assertTrue($reflection->isSubclassOf(\App\Module\AppGame\Handler\BaseHandler::class));
  67. }
  68. /**
  69. * 测试种子土地类型验证器 - 玫瑰种子在普通土地种植失败
  70. */
  71. public function testSeedLandTypeValidator_RoseSeedOnNormalLandFails()
  72. {
  73. // 创建模拟的验证对象
  74. $validation = new CropPlantValidation([]);
  75. // 创建模拟的普通土地
  76. $normalLand = new FarmLand();
  77. $normalLand->id = 1;
  78. $normalLand->user_id = $this->testUserId;
  79. $normalLand->land_type = LAND_TYPE::NORMAL->value;
  80. $normalLand->status = LAND_STATUS::IDLE->value;
  81. // 设置土地到验证对象
  82. $validation->land = $normalLand;
  83. // 创建验证器
  84. $validator = new SeedLandTypeValidator($validation, ['land']);
  85. // 验证应该失败
  86. $result = $validator->validate($this->roseSeedItemId, []);
  87. $this->assertFalse($result);
  88. }
  89. /**
  90. * 测试种子土地类型验证器 - 玫瑰种子在金土地种植成功
  91. */
  92. public function testSeedLandTypeValidator_RoseSeedOnGoldLandSucceeds()
  93. {
  94. // 创建模拟的验证对象
  95. $validation = new CropPlantValidation([]);
  96. // 创建模拟的金土地
  97. $goldLand = new FarmLand();
  98. $goldLand->id = 2;
  99. $goldLand->user_id = $this->testUserId;
  100. $goldLand->land_type = LAND_TYPE::GOLD->value;
  101. $goldLand->status = LAND_STATUS::IDLE->value;
  102. // 设置土地到验证对象
  103. $validation->land = $goldLand;
  104. // 创建验证器
  105. $validator = new SeedLandTypeValidator($validation, ['land']);
  106. // 验证应该成功
  107. $result = $validator->validate($this->roseSeedItemId, []);
  108. $this->assertTrue($result);
  109. }
  110. /**
  111. * 测试普通种子在所有土地类型都能种植
  112. */
  113. public function testNormalSeedOnAllLandTypes()
  114. {
  115. // 使用现有的普通种子(假设ID为1,没有土地类型限制)
  116. $normalSeedId = 1;
  117. // 确保普通种子没有土地类型限制
  118. DB::table('farm_seeds')
  119. ->where('item_id', $normalSeedId)
  120. ->update(['allowed_land_types' => null]);
  121. // 创建用户物品
  122. $this->createTestUserItem($this->testUserId, $normalSeedId, 10);
  123. $landTypes = [
  124. LAND_TYPE::NORMAL->value,
  125. LAND_TYPE::RED->value,
  126. LAND_TYPE::BLACK->value,
  127. LAND_TYPE::GOLD->value,
  128. LAND_TYPE::BLUE->value,
  129. LAND_TYPE::PURPLE->value,
  130. ];
  131. foreach ($landTypes as $landType) {
  132. $land = $this->createTestLand($landType);
  133. $validation = new CropPlantValidation([
  134. 'user_id' => $this->testUserId,
  135. 'land_id' => $land->id,
  136. 'item_id' => $normalSeedId,
  137. 'item_instance_id' => 0
  138. ]);
  139. // 所有土地类型都应该验证通过
  140. $result = $validation->validated();
  141. $this->assertInstanceOf(CropPlantValidation::class, $result);
  142. }
  143. }
  144. /**
  145. * 清理测试数据
  146. */
  147. private function cleanupTestData(): void
  148. {
  149. try {
  150. // 清理测试用户的数据
  151. DB::table('farm_lands')->where('user_id', $this->testUserId)->delete();
  152. DB::table('item_users')->where('user_id', $this->testUserId)->delete();
  153. } catch (\Exception) {
  154. // 忽略清理错误,可能表不存在
  155. }
  156. }
  157. /**
  158. * 创建测试农场数据
  159. */
  160. private function createTestFarmData(): void
  161. {
  162. try {
  163. // 使用现有的玫瑰种子配置(item_id = 17)
  164. // 确保玫瑰种子有正确的土地类型限制
  165. DB::table('farm_seeds')
  166. ->where('item_id', $this->roseSeedItemId)
  167. ->update(['allowed_land_types' => json_encode([4, 5, 6])]);
  168. // 创建用户物品
  169. $this->createTestUserItem($this->testUserId, $this->roseSeedItemId, 10);
  170. } catch (\Exception) {
  171. // 忽略数据库错误
  172. }
  173. }
  174. /**
  175. * 创建测试土地
  176. */
  177. private function createTestLand(int $landType): FarmLand
  178. {
  179. return FarmLand::create([
  180. 'user_id' => $this->testUserId,
  181. 'land_type' => $landType,
  182. 'status' => LAND_STATUS::IDLE->value,
  183. 'position_x' => 1,
  184. 'position_y' => 1,
  185. ]);
  186. }
  187. /**
  188. * 创建测试用户物品
  189. */
  190. private function createTestUserItem(int $userId, int $itemId, int $quantity): void
  191. {
  192. try {
  193. DB::table('item_users')->insert([
  194. 'user_id' => $userId,
  195. 'item_id' => $itemId,
  196. 'quantity' => $quantity,
  197. 'instance_id' => 0,
  198. 'created_at' => now(),
  199. 'updated_at' => now(),
  200. ]);
  201. } catch (\Exception) {
  202. // 忽略插入错误
  203. }
  204. }
  205. }