<?php

namespace SilverStripe\Core\Tests\Manifest;

use SilverStripe\Control\Director;
use SilverStripe\Core\Manifest\ModuleManifest;
use SilverStripe\Dev\SapphireTest;

class ModuleResourceTest extends SapphireTest
{
    /**
     * @var string
     */
    protected $base;

    /**
     * @var ModuleManifest
     */
    protected $manifest;

    protected function setUp(): void
    {
        parent::setUp();

        $this->base = dirname(__FILE__) . '/fixtures/classmanifest';
        $this->manifest = new ModuleManifest($this->base);
        $this->manifest->init();
        Director::config()->set('alternate_base_url', 'http://www.mysite.com/basefolder/');
        Director::config()->set('alternate_public_dir', 'public');
    }

    public function testBaseModuleResource()
    {
        $modulea = $this->manifest->getModule('module');
        $resource = $modulea->getResource('client/script.js');

        // Test main resource
        $this->assertTrue($resource->exists());
        $this->assertEquals('module/client/script.js', $resource->getRelativePath());
        $this->assertEquals(
            __DIR__ . '/fixtures/classmanifest/module/client/script.js',
            $resource->getPath()
        );
        $this->assertStringStartsWith(
            '/basefolder/' . RESOURCES_DIR . '/module/client/script.js?m=',
            $resource->getURL()
        );
    }

    public function testVendorModuleResources()
    {
        $modulec = $this->manifest->getModule('silverstripe/modulec');
        $resource = $modulec->getResource('client/script.js');

        // Test main resource
        $this->assertTrue($resource->exists());
        $this->assertEquals('vendor/silverstripe/modulec/client/script.js', $resource->getRelativePath());
        $this->assertEquals(
            __DIR__ . '/fixtures/classmanifest/vendor/silverstripe/modulec/client/script.js',
            $resource->getPath()
        );
        $this->assertStringStartsWith(
            '/basefolder/' . RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
            $resource->getURL()
        );
    }

    public function testRelativeResources()
    {
        $modulec = $this->manifest->getModule('silverstripe/modulec');
        $resource = $modulec
            ->getResource('client')
            ->getRelativeResource('script.js');

        // Test main resource
        $this->assertTrue($resource->exists());
        $this->assertEquals('vendor/silverstripe/modulec/client/script.js', $resource->getRelativePath());
        $this->assertEquals(
            __DIR__ . '/fixtures/classmanifest/vendor/silverstripe/modulec/client/script.js',
            $resource->getPath()
        );
        $this->assertStringStartsWith(
            '/basefolder/' . RESOURCES_DIR . '/vendor/silverstripe/modulec/client/script.js?m=',
            $resource->getURL()
        );
    }
}