<?php

namespace Tests\Features\Stock;

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class GoodTest extends \TestCase
{
    use DatabaseTransactions;

    protected $indexUrl = "/stock/goods";
    protected $item = "good";
    protected $model = "App\Models\Stock\Good";
    protected $table = "stock_goods";

    protected function indexTitle()
    {
        return "Manage goods";
    }

    public function testUserCanGotoManagementPage()
    {
        $user = factory(\App\User::class)->create();
        $item = factory($this->model)->create();
        
        $this->actingAs($user)
            ->visit($this->indexUrl)
            ->see($this->indexTitle())
            ->see($item->name);
    }

    public function testUserCanCreateItem()
    {
        $user = factory(\App\User::class)->create();
        $item = factory($this->model)->make();

        $this->actingAs($user)
            ->visit($this->indexUrl)
            ->click($this->createButton())
            ->see($this->createTitle())
            ->type($item->name, 'name')
            ->select($item->group->id, 'group')
            ->select($item->unit->id, 'unit')
            ->press($this->createButton())
            ->see($this->indexTitle())
            ->see($item->name);

        $this->seeInDatabase($this->table ?? $this->item, [
            'name' => $item->name
        ]);
    }

    public function testUserCanEditItem()
    {
        $user = factory(\App\User::class)->create();
        $item = factory($this->model)->create();
        $newItem = factory($this->model)->make();

        $this->actingAs($user)
            ->visit($this->indexUrl)
            ->within("tr:contains('$item->name')", function() { $this->click('edit'); })
            ->see($this->editTitle(""))
            ->type($newItem->name, 'name')
            ->select($newItem->group->id, 'group')
            ->select($newItem->unit->id, 'unit')
            ->press($this->updateButton())
            ->see($this->indexTitle())
            ->see($newItem->name);

        $this->seeInDatabase($this->table ?? $this->item, [
            'name' => $newItem->name,
            'stock_group_id' => $newItem->group->id,
            'base_unit_id' => $newItem->unit->id
        ]);
    }

    public function testUserCanDeleteItem()
    {
        $user = factory(\App\User::class)->create();
        $item = factory($this->model)->create();

        $this->actingAs($user)
            ->visit($this->indexUrl)
            ->within("tr:contains('$item->name')", function() { $this->press('delete'); })
            ->see($this->indexTitle())
            ->dontSee($item->name);

        $this->dontSeeInDatabase($this->table ?? $this->item, [
            'name' => $item->name
        ]);
    }
}
