<?php

declare(strict_types=1);

namespace App\Tests\Unit\Service;

use App\Module\Integration\Domain\Exception\InvalidPathException;
use App\Module\Integration\Domain\Service\SharePathResolver;
use PHPUnit\Framework\TestCase;

/**
 * @internal
 */
final class SharePathResolverTest extends TestCase
{
    private SharePathResolver $resolver;

    protected function setUp(): void
    {
        $this->resolver = new SharePathResolver();
    }

    public function testNormalizeRelativeKeepsSimplePath(): void
    {
        self::assertSame('a/b', $this->resolver->normalizeRelative('a/b'));
    }

    public function testNormalizeRelativeStripsDotsAndSlashes(): void
    {
        self::assertSame('a/b', $this->resolver->normalizeRelative('/a/./b/'));
    }

    public function testNormalizeRelativeConvertsBackslashes(): void
    {
        self::assertSame('a/b', $this->resolver->normalizeRelative('a\b'));
    }

    public function testNormalizeRelativeRejectsParentTraversal(): void
    {
        $this->expectException(InvalidPathException::class);
        $this->resolver->normalizeRelative('a/../b');
    }

    public function testNormalizeRelativeRejectsLeadingParent(): void
    {
        $this->expectException(InvalidPathException::class);
        $this->resolver->normalizeRelative('../etc/passwd');
    }

    public function testFullPathJoinsBaseAndRelative(): void
    {
        self::assertSame('/Projets/a/b', $this->resolver->fullPath('/Projets', 'a/b'));
    }

    public function testFullPathWithEmptyBaseAndEmptyRelativeIsRoot(): void
    {
        self::assertSame('/', $this->resolver->fullPath('', ''));
    }

    public function testFullPathTrimsBaseSlashes(): void
    {
        self::assertSame('/Projets/a', $this->resolver->fullPath('/Projets/', 'a'));
    }
}
