Module:Redirect/testcases: Difference between revisions

Content deleted Content added
add a test for decoding redirect targets
Jackmcbarn (talk | contribs)
actually test the right thing
 
(3 intermediate revisions by 2 users not shown)
Line 1:
-- Unit tests for [[Module:Redirect]]. Click talk page to run tests.
 
local module_namemRedirect = require('Module:Redirect/sandbox') -- the module to be tested
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()
 
--------------------------------------------------------------------------------
local p = require('Module:UnitTests')
-- Helper functions
--------------------------------------------------------------------------------
function p:test_main()
 
local options = { nowiki = true }
function suite:makeFrameWithArgs(args)
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|WP:AFC}}', 'Wikipedia:Articles for creation', options)
local frame = mw.getCurrentFrame()
self:preprocess_equals('{{#invoke:' .. module_name .. '|main| WP:AFC }}', 'Wikipedia:Articles for creation', options)
return frame:newChild{title = 'Frame', args = args}
self:preprocess_equals('{{#invoke:' .. module_name .. '|main| }}', '', options)
end
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|[[WP:AFC]]|bracket=yes}}','[[Wikipedia:Articles for creation]]', options)
 
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|[[WP:AFC]]}}', 'Wikipedia:Articles for creation', options)
--------------------------------------------------------------------------------
self:preprocess_equals('{{#invoke:' .. module_name .. '|main| [[WP:AFC]] }}', 'Wikipedia:Articles for creation', options)
-- Mock mw.title.new
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|WP:AFC|bracket=yes}}', '[[Wikipedia:Articles for creation]]', options)
--------------------------------------------------------------------------------
self:preprocess_equals('{{#invoke:' .. module_name .. '|main| WP:AFC |bracket=yes}}', '[[Wikipedia:Articles for creation]]', options)
 
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|User:John Vandenberg/testcases/Redirect/1}}', 'User:John Vandenberg/testcases/Redirect/1', options)--isRedirect fails
do
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|User:John Vandenberg/testcases/Redirect/2}}', 'Blah', options)
local oldNewTitle = mw.title.new
 
function suite:mockNewTitle(options)
mw.title.new = function (page)
local titleObj = oldNewTitle(page)
if options[page] then
if options[page].content then
local content = options[page].content
rawset(titleObj, 'getContent', function ()
return content
end)
options[page].content = nil
end
for k, v in pairs(options[page]) do
rawset(titleObj, k, v)
end
end
return titleObj
end
end
function suite:resetTitleMock()
mw.title.new = oldNewTitle
end
end
 
-- Shortcut method for typical pages used in tests
function suite:mockAFCShortcut()
local content = [=[
#REDIRECT [[Wikipedia:Articles for creation]]
 
{{R to Wikipedia namespace}}
{{R from shortcut}}
]=]
local pageOptions = {
content = content,
isRedirect = true,
}
self:mockNewTitle{
['WP:AFC'] = pageOptions,
['Wikipedia:AFC'] = pageOptions,
}
end
 
function suite:mockMothersDayPage()
self:mockNewTitle{["Mother's Day"] = {
content = 'Lorem ipsum',
isRedirect = false,
}}
end
 
--------------------------------------------------------------------------------
-- Test Main
--------------------------------------------------------------------------------
 
function suite:testMain()
self:mockAFCShortcut()
self:assertEquals(
'Wikipedia:Articles for creation',
mRedirect.main(self:makeFrameWithArgs{'WP:AFC'})
)
self:resetTitleMock()
end
 
function suite:testMainWithPadding()
self:mockAFCShortcut()
self:assertEquals(
'Wikipedia:Articles for creation',
mRedirect.main(self:makeFrameWithArgs{' WP:AFC '})
)
self:resetTitleMock()
end
 
function suite:testMainWithBlankArgument()
self:mockAFCShortcut()
self:assertEquals(
'',
mRedirect.main(self:makeFrameWithArgs{' '})
)
self:resetTitleMock()
end
 
function suite:testMainWithInputBrackets()
self:mockAFCShortcut()
self:assertEquals(
'Wikipedia:Articles for creation',
mRedirect.main(self:makeFrameWithArgs{'[[WP:AFC]]'})
)
self:resetTitleMock()
end
 
function suite:testMainWithOutputBrackets()
self:mockAFCShortcut()
self:assertEquals(
'[[Wikipedia:Articles for creation]]',
mRedirect.main(self:makeFrameWithArgs{'WP:AFC', bracket = 'yes'})
)
self:resetTitleMock()
end
 
