Jump to content

Module:Sensitive IP addresses/blocktext/testcases

From Wikipedia, the free encyclopedia
-- Unit tests for [[Module:Sensitive IP addresses/blocktext]]

local mBlockText = require('Module:Sensitive IP addresses/blocktext')
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()

local mBlockTextFunctions = mBlockText._exportFunctions()
local parseTitle = mBlockTextFunctions.parseTitle
local fetchSensitivityData = mBlockTextFunctions.fetchSensitivityData
local parseSensitivityData = mBlockTextFunctions.parseSensitivityData
local renderMessage = mBlockTextFunctions.renderMessage

-------------------------------------------------------------------------------
-- parseTitle tests
-------------------------------------------------------------------------------

function suite:test_parse_special_block_with_ipv4_address()
	self:assertEquals(
		'1.2.3.4',
		parseTitle(mw.title.new('Special:Block/1.2.3.4'))
	)
end

function suite:test_parse_special_block_with_ipv4_range()
	self:assertEquals(
		'1.2.3.0/24',
		parseTitle(mw.title.new('Special:Block/1.2.3.0/24'))
	)
end

function suite:test_parse_special_block_with_ipv6_address()
	self:assertEquals(
		'2001:db8::ff00:12:3456',
		parseTitle(mw.title.new('Special:Block/2001:db8::ff00:12:3456'))
	)
end

function suite:test_parse_special_block_with_ipv6_range()
	self:assertEquals(
		'2001:db8::ff00:12:0/122',
		parseTitle(mw.title.new('Special:Block/2001:db8::ff00:12:0/122'))
	)
end

function suite:test_parse_special_block_with_username()
	self:assertEquals(
		nil,
		parseTitle(mw.title.new('Special:Block/Example'))
	)
end

function suite:test_parse_special_block_with_non_normalized_ipv6_address()
	self:assertEquals(
		'2001:db8::ff00:12:3456',
		parseTitle(mw.title.new('Special:Block/2001:db8:0:0::ff00:12:3456'))
	)
end

function suite:test_parse_special_block_with_invalid_ipv4_address()
	self:assertEquals(
		nil,
		parseTitle(mw.title.new('Special:Block/1.2.3.256'))
	)
end

function suite:test_parse_special_block_in_french()
	self:assertEquals(
		'1.2.3.4',
		parseTitle(mw.title.new('Spécial:Bloquer/1.2.3.4'))
	)
end

-------------------------------------------------------------------------------
-- fetchSensitivityData tests
--
-- Here we test against the live sensitivity data, which means that changes to
-- that module could make these tests fail. This is bad for isolation but a
-- good quick check that the interface is working. To reduce the chance of test
-- failures because of data changes, only test one or two items, only test the
-- items that are least likely to change, and only test the data points that we
-- need.
-------------------------------------------------------------------------------

function suite:test_fetch_sensitivity_data_for_us_senate_ip()
	local ipData = fetchSensitivityData('156.33.0.1')
	self:assertEquals('ussenate', ipData.sensitiveips.matches[1]['entity-id'])
	self:assertEquals('156.33.0.1', ipData.sensitiveips.matches[1].ip)
	self:assertTrue(ipData.sensitiveips.entities.ussenate.description:find('Senate'))
	self:assertEquals('political', ipData.sensitiveips.entities.ussenate.reason)
end

function suite:test_fetch_sensitivity_data_for_us_senate_range()
	local ipData = fetchSensitivityData('156.33.0.0/24')
	self:assertEquals('ussenate', ipData.sensitiveips.matches[1]['entity-id'])
	self:assertEquals('156.33.0.0/24', ipData.sensitiveips.matches[1].range)
	self:assertTrue(ipData.sensitiveips.entities.ussenate.description:find('Senate'))
	self:assertEquals('political', ipData.sensitiveips.entities.ussenate.reason)
end

function suite:test_fetch_sensitivity_data_for_wmf_ip()
	local ipData = fetchSensitivityData('185.15.56.1')
	self:assertEquals('wmf', ipData.sensitiveips.matches[1]['entity-id'])
	self:assertEquals('185.15.56.1', ipData.sensitiveips.matches[1].ip)
	self:assertTrue(ipData.sensitiveips.entities.wmf.description:find('Wikimedia Foundation'))
	self:assertEquals('technical', ipData.sensitiveips.entities.wmf.reason)
end

