<?php

use DependencyInjector\DI;
use PHPUnit\Framework\TestCase;

require_once __DIR__ . '/legacyCode.php';

class DataProviderTest extends TestCase {
    /**
     * @var DataProvider
     */
    protected $dataProvider;

    protected function setUp() {
        // to mock the database during tests
        DI::set('database', function() {
            $mock = Mockery::mock('DatabaseObject');
            $mock->shouldReceive('query')->andReturn([])->byDefault();
        });

        $this->dataProvider = new DataProvider;

        parent::setUp();
    }


    public function tearDown() {
        Mockery::close();
        parent::tearDown();
    }

    public function testReturnsCached() {
        $mock = Mockery::mock('memcache_class');
        $mock->shouldReceive('get')->once()->with('SomeMemcacheKey')->andReturn('anyResult');
        DI::set('memcache', $mock);

        $result = $this->dataProvider->getSomeData();

        self::assertSame('anyResult', $result);
    }

    public function testQueriesDatabase() {
        $memcache = Mockery::mock('memcache_class');
        $memcache->shouldReceive('get')->andReturn(null);
        $memcache->shouldIgnoreMissing();
        DI::set('memcache', $memcache);

        $database = Mockery::mock(DatabaseObject::class);
        $database->shouldReceive('query')
            ->once()->with("SELECT * FROM someDatabase.someTable")
            ->andReturn('fooBar');
        DI::set('database', $database);

        $result = $this->dataProvider->getSomeData();

        self::assertSame('fooBar', $result);
    }
}