Module:Mock title/doc explained

This module allows you to easily mock Scribunto title objects. This can be useful when writing unit tests for modules which depend on whether a certain page exists, or whether a certain page is a redirect, etc. If you don't use mock title objects, then you run the risk of some editor changing a page that your test cases relied on (e.g. redirecting it or deleting it), thus breaking your tests. By using mock objects, you get to specify things like existence status and redirect status in your tests, making them more resilient against changes to real pages.

Usage

Loading the module

Load the module using require:

local mMockTitle = require('Module:Mock title')

Registering titles to mock

You can register a title to be mocked with the registerMockTitle function.

mMockTitle.registerMockTitle

Or you can register multiple titles at once using registerMockTitles.

mMockTitle.registerMockTitles

You can also register a mock for the current page with registerMockCurrentTitle.

mMockTitle.registerMockCurrentTitle

Patching title constructors

During tests, you can use the patchTitleConstructors function to temporarily replace the title constructors mw.title.new, mw.title.makeTitle and mw.title.getCurrentTitle with functions that return the mock titles that you registered. You pass patchTitleConstructors your own function containing your test code; while the function is running the title constructors will return mock titles, but after it finishes running they will be restored to their original versions.

local function logCurrentTitle mw.log(mw.title.getCurrentTitle.prefixedText)end

logCurrentTitle -- Logs "Module:Mock title"mMockTitle.patchTitleConstructors(logCurrentTitle) -- Logs "User:Example"logCurrentTitle -- Logs "Module:Mock title"

Sample test code

Let's say you want to test . This module displays a page type such as "article" for pages in mainspace, and "file" for pages in the File namespace. It also displays "redirect" for redirects in any namespace. Because of its ability to detect redirects, the module's output depends on the content of pages on the wiki. If we just used regular pages, then this would mean that people could break our tests just by redirecting certain pages. Not good!

To protect against this eventuality, we can use mock titles.

This example uses as the test runner. The /testcases module would include code like this:

local mPageType = require('Module:Pagetype')local ScribuntoUnit = require('Module:ScribuntoUnit')local mMockTitle = require('Module:Mock title')local suite = ScribuntoUnit:new

mMockTitle.registerMockTitles

function suite:testMainspacePages local actual = mMockTitle.patchTitleConstructors(mPageType.main,) suite:assertEquals('article', actual)end

function suite:testMainspaceRedirects local actual = mMockTitle.patchTitleConstructors(mPageType.main,) suite:assertEquals('redirect', actual)end

return suite

Note that in these tests we make use of patchTitleConstructors' ability to return the value of the function it runs. This means that we can store the result of mPageType.main in the actual variable and compare it with the expected result outside of the patched function.

API documentation

Mock title constructors

MockTitle

Creates a mock title object.

Mock title objects function like normal title objects, but values you specify when creating them are used instead of the real values taken from the wiki.

Usage:

mMockTitle.MockTitle(options)

Parameters:

This function takes a table of options. The possible options are as follows:

Example 1: create a mock title of a fully protected file.

local protectedFileMock = mMockTitle.MockTitle

Example 2: create a mock circular redirect.

local circularRedirectMock = mMockTitle.MockTitle

patchTitleObject

Create a mock title object by patching an existing title object with the specified options.

Usage:

mMockTitle.patchTitleObject(title, options)

Parameters:

This function takes two parameters:

Example: patch a title object for the Main Page.

local title = mw.title.new('Main Page')local mock = mMockTitle.patchTitleObject(title,)mw.log(mock:getContent) -- logs "Mock content"

Registration functions

These functions allow you to register mock titles in the module's internal mock title registry. When title constructors are patched with one of the patching functions, the title constructors return mock titles registered with these functions instead of normal title objects.

registerMockTitle

Register a single mock title.

Usage:

mMockTitle.registerMockTitle(titleOrOptions)

Parameters:

registerMockTitles

Register multiple mock titles.

Usage:

mMockTitle.registerMockTitles(...)

Parameters:

This function takes a variable number of parameters, each of which must be either a MockTitle object, or a table of MockTitle object options. (table, required)

registerMockCurrentTitle

Register a mock title as the current title. If mw.title.getCurrentTitle is patched with a patching function, it will return the mock title registered with this function.

Usage:

mMockTitle.registerMockCurrentTitle(titleOrOptions)

Parameters:

Deregistration functions

These functions remove mock titles registered with one of the registration functions.

deregisterMockTitle

Remove a single title from the mock title registry.

mMockTitle.deregisterMockTitle(titleOrOptions)

Parameters:

deregisterMockTitles

Remove multiple titles from the mock title registry.

Usage:

mMockTitle.deregisterMockTitles(...)

Parameters:

This function takes a variable number of parameters, each of which must be one of the following:

deregisterMockCurrentTitle

Remove the mock title registered as the current title.

mMockTitle.deregisterMockCurrentTitle

clearMockTitleRegistry

Remove all titles from the mock title registry. This removes titles added with registerMockTitle or registerMockTitles, but does not remove the registered mock current title.

mMockTitle.clearMockTitleRegistry

clearAllMockTitles

Remove all mock titles. This removes titles from the mock title registry that were added with registerMockTitle or registerMockTitles, and also removes the registered mock current title.

mMockTitle.clearMockTitleRegistry

Patching functions

These functions patch one or more of the Scribunto functions that create title objects. When these functions are patched, the patched versions will return mock titles registered with one of the registration functions.

patchTitleNew

Patch mw.title.new.

mMockTitle.patchTitleNew(func, ...)

Parameters:

Returns: the result of the func parameter.

patchMakeTitle

Patch mw.title.makeTitle.

mMockTitle.patchTitleNew(func, ...)

Parameters:

Returns: the result of the func parameter.

patchGetCurrentTitle

Patch mw.title.getCurrentTitle.

mMockTitle.patchTitleNew(func, ...)

Parameters:

Returns: the result of the func parameter.

patchTitleConstructors

Patch all title constructors: mw.title.new, mw.title.makeTitle, and mw.title.getCurrentTitle.

mMockTitle.patchTitleNew(func, ...)

Parameters:

Returns: the result of the func parameter.