Модуль:Песочница/D6194c-1cc/WDBackendV2/testcases

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
local suite = require('Модуль:ScribuntoUnit'):new()
local backend = require('Модуль:Песочница/D6194c-1cc/WDBackendV2')
local wikidata = require('Модуль:WDCommon')
local base = wikidata.base


local saganEntity = 'Q410'
local saganBook = 'Q2482106'
local marsEntity = 'Q111'
local kidneyEntity = 'Q9377'
local journalEntity = 'Q582728'
local scholaryArticleEntity = 'Q13442814'
local scientificJournalEntity = 'Q5633421'
local bookWithInscriptions = 'Q114831437'
local influenzaEntity = 'Q2840'

local P_SUBCLASS_OF = 'P279'
local P_WORK_LANG = 'P407'
local P_LANG_CODE = 'P218'

function suite:test_fetchEntity_baseTypes()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganEntity, {
		{
			name = 'gender',
			property = 'P21',
		},
		{
			name = 'birthDate',
			property = 'P569',
		},
		{
			name = 'shortName',
			property = 'P1813',
			filter = base.tryFilterStatementsByLang,
		},
	})

	self:assertEquals('Q6581097', source.gender.entity)
	self:assertEquals('male', source.gender.value)

	self:assertEquals(1934, source.birthDate.value.year)
	self:assertEquals(11, source.birthDate.value.month)
	self:assertEquals(9, source.birthDate.value.day)

	self:assertEquals('Carl Sagan', source.shortName.value)
end

function suite:test_fetchEntity_get()
	local source = {}
	local f = backend.new('ru')
	f:fetchEntity(source, marsEntity, {
		{
			name = 'parentBody',
			property = 'P397',
			get = {
				{
					name = 'center',
					property = 'P397',
				},
			},
		},
	})

	self:assertEquals('Q649112', source.center.entity)
end

function suite:test_fetchEntity_elseGet_exists()
	local source = {}
	local f = backend.new('ru')
	f:fetchEntity(source, marsEntity, {
		{
			name = 'namedAfter',
			property = 'P138',
			elseGet = {
				{
					name = 'parentBody',
					property = 'P397',
				},
			},
		},
	})

	self:assertTrue(source.namedAfter ~= nil)
	self:assertEquals(nil, source.parentBody)
end

function suite:test_fetchEntity_elseGet_notExists()
	local source = {}
	local f = backend.new('ru')
	f:fetchEntity(source, marsEntity, {
		{
			name = 'nonExistant',
			property = 'P1111',
			elseGet = {
				{
					name = 'parentBody',
					property = 'P397',
				},
			},
		},
	})

	self:assertEquals(nil, source.nonExistant)
	self:assertEquals('Q525', source.parentBody.entity)
end

function suite:test_fetchEntity_qualifiers()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, kidneyEntity, {
		{
			property = 'P2924',
			qualifiers = {
				{
					name = 'title',
					property = 'P1810',
					max = 1,
				},
				{
					name = 'date',
					property = 'P577',
					max = 1,
				},
			},
		},
	})

	self:assertEquals('Почки', source.title.value)
	self:assertEquals(2016, source.date.value.year)
	self:assertEquals(nil, source.date.value.month)
end

function suite:test_fetchEntity_getValue()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, journalEntity, {
		{
			name = 'title',
			getValue = wikidata.name,
		},
	})

	self:assertEquals('The New England Journal of Medicine', source.title.value)
end

function suite:test_fetchEntity_isArray()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, journalEntity, {
		{
			name = 'title',
			property = 'P921',
			isArray = true,
		},
	})

	self:assertEquals(1, table.getn(source.title))
end

function suite:test_fetchEntity_components()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'author',
			property = 'P50',
			get = {
				{
					name = 'familyName',
					property = 'P734',
					isLocal = true,
				},
			},
		},
	})

	self:assertEquals(saganEntity, source.author.entity)
	self:assertTrue(source.author.components ~= nil)
	self:assertTrue(source.author.components.familyName ~= nil)
	self:assertEquals('Q17516282', source.author.components.familyName.entity)
end

function suite:test_fetchEntity_noOverwrite()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'author',
			property = 'P50',
			get = {
				{
					name = 'author',
					property = 'P734',
				},
			},
		},
	})

	self:assertEquals(saganEntity, source.author.entity)
end

