<?php
/**
 * Created by PhpStorm.
 * User: Stan
 * Date: 26-5-2018
 * Time: 21:06
 */

namespace Tests\Unit\Http\Controllers\Admin;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Routing\Controller;
use Mockery as m;
use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface;
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
use Pterodactyl\Http\Controllers\Admin\StatisticsController;
use Pterodactyl\Models\Node;
use Tests\Assertions\ControllerAssertionsTrait;
use Tests\Unit\Http\Controllers\ControllerTestCase;

class StatisticsControllerTest extends ControllerTestCase
{
    use ControllerAssertionsTrait;

    /**
     * @var \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface|\Mockery\Mock
     */
    private $allocationRepository;

    /**
     * @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface|\Mockery\Mock
     */
    private $databaseRepository;

    /**
     * @var \Pterodactyl\Contracts\Repository\EggRepositoryInterface|\Mockery\Mock
     */
    private $eggRepository;

    /**
     * @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface|\Mockery\Mock
     */
    private $nodeRepository;

    /**
     * @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock
     */
    private $serverRepository;

    /**
     * @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface|\Mockery\Mock
     */
    private $userRepository;

    public function setUp()
    {
        parent::setUp();

        $this->allocationRepository = m::mock(AllocationRepositoryInterface::class);
        $this->databaseRepository = m::mock(DatabaseRepositoryInterface::class);
        $this->eggRepository = m::mock(EggRepositoryInterface::class);
        $this->nodeRepository = m::mock(NodeRepositoryInterface::class);
        $this->serverRepository = m::mock(ServerRepositoryInterface::class);
        $this->userRepository = m::mock(UserRepositoryInterface::class);
    }

    public function testIndexController()
    {
        $controller = $this->getController();

        $this->serverRepository->shouldReceive('all')->withNoArgs();
        $this->nodeRepository->shouldReceive('all')->withNoArgs()->andReturn(collect([factory(Node::class)->make(), factory(Node::class)->make()]));
        $this->userRepository->shouldReceive('count')->withNoArgs();
        $this->eggRepository->shouldReceive('count')->withNoArgs();
        $this->databaseRepository->shouldReceive('count')->withNoArgs();
        $this->allocationRepository->shouldReceive('count')->withNoArgs();
        $this->serverRepository->shouldReceive('getSuspendedServersCount')->withNoArgs();

        $this->nodeRepository->shouldReceive('getUsageStatsRaw')->twice()->andReturn([
            'memory' => [
                'value' => 1024,
                'max' => 512,
            ],
            'disk' => [
                'value' => 1024,
                'max' => 512,
            ]
        ]);

        $controller->shouldReceive('injectJavascript')->once();

        $response = $controller->index();

        $this->assertIsViewResponse($response);
        $this->assertViewNameEquals('admin.statistics', $response);
    }

    private function getController()
    {
        return $this->buildMockedController(StatisticsController::class, [$this->allocationRepository,
            $this->databaseRepository,
            $this->eggRepository,
            $this->nodeRepository,
            $this->serverRepository,
            $this->userRepository]
        );
    }

}