<?php
declare(strict_types=1);

namespace ShlinkioTest\Shlink\Common\Cache;

use PHPUnit\Framework\TestCase;
use Predis\Connection\Aggregate\PredisCluster;
use Predis\Connection\Aggregate\RedisCluster;
use Prophecy\Prophecy\ObjectProphecy;
use Psr\Container\ContainerInterface;
use Shlinkio\Shlink\Common\Cache\RedisFactory;

class RedisFactoryTest extends TestCase
{
    /** @var RedisFactory */
    private $factory;
    /** @var ObjectProphecy */
    private $container;

    public function setUp(): void
    {
        $this->container = $this->prophesize(ContainerInterface::class);
        $this->factory = new RedisFactory();
    }

    /**
     * @test
     * @dataProvider provideRedisConfig
     */
    public function createsRedisClientBasedOnConfig(?array $config, string $expectedCluster): void
    {
        $getConfig = $this->container->get('config')->willReturn([
            'redis' => $config,
        ]);

        $client = ($this->factory)($this->container->reveal());

        $getConfig->shouldHaveBeenCalledOnce();
        $this->assertInstanceOf($expectedCluster, $client->getOptions()->cluster);
    }

    public function provideRedisConfig(): iterable
    {
        yield 'no config' => [null, PredisCluster::class];
        yield 'single server as string' => [[
            'servers' => 'tcp://127.0.0.1:6379',
        ], PredisCluster::class];
        yield 'single server as array' => [[
            'servers' => ['tcp://127.0.0.1:6379'],
        ], PredisCluster::class];
        yield 'cluster of servers' => [[
            'servers' => ['tcp://1.1.1.1:6379', 'tcp://2.2.2.2:6379'],
        ], RedisCluster::class];
        yield 'empty cluster of servers' => [[
            'servers' => [],
        ], PredisCluster::class];
        yield 'cluster of servers as string' => [[
            'servers' => 'tcp://1.1.1.1:6379,tcp://2.2.2.2:6379',
        ], RedisCluster::class];
    }
}