Module:Redirect/testcases

-- Unit tests for [[Module:Redirect]]. Click talk page to run tests.local mRedirect = require('Module:Redirect') -- the module to be testedlocal ScribuntoUnit = require('Module:ScribuntoUnit')local suite = ScribuntoUnit:new()---------------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------------function suite:makeFrameWithArgs(args)local frame = mw.getCurrentFrame()return frame:newChild{title = 'Frame', args = args}end---------------------------------------------------------------------------------- Mock mw.title.new--------------------------------------------------------------------------------dolocal oldNewTitle = mw.title.newfunction suite:mockNewTitle(options)mw.title.new = function (page)local titleObj = oldNewTitle(page)if options[page] thenif options[page].content thenlocal content = options[page].contentrawset(titleObj, 'getContent', function ()return contentend)options[page].content = nilendfor k, v in pairs(options[page]) dorawset(titleObj, k, v)endendreturn titleObjendendfunction suite:resetTitleMock()mw.title.new = oldNewTitleendend-- Shortcut method for typical pages used in testsfunction 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,}endfunction 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()endfunction suite:testMainWithPadding()self:mockAFCShortcut()self:assertEquals('Wikipedia:Articles for creation',mRedirect.main(self:makeFrameWithArgs{'  WP:AFC  '}))self:resetTitleMock()endfunction suite:testMainWithBlankArgument()self:mockAFCShortcut()self:assertEquals('',mRedirect.main(self:makeFrameWithArgs{'  '}))self:resetTitleMock()endfunction suite:testMainWithInputBrackets()self:mockAFCShortcut()self:assertEquals('Wikipedia:Articles for creation',mRedirect.main(self:makeFrameWithArgs{'[[WP:AFC]]'}))self:resetTitleMock()endfunction suite:testMainWithOutputBrackets()self:mockAFCShortcut()self:assertEquals('[[Wikipedia:Articles for creation]]',mRedirect.main(self:makeFrameWithArgs{'WP:AFC', bracket = 'yes'}))self:resetTitleMock()endfunction suite:testMainWithInputAndOutputBrackets()self:mockAFCShortcut()self:assertEquals('[[Wikipedia:Articles for creation]]',mRedirect.main(self:makeFrameWithArgs{'[[WP:AFC]]', bracket = 'yes'}))self:resetTitleMock()endfunction suite:testMainWithInputBracketsAndPadding()self:mockAFCShortcut()self:assertEquals('Wikipedia:Articles for creation',mRedirect.main(self:makeFrameWithArgs{'  [[WP:AFC]]  '}))self:resetTitleMock()endfunction suite:testMainWithRealInvalidRedirect()self:assertEquals('User:John Vandenberg/testcases/Redirect/1',mRedirect.main(self:makeFrameWithArgs{'User:John Vandenberg/testcases/Redirect/1'}))endfunction 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()endfunction 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()endfunction 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()endfunction 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()endfunction suite:testTitleCanonicalisation()self:mockMothersDayPage()self:assertEquals("Mother's Day",mRedirect.main(self:makeFrameWithArgs{"Mother's Day"}))self:resetTitleMock()endfunction 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()endfunction suite:testIsRedirect()self:mockMothersDayPage()self:assertEquals('',mRedirect.isRedirect(self:makeFrameWithArgs{"Mother's Day"}))self:resetTitleMock()endreturn suite