DisasterRemovalValidationTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace Tests\Unit\Farm;
  3. use Tests\TestCase;
  4. use App\Module\Farm\Validations\DisasterRemovalValidation;
  5. use App\Module\Farm\Validators\LandOwnershipValidator;
  6. use App\Module\Farm\Validators\DisasterRemovalItemValidator;
  7. use App\Module\Farm\Enums\DISASTER_TYPE;
  8. use App\Module\Farm\Models\FarmLand;
  9. use App\Module\GameItems\Services\ItemService;
  10. use Illuminate\Foundation\Testing\RefreshDatabase;
  11. use UCore\Exception\ValidateException;
  12. /**
  13. * 灾害去除验证测试
  14. */
  15. class DisasterRemovalValidationTest extends TestCase
  16. {
  17. use RefreshDatabase;
  18. /**
  19. * 测试验证规则
  20. */
  21. public function testValidationRules()
  22. {
  23. $validation = new DisasterRemovalValidation([]);
  24. $rules = $validation->rules();
  25. // 验证必填字段规则
  26. $this->assertNotEmpty($rules);
  27. // 检查是否包含必填字段验证
  28. $requiredRule = $rules[0];
  29. $this->assertEquals('user_id,land_id,item_id,disaster_type', $requiredRule[0]);
  30. $this->assertEquals('required', $requiredRule[1]);
  31. }
  32. /**
  33. * 测试缺少必填字段
  34. */
  35. public function testMissingRequiredFields()
  36. {
  37. $this->expectException(ValidateException::class);
  38. $validation = new DisasterRemovalValidation([
  39. 'user_id' => 1,
  40. // 缺少其他必填字段
  41. ]);
  42. $validation->validated();
  43. }
  44. /**
  45. * 测试字段类型验证
  46. */
  47. public function testFieldTypeValidation()
  48. {
  49. $this->expectException(ValidateException::class);
  50. $validation = new DisasterRemovalValidation([
  51. 'user_id' => 'invalid', // 应该是整数
  52. 'land_id' => 1,
  53. 'item_id' => 1,
  54. 'disaster_type' => DISASTER_TYPE::PEST->value
  55. ]);
  56. $validation->validated();
  57. }
  58. /**
  59. * 测试土地归属验证器
  60. */
  61. public function testLandOwnershipValidator()
  62. {
  63. // 创建测试用户和土地
  64. $userId = 1;
  65. $landId = 1;
  66. // Mock FarmLand 模型
  67. $this->mock(FarmLand::class, function ($mock) use ($userId, $landId) {
  68. $mock->shouldReceive('where')
  69. ->with('id', $landId)
  70. ->andReturnSelf();
  71. $mock->shouldReceive('where')
  72. ->with('user_id', $userId)
  73. ->andReturnSelf();
  74. $mock->shouldReceive('first')
  75. ->andReturn(new FarmLand()); // 返回土地实例表示验证通过
  76. });
  77. $validator = new LandOwnershipValidator(new DisasterRemovalValidation([]), ['user_id']);
  78. $result = $validator->validate($landId, ['user_id' => $userId]);
  79. $this->assertTrue($result);
  80. }
  81. /**
  82. * 测试土地归属验证失败
  83. */
  84. public function testLandOwnershipValidatorFail()
  85. {
  86. $userId = 1;
  87. $landId = 999; // 不存在的土地
  88. // Mock FarmLand 模型
  89. $this->mock(FarmLand::class, function ($mock) use ($userId, $landId) {
  90. $mock->shouldReceive('where')
  91. ->with('id', $landId)
  92. ->andReturnSelf();
  93. $mock->shouldReceive('where')
  94. ->with('user_id', $userId)
  95. ->andReturnSelf();
  96. $mock->shouldReceive('first')
  97. ->andReturn(null); // 返回null表示土地不存在
  98. });
  99. $validator = new LandOwnershipValidator(new DisasterRemovalValidation([]), ['user_id']);
  100. $result = $validator->validate($landId, ['user_id' => $userId]);
  101. $this->assertFalse($result);
  102. }
  103. /**
  104. * 测试灾害去除物品验证器
  105. */
  106. public function testDisasterRemovalItemValidator()
  107. {
  108. $userId = 1;
  109. $itemId = 123;
  110. $disasterType = DISASTER_TYPE::PEST->value;
  111. // Mock ItemService
  112. $this->mock(ItemService::class, function ($mock) use ($userId, $itemId) {
  113. $mock->shouldReceive('getUserItems')
  114. ->with($userId, ['item_id' => $itemId])
  115. ->andReturn(collect([new \stdClass()])); // 用户拥有该物品
  116. $mock->shouldReceive('getItemNumericAttribute')
  117. ->with($itemId, 'fram_pesticide_rate')
  118. ->andReturn(80); // 物品具有除虫属性
  119. });
  120. $validator = new DisasterRemovalItemValidator(
  121. new DisasterRemovalValidation([]),
  122. ['user_id', 'disaster_type']
  123. );
  124. $result = $validator->validate($itemId, [
  125. 'user_id' => $userId,
  126. 'disaster_type' => $disasterType
  127. ]);
  128. $this->assertTrue($result);
  129. }
  130. /**
  131. * 测试物品验证失败 - 用户没有物品
  132. */
  133. public function testDisasterRemovalItemValidatorFailNoItem()
  134. {
  135. $userId = 1;
  136. $itemId = 123;
  137. $disasterType = DISASTER_TYPE::PEST->value;
  138. // Mock ItemService
  139. $this->mock(ItemService::class, function ($mock) use ($userId, $itemId) {
  140. $mock->shouldReceive('getUserItems')
  141. ->with($userId, ['item_id' => $itemId])
  142. ->andReturn(collect([])); // 用户没有该物品
  143. });
  144. $validator = new DisasterRemovalItemValidator(
  145. new DisasterRemovalValidation([]),
  146. ['user_id', 'disaster_type']
  147. );
  148. $result = $validator->validate($itemId, [
  149. 'user_id' => $userId,
  150. 'disaster_type' => $disasterType
  151. ]);
  152. $this->assertFalse($result);
  153. }
  154. /**
  155. * 测试物品验证失败 - 物品没有对应属性
  156. */
  157. public function testDisasterRemovalItemValidatorFailNoAttribute()
  158. {
  159. $userId = 1;
  160. $itemId = 123;
  161. $disasterType = DISASTER_TYPE::PEST->value;
  162. // Mock ItemService
  163. $this->mock(ItemService::class, function ($mock) use ($userId, $itemId) {
  164. $mock->shouldReceive('getUserItems')
  165. ->with($userId, ['item_id' => $itemId])
  166. ->andReturn(collect([new \stdClass()])); // 用户拥有该物品
  167. $mock->shouldReceive('getItemNumericAttribute')
  168. ->with($itemId, 'fram_pesticide_rate')
  169. ->andReturn(0); // 物品没有除虫属性
  170. });
  171. $validator = new DisasterRemovalItemValidator(
  172. new DisasterRemovalValidation([]),
  173. ['user_id', 'disaster_type']
  174. );
  175. $result = $validator->validate($itemId, [
  176. 'user_id' => $userId,
  177. 'disaster_type' => $disasterType
  178. ]);
  179. $this->assertFalse($result);
  180. }
  181. /**
  182. * 测试不支持的灾害类型
  183. */
  184. public function testUnsupportedDisasterType()
  185. {
  186. $userId = 1;
  187. $itemId = 123;
  188. $disasterType = 999; // 不支持的灾害类型
  189. $validator = new DisasterRemovalItemValidator(
  190. new DisasterRemovalValidation([]),
  191. ['user_id', 'disaster_type']
  192. );
  193. $result = $validator->validate($itemId, [
  194. 'user_id' => $userId,
  195. 'disaster_type' => $disasterType
  196. ]);
  197. $this->assertFalse($result);
  198. }
  199. }