function suite:test_fetchEntity_overwrite()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'author',
			property = 'P50',
			get = {
				{
					name = 'author',
					property = 'P734',
					overwrite = true,
				},
			},
		},
	})

	self:assertEquals('Q17516282', source.author.entity)
end

function suite:test_fetchEntity_overwriteByQualifier()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q117104121', {
		{
			name = 'publisher',
			property = 'P123',
			qualifiers = {
				{
					name = 'publisher',
					property = 'P1932',
					overwrite = true,
					max = 1,
				},
			},
		},
	})

	self:assertEquals('Springer-Verlag', source.publisher.value)
end

function suite:test_fetchEntity_overwriteValueByQualifier()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q117104121', {
		{
			name = 'publisher',
			property = 'P123',
			qualifiers = {
				{
					property = 'P1932',
					overwriteValue = true,
					max = 1,
				},
			},
		},
	})

	self:assertEquals('Springer-Verlag', source.publisher.value)
end

function suite:test_fetchEntity_array()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'editions',
			property = 'P747',
		},
	})

	self:assertTrue(table.getn(source.editions) > 1)
end

function suite:test_fetchEntity_max()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'author',
			property = 'P747',
			max = 1,
		},
	})

	self:assertEquals(0, table.getn(source.author))
end

function suite:test_fetchEntity_defaultUnit()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, saganBook, {
		{
			name = 'doNotDoSo',
			property = 'P1476',
			defaultUnit = 'Q1069725',
			max = 1,
		},
	})

	self:assertEquals('Q1069725', source.doNotDoSo.unitEntity)
end

function suite:test_fetchEntity_map()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, journalEntity, {
		{
			name = 'isScholaryArticle',
			property = 'P31',
			mapEntity = { [scientificJournalEntity] = scholaryArticleEntity },
			max = 1,
		},
	})

	self:assertEquals(scholaryArticleEntity, source.isScholaryArticle.entity)
end

function suite:test_fetchEntity_has()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, bookWithInscriptions, {
		{
			name = 'info',
			property = 'P1684',
			has = {
				{ property='P2868', value='Q116158574' },
			},
			isArray = true,
		},
	})

	self:assertEquals(type(source.info), 'table')
	self:assertEquals(table.getn(source.info), 1)
	self:assertEquals(source.info[1].value, 'учебное пособие')
end

function suite:test_fetchEntity_overwriteEntity()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, bookWithInscriptions, {
		{
			name = 'info',
			property = 'P1684',
			has = {
				{ property='P6568', value='Q136822' },
			},
			qualifiers = {
				{
					property = 'P6568',
					max = 1,
					overwriteEntity = true,
				},
			},
			isArray = true,
		},
	})

	self:assertEquals(type(source.info), 'table')
	self:assertEquals(table.getn(source.info), 1)
	self:assertEquals(source.info[1].value, 'высшее профессиональное образование')
	self:assertEquals(source.info[1].entity, 'Q136822')
end

function suite:test_fetchEntity_overwriteValue()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, bookWithInscriptions, {
		{
			name = 'info',
			property = 'P1684',
			has = {
				{ property='P6568', value='Q136822' },
			},
			qualifiers = {
				{
					property = 'P6568',
					max = 1,
					overwriteValue = true,
				},
			},
			isArray = true,
		},
	})

	self:assertEquals(type(source.info), 'table')
	self:assertEquals(table.getn(source.info), 1)
	self:assertEquals(source.info[1].value, 'higher education')
	self:assertEquals(source.info[1].entity, nil)
end

function suite:test_fetchEntity_isLocal_in_unnamed()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, influenzaEntity, {
		{
			name = 'mesh',
			property = 'P486',
			get = {
				{
					entity = 'P486',
					property = 'P9073',
					get = {
						{
							name = 'lang',
							property = 'P407',
							isLocal = true,
						},
					},
				}
			},
		},
	})

	self:assertTrue(source.mesh)
	if not source.mesh.components then
		mw.log('Test test_fetchEntity_isLocal_in_unnamed failed. Debug data:')
		mw.logObject(source)
	end
	self:assertTrue(source.mesh.components ~= nil)
	self:assertEquals(source.mesh.components.lang.entity, 'Q1860')
end

