mc-blessing-skin/tests/HttpTest/ControllersTest/TextureControllerTest.php

281 lines
10 KiB
PHP
Raw Permalink Normal View History

2017-11-17 07:40:29 +08:00
<?php
2018-08-17 15:25:08 +08:00
namespace Tests;
2017-11-17 07:40:29 +08:00
use App\Models\Player;
use App\Models\Texture;
2019-12-14 11:10:37 +08:00
use App\Models\User;
2020-05-21 15:04:47 +08:00
use Blessing\Minecraft;
use Illuminate\Support\Facades\Cache;
2017-11-17 07:40:29 +08:00
use Illuminate\Foundation\Testing\DatabaseTransactions;
2019-12-14 11:10:37 +08:00
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
2017-11-17 07:40:29 +08:00
class TextureControllerTest extends TestCase
{
use DatabaseTransactions;
public function testJson()
{
2020-10-14 11:56:34 +08:00
$steve = Texture::factory()->create();
2017-11-17 07:40:29 +08:00
// Player is not existed
2020-01-12 17:12:00 +08:00
$this->get('/nope.json')->assertStatus(404);
2017-11-17 07:40:29 +08:00
// Player is banned
2020-10-14 11:56:34 +08:00
$player = Player::factory()->create(['tid_skin' => $steve->tid]);
2019-03-23 00:20:28 +08:00
$player->user->permission = User::BANNED;
$player->user->save();
2019-03-13 13:16:51 +08:00
$this->get("/{$player->name}.json")
2018-07-13 15:21:13 +08:00
->assertSee(trans('general.player-banned'))
->assertStatus(403);
2017-11-17 07:40:29 +08:00
2019-03-23 00:20:28 +08:00
$player->user->permission = User::NORMAL;
$player->user->save();
2019-12-30 23:29:44 +08:00
$this->getJson("/{$player->name}.json")
2018-07-13 15:21:13 +08:00
->assertJson([
2019-03-13 13:16:51 +08:00
'username' => $player->name,
2017-11-17 07:40:29 +08:00
'skins' => [
'default' => $steve->hash,
2017-11-17 07:40:29 +08:00
],
'cape' => null,
2018-07-13 15:21:13 +08:00
])->assertHeader('Last-Modified');
2017-11-17 07:40:29 +08:00
}
public function testPreviewByHash()
2017-11-17 07:40:29 +08:00
{
2020-01-12 09:27:39 +08:00
$disk = Storage::fake('textures');
$this->mock(Minecraft::class, function ($mock) {
$mock->shouldReceive('renderSkin')->andReturn(Image::canvas(1, 1));
$mock->shouldReceive('renderCape')->andReturn(Image::canvas(1, 1));
});
2017-11-17 07:40:29 +08:00
2020-10-14 11:56:34 +08:00
$skin = Texture::factory()->create();
$disk->put($skin->hash, '');
2020-07-29 18:50:45 +08:00
$this->get(route('preview.hash', ['hash' => $skin->hash]))
->assertHeader('Content-Type', 'image/webp');
}
public function testPreview()
{
$disk = Storage::fake('textures');
2017-11-17 07:40:29 +08:00
2020-05-21 15:04:47 +08:00
$this->mock(Minecraft::class, function ($mock) {
2020-03-05 17:09:30 +08:00
$mock->shouldReceive('renderSkin')->andReturn(Image::canvas(1, 1));
$mock->shouldReceive('renderCape')->andReturn(Image::canvas(1, 1));
});
2020-10-14 11:56:34 +08:00
$skin = Texture::factory()->create();
2020-07-29 18:50:45 +08:00
$this->get(route('preview.texture', ['texture' => $skin]))->assertNotFound();
2018-07-30 15:13:14 +08:00
2020-01-12 09:27:39 +08:00
$disk->put($skin->hash, '');
2020-07-29 18:50:45 +08:00
$this->get(route('preview.texture', ['texture' => $skin]))
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
2020-07-29 18:50:45 +08:00
$this->get(route('preview.texture', ['texture' => $skin, 'png' => true]))
->assertHeader('Content-Type', 'image/png');
$this->assertTrue(Cache::has('preview-t'.$skin->tid.'-png'));
2017-11-17 07:40:29 +08:00
2020-10-14 11:56:34 +08:00
$cape = Texture::factory()->cape()->create();
2020-01-12 09:27:39 +08:00
$disk->put($cape->hash, '');
2020-07-29 18:50:45 +08:00
$this->get(route('preview.texture', ['texture' => $cape, 'height' => 100]))
->assertHeader('Content-Type', 'image/webp');
$this->assertTrue(Cache::has('preview-t'.$cape->tid.'-webp'));
2020-01-12 09:27:39 +08:00
}
2017-11-17 07:40:29 +08:00
2020-01-12 09:27:39 +08:00
public function testRaw()
{
$disk = Storage::fake('textures');
2020-10-14 11:56:34 +08:00
$skin = Texture::factory()->create();
2017-11-17 07:40:29 +08:00
2020-01-12 09:27:39 +08:00
// Not found
$this->get('/raw/0')->assertNotFound();
2017-11-17 07:40:29 +08:00
2020-01-12 09:27:39 +08:00
// Missing texture file
$this->get('/raw/'.$skin->tid)->assertNotFound();
2020-01-12 09:27:39 +08:00
// Success
$disk->put($skin->hash, '');
$this->get('/raw/'.$skin->tid)->assertHeader('Content-Type', 'image/png');
// Disallow downloading texture directly
option(['allow_downloading_texture' => false]);
$this->get('/raw/'.$skin->tid)->assertForbidden();
2017-11-17 07:40:29 +08:00
}
2020-01-12 09:27:39 +08:00
public function testTexture()
2017-11-17 07:40:29 +08:00
{
2020-01-12 09:27:39 +08:00
$disk = Storage::fake('textures');
2020-10-14 11:56:34 +08:00
$skin = Texture::factory()->create();
2019-05-01 10:38:50 +08:00
2020-01-12 09:27:39 +08:00
$this->get('/textures/'.$skin->hash)->assertNotFound();
2017-11-17 07:40:29 +08:00
2020-01-12 09:27:39 +08:00
$disk->put($skin->hash, '');
$this->get('/textures/'.$skin->hash)
->assertSuccessful()
->assertHeader('Content-Type', 'image/png');
$this->get('/csl/textures/'.$skin->hash)
->assertSuccessful()
2018-07-13 15:21:13 +08:00
->assertHeader('Content-Type', 'image/png');
2020-01-12 09:27:39 +08:00
}
2017-11-17 07:40:29 +08:00
2020-01-12 09:27:39 +08:00
public function testAvatarByPlayer()
{
$disk = Storage::fake('textures');
2017-11-17 07:40:29 +08:00
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.player', ['name' => 'abc']))->assertNotFound();
2017-11-17 07:40:29 +08:00
2020-10-14 11:56:34 +08:00
$player = Player::factory()->create();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.player', ['name' => $player->name]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/webp');
2017-11-17 07:40:29 +08:00
2020-05-21 15:04:47 +08:00
$this->mock(Minecraft::class, function ($mock) {
$mock->shouldReceive('render2dAvatar')->andReturn(Image::canvas(1, 1));
});
2020-10-14 11:56:34 +08:00
$texture = Texture::factory()->create();
2020-05-21 15:04:47 +08:00
$disk->put($texture->hash, '');
2020-01-12 09:27:39 +08:00
$player->tid_skin = $texture->tid;
$player->save();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.player', ['name' => $player->name]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
2020-05-21 22:30:15 +08:00
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.player', [
'name' => $player->name,
'png' => true,
]))->assertSuccessful()
2020-05-21 22:30:15 +08:00
->assertHeader('Content-Type', 'image/png')
->getContent();
$image = Image::make($image);
$this->assertEquals(100, $image->width());
$this->assertEquals(100, $image->height());
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.player', [
'name' => $player->name,
'size' => 50,
'png' => true,
]))->getContent();
2020-05-21 22:30:15 +08:00
$image = Image::make($image);
$this->assertEquals(50, $image->width());
$this->assertEquals(50, $image->height());
2017-11-17 07:40:29 +08:00
}
2020-01-12 09:27:39 +08:00
public function testAvatarByUser()
2017-11-17 07:40:29 +08:00
{
2020-01-12 09:27:39 +08:00
$disk = Storage::fake('textures');
2017-11-17 07:40:29 +08:00
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.user', ['uid' => 0]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/webp');
2017-11-17 07:40:29 +08:00
2020-10-14 11:56:34 +08:00
$user = User::factory()->create();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.user', ['uid' => $user->uid]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/webp');
2017-11-17 07:40:29 +08:00
2020-05-21 15:04:47 +08:00
$this->mock(Minecraft::class, function ($mock) {
$mock->shouldReceive('render2dAvatar')->andReturn(Image::canvas(1, 1));
});
2020-10-14 11:56:34 +08:00
$texture = Texture::factory()->create();
2020-05-21 15:04:47 +08:00
$disk->put($texture->hash, '');
2020-01-12 09:27:39 +08:00
$user->avatar = $texture->tid;
$user->save();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.user', ['uid' => $user->uid]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
2020-05-21 22:30:15 +08:00
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.user', ['uid' => $user->uid, 'png' => true]))
2020-05-21 22:30:15 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/png')
2020-01-12 09:27:39 +08:00
->getContent();
2020-05-21 22:30:15 +08:00
$image = Image::make($image);
$this->assertEquals(100, $image->width());
$this->assertEquals(100, $image->height());
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.user', [
'uid' => $user->uid,
'size' => 50,
'png' => true,
]))->getContent();
2020-05-21 22:30:15 +08:00
$image = Image::make($image);
$this->assertEquals(50, $image->width());
$this->assertEquals(50, $image->height());
2017-11-17 07:40:29 +08:00
}
2019-03-16 17:40:04 +08:00
public function testAvatarByHash()
{
$disk = Storage::fake('textures');
$this->mock(Minecraft::class, function ($mock) {
$mock->shouldReceive('render2dAvatar')->andReturn(Image::canvas(1, 1));
$mock->shouldReceive('render3dAvatar')->andReturn(Image::canvas(1, 1));
});
2020-10-14 11:56:34 +08:00
$texture = Texture::factory()->create();
$disk->put($texture->hash, '');
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.hash', ['hash' => $texture->hash]))
->assertSuccessful()
->assertHeader('Content-Type', 'image/webp');
}
2020-01-12 09:27:39 +08:00
public function testAvatarByTexture()
2019-03-16 17:40:04 +08:00
{
2020-01-12 09:27:39 +08:00
$disk = Storage::fake('textures');
2019-03-16 17:40:04 +08:00
$cape = Texture::factory()->cape()->create();
$this->get(route('avatar.texture', ['tid' => $cape->tid]))->assertStatus(422);
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.texture', ['tid' => 0]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
2020-05-21 22:37:08 +08:00
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.texture', ['tid' => 0, 'png' => true]))
2020-05-21 22:37:08 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/png')
2020-01-12 09:27:39 +08:00
->getContent();
$image = Image::make($image);
$this->assertEquals(100, $image->width());
$this->assertEquals(100, $image->height());
2019-03-16 17:40:04 +08:00
2020-10-14 11:56:34 +08:00
$texture = Texture::factory()->create();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.texture', ['tid' => $texture->tid]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
2020-05-21 22:42:24 +08:00
->assertHeader('Content-Type', 'image/webp');
2019-03-16 17:40:04 +08:00
2020-05-21 15:04:47 +08:00
$this->mock(Minecraft::class, function ($mock) {
$mock->shouldReceive('render2dAvatar')->andReturn(Image::canvas(1, 1));
$mock->shouldReceive('render3dAvatar')->andReturn(Image::canvas(1, 1));
});
$disk->put($texture->hash, '');
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.texture', ['tid' => $texture->tid]))
2020-01-12 09:27:39 +08:00
->assertSuccessful()
2020-05-21 22:30:15 +08:00
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.texture', ['tid' => $texture->tid, 'png' => true]))
2020-05-21 22:30:15 +08:00
->assertSuccessful()
->assertHeader('Content-Type', 'image/png');
$image = Image::make($image);
$this->assertEquals(100, $image->width());
$this->assertEquals(100, $image->height());
$this->assertTrue(Cache::has('avatar-2d-t'.$texture->tid.'-s100-png'));
2020-01-12 09:27:39 +08:00
2020-07-29 18:50:45 +08:00
$image = $this->get(route('avatar.texture', [
'tid' => $texture->tid,
'size' => 50,
'png' => true,
]))->getContent();
2020-05-21 22:30:15 +08:00
$image = Image::make($image);
$this->assertEquals(50, $image->width());
$this->assertEquals(50, $image->height());
$this->assertTrue(Cache::has('avatar-2d-t'.$texture->tid.'-s50-png'));
2020-07-29 18:50:45 +08:00
$this->get(route('avatar.texture', ['tid' => $texture->tid, '3d' => true]))
->assertSuccessful()
2020-05-21 22:30:15 +08:00
->assertHeader('Content-Type', 'image/webp');
$this->assertTrue(Cache::has('avatar-3d-t'.$texture->tid.'-s100-webp'));
2019-03-16 17:40:04 +08:00
}
2017-11-17 07:40:29 +08:00
}