Fixed url view function improperly stripping leading dotslash on Windows

This commit is contained in:
Chris Kankiewicz
2020-02-26 11:08:56 -07:00
parent 2a58da4463
commit 8fa15cfb6b
2 changed files with 20 additions and 15 deletions

View File

@@ -16,12 +16,12 @@ class Url extends ViewFunction
*/
public function __invoke(string $path = '/'): string
{
$path = preg_replace('/^[.\/]+/', '', $path);
$path = preg_replace('/^.?(\/|\\\)+/', '', $path);
if (is_file($path)) {
return $path;
}
return empty($path) ? '' : sprintf('?dir=%s', ltrim($path, './'));
return empty($path) ? '' : sprintf('?dir=%s', $path);
}
}

View File

@@ -7,32 +7,37 @@ use Tests\TestCase;
class UrlTest extends TestCase
{
public function test_it_can_return_a_directory_url(): void
public function test_it_can_return_a_url_for_a_directory(): void
{
$url = new Url($this->container, $this->config);
// Forward slashes
$this->assertEquals('', $url('/'));
$this->assertEquals('', $url('./'));
$this->assertEquals('?dir=some/path', $url('some/path'));
$this->assertEquals('?dir=some/path', $url('./some/path'));
$this->assertEquals('?dir=some/path', $url('./some/path'));
$this->assertEquals('?dir=some/file.test', $url('some/file.test'));
$this->assertEquals('?dir=some/file.test', $url('./some/file.test'));
// Back slashes
$this->assertEquals('', $url('\\'));
$this->assertEquals('', $url('.\\'));
$this->assertEquals('?dir=some\path', $url('some\path'));
$this->assertEquals('?dir=some\path', $url('.\some\path'));
$this->assertEquals('?dir=some\file.test', $url('some\file.test'));
$this->assertEquals('?dir=some\file.test', $url('.\some\file.test'));
}
public function test_it_can_return_a_directory_url_in_a_subdirectory(): void
{
$_SERVER['SCRIPT_NAME'] = '/some/dir/index.php';
$url = new Url($this->container, $this->config);
$this->assertEquals('', $url('/'));
$this->assertEquals('?dir=some/path', $url('some/path'));
$this->assertEquals('?dir=some/file.test', $url('some/file.test'));
}
public function test_it_can_return_a_file_url(): void
public function test_it_can_return_a_url_for_a_file(): void
{
chdir($this->filePath('.'));
$url = new Url($this->container, $this->config);
$this->assertEquals('README.md', $url('README.md'));
$this->assertEquals('README.md', $url('./README.md'));
$this->assertEquals('subdir/alpha.scss', $url('subdir/alpha.scss'));
$this->assertEquals('subdir/alpha.scss', $url('./subdir/alpha.scss'));
}
}