mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-12-04 20:58:13 +00:00
ca85f20099
The core {{urlencode:}} parser function doesn't encode various characters in WIKI mode that it does in other modes. mw.uri.encode should match that. Bug: T174239 Change-Id: I2be0811cf39c02c5c0ad3433e4b0ef9030350e24
183 lines
5.3 KiB
Lua
183 lines
5.3 KiB
Lua
local testframework = require 'Module:TestFramework'
|
|
|
|
local function test_new( arg )
|
|
-- Skip the functions
|
|
local ret = {}
|
|
for k, v in pairs( mw.uri.new( arg ) ) do
|
|
if type( v ) ~= 'function' then
|
|
ret[k] = v
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
-- Tests
|
|
local tests = {
|
|
{ name = 'uri.encode', func = mw.uri.encode,
|
|
args = { '__foo b\195\161r + baz__' },
|
|
expect = { '__foo+b%C3%A1r+%2B+baz__' }
|
|
},
|
|
{ name = 'uri.encode QUERY', func = mw.uri.encode,
|
|
args = { '__foo b\195\161r + /baz/__', 'QUERY' },
|
|
expect = { '__foo+b%C3%A1r+%2B+%2Fbaz%2F__' }
|
|
},
|
|
{ name = 'uri.encode PATH', func = mw.uri.encode,
|
|
args = { '__foo b\195\161r + /baz/__', 'PATH' },
|
|
expect = { '__foo%20b%C3%A1r%20%2B%20%2Fbaz%2F__' }
|
|
},
|
|
{ name = 'uri.encode WIKI', func = mw.uri.encode,
|
|
args = { '__foo b\195\161r + /baz/__', 'WIKI' },
|
|
expect = { '__foo_b%C3%A1r_%2B_/baz/__' }
|
|
},
|
|
|
|
{ name = 'uri.decode', func = mw.uri.decode,
|
|
args = { '__foo+b%C3%A1r+%2B+baz__' },
|
|
expect = { '__foo b\195\161r + baz__' }
|
|
},
|
|
{ name = 'uri.decode QUERY', func = mw.uri.decode,
|
|
args = { '__foo+b%C3%A1r+%2B+baz__', 'QUERY' },
|
|
expect = { '__foo b\195\161r + baz__' }
|
|
},
|
|
{ name = 'uri.decode PATH', func = mw.uri.decode,
|
|
args = { '__foo+b%C3%A1r+%2B+baz__', 'PATH' },
|
|
expect = { '__foo+b\195\161r+++baz__' }
|
|
},
|
|
{ name = 'uri.decode WIKI', func = mw.uri.decode,
|
|
args = { '__foo+b%C3%A1r+%2B+baz__', 'WIKI' },
|
|
expect = { ' foo+b\195\161r+++baz ' }
|
|
},
|
|
|
|
{ name = 'uri.anchorEncode', func = mw.uri.anchorEncode,
|
|
args = { '__foo b\195\161r__' },
|
|
expect = { 'foo_b.C3.A1r' }
|
|
},
|
|
|
|
{ name = 'uri.new', func = test_new,
|
|
args = { 'http://www.example.com/test?foo=1&bar&baz=1&baz=2#fragment' },
|
|
expect = {
|
|
{
|
|
protocol = 'http',
|
|
host = 'www.example.com',
|
|
hostPort = 'www.example.com',
|
|
authority = 'www.example.com',
|
|
path = '/test',
|
|
query = {
|
|
foo = '1',
|
|
bar = false,
|
|
baz = { '1', '2' },
|
|
},
|
|
queryString = 'foo=1&bar&baz=1&baz=2',
|
|
fragment = 'fragment',
|
|
relativePath = '/test?foo=1&bar&baz=1&baz=2#fragment',
|
|
},
|
|
},
|
|
},
|
|
|
|
{ name = 'uri.new', func = mw.uri.new, type = 'ToString',
|
|
args = { 'http://www.example.com/test?foo=1&bar&baz=1&baz=2#fragment' },
|
|
expect = { 'http://www.example.com/test?foo=1&bar&baz=1&baz=2#fragment' },
|
|
},
|
|
|
|
{ name = 'uri.localUrl( Example )', func = mw.uri.localUrl, type = 'ToString',
|
|
args = { 'Example' },
|
|
expect = { '/wiki/Example' },
|
|
},
|
|
{ name = 'uri.localUrl( Example, string )', func = mw.uri.localUrl, type = 'ToString',
|
|
args = { 'Example', 'action=edit' },
|
|
expect = { '/w/index.php?title=Example&action=edit' },
|
|
},
|
|
{ name = 'uri.localUrl( Example, table )', func = mw.uri.localUrl, type = 'ToString',
|
|
args = { 'Example', { action = 'edit' } },
|
|
expect = { '/w/index.php?title=Example&action=edit' },
|
|
},
|
|
|
|
{ name = 'uri.fullUrl( Example )', func = mw.uri.fullUrl, type = 'ToString',
|
|
args = { 'Example' },
|
|
expect = { '//wiki.local/wiki/Example' },
|
|
},
|
|
{ name = 'uri.fullUrl( Example, string )', func = mw.uri.fullUrl, type = 'ToString',
|
|
args = { 'Example', 'action=edit' },
|
|
expect = { '//wiki.local/w/index.php?title=Example&action=edit' },
|
|
},
|
|
{ name = 'uri.fullUrl( Example, table )', func = mw.uri.fullUrl, type = 'ToString',
|
|
args = { 'Example', { action = 'edit' } },
|
|
expect = { '//wiki.local/w/index.php?title=Example&action=edit' },
|
|
},
|
|
|
|
{ name = 'uri.canonicalUrl( Example )', func = mw.uri.canonicalUrl, type = 'ToString',
|
|
args = { 'Example' },
|
|
expect = { 'http://wiki.local/wiki/Example' },
|
|
},
|
|
{ name = 'uri.canonicalUrl( Example, string )', func = mw.uri.canonicalUrl, type = 'ToString',
|
|
args = { 'Example', 'action=edit' },
|
|
expect = { 'http://wiki.local/w/index.php?title=Example&action=edit' },
|
|
},
|
|
{ name = 'uri.canonicalUrl( Example, table )', func = mw.uri.canonicalUrl, type = 'ToString',
|
|
args = { 'Example', { action = 'edit' } },
|
|
expect = { 'http://wiki.local/w/index.php?title=Example&action=edit' },
|
|
},
|
|
|
|
{ name = 'uri.new with empty query string', func = mw.uri.new, type = 'ToString',
|
|
args = { 'http://wiki.local/w/index.php?' },
|
|
expect = { 'http://wiki.local/w/index.php?' },
|
|
},
|
|
|
|
{ name = 'uri.new with empty fragment', func = mw.uri.new, type = 'ToString',
|
|
args = { 'http://wiki.local/w/index.php#' },
|
|
expect = { 'http://wiki.local/w/index.php#' },
|
|
},
|
|
}
|
|
|
|
-- Add tests to test round-tripping for every combination of parameters
|
|
local bits = { [0] = false, false, false, false, false, false, false, false, false }
|
|
local ct = 0
|
|
while not bits[8] do
|
|
local url = {}
|
|
if bits[0] then
|
|
url[#url+1] = 'http:'
|
|
end
|
|
if bits[1] or bits[2] or bits[3] or bits[4] then
|
|
url[#url+1] = '//'
|
|
end
|
|
if bits[1] then
|
|
url[#url+1] = 'user'
|
|
end
|
|
if bits[2] then
|
|
url[#url+1] = ':password'
|
|
end
|
|
if bits[1] or bits[2] then
|
|
url[#url+1] = '@'
|
|
end
|
|
if bits[3] then
|
|
url[#url+1] = 'host.example.com'
|
|
end
|
|
if bits[4] then
|
|
url[#url+1] = ':123'
|
|
end
|
|
if bits[5] then
|
|
url[#url+1] = '/path'
|
|
end
|
|
if bits[6] then
|
|
url[#url+1] = '?query=1'
|
|
end
|
|
if bits[7] then
|
|
url[#url+1] = '#fragment'
|
|
end
|
|
|
|
url = table.concat( url, '' )
|
|
tests[#tests+1] = { name = 'uri.new (' .. ct .. ')', func = mw.uri.new, type = 'ToString',
|
|
args = { url },
|
|
expect = { url },
|
|
}
|
|
ct = ct + 1
|
|
|
|
for i = 0, 8 do
|
|
bits[i] = not bits[i]
|
|
if bits[i] then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
return testframework.getTestProvider( tests )
|