From 6d03e47526989b3b2df7fc82e60d9bc847b4b223 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Tue, 23 Apr 2019 19:14:41 +0800 Subject: [PATCH] Nomalize JSON response structure --- app/Http/Controllers/AuthController.php | 11 +- app/Http/Controllers/ClosetController.php | 6 +- app/Http/Controllers/PlayerController.php | 18 +-- app/Http/Controllers/PluginController.php | 6 +- app/Http/Controllers/SkinlibController.php | 21 ++- app/Http/Controllers/UserController.php | 20 +-- app/Http/Middleware/CheckPlayerExist.php | 5 +- app/Http/Middleware/CheckPlayerOwner.php | 5 +- app/helpers.php | 5 +- .../src/components/ApplyToPlayerDialog.vue | 2 +- .../src/components/mixins/enablePlugin.ts | 4 +- resources/assets/src/views/admin/Reports.vue | 4 +- resources/assets/src/views/auth/Login.vue | 2 +- resources/assets/src/views/skinlib/List.vue | 4 +- resources/assets/src/views/skinlib/Show.vue | 2 +- resources/assets/src/views/skinlib/Upload.vue | 2 +- resources/assets/src/views/user/Bind.vue | 2 +- resources/assets/src/views/user/Closet.vue | 6 +- resources/assets/src/views/user/Dashboard.vue | 18 +-- resources/assets/src/views/user/Players.vue | 6 +- .../components/ApplyToPlayerDialog.test.ts | 4 +- .../assets/tests/views/admin/Plugins.test.ts | 2 +- .../assets/tests/views/admin/Reports.test.ts | 6 +- .../assets/tests/views/auth/Login.test.ts | 6 +- .../assets/tests/views/skinlib/List.test.ts | 48 +++++-- .../assets/tests/views/skinlib/Show.test.ts | 48 ++++--- .../assets/tests/views/skinlib/Upload.test.ts | 2 +- .../assets/tests/views/user/Bind.test.ts | 6 +- .../assets/tests/views/user/Closet.test.ts | 80 ++++++----- .../assets/tests/views/user/Dashboard.test.ts | 32 +++-- .../assets/tests/views/user/Players.test.ts | 73 +++++----- routes/web.php | 1 - tests/AdminControllerTest.php | 1 + tests/AuthControllerTest.php | 2 +- tests/ClosetControllerTest.php | 22 +-- tests/PlayerControllerTest.php | 11 +- tests/PluginControllerTest.php | 20 +-- tests/ReportControllerTest.php | 6 +- tests/SkinlibControllerTest.php | 136 +++++++++--------- tests/UserControllerTest.php | 25 ++-- 40 files changed, 349 insertions(+), 331 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index a201da38..44bcf8de 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -154,10 +154,7 @@ class AuthController extends Controller Auth::login($user); - return json([ - 'code' => 0, - 'message' => trans('auth.register.success'), - ]); + return json(trans('auth.register.success'), 0); } public function forgot() @@ -190,11 +187,7 @@ class AuthController extends Controller // Rate limit if ($remain > 0) { - return json([ - 'code' => 2, - 'message' => trans('auth.forgot.frequent-mail'), - 'remain' => $remain, - ]); + return json(trans('auth.forgot.frequent-mail'), 2); } $user = User::where('email', $request->email)->first(); diff --git a/app/Http/Controllers/ClosetController.php b/app/Http/Controllers/ClosetController.php index 90a1acad..21de3c84 100644 --- a/app/Http/Controllers/ClosetController.php +++ b/app/Http/Controllers/ClosetController.php @@ -58,9 +58,9 @@ class ClosetController extends Controller }); $totalPages = ceil($items->count() / $perPage); - return response()->json([ - 'category' => $category, - 'items' => $items, + return json('', 0, [ + 'category' => $category, + 'items' => $items, 'total_pages' => $totalPages, ]); } diff --git a/app/Http/Controllers/PlayerController.php b/app/Http/Controllers/PlayerController.php index 176bc80c..c1a9bd5c 100644 --- a/app/Http/Controllers/PlayerController.php +++ b/app/Http/Controllers/PlayerController.php @@ -64,10 +64,15 @@ class PlayerController extends Controller public function listAll() { - return Auth::user() - ->players() - ->select('pid', 'name', 'tid_skin', 'tid_cape') - ->get(); + return json( + '', + 0, + Auth::user() + ->players() + ->select('pid', 'name', 'tid_skin', 'tid_cape') + ->get() + ->toArray() + ); } public function add(Request $request) @@ -129,11 +134,6 @@ class PlayerController extends Controller return json(trans('user.player.delete.success', ['name' => $playerName]), 0); } - public function show() - { - return response()->json($this->player->toArray()); - } - public function rename(Request $request) { $this->validate($request, [ diff --git a/app/Http/Controllers/PluginController.php b/app/Http/Controllers/PluginController.php index 6dd6eb8f..481dbc74 100644 --- a/app/Http/Controllers/PluginController.php +++ b/app/Http/Controllers/PluginController.php @@ -42,11 +42,7 @@ class PluginController extends Controller } } - return json([ - 'code' => 1, - 'message' => trans('admin.plugins.operations.unsatisfied.notice'), - 'reason' => $reason, - ]); + return json(trans('admin.plugins.operations.unsatisfied.notice'), 1, compact('reason')); } $plugins->enable($name); diff --git a/app/Http/Controllers/SkinlibController.php b/app/Http/Controllers/SkinlibController.php index 5805f184..dd416d4d 100644 --- a/app/Http/Controllers/SkinlibController.php +++ b/app/Http/Controllers/SkinlibController.php @@ -119,8 +119,8 @@ class SkinlibController extends Controller } } - return response()->json([ - 'items' => $textures, + return json('', 0, [ + 'items' => $textures, 'current_uid' => $user ? $user->uid : 0, 'total_pages' => $totalPages, ]); @@ -165,9 +165,9 @@ class SkinlibController extends Controller public function info($tid) { if ($t = Texture::find($tid)) { - return json($t->toArray()); + return json('', 0, $t->toArray()); } else { - return json([]); + return abort(404); } } @@ -228,9 +228,7 @@ class SkinlibController extends Controller // if the texture already uploaded was set to private, // then allow to re-upload it. if ($result->type == $t->type && $result->public) { - return json(trans('skinlib.upload.repeated'), 0, [ - 'tid' => $result->tid, - ]); + return json(trans('skinlib.upload.repeated'), 0, ['tid' => $result->tid]); } } } @@ -340,11 +338,10 @@ class SkinlibController extends Controller $t->public = ! $t->public; $t->save(); - return json([ - 'code' => 0, - 'message' => trans('skinlib.privacy.success', ['privacy' => (! $t->public ? trans('general.private') : trans('general.public'))]), - 'public' => $t->public, - ]); + return json( + trans('skinlib.privacy.success', ['privacy' => (! $t->public ? trans('general.private') : trans('general.public'))]), + 0 + ); } // @codeCoverageIgnore diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index cc02fff7..0bbc4c91 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -45,7 +45,7 @@ class UserController extends Controller { $user = Auth::user(); - return [ + return json('', 0, [ 'user' => [ 'score' => $user->score, 'lastSignAt' => $user->last_sign_at, @@ -56,7 +56,7 @@ class UserController extends Controller ], 'signAfterZero' => option('sign_after_zero'), 'signGapTime' => option('sign_gap_time'), - ]; + ]); } /** @@ -94,11 +94,9 @@ class UserController extends Controller $acquiredScore = $user->sign(); $gap = option('sign_gap_time'); - return json([ - 'code' => 0, - 'message' => trans('user.sign-success', ['score' => $acquiredScore]), - 'score' => $user->score, - 'storage' => $this->calculatePercentageUsed($user->getStorageUsed(), option('score_per_storage')), + return json(trans('user.sign-success', ['score' => $acquiredScore]), 0, [ + 'score' => $user->score, + 'storage' => $this->calculatePercentageUsed($user->getStorageUsed(), option('score_per_storage')), 'remaining_time' => $gap > 1 ? round($gap) : $gap, ]); } else { @@ -130,7 +128,7 @@ class UserController extends Controller $remain = 60 + session('last_mail_time', 0) - time(); if ($remain > 0) { - return json(trans('user.verification.frequent-mail')); + return json(trans('user.verification.frequent-mail'), 1); } $user = Auth::user(); @@ -250,11 +248,7 @@ class UserController extends Controller if ($user->delete()) { session()->flush(); - return response() - ->json([ - 'code' => 0, - 'message' => trans('user.profile.delete.success'), - ]); + return json(trans('user.profile.delete.success'), 0); } break; // @codeCoverageIgnore diff --git a/app/Http/Middleware/CheckPlayerExist.php b/app/Http/Middleware/CheckPlayerExist.php index 6e304c42..8c5583a5 100644 --- a/app/Http/Middleware/CheckPlayerExist.php +++ b/app/Http/Middleware/CheckPlayerExist.php @@ -12,10 +12,7 @@ class CheckPlayerExist { if ($request->has('pid') && $request->isMethod('post')) { if (is_null(Player::find($request->input('pid')))) { - return response()->json([ - 'code' => 1, - 'message' => trans('general.unexistent-player'), - ]); + return json(trans('general.unexistent-player'), 1); } else { return $next($request); } diff --git a/app/Http/Middleware/CheckPlayerOwner.php b/app/Http/Middleware/CheckPlayerOwner.php index 97c4b48d..6b8a05a5 100644 --- a/app/Http/Middleware/CheckPlayerOwner.php +++ b/app/Http/Middleware/CheckPlayerOwner.php @@ -20,10 +20,7 @@ class CheckPlayerOwner $player = Player::find($pid); if ($player->uid != auth()->id()) { - return response()->json([ - 'code' => 1, - 'message' => trans('admin.players.no-permission'), - ]); + return json(trans('admin.players.no-permission'), 1); } } diff --git a/app/helpers.php b/app/helpers.php index 2cae9385..c6b0c28d 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -50,10 +50,11 @@ if (! function_exists('json')) { return Response::json($args[0]); } elseif (count($args) == 3 && is_array($args[2])) { // The third argument is array of extra fields - return Response::json(array_merge([ + return Response::json([ 'code' => $args[1], 'message' => $args[0], - ], $args[2])); + 'data' => $args[2], + ]); } else { return Response::json([ 'code' => Arr::get($args, 1, 1), diff --git a/resources/assets/src/components/ApplyToPlayerDialog.vue b/resources/assets/src/components/ApplyToPlayerDialog.vue index ecb70602..01fde109 100644 --- a/resources/assets/src/components/ApplyToPlayerDialog.vue +++ b/resources/assets/src/components/ApplyToPlayerDialog.vue @@ -71,7 +71,7 @@ export default { }, methods: { async fetchList() { - this.players = await this.$http.get('/user/player/list') + this.players = (await this.$http.get('/user/player/list')).data }, async submit() { if (!this.selected) { diff --git a/resources/assets/src/components/mixins/enablePlugin.ts b/resources/assets/src/components/mixins/enablePlugin.ts index 56fcf405..66bcc803 100644 --- a/resources/assets/src/components/mixins/enablePlugin.ts +++ b/resources/assets/src/components/mixins/enablePlugin.ts @@ -22,11 +22,11 @@ export default Vue.extend({ } const { - code, message, reason, + code, message, data: { reason } = { reason: [] }, } = await this.$http.post( '/admin/plugins/manage', { action: 'enable', name } - ) as { code: number, message: string, reason: string[] } + ) as { code: number, message: string, data: { reason: string[] } } if (code === 0) { this.$message.success(message) this.$set(this.plugins[originalIndex], 'enabled', true) diff --git a/resources/assets/src/views/admin/Reports.vue b/resources/assets/src/views/admin/Reports.vue index d1d16b57..54921fe1 100644 --- a/resources/assets/src/views/admin/Reports.vue +++ b/resources/assets/src/views/admin/Reports.vue @@ -122,14 +122,14 @@ export default { }, async resolve(report, action) { const { - code, message, status, + code, message, data, } = await this.$http.post( '/admin/reports', { id: report.id, action } ) if (code === 0) { this.$message.success(message) - report.status = status + report.status = data.status } else { this.$message.warning(message) } diff --git a/resources/assets/src/views/auth/Login.vue b/resources/assets/src/views/auth/Login.vue index e60b383b..12363aae 100644 --- a/resources/assets/src/views/auth/Login.vue +++ b/resources/assets/src/views/auth/Login.vue @@ -99,7 +99,7 @@ export default { this.pending = true const { - code, message, login_fails: loginFails, + code, message, data: { login_fails: loginFails } = { login_fails: 0 }, } = await this.$http.post( '/auth/login', { diff --git a/resources/assets/src/views/skinlib/List.vue b/resources/assets/src/views/skinlib/List.vue index 7fbc5fa8..b2067176 100644 --- a/resources/assets/src/views/skinlib/List.vue +++ b/resources/assets/src/views/skinlib/List.vue @@ -176,7 +176,9 @@ export default { async fetchData() { this.pending = true const { - items, total_pages: totalPages, current_uid: currentUid, + data: { + items, total_pages: totalPages, current_uid: currentUid, + }, } = await this.$http.get( '/skinlib/data', { diff --git a/resources/assets/src/views/skinlib/Show.vue b/resources/assets/src/views/skinlib/Show.vue index 023aaa88..58aef058 100644 --- a/resources/assets/src/views/skinlib/Show.vue +++ b/resources/assets/src/views/skinlib/Show.vue @@ -220,7 +220,7 @@ export default { }, methods: { async fetchData() { - const data = await this.$http.get(`/skinlib/info/${this.tid}`) + const { data = {} } = await this.$http.get(`/skinlib/info/${this.tid}`) this.name = data.name this.type = data.type this.likes = data.likes diff --git a/resources/assets/src/views/skinlib/Upload.vue b/resources/assets/src/views/skinlib/Upload.vue index 03893fab..b9506474 100644 --- a/resources/assets/src/views/skinlib/Upload.vue +++ b/resources/assets/src/views/skinlib/Upload.vue @@ -160,7 +160,7 @@ export default { this.uploading = true const { - code, message, tid, + code, message, data: { tid } = { tid: 0 }, } = await this.$http.post('/skinlib/upload', data) if (code === 0) { this.$message.success(message) diff --git a/resources/assets/src/views/user/Bind.vue b/resources/assets/src/views/user/Bind.vue index af81646c..8505dd08 100644 --- a/resources/assets/src/views/user/Bind.vue +++ b/resources/assets/src/views/user/Bind.vue @@ -49,7 +49,7 @@ export default { }, methods: { async fetchPlayers() { - const players = await this.$http.get('/user/player/list') + const players = (await this.$http.get('/user/player/list')).data this.players = players.map(player => player.name) ;[this.selected] = this.players }, diff --git a/resources/assets/src/views/user/Closet.vue b/resources/assets/src/views/user/Closet.vue index 86d905c2..43254fc9 100644 --- a/resources/assets/src/views/user/Closet.vue +++ b/resources/assets/src/views/user/Closet.vue @@ -200,7 +200,9 @@ export default { search() {}, // eslint-disable-line no-empty-function async loadCloset(page = 1) { const { - items, category, total_pages: totalPages, + data: { + items, category, total_pages: totalPages, + }, } = await this.$http.get( '/user/closet-data', { @@ -226,7 +228,7 @@ export default { this.loadCloset(page) }, async selectTexture(tid) { - const { type, hash } = await this.$http.get(`/skinlib/info/${tid}`) + const { data: { type, hash } } = await this.$http.get(`/skinlib/info/${tid}`) if (type === 'cape') { this.capeUrl = `/textures/${hash}` this.selectedCape = tid diff --git a/resources/assets/src/views/user/Dashboard.vue b/resources/assets/src/views/user/Dashboard.vue index f12b5e2f..9e9e6f95 100644 --- a/resources/assets/src/views/user/Dashboard.vue +++ b/resources/assets/src/views/user/Dashboard.vue @@ -176,7 +176,7 @@ export default { }, methods: { async fetchScoreInfo() { - const data = await this.$http.get('/user/score-info') + const { data } = await this.$http.get('/user/score-info') this.lastSignAt = new Date(data.user.lastSignAt) this.signAfterZero = data.signAfterZero this.signGap = data.signGapTime * 3600 * 1000 @@ -187,16 +187,18 @@ export default { this.score = data.user.score }, async sign() { - const result = await this.$http.post('/user/sign') + const { + code, message, data, + } = await this.$http.post('/user/sign') - if (result.code === 0) { - this.$message.success(result.message) - this.score = result.score + if (code === 0) { + this.$message.success(message) + this.score = data.score this.lastSignAt = new Date() - this.storageUsed = result.storage.used - this.storageTotal = result.storage.total + this.storageUsed = data.storage.used + this.storageTotal = data.storage.total } else { - this.$message.warning(result.message) + this.$message.warning(message) } }, }, diff --git a/resources/assets/src/views/user/Players.vue b/resources/assets/src/views/user/Players.vue index 0ea6d947..129288f2 100644 --- a/resources/assets/src/views/user/Players.vue +++ b/resources/assets/src/views/user/Players.vue @@ -195,7 +195,7 @@ export default { }, methods: { async fetchPlayers() { - this.players = await this.$http.get('/user/player/list') + this.players = (await this.$http.get('/user/player/list')).data }, togglePreviewer() { this.using3dPreviewer = !this.using3dPreviewer @@ -207,13 +207,13 @@ export default { this.preview2d.cape = player.tid_cape if (player.tid_skin) { - const skin = await this.$http.get(`/skinlib/info/${player.tid_skin}`) + const { data: skin } = await this.$http.get(`/skinlib/info/${player.tid_skin}`) this.skinUrl = `${this.baseUrl}/textures/${skin.hash}` } else { this.skinUrl = '' } if (player.tid_cape) { - const cape = await this.$http.get(`/skinlib/info/${player.tid_cape}`) + const { data: cape } = await this.$http.get(`/skinlib/info/${player.tid_cape}`) this.capeUrl = `${this.baseUrl}/textures/${cape.hash}` } else { this.capeUrl = '' diff --git a/resources/assets/tests/components/ApplyToPlayerDialog.test.ts b/resources/assets/tests/components/ApplyToPlayerDialog.test.ts index 343cf65b..e8ff5b2c 100644 --- a/resources/assets/tests/components/ApplyToPlayerDialog.test.ts +++ b/resources/assets/tests/components/ApplyToPlayerDialog.test.ts @@ -4,7 +4,7 @@ import ApplyToPlayerDialog from '@/components/ApplyToPlayerDialog.vue' test('submit applying texture', async () => { window.$ = jest.fn(() => ({ modal() {} })) - Vue.prototype.$http.get.mockResolvedValue([{ pid: 1 }]) + Vue.prototype.$http.get.mockResolvedValue({ data: [{ pid: 1 }] }) Vue.prototype.$http.post.mockResolvedValueOnce({ code: 1 }) .mockResolvedValue({ code: 0, message: 'ok' }) const wrapper = mount(ApplyToPlayerDialog) @@ -46,7 +46,7 @@ test('submit applying texture', async () => { }) test('compute avatar URL', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) // eslint-disable-next-line camelcase const wrapper = mount(ApplyToPlayerDialog) const { avatarUrl } = wrapper.vm diff --git a/resources/assets/tests/views/admin/Plugins.test.ts b/resources/assets/tests/views/admin/Plugins.test.ts index 31ad9a24..22ae6880 100644 --- a/resources/assets/tests/views/admin/Plugins.test.ts +++ b/resources/assets/tests/views/admin/Plugins.test.ts @@ -57,7 +57,7 @@ test('enable plugin', async () => { ]) Vue.prototype.$http.post .mockResolvedValueOnce({ - code: 1, message: '1', reason: ['`a
`b'], + code: 1, message: '1', data: { reason: ['`a
`b'] }, }) .mockResolvedValue({ code: 0, message: '0' }) Vue.prototype.$confirm diff --git a/resources/assets/tests/views/admin/Reports.test.ts b/resources/assets/tests/views/admin/Reports.test.ts index 6d208cee..9fe97608 100644 --- a/resources/assets/tests/views/admin/Reports.test.ts +++ b/resources/assets/tests/views/admin/Reports.test.ts @@ -38,7 +38,7 @@ test('delete texture', async () => { Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: 'fail' }) .mockResolvedValue({ - code: 0, message: 'ok', status: 1, + code: 0, message: 'ok', data: { status: 1 }, }) const wrapper = mount(Reports) await wrapper.vm.$nextTick() @@ -62,7 +62,7 @@ test('ban uploader', async () => { Vue.prototype.$http.get.mockResolvedValue({ data: [{ id: 1, status: 0 }] }) Vue.prototype.$http.post .mockResolvedValue({ - code: 0, message: 'ok', status: 1, + code: 0, message: 'ok', data: { status: 1 }, }) const wrapper = mount(Reports) await wrapper.vm.$nextTick() @@ -82,7 +82,7 @@ test('reject', async () => { Vue.prototype.$http.get.mockResolvedValue({ data: [{ id: 1, status: 0 }] }) Vue.prototype.$http.post .mockResolvedValue({ - code: 0, message: 'ok', status: 2, + code: 0, message: 'ok', data: { status: 2 }, }) const wrapper = mount(Reports) await wrapper.vm.$nextTick() diff --git a/resources/assets/tests/views/auth/Login.test.ts b/resources/assets/tests/views/auth/Login.test.ts index 0b5b4d54..0f9a18dd 100644 --- a/resources/assets/tests/views/auth/Login.test.ts +++ b/resources/assets/tests/views/auth/Login.test.ts @@ -22,9 +22,9 @@ test('login', async () => { window.blessing.extra = { tooManyFails: false } Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: 'fail' }) - .mockResolvedValueOnce({ code: 1, login_fails: 4 }) - .mockResolvedValueOnce({ code: 1, login_fails: 4 }) - .mockResolvedValueOnce({ code: 1, login_fails: 4 }) + .mockResolvedValueOnce({ code: 1, data: { login_fails: 4 } }) + .mockResolvedValueOnce({ code: 1, data: { login_fails: 4 } }) + .mockResolvedValueOnce({ code: 1, data: { login_fails: 4 } }) .mockResolvedValueOnce({ code: 0, message: 'ok' }) const wrapper = mount(Login, { stubs: { Captcha } }) const form = wrapper.find('form') diff --git a/resources/assets/tests/views/skinlib/List.test.ts b/resources/assets/tests/views/skinlib/List.test.ts index 502225cf..0eeb8e4c 100644 --- a/resources/assets/tests/views/skinlib/List.test.ts +++ b/resources/assets/tests/views/skinlib/List.test.ts @@ -45,7 +45,9 @@ jest.mock('element-ui/lib/option', () => ({ test('fetch data before mounting', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) mount(List) expect(Vue.prototype.$http.get).toBeCalledWith( @@ -58,7 +60,9 @@ test('fetch data before mounting', () => { test('empty skin library', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) expect(wrapper.text()).toContain('general.noResult') @@ -66,7 +70,9 @@ test('empty skin library', () => { test('toggle texture type', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) const select = wrapper.find({ name: 'ElSelect' }) @@ -104,7 +110,9 @@ test('toggle texture type', () => { test('check specified uploader', async () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 1, + data: { + items: [], total_pages: 0, current_uid: 1, + }, }) const wrapper = mount(List) await wrapper.vm.$nextTick() @@ -127,7 +135,9 @@ test('check specified uploader', async () => { test('sort items', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) const buttons = wrapper.find('.advanced-filter').findAll(Button) @@ -155,7 +165,9 @@ test('sort items', () => { test('search by keyword', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) @@ -180,7 +192,9 @@ test('search by keyword', () => { test('reset all filters', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) wrapper.findAll('option').at(3) @@ -196,7 +210,9 @@ test('reset all filters', () => { test('is anonymous', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) expect(wrapper.vm.anonymous).toBeTrue() @@ -204,7 +220,9 @@ test('is anonymous', () => { test('on page changed', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], total_pages: 0, current_uid: 0, + data: { + items: [], total_pages: 0, current_uid: 0, + }, }) const wrapper = mount(List) wrapper.vm.pageChanged(2) @@ -218,11 +236,13 @@ test('on page changed', () => { test('on like toggled', async () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [{ - tid: 1, liked: false, likes: 0, - }], - total_pages: 1, - current_uid: 0, + data: { + items: [{ + tid: 1, liked: false, likes: 0, + }], + total_pages: 1, + current_uid: 0, + }, }) const wrapper = mount { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -39,7 +39,7 @@ test('button for adding to closet should be disabled if not auth', () => { }) test('button for adding to closet should be disabled if auth', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) Object.assign(window.blessing.extra, { inCloset: true, currentUid: 1 }) const wrapper = mount(Show, { mocks: { @@ -51,7 +51,7 @@ test('button for adding to closet should be disabled if auth', () => { }) test('likes count indicator', async () => { - Vue.prototype.$http.get.mockResolvedValue({ likes: 2 }) + Vue.prototype.$http.get.mockResolvedValue({ data: { likes: 2 } }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -65,11 +65,13 @@ test('likes count indicator', async () => { test('render basic information', async () => { Vue.prototype.$http.get.mockResolvedValue({ - name: 'my-texture', - type: 'alex', - hash: '123', - size: 2, - upload_at: '2018', + data: { + name: 'my-texture', + type: 'alex', + hash: '123', + size: 2, + upload_at: '2018', + }, }) const wrapper = mount(Show, { mocks: { @@ -88,7 +90,7 @@ test('render basic information', async () => { test('render action text of editing texture name', async () => { Object.assign(window.blessing.extra, { admin: true }) - Vue.prototype.$http.get.mockResolvedValue({ uploader: 1, name: 'name' }) + Vue.prototype.$http.get.mockResolvedValue({ data: { uploader: 1, name: 'name' } }) let wrapper = mount(Show, { mocks: { @@ -110,7 +112,7 @@ test('render action text of editing texture name', async () => { test('render nickname of uploader', () => { Object.assign(window.blessing.extra, { nickname: null }) - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -121,7 +123,7 @@ test('render nickname of uploader', () => { test('operation panel should not be rendered if not auth', () => { Object.assign(window.blessing.extra, { currentUid: 0 }) - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -132,7 +134,7 @@ test('operation panel should not be rendered if not auth', () => { test('download texture', async () => { Object.assign(window.blessing.extra, { currentUid: 1 }) - Vue.prototype.$http.get.mockResolvedValue({ tid: 1, name: 'abc' }) + Vue.prototype.$http.get.mockResolvedValue({ data: { tid: 1, name: 'abc' } }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -144,7 +146,7 @@ test('download texture', async () => { test('link to downloading texture', async () => { Object.assign(window.blessing.extra, { download: false }) - Vue.prototype.$http.get.mockResolvedValue({ hash: '123' }) + Vue.prototype.$http.get.mockResolvedValue({ data: { hash: '123' } }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -157,7 +159,7 @@ test('link to downloading texture', async () => { test('set as avatar', async () => { Object.assign(window.blessing.extra, { currentUid: 1, inCloset: true }) - Vue.prototype.$http.get.mockResolvedValueOnce({ type: 'steve' }) + Vue.prototype.$http.get.mockResolvedValueOnce({ data: { type: 'steve' } }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -170,7 +172,7 @@ test('set as avatar', async () => { }) test('hide "set avatar" button when texture is cape', async () => { - Vue.prototype.$http.get.mockResolvedValueOnce({ type: 'cape' }) + Vue.prototype.$http.get.mockResolvedValueOnce({ data: { type: 'cape' } }) const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'], @@ -183,7 +185,7 @@ test('hide "set avatar" button when texture is cape', async () => { test('add to closet', async () => { Object.assign(window.blessing.extra, { currentUid: 1, inCloset: false }) - Vue.prototype.$http.get.mockResolvedValue({ name: 'wow', likes: 2 }) + Vue.prototype.$http.get.mockResolvedValue({ data: { name: 'wow', likes: 2 } }) Vue.prototype.$http.post.mockResolvedValue({ code: 0, message: '' }) Vue.prototype.$prompt.mockResolvedValue({ value: 'a' } as MessageBoxData) const wrapper = mount(Show, { @@ -200,7 +202,7 @@ test('add to closet', async () => { test('remove from closet', async () => { Object.assign(window.blessing.extra, { currentUid: 1, inCloset: true }) - Vue.prototype.$http.get.mockResolvedValue({ likes: 2 }) + Vue.prototype.$http.get.mockResolvedValue({ data: { likes: 2 } }) Vue.prototype.$http.post.mockResolvedValue({ code: 0 }) const wrapper = mount(Show, { mocks: { @@ -216,7 +218,7 @@ test('remove from closet', async () => { test('change texture name', async () => { Object.assign(window.blessing.extra, { admin: true }) - Vue.prototype.$http.get.mockResolvedValue({ name: 'old-name' }) + Vue.prototype.$http.get.mockResolvedValue({ data: { name: 'old-name' } }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: '1' }) .mockResolvedValue({ code: 0, message: '0' }) @@ -254,7 +256,7 @@ test('change texture name', async () => { }) test('change texture model', async () => { - Vue.prototype.$http.get.mockResolvedValue({ type: 'steve' }) + Vue.prototype.$http.get.mockResolvedValue({ data: { type: 'steve' } }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: '1' }) .mockResolvedValue({ code: 0, message: '0' }) @@ -297,7 +299,7 @@ test('change texture model', async () => { }) test('toggle privacy', async () => { - Vue.prototype.$http.get.mockResolvedValue({ public: true }) + Vue.prototype.$http.get.mockResolvedValue({ data: { public: true } }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: '1' }) .mockResolvedValue({ code: 0, message: '0' }) @@ -336,7 +338,7 @@ test('toggle privacy', async () => { }) test('delete texture', async () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: '1' }) .mockResolvedValue({ code: 0, message: '0' }) @@ -372,7 +374,7 @@ test('delete texture', async () => { }) test('report texture', async () => { - Vue.prototype.$http.get.mockResolvedValue({ report: 0 }) + Vue.prototype.$http.get.mockResolvedValue({ data: { report: 0 } }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: 'duplicated' }) .mockResolvedValue({ code: 0, message: 'success' }) @@ -422,7 +424,7 @@ test('report texture', async () => { test('apply texture to player', () => { Vue.prototype.$http.get - .mockResolvedValue({}) + .mockResolvedValue({ data: {} }) .mockResolvedValue([]) const wrapper = mount(Show, { mocks: { diff --git a/resources/assets/tests/views/skinlib/Upload.test.ts b/resources/assets/tests/views/skinlib/Upload.test.ts index 9bb33432..377a6fce 100644 --- a/resources/assets/tests/views/skinlib/Upload.test.ts +++ b/resources/assets/tests/views/skinlib/Upload.test.ts @@ -116,7 +116,7 @@ test('upload file', async () => { Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: '1' }) .mockResolvedValueOnce({ - code: 0, message: '0', tid: 1, + code: 0, message: '0', data: { tid: 1 }, }) const wrapper = mount(Upload, { diff --git a/resources/assets/tests/views/user/Bind.test.ts b/resources/assets/tests/views/user/Bind.test.ts index 44a913e5..5047af82 100644 --- a/resources/assets/tests/views/user/Bind.test.ts +++ b/resources/assets/tests/views/user/Bind.test.ts @@ -4,7 +4,7 @@ import Bind from '@/views/user/Bind.vue' test('list existed players', async () => { Vue.prototype.$http.get - .mockResolvedValue([{ name: 'a' }, { name: 'b' }]) + .mockResolvedValue({ data: [{ name: 'a' }, { name: 'b' }] }) const wrapper = mount(Bind) await wrapper.vm.$nextTick() const options = wrapper.findAll('option') @@ -12,7 +12,7 @@ test('list existed players', async () => { }) test('show input box', async () => { - Vue.prototype.$http.get.mockResolvedValue([]) + Vue.prototype.$http.get.mockResolvedValue({ data: [] }) const wrapper = mount(Bind) await wrapper.vm.$nextTick() const input = wrapper.find('input') @@ -20,7 +20,7 @@ test('show input box', async () => { }) test('submit', async () => { - Vue.prototype.$http.get.mockResolvedValue([]) + Vue.prototype.$http.get.mockResolvedValue({ data: [] }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1, message: 'fail' }) .mockResolvedValueOnce({ code: 0, message: 'ok' }) diff --git a/resources/assets/tests/views/user/Closet.test.ts b/resources/assets/tests/views/user/Closet.test.ts index 86665097..6c3fdd84 100644 --- a/resources/assets/tests/views/user/Closet.test.ts +++ b/resources/assets/tests/views/user/Closet.test.ts @@ -7,7 +7,7 @@ import Previewer from '@/components/Previewer.vue' window.blessing.extra = { unverified: false } test('fetch closet data before mount', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) mount(Closet) jest.runAllTicks() expect(Vue.prototype.$http.get).toBeCalledWith( @@ -22,13 +22,17 @@ test('fetch closet data before mount', () => { test('switch tabs', () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [], - category: 'skin', - total_pages: 1, + data: { + items: [], + category: 'skin', + total_pages: 1, + }, }).mockResolvedValueOnce({ - items: [], - category: 'cape', - total_pages: 1, + data: { + items: [], + category: 'cape', + total_pages: 1, + }, }) const wrapper = mount(Closet) @@ -58,7 +62,7 @@ test('switch tabs', () => { }) test('different categories', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) expect(wrapper.findAll('.nav-tabs > li').at(0) @@ -72,7 +76,7 @@ test('different categories', () => { }) test('search textures', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) const input = wrapper.find('input') @@ -91,7 +95,7 @@ test('search textures', () => { }) test('empty closet', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) expect(wrapper.find('#skin-category').text()).toContain('user.emptyClosetMsg') wrapper.setData({ category: 'cape' }) @@ -99,7 +103,7 @@ test('empty closet', () => { }) test('no matched search result', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) wrapper.setData({ query: 'q' }) expect(wrapper.find('#skin-category').text()).toContain('general.noResult') @@ -109,12 +113,14 @@ test('no matched search result', () => { test('render items', async () => { Vue.prototype.$http.get.mockResolvedValue({ - items: [ - { tid: 1 }, - { tid: 2 }, - ], - category: 'skin', - total_pages: 1, + data: { + items: [ + { tid: 1 }, + { tid: 2 }, + ], + category: 'skin', + total_pages: 1, + }, }) const wrapper = mount(Closet) await wrapper.vm.$nextTick() @@ -122,7 +128,7 @@ test('render items', async () => { }) test('reload closet when page changed', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) wrapper.vm.pageChanged() jest.runAllTicks() @@ -130,7 +136,7 @@ test('reload closet when page changed', () => { }) test('remove skin item', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) wrapper.setData({ skinItems: [{ tid: 1 }] }) wrapper.vm.removeSkinItem(0) @@ -138,7 +144,7 @@ test('remove skin item', () => { }) test('remove cape item', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) wrapper.setData({ capeItems: [{ tid: 1 }], category: 'cape' }) wrapper.vm.removeCapeItem(0) @@ -147,9 +153,9 @@ test('remove cape item', () => { test('select texture', async () => { Vue.prototype.$http.get - .mockResolvedValueOnce({}) - .mockResolvedValueOnce({ type: 'steve', hash: 'a' }) - .mockResolvedValueOnce({ type: 'cape', hash: 'b' }) + .mockResolvedValueOnce({ data: {} }) + .mockResolvedValueOnce({ data: { type: 'steve', hash: 'a' } }) + .mockResolvedValueOnce({ data: { type: 'cape', hash: 'b' } }) const wrapper = mount(Closet) wrapper.setData({ skinItems: [{ tid: 1 }] }) @@ -169,13 +175,15 @@ test('select texture', async () => { test('apply texture', async () => { Vue.prototype.$http.get - .mockResolvedValueOnce({}) - .mockResolvedValueOnce([]) - .mockResolvedValueOnce([ - { - pid: 1, name: 'name', tid_skin: 10, - }, - ]) + .mockResolvedValueOnce({ data: {} }) + .mockResolvedValueOnce({ data: [] }) + .mockResolvedValueOnce({ + data: [ + { + pid: 1, name: 'name', tid_skin: 10, + }, + ], + }) const wrapper = mount(Closet) const button = wrapper.find(Previewer).findAll('button') @@ -193,7 +201,7 @@ test('apply texture', async () => { }) test('reset selected texture', () => { - Vue.prototype.$http.get.mockResolvedValue({}) + Vue.prototype.$http.get.mockResolvedValue({ data: {} }) const wrapper = mount(Closet) wrapper.setData({ selectedSkin: 1, @@ -217,11 +225,13 @@ test('select specified texture initially', async () => { })) Vue.prototype.$http.get .mockResolvedValueOnce({ - items: [], - category: 'skin', - total_pages: 1, + data: { + items: [], + category: 'skin', + total_pages: 1, + }, }) - .mockResolvedValueOnce({ type: 'cape', hash: '' }) + .mockResolvedValueOnce({ data: { type: 'cape', hash: '' } }) .mockResolvedValueOnce([]) const wrapper = mount(Closet) jest.runAllTimers() diff --git a/resources/assets/tests/views/user/Dashboard.test.ts b/resources/assets/tests/views/user/Dashboard.test.ts index f177dacc..6c841030 100644 --- a/resources/assets/tests/views/user/Dashboard.test.ts +++ b/resources/assets/tests/views/user/Dashboard.test.ts @@ -26,18 +26,20 @@ window.blessing.extra = { unverified: false } function scoreInfo(data = {}) { return { - user: { score: 835, lastSignAt: '2018-08-07 16:06:49' }, - stats: { - players: { - used: 3, total: 15, percentage: 20, - }, - storage: { - used: 5, total: 20, percentage: 25, + data: { + user: { score: 835, lastSignAt: '2018-08-07 16:06:49' }, + stats: { + players: { + used: 3, total: 15, percentage: 20, + }, + storage: { + used: 5, total: 20, percentage: 25, + }, }, + signAfterZero: false, + signGapTime: '24', + ...data, }, - signAfterZero: false, - signGapTime: '24', - ...data, } } @@ -140,11 +142,15 @@ test('sign', async () => { user: { lastSignAt: Date.now() - 30 * 3600 * 1000 }, })) Vue.prototype.$http.post - .mockResolvedValueOnce({ code: 1, message: '1' }) + .mockResolvedValueOnce({ + code: 1, message: '1', data: {}, + }) .mockResolvedValueOnce({ code: 0, - score: 233, - storage: { used: 3, total: 4 }, + data: { + score: 233, + storage: { used: 3, total: 4 }, + }, }) const wrapper = mount(Dashboard) const button = wrapper.find(Button) diff --git a/resources/assets/tests/views/user/Players.test.ts b/resources/assets/tests/views/user/Players.test.ts index c14dcf0d..7cbb2958 100644 --- a/resources/assets/tests/views/user/Players.test.ts +++ b/resources/assets/tests/views/user/Players.test.ts @@ -11,6 +11,7 @@ window.blessing.extra = { } test('display player name constraints', () => { + Vue.prototype.$http.get.mockResolvedValue({ data: [] }) const wrapper = mount(Players) const text = wrapper.text() expect(text).toContain('rule') @@ -18,31 +19,33 @@ test('display player name constraints', () => { }) test('fetch players data before mount', () => { - Vue.prototype.$http.get.mockResolvedValue([]) + Vue.prototype.$http.get.mockResolvedValue({ data: [] }) mount(Players) expect(Vue.prototype.$http.get).toBeCalledWith('/user/player/list') }) test('click to preview player', async () => { Vue.prototype.$http.get - .mockResolvedValueOnce([ - { - pid: 1, tid_skin: 1, tid_cape: 3, - }, - { - pid: 2, tid_skin: 0, tid_cape: 0, - }, - { - pid: 3, tid_skin: 2, tid_cape: 0, - }, - { - pid: 4, tid_skin: 0, tid_cape: 5, - }, - ]) - .mockResolvedValueOnce({ hash: 'a' }) - .mockResolvedValueOnce({ hash: 'b' }) - .mockResolvedValueOnce({ hash: 'c' }) - .mockResolvedValueOnce({ hash: 'd' }) + .mockResolvedValueOnce({ + data: [ + { + pid: 1, tid_skin: 1, tid_cape: 3, + }, + { + pid: 2, tid_skin: 0, tid_cape: 0, + }, + { + pid: 3, tid_skin: 2, tid_cape: 0, + }, + { + pid: 4, tid_skin: 0, tid_cape: 5, + }, + ], + }) + .mockResolvedValueOnce({ data: { hash: 'a' } }) + .mockResolvedValueOnce({ data: { hash: 'b' } }) + .mockResolvedValueOnce({ data: { hash: 'c' } }) + .mockResolvedValueOnce({ data: { hash: 'd' } }) const wrapper = mount(Players) await wrapper.vm.$nextTick() @@ -69,9 +72,11 @@ test('click to preview player', async () => { test('change player name', async () => { Vue.prototype.$http.get - .mockResolvedValueOnce([ - { pid: 1, name: 'old' }, - ]) + .mockResolvedValue({ + data: [ + { pid: 1, name: 'old' }, + ], + }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1 }) .mockResolvedValue({ code: 0 }) @@ -103,9 +108,11 @@ test('change player name', async () => { test('delete player', async () => { Vue.prototype.$http.get - .mockResolvedValueOnce([ - { pid: 1, name: 'to-be-deleted' }, - ]) + .mockResolvedValueOnce({ + data: [ + { pid: 1, name: 'to-be-deleted' }, + ], + }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1 }) .mockResolvedValue({ code: 0 }) @@ -128,7 +135,7 @@ test('delete player', async () => { }) test('toggle preview mode', () => { - Vue.prototype.$http.get.mockResolvedValueOnce([]) + Vue.prototype.$http.get.mockResolvedValueOnce({ data: [] }) const wrapper = mount(Players) wrapper.find('[data-test="to2d"]').trigger('click') expect(wrapper.text()).toContain('user.player.texture-empty') @@ -136,7 +143,7 @@ test('toggle preview mode', () => { test('add player', async () => { window.$ = jest.fn(() => ({ modal() {} })) - Vue.prototype.$http.get.mockResolvedValueOnce([]) + Vue.prototype.$http.get.mockResolvedValueOnce({ data: [] }) Vue.prototype.$http.post.mockResolvedValue({ code: 0 }) const wrapper = mount(Players) const button = wrapper.find('[data-test=addPlayer]') @@ -149,11 +156,13 @@ test('add player', async () => { test('clear texture', async () => { window.$ = jest.fn(() => ({ modal() {} })) - Vue.prototype.$http.get.mockResolvedValueOnce([ - { - pid: 1, tid_skin: 1, tid_cape: 0, - }, - ]) + Vue.prototype.$http.get.mockResolvedValueOnce({ + data: [ + { + pid: 1, tid_skin: 1, tid_cape: 0, + }, + ], + }) Vue.prototype.$http.post .mockResolvedValueOnce({ code: 1 }) .mockResolvedValue({ code: 0, message: 'ok' }) diff --git a/routes/web.php b/routes/web.php index 58331f97..2a5756d2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -65,7 +65,6 @@ Route::group([ Route::any('', 'PlayerController@index'); Route::get('/list', 'PlayerController@listAll'); Route::post('/add', 'PlayerController@add'); - Route::any('/show', 'PlayerController@show'); Route::post('/set', 'PlayerController@setTexture'); Route::post('/texture/clear', 'PlayerController@clearTexture'); Route::post('/rename', 'PlayerController@rename'); diff --git a/tests/AdminControllerTest.php b/tests/AdminControllerTest.php index 5b27ff83..f2905ddb 100644 --- a/tests/AdminControllerTest.php +++ b/tests/AdminControllerTest.php @@ -688,6 +688,7 @@ class AdminControllerTest extends BrowserKitTestCase $this->postJson('/admin/players', [ 'pid' => $player->pid, 'action' => 'name', + 'name' => 'abc', ])->seeJson(['code' => 0]); $player->refresh(); $this->assertEquals('abc', $player->user->nickname); diff --git a/tests/AuthControllerTest.php b/tests/AuthControllerTest.php index 26e5dfc1..79bfb52c 100644 --- a/tests/AuthControllerTest.php +++ b/tests/AuthControllerTest.php @@ -81,7 +81,7 @@ class AuthControllerTest extends TestCase [ 'code' => 1, 'message' => trans('auth.validation.password'), - 'login_fails' => 1, + 'data' => ['login_fails' => 1], ] ); $this->assertTrue(Cache::has($loginFailsCacheKey)); diff --git a/tests/ClosetControllerTest.php b/tests/ClosetControllerTest.php index 73e058fe..1f5dceb6 100644 --- a/tests/ClosetControllerTest.php +++ b/tests/ClosetControllerTest.php @@ -37,24 +37,26 @@ class ClosetControllerTest extends TestCase // Use default query parameters $this->getJson('/user/closet-data') ->assertJsonStructure([ - 'category', - 'total_pages', - 'items' => [['tid', 'name', 'type']], + 'data' => [ + 'category', + 'total_pages', + 'items' => [['tid', 'name', 'type']], + ] ]); // Responsive - $result = $this->json('get', '/user/closet-data?perPage=0')->json(); + $result = $this->json('get', '/user/closet-data?perPage=0')->json()['data']; $this->assertCount(6, $result['items']); - $result = $this->json('get', '/user/closet-data?perPage=8')->json(); + $result = $this->json('get', '/user/closet-data?perPage=8')->json()['data']; $this->assertCount(8, $result['items']); - $result = $this->json('get', '/user/closet-data?perPage=8&page=2')->json(); + $result = $this->json('get', '/user/closet-data?perPage=8&page=2')->json()['data']; $this->assertCount(2, $result['items']); // Get capes $cape = factory(Texture::class, 'cape')->create(); $this->user->closet()->attach($cape->tid, ['item_name' => 'custom_name']); $this->getJson('/user/closet-data?category=cape') - ->assertJson([ + ->assertJson(['data' => [ 'category' => 'cape', 'total_pages' => 1, 'items' => [[ @@ -62,12 +64,12 @@ class ClosetControllerTest extends TestCase 'name' => 'custom_name', 'type' => 'cape', ]], - ]); + ]]); // Search by keyword $random = $textures->random(); $this->getJson('/user/closet-data?q='.$random->name) - ->assertJson([ + ->assertJson(['data' => [ 'category' => 'skin', 'total_pages' => 1, 'items' => [[ @@ -75,7 +77,7 @@ class ClosetControllerTest extends TestCase 'name' => $random->name, 'type' => $random->type, ]], - ]); + ]]); } public function testAdd() diff --git a/tests/PlayerControllerTest.php b/tests/PlayerControllerTest.php index d0ac9c6e..bf212497 100644 --- a/tests/PlayerControllerTest.php +++ b/tests/PlayerControllerTest.php @@ -30,12 +30,12 @@ class PlayerControllerTest extends TestCase $player = factory(Player::class)->create(['uid' => $user->uid]); $this->actingAs($user) ->get('/user/player/list') - ->assertJson([ + ->assertJson(['data' => [ [ 'pid' => $player->pid, 'name' => $player->name, ], - ]); + ]]); } public function testAdd() @@ -153,13 +153,6 @@ class PlayerControllerTest extends TestCase $this->assertNotNull(Player::find($player->pid)); } - public function testShow() - { - $player = factory(Player::class)->create(['last_modified' => '2017-11-11 22:51:00']); - $this->get('/user/player/show?pid='.$player->pid) - ->assertJson($player->toArray()); - } - public function testRename() { Event::fake(); diff --git a/tests/PluginControllerTest.php b/tests/PluginControllerTest.php index e0fae3b8..8e7d59ad 100644 --- a/tests/PluginControllerTest.php +++ b/tests/PluginControllerTest.php @@ -74,15 +74,17 @@ class PluginControllerTest extends TestCase ])->assertJson([ 'code' => 1, 'message' => trans('admin.plugins.operations.unsatisfied.notice'), - 'reason' => [ - trans('admin.plugins.operations.unsatisfied.version', [ - 'name' => 'fake-plugin-with-config-view', - 'constraint' => '^6.6.6', - ]), - trans('admin.plugins.operations.unsatisfied.disabled', [ - 'name' => 'whatever', - ]), - ], + 'data' => [ + 'reason' => [ + trans('admin.plugins.operations.unsatisfied.version', [ + 'name' => 'fake-plugin-with-config-view', + 'constraint' => '^6.6.6', + ]), + trans('admin.plugins.operations.unsatisfied.disabled', [ + 'name' => 'whatever', + ]), + ], + ] ]); // Enable a plugin diff --git a/tests/ReportControllerTest.php b/tests/ReportControllerTest.php index c5e5c75d..864acde1 100644 --- a/tests/ReportControllerTest.php +++ b/tests/ReportControllerTest.php @@ -159,7 +159,7 @@ class ReportControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('general.op-success'), - 'status' => Report::REJECTED, + 'data' => ['status' => Report::REJECTED], ]); $report->refresh(); $reporter->refresh(); @@ -186,7 +186,7 @@ class ReportControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('general.op-success'), - 'status' => Report::RESOLVED, + 'data' => ['status' => Report::RESOLVED], ]); $report->refresh(); $reporter->refresh(); @@ -207,7 +207,7 @@ class ReportControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('general.op-success'), - 'status' => Report::RESOLVED, + 'data' => ['status' => Report::RESOLVED], ]); $reporter->refresh(); $this->assertEquals(User::BANNED, $uploader->permission); diff --git a/tests/SkinlibControllerTest.php b/tests/SkinlibControllerTest.php index 1ce01959..a17ad635 100644 --- a/tests/SkinlibControllerTest.php +++ b/tests/SkinlibControllerTest.php @@ -22,11 +22,11 @@ class SkinlibControllerTest extends TestCase public function testGetSkinlibFiltered() { $this->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'items' => [], 'current_uid' => 0, 'total_pages' => 0, - ]); + ]]); $steves = factory(Texture::class)->times(5)->create(); $alexs = factory(Texture::class, 'alex')->times(5)->create(); @@ -35,11 +35,11 @@ class SkinlibControllerTest extends TestCase // Default arguments $items = $this->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(10, $items); $this->assertTrue(collect($items)->every(function ($item) { return $item['type'] == 'steve' || $item['type'] == 'alex'; @@ -47,11 +47,11 @@ class SkinlibControllerTest extends TestCase // Only steve $items = $this->getJson('/skinlib/data?filter=steve') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(5, $items); $this->assertTrue(collect($items)->every(function ($item) { return $item['type'] == 'steve'; @@ -59,19 +59,19 @@ class SkinlibControllerTest extends TestCase // Invalid type $this->getJson('/skinlib/data?filter=what') - ->assertJson([ + ->assertJson(['data' => [ 'items' => [], 'current_uid' => 0, 'total_pages' => 0, - ]); + ]]); // Only capes $items = $this->getJson('/skinlib/data?filter=cape') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(5, $items); $this->assertTrue(collect($items)->every(function ($item) { return $item['type'] == 'cape'; @@ -84,11 +84,11 @@ class SkinlibControllerTest extends TestCase return $texture->uploader == $uid; }); $items = $this->getJson('/skinlib/data?uploader='.$uid) - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount($owned->count(), $items); $this->assertTrue(collect($items)->every(function ($item) use ($uid) { return $item['uploader'] == $uid; @@ -99,11 +99,11 @@ class SkinlibControllerTest extends TestCase return $skin->tid; })->values(); $items = $this->getJson('/skinlib/data?sort=tid') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $items = array_map(function ($item) { return $item['tid']; }, $items); @@ -113,11 +113,11 @@ class SkinlibControllerTest extends TestCase $user = factory(User::class)->create(); $user->closet()->attach($skins->random()->tid, ['item_name' => 'name']); $items = $this->getJson('/skinlib/data?sort=likes') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertEquals(1, $items[0]['likes']); $this->assertEquals(0, $items[1]['likes']); @@ -129,11 +129,11 @@ class SkinlibControllerTest extends TestCase Str::contains($texture->name, strtolower($keyword)); }); $items = $this->getJson('/skinlib/data?keyword='.$keyword) - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount($keyworded->count(), $items); // More than one argument @@ -149,11 +149,11 @@ class SkinlibControllerTest extends TestCase }) ->values(); $items = $this->getJson('/skinlib/data?sort=size&keyword='.$keyword) - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 1, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $items = array_map(function ($item) { return $item['tid']; }, $items); @@ -167,47 +167,47 @@ class SkinlibControllerTest extends TestCase ->merge($steves); $skins = $steves->merge($alexs); $items = $this->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(20, $items); $items = $this->getJson('/skinlib/data?page=-5') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(20, $items); $page2Count = $skins->forPage(2, 20)->count(); $items = $this->getJson('/skinlib/data?page=2') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount(5, $items); $this->getJson('/skinlib/data?page=8') - ->assertJson([ + ->assertJson(['data' => [ 'items' => [], 'current_uid' => 0, 'total_pages' => 2, - ]); + ]]); $items = $this->getJson('/skinlib/data?items_per_page=-6&page=2') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount($page2Count, $items); $page3Count = $skins->forPage(3, 8)->count(); $items = $this->getJson('/skinlib/data?page=3&items_per_page=8') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 4, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertCount($page3Count, $items); // Add some private textures @@ -219,11 +219,11 @@ class SkinlibControllerTest extends TestCase // If not logged in, private textures should not be shown $items = $this->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => 0, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertTrue(collect($items)->every(function ($item) { return $item['public'] == true; })); @@ -231,11 +231,11 @@ class SkinlibControllerTest extends TestCase // Other users should not see someone's private textures $items = $this->actingAs($otherUser) ->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => $otherUser->uid, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertTrue(collect($items)->every(function ($item) { return ! $item['liked']; })); @@ -244,22 +244,22 @@ class SkinlibControllerTest extends TestCase $texture = $skins->sortByDesc('upload_at')->values()->first(); $otherUser->closet()->attach($texture->tid, ['item_name' => $texture->name]); $this->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'items' => [ ['tid' => $texture->tid, 'liked' => true], ], 'current_uid' => $otherUser->uid, 'total_pages' => 2, - ]); + ]]); // Uploader can see his private textures $items = $this->actingAs($uploader) ->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => $uploader->uid, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertTrue(collect($items)->contains(function ($item) { return $item['public'] == false; })); @@ -268,11 +268,11 @@ class SkinlibControllerTest extends TestCase $admin = factory(User::class, 'admin')->create(); $items = $this->actingAs($admin) ->getJson('/skinlib/data') - ->assertJson([ + ->assertJson(['data' => [ 'current_uid' => $admin->uid, 'total_pages' => 2, - ]) - ->decodeResponseJson('items'); + ]]) + ->decodeResponseJson('data')['items']; $this->assertTrue(collect($items)->contains(function ($item) { return $item['public'] == false; })); @@ -335,11 +335,11 @@ class SkinlibControllerTest extends TestCase public function testInfo() { // Non-existed texture - $this->get('/skinlib/info/1')->assertJson([]); + $this->get('/skinlib/info/1')->assertNotFound(); $texture = factory(Texture::class)->create(); $this->get('/skinlib/info/'.$texture->tid) - ->assertJson([ + ->assertJson(['data' => [ 'tid' => $texture->tid, 'name' => $texture->name, 'type' => $texture->type, @@ -349,7 +349,7 @@ class SkinlibControllerTest extends TestCase 'uploader' => $texture->uploader, 'public' => $texture->public, 'upload_at' => $texture->upload_at->format('Y-m-d H:i:s'), - ]); + ]]); } public function testUpload() @@ -555,7 +555,7 @@ class SkinlibControllerTest extends TestCase $response->assertJson([ 'code' => 0, 'message' => trans('skinlib.upload.success', ['name' => 'texture']), - 'tid' => $t->tid, + 'data' => ['tid' => $t->tid], ]); Storage::disk('textures')->assertExists($t->hash); $user = User::find($user->uid); @@ -581,7 +581,7 @@ class SkinlibControllerTest extends TestCase )->assertJson([ 'code' => 0, 'message' => trans('skinlib.upload.repeated'), - 'tid' => $t->tid, + 'data' => ['tid' => $t->tid], ]); unlink(storage_path('framework/testing/disks/textures/'.$t->hash)); @@ -744,7 +744,6 @@ class SkinlibControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('skinlib.privacy.success', ['privacy' => trans('general.private')]), - 'public' => false, ]); $this->assertEquals(0, Texture::find($texture->tid)->public); @@ -769,7 +768,6 @@ class SkinlibControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('skinlib.privacy.success', ['privacy' => trans('general.private')]), - 'public' => false, ]); $this->assertEquals(0, User::find($uploader->uid)->score); @@ -785,7 +783,6 @@ class SkinlibControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('skinlib.privacy.success', ['privacy' => trans('general.private')]), - 'public' => false, ]); $this->assertEquals(0, Player::find($player->pid)->tid_skin); $this->assertEquals(0, $other->closet()->count()); @@ -812,10 +809,7 @@ class SkinlibControllerTest extends TestCase $other = factory(User::class)->create(); $other->closet()->attach($texture->tid, ['item_name' => 'a']); $this->postJson('/skinlib/privacy', ['tid' => $texture->tid]) - ->assertJson([ - 'code' => 0, - 'public' => false, - ]); + ->assertJson(['code' => 0]); $this->assertEquals($other->score, User::find($other->uid)->score); } diff --git a/tests/UserControllerTest.php b/tests/UserControllerTest.php index 44261822..6967f3f2 100644 --- a/tests/UserControllerTest.php +++ b/tests/UserControllerTest.php @@ -38,7 +38,7 @@ class UserControllerTest extends TestCase $this->actingAs($user) ->get('/user/score-info') - ->assertJson([ + ->assertJson(['data' => [ 'user' => [ 'score' => $user->score, 'lastSignAt' => $user->last_sign_at, @@ -57,7 +57,7 @@ class UserControllerTest extends TestCase ], 'signAfterZero' => option('sign_after_zero'), 'signGapTime' => option('sign_gap_time'), - ]); + ]]); } public function testSign() @@ -71,13 +71,15 @@ class UserControllerTest extends TestCase ->assertJson([ 'code' => 0, 'message' => trans('user.sign-success', ['score' => 50]), - 'score' => option('user_initial_score') + 50, - 'storage' => [ - 'percentage' => 0, - 'total' => option('user_initial_score') + 50, - 'used' => 0, - ], - 'remaining_time' => (int) option('sign_gap_time'), + 'data' => [ + 'score' => option('user_initial_score') + 50, + 'storage' => [ + 'percentage' => 0, + 'total' => option('user_initial_score') + 50, + 'used' => 0, + ], + 'remaining_time' => (int) option('sign_gap_time'), + ] ]); // Remaining time is greater than 0 @@ -123,10 +125,7 @@ class UserControllerTest extends TestCase $user = factory(User::class)->create([ 'last_sign_at' => \Carbon\Carbon::today()->toDateTimeString(), ]); - $this->actingAs($user)->postJson('/user/sign') - ->assertJson([ - 'code' => 0, - ]); + $this->actingAs($user)->postJson('/user/sign')->assertJson(['code' => 0]); } public function testSendVerificationEmail()