<?php

declare(strict_types=1);

namespace ShlinkioTest\Shlink\Core\Exception;

use PHPUnit\Framework\TestCase;
use Shlinkio\Shlink\Core\Exception\NonUniqueSlugException;

class NonUniqueSlugExceptionTest extends TestCase
{
    /**
     * @test
     * @dataProvider provideMessages
     */
    public function properlyCreatesExceptionFromSlug(string $expectedMessage, string $slug, ?string $domain): void
    {
        $expectedAdditional = ['customSlug' => $slug];
        if ($domain !== null) {
            $expectedAdditional['domain'] = $domain;
        }

        $e = NonUniqueSlugException::fromSlug($slug, $domain);

        self::assertEquals($expectedMessage, $e->getMessage());
        self::assertEquals($expectedMessage, $e->getDetail());
        self::assertEquals('Invalid custom slug', $e->getTitle());
        self::assertEquals('INVALID_SLUG', $e->getType());
        self::assertEquals(400, $e->getStatus());
        self::assertEquals($expectedAdditional, $e->getAdditionalData());
    }

    public function provideMessages(): iterable
    {
        yield 'without domain' => [
            'Provided slug "foo" is already in use.',
            'foo',
            null,
        ];
        yield 'with domain' => [
            'Provided slug "baz" is already in use for domain "bar".',
            'baz',
            'bar',
        ];
    }
}