<?php

namespace MageTest\Command\BuiltIn;

use Mage\Command\BuiltIn\UnlockCommand;
use MageTest\TestHelper\BaseTest;
use malkusch\phpmock\MockBuilder;

/**
 * Class UnlockCommandTest
 * @package MageTest\Command\BuiltIn
 * @coversDefaultClass Mage\Command\BuiltIn\UnlockCommand
 * @uses malkusch\phpmock\MockBuilder
 * @uses malkusch\phpmock\Mock
 * @uses Mage\Command\AbstractCommand
 * @uses Mage\Console
 * @uses Mage\Console\Colors
 */
class UnlockCommandTest extends BaseTest
{
    /**
     * @var UnlockCommand
     */
    private $unlockCommand;

    public static $isUnlinkCalled;
    public static $fileExistsResult;
    public static $isFileExists;

    public function runProvider()
    {
        return array(
            'happy_path' => array(
                'file_exists' => true,
            ),
            'file_not_exists' => array(
                'file_exsits' => false
            )
        );
    }

    /**
     * @before
     */
    public function before()
    {
        $this->unlockCommand = new UnlockCommand();

        self::$isUnlinkCalled = false;
        self::$fileExistsResult = false;
        self::$isFileExists = false;

        $mockBuilder = new MockBuilder();
        $fileExistsMock = $mockBuilder
            ->setName('file_exists')
            ->setNamespace('Mage\Command\BuiltIn')
            ->setFunction(
                function ($filePath) {
                    UnlockCommandTest::$fileExistsResult = $filePath;
                    return UnlockCommandTest::$isFileExists;
                }
            )
            ->build();
        $unlinkMock = $mockBuilder
            ->setName('unlink')
            ->setNamespace('Mage\Command\BuiltIn')
            ->setFunction(
                function () {
                    UnlockCommandTest::$isUnlinkCalled = true;
                }
            )
            ->build();
        $getCwdMock = $mockBuilder
            ->setNamespace('Mage\Command\BuiltIn')
            ->setName('getcwd')
            ->setFunction(
                function () {
                    return '';
                }
            )
            ->build();

        $fileExistsMock->disable();
        $unlinkMock->disable();
        $getCwdMock->disable();

        $fileExistsMock->enable();
        $unlinkMock->enable();
        $getCwdMock->enable();

        $configMock = $this->getMock('Mage\Config');
        $configMock->expects($this->atLeastOnce())
            ->method('getEnvironment')
            ->willReturn('production');
        $this->unlockCommand->setConfig($configMock);

        $this->setUpConsoleStatics();
    }

    /**
     * @covers ::__construct
     * @covers ::run
     * @dataProvider runProvider
     */
    public function testRun($fileExists)
    {
        $expectedOutput = "\tUnlocked deployment to production environment\n\n";
        $this->expectOutputString($expectedOutput);
        $expectedLockFilePath = '/.mage/production.lock';

        self::$isFileExists = $fileExists;

        $actualExitCode = $this->unlockCommand->run();
        $expectedExitCode = 0;

        $this->assertEquals(self::$isUnlinkCalled, $fileExists);
        $this->assertEquals($expectedExitCode, $actualExitCode);
        $this->assertEquals($expectedLockFilePath, self::$fileExistsResult);
    }
}