Codebase list lua-http / 112e58fc-607b-4a76-b747-562fe143687c/main spec / path_spec.lua
112e58fc-607b-4a76-b747-562fe143687c/main

Tree @112e58fc-607b-4a76-b747-562fe143687c/main (Download .tar.gz)

path_spec.lua @112e58fc-607b-4a76-b747-562fe143687c/mainraw · history · blame

describe("Relative path resolution", function()
	local resolve_relative_path = require "http.util".resolve_relative_path
	it("should resolve .. correctly", function()
		assert.same("/foo", resolve_relative_path("/", "foo"))
		assert.same("/foo", resolve_relative_path("/", "./foo"))
		assert.same("/foo", resolve_relative_path("/", "../foo"))
		assert.same("/foo", resolve_relative_path("/", "../foo/../foo"))
		assert.same("/foo", resolve_relative_path("/", "foo/bar/.."))
		assert.same("/foo/", resolve_relative_path("/", "foo/bar/../"))
		assert.same("/foo/", resolve_relative_path("/", "foo/bar/../"))
		assert.same("/", resolve_relative_path("/", "../.."))
		assert.same("/", resolve_relative_path("/", "../../"))
		assert.same("/bar", resolve_relative_path("/foo/", "../bar"))
		assert.same("bar", resolve_relative_path("foo/", "../bar"))
		assert.same("bar/", resolve_relative_path("foo/", "../bar/"))
	end)
	it("should ignore .", function()
		assert.same("/", resolve_relative_path("/", "."))
		assert.same("/", resolve_relative_path("/", "./././."))
		assert.same("/", resolve_relative_path("/", "././././"))
		assert.same("/foo/bar/", resolve_relative_path("/foo/", "bar/././././"))
	end)
	it("should keep leading and trailing /", function()
		assert.same("/foo/", resolve_relative_path("/foo/", "./"))
		assert.same("foo/", resolve_relative_path("foo/", "./"))
		assert.same("/foo", resolve_relative_path("/foo/", "."))
		assert.same("foo", resolve_relative_path("foo/", "."))
	end)
	it("an absolute path as 2nd arg should be resolved", function()
		assert.same("/foo", resolve_relative_path("ignored", "/foo"))
		assert.same("/foo", resolve_relative_path("ignored", "/foo/./."))
		assert.same("/foo", resolve_relative_path("ignored", "/foo/bar/.."))
		assert.same("/foo", resolve_relative_path("ignored", "/foo/bar/qux/./../././.."))
		assert.same("/foo/", resolve_relative_path("ignored", "/foo/././"))
	end)
	it("cannot go above root level", function()
		assert.same("/bar", resolve_relative_path("/", "../bar"))
		assert.same("/bar", resolve_relative_path("/foo", "../../../../bar"))
		assert.same("/bar", resolve_relative_path("/foo", "./../../../../bar"))
		assert.same("/", resolve_relative_path("/foo", "./../../../../"))
		assert.same("/", resolve_relative_path("/", ".."))
		assert.same("", resolve_relative_path("", ".."))
		assert.same("", resolve_relative_path("", "./.."))
		assert.same("bar", resolve_relative_path("", "../bar"))
	end)
end)