<?php

use Mockery as m;
use Maatwebsite\Excel\Excel;
use Illuminate\Filesystem\Filesystem;

class ExcelTestCase extends PHPUnit_Framework_TestCase {

    /**
     * Mocks
     * @var [type]
     */
    public $phpexcel;
    public $reader;
    public $writer;
    public $excel;
    public $batch;

    /**
     * Setup test case
     */
    public function setUp()
    {
        parent::setUp();

        // Set the mocks
        $this->setMocks();

        // Init our excel class
        $this->excel = new Excel($this->phpexcel, $this->reader, $this->writer);
    }

    /**
     * Test the constructor
     * @return [type] [description]
     */
    public function testConstructor()
    {
        $this->assertInstanceOf('Maatwebsite\Excel\Excel', $this->excel);
    }

    /**
     * Set the mocks
     */
    public function setMocks()
    {
        $this->mockPHPExcel();
        $this->mockReader();
        $this->mockWriter();
        $this->mockBatch();
    }

    /**
     * Mock PHPExcel class
     * @return [type] [description]
     */
    public function mockPHPExcel()
    {
        $this->phpexcel = m::mock('Maatwebsite\Excel\Classes\PHPExcel');
        $this->phpexcel->shouldReceive('getID');
        $this->phpexcel->shouldReceive('disconnectWorksheets');
        $this->phpexcel->shouldReceive('setDefaultProperties');
    }

    /**
     * Mock Reader class
     * @return [type] [description]
     */
    public function mockReader()
    {
        $this->reader = m::mock('Maatwebsite\Excel\Readers\LaravelExcelReader');
        $this->reader->shouldReceive('injectExcel')->with($this->phpexcel);
        $this->reader->shouldReceive('load');
        $this->reader->shouldReceive('setSelectedSheets');
        $this->reader->shouldReceive('setSelectedSheetIndices');
        $this->reader->shouldReceive('setFilters');
    }

    /**
     * Mock Writer class
     * @return [type] [description]
     */
    public function mockWriter()
    {
        $this->writer = m::mock('Maatwebsite\Excel\Writers\LaravelExcelWriter');
        $this->writer->shouldReceive('injectExcel')->with($this->phpexcel);
        $this->writer->shouldReceive('setTitle');
        $this->writer->shouldReceive('setFileName');
        $this->writer->shouldReceive('shareView')->andReturn($this->writer);
    }

    /**
     * Mock Writer class
     * @return [type] [description]
     */
    public function mockBatch()
    {
        $this->batch = m::mock('Maatwebsite\Excel\Readers\Batch');
        $this->batch->shouldReceive('start')->andReturn('foo');
    }

    /**
     * Teardown
     * @return [type] [description]
     */
    public function tearDown()
    {
        m::close();
    }

}