ImageUploadTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. use Encore\Admin\Auth\Database\Administrator;
  3. use Illuminate\Support\Facades\File;
  4. use Tests\Models\Image;
  5. use Tests\Models\MultipleImage;
  6. class ImageUploadTest extends TestCase
  7. {
  8. public function setUp()
  9. {
  10. parent::setUp();
  11. $this->be(Administrator::first(), 'admin');
  12. }
  13. public function testDisableFilter()
  14. {
  15. $this->visit('admin/images')
  16. ->dontSeeElement('input[name=id]');
  17. }
  18. public function testImageUploadPage()
  19. {
  20. $this->visit('admin/images/create')
  21. ->see('Upload image')
  22. ->seeInElement('h3[class=box-title]', 'Create')
  23. ->seeElement('input[name=image1]')
  24. ->seeElement('input[name=image2]')
  25. ->seeElement('input[name=image3]')
  26. ->seeElement('input[name=image4]')
  27. ->seeElement('input[name=image5]')
  28. ->seeElement('input[name=image6]')
  29. ->seeInElement('button[type=reset]', 'Reset')
  30. ->seeInElement('button[type=submit]', 'Submit');
  31. }
  32. protected function uploadImages()
  33. {
  34. return $this->visit('admin/images/create')
  35. ->attach(__DIR__.'/assets/test.jpg', 'image1')
  36. ->attach(__DIR__.'/assets/test.jpg', 'image2')
  37. ->attach(__DIR__.'/assets/test.jpg', 'image3')
  38. ->attach(__DIR__.'/assets/test.jpg', 'image4')
  39. ->attach(__DIR__.'/assets/test.jpg', 'image5')
  40. ->attach(__DIR__.'/assets/test.jpg', 'image6')
  41. ->press('Submit');
  42. }
  43. public function testUploadImage()
  44. {
  45. File::cleanDirectory(public_path('uploads/images'));
  46. $this->uploadImages()
  47. ->seePageIs('admin/images');
  48. $this->assertEquals(Image::count(), 1);
  49. $this->seeInDatabase('test_images', ['image4' => 'images/renamed.jpeg']);
  50. $images = Image::first()->toArray();
  51. foreach (range(1, 6) as $index) {
  52. $this->assertFileExists(public_path('uploads/'.$images['image'.$index]));
  53. }
  54. $this->assertFileExists(public_path('uploads/images/asdasdasdasdasd.jpeg'));
  55. File::cleanDirectory(public_path('uploads/images'));
  56. }
  57. public function testRemoveImage()
  58. {
  59. File::cleanDirectory(public_path('uploads/images'));
  60. $this->uploadImages();
  61. $this->assertEquals($this->fileCountInImageDir(), 6);
  62. }
  63. public function testUpdateImage()
  64. {
  65. File::cleanDirectory(public_path('uploads/images'));
  66. $this->uploadImages();
  67. $old = Image::first();
  68. $this->visit('admin/images/1/edit')
  69. ->see('ID')
  70. ->see('Created At')
  71. ->see('Updated At')
  72. ->seeElement('input[name=image1]')
  73. ->seeElement('input[name=image2]')
  74. ->seeElement('input[name=image3]')
  75. ->seeElement('input[name=image4]')
  76. ->seeElement('input[name=image5]')
  77. ->seeElement('input[name=image6]')
  78. ->seeInElement('button[type=reset]', 'Reset')
  79. ->seeInElement('button[type=submit]', 'Submit');
  80. $this->attach(__DIR__.'/assets/test.jpg', 'image3')
  81. ->attach(__DIR__.'/assets/test.jpg', 'image4')
  82. ->attach(__DIR__.'/assets/test.jpg', 'image5')
  83. ->press('Submit');
  84. $new = Image::first();
  85. $this->assertEquals($old->id, $new->id);
  86. $this->assertEquals($old->image1, $new->image1);
  87. $this->assertEquals($old->image2, $new->image2);
  88. $this->assertEquals($old->image6, $new->image6);
  89. $this->assertNotEquals($old->image3, $new->image3);
  90. $this->assertNotEquals($old->image4, $new->image4);
  91. $this->assertNotEquals($old->image5, $new->image5);
  92. File::cleanDirectory(public_path('uploads/images'));
  93. }
  94. public function testDeleteImages()
  95. {
  96. File::cleanDirectory(public_path('uploads/images'));
  97. $this->uploadImages();
  98. $this->visit('admin/images')
  99. ->seeInElement('td', 1);
  100. $images = Image::first()->toArray();
  101. $this->delete('admin/images/1')
  102. ->dontSeeInDatabase('test_images', ['id' => 1]);
  103. foreach (range(1, 6) as $index) {
  104. $this->assertFileNotExists(public_path('uploads/'.$images['image'.$index]));
  105. }
  106. $this->visit('admin/images')
  107. ->seeInElement('td', 'svg');
  108. }
  109. public function testBatchDelete()
  110. {
  111. File::cleanDirectory(public_path('uploads/images'));
  112. $this->uploadImages();
  113. $this->uploadImages();
  114. $this->uploadImages();
  115. $this->visit('admin/images')
  116. ->seeInElement('td', 1)
  117. ->seeInElement('td', 2)
  118. ->seeInElement('td', 3);
  119. $this->assertEquals($this->fileCountInImageDir(), 18);
  120. $this->assertEquals(Image::count(), 3);
  121. $this->delete('admin/images/1,2,3');
  122. $this->assertEquals(Image::count(), 0);
  123. $this->visit('admin/images')
  124. ->seeInElement('td', 'svg');
  125. $this->assertEquals($this->fileCountInImageDir(), 0);
  126. }
  127. public function testUploadMultipleImage()
  128. {
  129. File::cleanDirectory(public_path('uploads/images'));
  130. $this->visit('admin/multiple-images/create')
  131. ->seeElement('input[type=file][name="pictures[]"][multiple=1]');
  132. $path = __DIR__.'/assets/test.jpg';
  133. $file = new \Illuminate\Http\UploadedFile(
  134. $path, 'test.jpg', 'image/jpeg', filesize($path), null, true
  135. );
  136. $size = rand(10, 20);
  137. $files = ['pictures' => array_pad([], $size, $file)];
  138. $this->call(
  139. 'POST', // $method
  140. '/admin/multiple-images', // $action
  141. [], // $parameters
  142. [],
  143. $files
  144. );
  145. $this->assertResponseStatus(302);
  146. $this->assertRedirectedTo('/admin/multiple-images');
  147. $this->assertEquals($this->fileCountInImageDir(), $size);
  148. $pictures = MultipleImage::first()->pictures;
  149. $this->assertCount($size, $pictures);
  150. foreach ($pictures as $picture) {
  151. $this->assertFileExists(public_path('uploads/'.$picture));
  152. }
  153. }
  154. public function testRemoveMultipleFiles()
  155. {
  156. File::cleanDirectory(public_path('uploads/images'));
  157. // upload files
  158. $path = __DIR__.'/assets/test.jpg';
  159. $file = new \Illuminate\Http\UploadedFile(
  160. $path, 'test.jpg', 'image/jpeg', filesize($path), null, true
  161. );
  162. $size = rand(10, 20);
  163. $files = ['pictures' => array_pad([], $size, $file)];
  164. $this->call(
  165. 'POST', // $method
  166. '/admin/multiple-images', // $action
  167. [], // $parameters
  168. [],
  169. $files
  170. );
  171. $this->assertEquals($this->fileCountInImageDir(), $size);
  172. }
  173. protected function fileCountInImageDir($dir = 'uploads/images')
  174. {
  175. $file = new FilesystemIterator(public_path($dir), FilesystemIterator::SKIP_DOTS);
  176. return iterator_count($file);
  177. }
  178. }