<?php declare(strict_types=1);

use PHPUnit\Framework\TestCase;
use Symfony\Contracts\HttpClient\ResponseInterface;
use Lewisdale\Webmentions\EndpointParser;

class EndpointParserTest extends TestCase {
    public function testParsesRelativeEndpointFromResponseHeaders() {
        $response = $this->createStub(ResponseInterface::class);

        $response->method('getHeaders')
            ->willReturn([
                "link" => ["</test/1/webmention>; rel=webmention"],
            ]);

        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/1');

        $this->assertSame("https://webmention.rocks/test/1/webmention", EndpointParser::parse($response));   
    }

    public function testParsesRelativeEndpointWithQuotedRelInResponseHeader() {
        $response = $this->createStub(ResponseInterface::class);

        $response->method('getHeaders')
            ->willReturn([
                "link" => ['</test/5/webmention>; rel="webmention"'],
            ]);

        
        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/5');

        $this->assertSame("https://webmention.rocks/test/5/webmention", EndpointParser::parse($response));   
    }

    public function testParsesAbsoluteEndpointFromHeader() {
        $response = $this->createStub(ResponseInterface::class);

        $response->method('getHeaders')
            ->willReturn([
                "link" => ['<https://webmention.rocks/test/2/webmention>; rel="webmention"'],
            ]);

        
        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/2');

        $this->assertSame("https://webmention.rocks/test/2/webmention", EndpointParser::parse($response));
    }

    public function testParsesRelativeEndpointFromLink() {
        $content = <<<XML
        <html>
            <head>
                <link rel="webmention" href="/test/4/webmention" />
            </head>
            <body>
                <h1>Some content</h1>
        </html>
        XML;

        $response = $this->createStub(ResponseInterface::class);
        $response->method('getHeaders')->willReturn([]);
        $response->method('getContent')->willReturn($content);
        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/4');

        $this->assertSame("https://webmention.rocks/test/4/webmention", EndpointParser::parse($response));
    }

    public function testSkipsParsingEndpointWithNoHref() {
        $content = <<<XML
        <html>
            <head>
                <link rel="webmention" />
            </head>
            <body>
                <h1>Some content</h1>
                <a href="/test/6/webmention" rel="webmention">The real webmention</a>
            </body>
        </html>
        XML;

        $response = $this->createStub(ResponseInterface::class);
        $response->method('getHeaders')->willReturn([]);
        $response->method('getContent')->willReturn($content);
        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/6');

        $this->assertSame("https://webmention.rocks/test/6/webmention", EndpointParser::parse($response));
    }

    public function testParseRelativeToPath() {
        $content = <<<XML
        <html>
            <head>
                <link rel="webmention" />
            </head>
            <body>
                <h1>Some content</h1>
                <a href="153/webmention" rel="webmention">The real webmention</a>
            </body>
        </html>
        XML;

        $response = $this->createStub(ResponseInterface::class);
        $response->method('getHeaders')->willReturn([]);
        $response->method('getContent')->willReturn($content);
        $response->method('getInfo')
            ->willReturn('https://webmention.rocks/test/153');

        $this->assertSame("https://webmention.rocks/test/153/webmention", EndpointParser::parse($response));
    }
}