<?php

namespace Breyta\Test\Migrations;

use Breyta\Model\Migration;
use Breyta\Test\TestCase;

class MigrateTest extends TestCase
{
    /** @test */
    public function returnsSuccessWhenNoMigrationsNeedToBeExecuted()
    {
        $this->mockStatus(Migration::createInstance([
            'file' => '@breyta/CreateMigrationTable.php',
            'status' => 'done'
        ]));
        $this->migrations->shouldReceive('up')->with()->once()->andReturn(true);

        $result = $this->migrations->migrate();

        self::assertTrue($result);
    }

    /** @test */
    public function executesNewMigrations()
    {
        $this->mockStatus($migration = Migration::createInstance([
            'file' => '@breyta/CreateMigrationTable.php',
            'status' => 'new',
        ]));
        $this->migrations->shouldReceive('up')->with($migration)->once()->andReturn(true);

        $result = $this->migrations->migrate();

        self::assertTrue($result);
    }

    /** @test */
    public function executesFailedMigrations()
    {
        $this->mockStatus($migration = Migration::createInstance([
            'file' => '@breyta/CreateMigrationTable.php',
            'status' => 'failed',
            'executed' => date('c', strtotime('-1 hour')),
        ]));
        $this->migrations->shouldReceive('up')->with($migration)->once()->andReturn(true);

        $result = $this->migrations->migrate();

        self::assertTrue($result);
    }

    /** @test */
    public function executesRevertedMigrations()
    {
        $this->mockStatus($migration = Migration::createInstance([
            'file' => '@breyta/CreateMigrationTable.php',
            'status' => 'reverted',
            'executed' => date('c', strtotime('-1 hour')),
            'reverted' => date('c', strtotime('-10 minutes')),
        ]));
        $this->migrations->shouldReceive('up')->with($migration)->once()->andReturn(true);

        $result = $this->migrations->migrate();

        self::assertTrue($result);
    }
}