Difference between revisions of "Module:Redirect/testcases"

From blackwiki
Jump to navigation Jump to search
test>Mr. Stradivarius
(test isRedirect)
test>Mr. Stradivarius
(convert test cases to use Module:ScribuntoUnit)
Line 1: Line 1:
 
-- Unit tests for [[Module:Redirect]]. Click talk page to run tests.
 
-- Unit tests for [[Module:Redirect]]. Click talk page to run tests.
  
local module_name = 'Redirect/sandbox'
+
local mRedirect = require('Module:Redirect') -- 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 }
+
 
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|WP:AFC}}', 'Wikipedia:Articles for creation', options)
+
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|    }}', '', options)
+
return frame:newChild{title = 'Frame', args = args}
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|[[WP:AFC]]|bracket=yes}}','[[Wikipedia:Articles for creation]]', options)
+
end
    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)
+
--------------------------------------------------------------------------------
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|WP:AFC|bracket=yes}}', '[[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|User:John Vandenberg/testcases/Redirect/1}}', 'User:John Vandenberg/testcases/Redirect/1', options)--isRedirect fails
+
 
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|User:John Vandenberg/testcases/Redirect/2}}', 'Blah', options)
+
do
 +
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
 
end
  
function p:test_canonicalisation()
+
-- Shortcut method for typical pages used in tests
self:preprocess_equals('{{#invoke:' .. module_name .. '|main|Module talk:Redirect/sandbox}}', 'Module talk:Redirect', options) -- Content is "#REDIRECT [[Module talk:Redirect]]"
+
function suite:mockAFCShortcut()
-- not redirects, but should be canonicalized anyway
+
local content = [=[
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|Mother's Day}}', 'Mother\'s Day', options)
+
#REDIRECT [[Wikipedia:Articles for creation]]
    self:preprocess_equals('{{#invoke:' .. module_name .. '|main|mother\'s Day}}', 'Mother\'s Day', options)
+
 
 +
{{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:testContentCanonicalisation()
 +
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: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
 
end
  
function p:test_isRedirect()
+
function suite:testIsRedirect()
self:preprocess_equals('{{#invoke:' .. module_name .. '|isRedirect|WP:AFC}}', 'yes', options)
+
self:mockMothersDayPage()
    self:preprocess_equals('{{#invoke:' .. module_name .. '|isRedirect|France}}', '', options)
+
self:assertEquals(
 +
'',
 +
mRedirect.isRedirect(self:makeFrameWithArgs{"Mother's Day"})
 +
)
 +
self:resetTitleMock()
 
end
 
end
  
return p
+
return suite

Revision as of 05:09, 7 March 2017

Documentation for this module may be created at Module:Redirect/testcases/doc

-- Unit tests for [[Module:Redirect]]. Click talk page to run tests.

local mRedirect = require('Module:Redirect') -- the module to be tested
local 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
--------------------------------------------------------------------------------

do
	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:testContentCanonicalisation()
	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: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 suite:testIsRedirect()
	self:mockMothersDayPage()
	self:assertEquals(
		'',
		mRedirect.isRedirect(self:makeFrameWithArgs{"Mother's Day"})
	)
	self:resetTitleMock()
end

return suite