ppeasy/tests/Feature/Api/StatsControllerTest.php

74 lines
2.0 KiB
PHP

<?php
namespace Tests\Feature\Api;
use Carbon\Carbon;
use Tests\Feature\ApiTestCase;
use Vanguard\Http\Resources\UserResource;
use Vanguard\Repositories\User\UserRepository;
use Vanguard\Role;
use Vanguard\Support\Enum\UserStatus;
use Vanguard\User;
class StatsControllerTest extends ApiTestCase
{
/** @test */
public function unauthenticated()
{
$this->getJson('/api/stats')->assertStatus(401);
}
/** @test */
public function get_stats_as_admin()
{
\DB::table('users')->delete();
$adminRole = Role::whereName('Admin')->first();
$user = User::factory()->create(['role_id' => $adminRole->id]);
$this->be($user, self::API_GUARD);
Carbon::setTestNow(Carbon::now()->startOfYear());
User::factory()->times(4)->create(['status' => UserStatus::ACTIVE]);
Carbon::setTestNow(null);
User::factory()->times(2)->create(['status' => UserStatus::BANNED]);
User::factory()->times(7)->create(['status' => UserStatus::UNCONFIRMED]);
$users = app(UserRepository::class);
$response = $this->getJson("/api/stats");
$usersPerMonth = $users->countOfNewUsersPerMonth(
now()->subYear()->startOfMonth(),
now()->endOfMonth()
);
$latestRegistrations = $users->latest(7);
$response->assertOk()
->assertJson([
'users_per_month' => $usersPerMonth,
'users_per_status' => [
'total' => 14,
'new' => $users->newUsersCount(),
'banned' => 2,
'unconfirmed' => 7
],
'latest_registrations' => UserResource::collection($latestRegistrations)->resolve()
]);
}
/** @test */
public function non_admin_users_cannot_get_user_stats()
{
$user = User::factory()->create();
$this->actingAs($user, self::API_GUARD)->getJson("/api/stats")->assertForbidden();
}
}