Module:Sensitive IP addresses/blocktext/testcases

-- 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( '',			{				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 $2 ' .. 'belongs to the entity with id "$4".', },		   mw.title.new('Special:Block/156.33.0.1') )	) end return suite