function suite:testMainWithInputAndOutputBrackets()
self:mockAFCShortcut()
self:assertEquals(
'[[Wikipedia:Articles for creation]]',
mRedirect.main(self:makeFrameWithArgs{'[[WP:AFC]]', bracket = 'yes'})
)
self:resetTitleMock()
end
 
function suite:testMainWithInputBracketsAndPadding()
self:mockAFCShortcut()
self:assertEquals(
'Wikipedia:Articles for creation',
mRedirect.main(self:makeFrameWithArgs{' [[WP:AFC]] '})
)
self:resetTitleMock()
end
 
function suite:testMainWithRealInvalidRedirect()
self:assertEquals(
'User:John Vandenberg/testcases/Redirect/1',
mRedirect.main(self:makeFrameWithArgs{'User:John Vandenberg/testcases/Redirect/1'})
)
end
 
function suite:testMainWithRealValidRedirect()
self:assertEquals(
'Blah',
mRedirect.main(self:makeFrameWithArgs{'User:John Vandenberg/testcases/Redirect/2'})
)
end
 
--------------------------------------------------------------------------------
-- Test Canonicalisation
--------------------------------------------------------------------------------
 
function suite:testContentAmpersandCanonicalisation()
self:mockNewTitle{['Module talk:Redirect/sandbox'] = {
content = '#REDIRECT [[Module talk:Redirect]]',
isRedirect = true,
}}
self:assertEquals(
'Module talk:Redirect',
mRedirect.main(self:makeFrameWithArgs{'Module talk:Redirect/sandbox'})
)
self:resetTitleMock()
end
 
function suite:testContentPercentCanonicalisation()
self:mockNewTitle{['Module talk:Redirect/sandbox'] = {
content = '#REDIRECT [[Module talk%3ARedirect]]',
isRedirect = true,
}}
self:assertEquals(
'Module talk:Redirect',
mRedirect.main(self:makeFrameWithArgs{'Module talk:Redirect/sandbox'})
)
self:resetTitleMock()
end
 
function suite:testContentAmpersandInsidePercentCanonicalisation()
self:mockNewTitle{['Module talk:Redirect/sandbox'] = {
content = '#REDIRECT [[Module talk%26#58;Redirect]]',
isRedirect = true,
}}
self:assertEquals(
'Module talk:Redirect',
mRedirect.main(self:makeFrameWithArgs{'Module talk:Redirect/sandbox'})
)
self:resetTitleMock()
end
 
function suite:testContentPercentInsideAmpersandCanonicalisation()
self:mockNewTitle{['Module talk:Redirect/sandbox'] = {
content = '#REDIRECT [[Module talk%3ARedirect]]',
isRedirect = true, -- not actually considered a redirect, but we want to exercise the code paths anyway
}}
self:assertEquals(
'Module talk:Redirect/sandbox',
mRedirect.main(self:makeFrameWithArgs{'Module talk:Redirect/sandbox'})
)
self:resetTitleMock()
end
 
function suite:testTitleCanonicalisation()
self:mockMothersDayPage()
self:assertEquals(
"Mother's Day",
mRedirect.main(self:makeFrameWithArgs{"Mother's Day"})
)
self:resetTitleMock()
end
 
function suite:testTitleInitialCapitalCanonicalisation()
self:mockMothersDayPage()
self:assertEquals(
"Mother's Day",
mRedirect.main(self:makeFrameWithArgs{"mother's Day"})
)
self:resetTitleMock()
end
 
--------------------------------------------------------------------------------
-- Test isRedirect
--------------------------------------------------------------------------------
 
function suite:testIsRedirect()
self:mockAFCShortcut()
self:assertEquals(
'yes',
mRedirect.isRedirect(self:makeFrameWithArgs{'WP:AFC'})
)
self:resetTitleMock()
end
 
function psuite:test_canonicalisationtestIsRedirect()
self:mockMothersDayPage()
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|Module talk:Redirect/sandbox}}', 'Module talk:Redirect', options) -- Content is "#REDIRECT [[Module talk:Redirect]]"
self:assertEquals(
-- not redirects, but should be canonicalized anyway
'',
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|Mother's Day}}', 'Mother\'s Day', options)
mRedirect.isRedirect(self:makeFrameWithArgs{"Mother's Day"})
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|mother\'s Day}}', 'Mother\'s Day', options)
)
self:resetTitleMock()
end
 
return psuite