function suite:test_fetch_sensitivity_data_for_private_ip()
	local ipData = fetchSensitivityData('10.0.0.1')
	self:assertEquals(0, #ipData.sensitiveips.matches)
end

-------------------------------------------------------------------------------
-- parseSensitivityData tests
-------------------------------------------------------------------------------

function suite:test_parse_sensitivity_data_for_us_senate_ip()
	local ipData = {
		sensitiveips = {
			entities = {
				ussenate = {
					description = "the [[United States Senate]]",
					id = "ussenate",
					ipv4Ranges = {"156.33.0.0/16"},
					ipv6Ranges = {"2620:0:8a0::/48", "2600:803:618::/48"},
					name = "United States Senate",
					reason = "political",
				},
			},
			["entity-ids"] = {"ussenate"},
			["matched-ranges"] = {
				["156.33.0.0/16"] = {
					["entity-id"] = "ussenate",
					["ip-version"] = "IPv4",
					range = "156.33.0.0/16",
				},
			},
			matches = {
				{
					["entity-id"] = "ussenate",
					ip = "156.33.0.1",
					["ip-version"] = "IPv4",
					["matches-range"] = "156.33.0.0/16",
					type = "ip",
				},
			},
		},
	}
	self:assertDeepEquals(
		{
			type = 'ip',
			ip = '156.33.0.1',
			['entity-id'] = 'ussenate',
			['matches-range'] = '156.33.0.0/16',
			['entity-name'] = 'United States Senate',
			['entity-description'] = 'the [[United States Senate]]',
			reason = 'political',
		},
		parseSensitivityData(ipData)
	)
end

function suite:test_parse_sensitivity_data_for_us_senate_range()
	local ipData = {
		sensitiveips = {
			entities = {
				ussenate = {
					description = "the [[United States Senate]]",
					id = "ussenate",
					ipv4Ranges = {"156.33.0.0/16"},
					ipv6Ranges = {"2620:0:8a0::/48", "2600:803:618::/48"},
					name = "United States Senate",
					reason = "political",
				},
			},
			["entity-ids"] = {"ussenate"},
			["matched-ranges"] = {
				["156.33.0.0/16"] = {
					["entity-id"] = "ussenate",
					["ip-version"] = "IPv4",
					range = "156.33.0.0/16",
				},
			},
			matches = {
				{
					["entity-id"] = "ussenate",
					["ip-version"] = "IPv4",
					["matches-range"] = "156.33.0.0/16",
					range = "156.33.0.0/24",
					type = "range",
				},
			},
		},
	}
	self:assertDeepEquals(
		{
			type = 'range',
			range = '156.33.0.0/24',
			['entity-id'] = 'ussenate',
			['matches-range'] = '156.33.0.0/16',
			['entity-name'] = 'United States Senate',
			['entity-description'] = 'the [[United States Senate]]',
			reason = 'political',
		},
		parseSensitivityData(ipData)
	)
end

function suite:test_parse_sensitivity_data_when_no_match_occurs()
	local ipData = {
		sensitiveips = {
			entities = {},
			["entity-ids"] = {},
			["matched-ranges"] = {},
			matches = {},
		},
	}
	self:assertEquals(nil, parseSensitivityData(ipData))
end

function suite:test_parse_sensitivity_data_when_an_error_occurs()
	local ipData = {
		error = {
			["*"] = "See https://en.wikipedia.org/wiki/Module:Sensitive_IP_addresses/API for API usage",
			code = "sipa-invalid-test-string",
			info = "test string #1 'foo' was not a valid IP address or CIDR string",
		},
	}
	self:assertEquals(nil, parseSensitivityData(ipData))
end

-------------------------------------------------------------------------------
-- renderMessage tests
-------------------------------------------------------------------------------

function suite:test_render_message_template_with_ip()
	self:assertEquals(
		'1: ip, 2: 156.33.0.1, 3: 156.33.0.0/16, 4: ussenate, '
		.. '5: United States Senate, 6: the [[United States Senate]], '
		.. '7: political',
		renderMessage(
			'1: $1, 2: $2, 3: $3, 4: $4, 5: $5, 6: $6, 7: $7',
			{
				type = 'ip',
				ip = '156.33.0.1',
				['entity-id'] = 'ussenate',
				['matches-range'] = '156.33.0.0/16',
				['entity-name'] = 'United States Senate',
				['entity-description'] = 'the [[United States Senate]]',
				reason = 'political',
			}
		)
	)
end

function suite:test_render_message_template_with_range()
	self:assertEquals(
		'1: range, 2: 156.33.0.0/24, 3: 156.33.0.0/16, 4: ussenate, '
		.. '5: United States Senate, 6: the [[United States Senate]], '
		.. '7: political',
		renderMessage(
			'1: $1, 2: $2, 3: $3, 4: $4, 5: $5, 6: $6, 7: $7',
			{
				type = 'range',
				range = '156.33.0.0/24',
				['entity-id'] = 'ussenate',
				['matches-range'] = '156.33.0.0/16',
				['entity-name'] = 'United States Senate',
				['entity-description'] = 'the [[United States Senate]]',
				reason = 'political',
			}
		)
	)
end


function suite:test_render_message_template_with_ip_wikitext()
	self:assertEquals(
		'IP address',
		renderMessage(
			'{{#ifeq: $1 | ip | IP address | IP range}}',
			{
				type = 'ip',
				ip = '156.33.0.1',
				['entity-id'] = 'ussenate',
				['matches-range'] = '156.33.0.0/16',
				['entity-name'] = 'United States Senate',
				['entity-description'] = 'the [[United States Senate]]',
				reason = 'political',
			}
		)
	)
end

--------------------------------------------------------------------------------
-- Main tests
--------------------------------------------------------------------------------

function suite:test_main()
	self:assertEquals(
		'The IP address 156.33.0.1 belongs to the entity with id "ussenate".',
		mBlockText._main(
			{
				message = 'The {{#ifeq: $1 | ip | IP address | IP range}} $2 '
				.. 'belongs to the entity with id "$4".',
			},
		    mw.title.new('Special:Block/156.33.0.1')
		)
	)
end
return suite