function suite:test_fetchEntity_isLocal_in_array()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q8277', {
		{
			name = 'omim',
			property = 'P492',
			qualifiers = {
				{
					name = 'title',
					property = 'P1810',
					max = 1,
					isLocal = true,
				},
			},
		},
	})

	self:assertTrue(table.getn(source.omim) > 1)
	self:assertTrue(source.omim[1].components ~= nil)
	self:assertTrue(source.omim[1].components.title.value ~= nil)
end

function suite:test_fetchEntity_isLocal_with_qualifiers_and_get_by_entity_with_isLocal()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q8277', {
		{
			name = 'omim',
			property = 'P492',
			qualifiers = {
				{
					name = 'title',
					property = 'P1810',
					max = 1,
					isLocal = true,
				},
			},
			get = {
				{
					name = 'test',
					entity = 'P492',
					property = 'P31',
					isLocal = true,
				},
			},
		},
	})

	self:assertTrue(table.getn(source.omim) > 1)
	self:assertTrue(source.omim[1].components ~= nil)
	self:assertTrue(source.omim[1].components.title.value ~= nil)
end

function suite:test_fetchEntity_forceGet()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q8277', {
		{
			name = 'omim',
			property = 'P492',
			forceGet = {
				{
					name = 'test',
					entity = 'P492',
					property = 'P31',
					max = 1,
					isLocal = true,
				},
			},
		},
	})

	self:assertTrue(table.getn(source.omim) > 0)
	self:assertTrue(source.omim[1].components ~= nil)
	self:assertTrue(source.omim[1].components.test.value ~= nil)
end

function suite:test_fetchEntity_forceGet_predefined_value()
	local source = {
		omim = { value = { '612594 '} }
	}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q8277', {
		{
			name = 'omim',
			property = 'P492',
			forceGet = {
				{
					name = 'test',
					entity = 'P492',
					property = 'P31',
					max = 1,
					isLocal = true,
				},
			},
		},
	})

	self:assertTrue(table.getn(source.omim) == 0)
	self:assertTrue(source.omim.components ~= nil)
	self:assertTrue(source.omim.components.test.value ~= nil)
end

function suite:test_fetchEntity_forceGet_predefined_value()
	local source = {
		omim = { value = { '612594 '} }
	}
	local f = backend.new('en')
	f:fetchEntity(source, nil, {
		{
			name = 'omim',
			property = 'P492',
			forceGet = {
				{
					name = 'test',
					entity = 'P492',
					property = 'P31',
					max = 1,
					isLocal = true,
				},
			},
		},
	})

	self:assertTrue(table.getn(source.omim) == 0)
	self:assertTrue(source.omim.components ~= nil)
	self:assertTrue(source.omim.components.test.value ~= nil)
end

function suite:test_fetchEntity_elseGet_in_inLocal_with_overwriteEntity()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q455', {
		{
			name = 'lang',
			property = P_WORK_LANG,
			get = {
				{
					name = 'langCode',
					property = P_LANG_CODE,
					isLocal = true,
					max = 1,
					elseGet = {
						-- for ethnolects determine parent language
						{
							property = P_SUBCLASS_OF,
							overwriteEntity = true,
							max = 1,
							get = {
								{
									name = 'langCode',
									property = P_LANG_CODE,
									isLocal = true,
									max = 1,
								},
							},
						},
					},
				},
			},
		},
	})

	self:assertTrue(source.lang ~= nil)
	self:assertEquals('Q1860', source.lang.entity)
	if not source.lang.components then
		mw.log('Test test_fetchEntity_elseGet_in_inLocal_with_overwriteEntity failed. Debug data:')
		mw.logObject(source)
	end
	self:assertTrue(source.lang.components ~= nil)
	self:assertTrue(source.lang.components.langCode ~= nil)
	self:assertEquals('en', source.lang.components.langCode.value)
end

function suite:test_fetchEntity_substInto()
	local source = {}
	local f = backend.new('en')
	f:fetchEntity(source, 'Q2', {
		{
			name = 'urlMask',
			entity = 'P1417',
			property = 'P1630',
			max = 1,
		},
		{
			name = 'id',
			property = 'P1417',
			substInto = {
				name = 'url',
				template = {
					name = 'urlMask',
				},
			},
		},
	})

	self:assertTrue(source.id ~= nil)
	self:assertTrue(source.urlMask ~= nil)
	self:assertTrue(source.url ~= nil)
	self:assertEquals(source.url.value, 'https://www.britannica.com/place/Earth')
end

return suite