<?php
namespace Medienreaktor\Persons\Tests\Unit\Controller;

/**
 * Test case.
 *
 * @author Tobias Lorz <tobias.lorz@yahoo.de>
 */
class OrganisationControllerTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
{
    /**
     * @var \Medienreaktor\Persons\Controller\OrganisationController
     */
    protected $subject = null;

    protected function setUp()
    {
        parent::setUp();
        $this->subject = $this->getMockBuilder(\Medienreaktor\Persons\Controller\OrganisationController::class)
            ->setMethods(['redirect', 'forward', 'addFlashMessage'])
            ->disableOriginalConstructor()
            ->getMock();
    }

    protected function tearDown()
    {
        parent::tearDown();
    }

    /**
     * @test
     */
    public function listActionFetchesAllOrganisationsFromRepositoryAndAssignsThemToView(): void
    {

        $allOrganisations = $this->getMockBuilder(\TYPO3\CMS\Extbase\Persistence\ObjectStorage::class)
            ->disableOriginalConstructor()
            ->getMock();

        $organisationRepository = $this->getMockBuilder(\Medienreaktor\Persons\Domain\Repository\OrganisationRepository::class)
            ->setMethods(['findAll'])
            ->disableOriginalConstructor()
            ->getMock();
        $organisationRepository->expects(self::once())->method('findAll')->will(self::returnValue($allOrganisations));
        $this->inject($this->subject, 'organisationRepository', $organisationRepository);

        $view = $this->getMockBuilder(\TYPO3\CMS\Extbase\Mvc\View\ViewInterface::class)->getMock();
        $view->expects(self::once())->method('assign')->with('organisations', $allOrganisations);
        $this->inject($this->subject, 'view', $view);

        $this->subject->listAction();
    }

    /**
     * @test
     */
    public function showActionAssignsTheGivenOrganisationToView(): void
    {
        $organisation = new \Medienreaktor\Persons\Domain\Model\Organisation();

        $view = $this->getMockBuilder(\TYPO3\CMS\Extbase\Mvc\View\ViewInterface::class)->getMock();
        $this->inject($this->subject, 'view', $view);
        $view->expects(self::once())->method('assign')->with('organisation', $organisation);

        $this->subject->showAction($organisation);
    }
}
