wikibase-edit
Version:
Edit Wikibase from NodeJS
498 lines • 19 kB
JavaScript
import 'should';
import config from 'config';
import { editEntity as _editEntity } from '../../../src/lib/entity/edit.js';
import { shouldNotBeCalled } from '../../integration/utils/utils.js';
import { randomString, someEntityId as id, properties } from '../utils.js';
const { instance } = config;
const editEntity = params => _editEntity(params, properties, instance, config);
describe('entity edit', () => {
it('should reject a missing id', async () => {
const params = { claims: { someWikibaseItemPropertyId: 'bla' } };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => err.message.should.equal('invalid entity id'));
});
it('should reject misplaced parameters', async () => {
const params = { id, P2: 'bla' };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => {
err.message.should.startWith('invalid parameter');
err.context.parameter.should.equal('P2');
});
});
it('should reject an edit without data', async () => {
const params = { id };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => err.message.should.equal('no data was passed'));
});
it('should reject invalid labels', async () => {
const params = { id, labels: { fr: '' } };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => err.message.should.equal('invalid label'));
});
it('should reject invalid descriptions', async () => {
const params = { id, descriptions: { fr: '' } };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => err.message.should.equal('invalid description'));
});
it('should set the action to wbeditentity', async () => {
const params = { id, labels: { fr: 'foo' } };
const { action } = await editEntity(params);
action.should.equal('wbeditentity');
});
it('should return formatted data', async () => {
const label = randomString();
const description = randomString();
const frAlias = randomString();
const enAlias = randomString();
const { data } = await editEntity({
id,
labels: { fr: label },
aliases: { fr: frAlias, en: [enAlias] },
descriptions: { fr: description },
claims: { P2: 'Q3576110' },
});
data.id.should.equal(id);
JSON.parse(data.data).should.deepEqual({
labels: {
fr: { language: 'fr', value: label },
},
aliases: {
fr: [{ language: 'fr', value: frAlias }],
en: [{ language: 'en', value: enAlias }],
},
descriptions: {
fr: { language: 'fr', value: description },
},
claims: {
P2: [
{
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P2',
snaktype: 'value',
datavalue: {
type: 'wikibase-entityid',
value: {
id: 'Q3576110',
'entity-type': 'item',
},
},
},
},
],
},
});
});
describe('claims', () => {
it('should reject invalid claims', async () => {
const params = { id, claims: { P2: 'bla' } };
await editEntity(params)
.then(shouldNotBeCalled)
.catch(err => err.message.should.equal('invalid entity value'));
});
it('should format an entity claim with qualifiers', async () => {
const { data } = await editEntity({
id,
claims: {
P2: [
{ value: 'Q5111731', qualifiers: { P1: '17', P2: ['Q13406268'] } },
{
value: 'Q2622002',
qualifiers: {
P4: '1789-08-04',
P8: { amount: 9001, unit: 'Q7727' },
P9: { text: 'bulgroz', language: 'fr' },
},
},
],
},
});
JSON.parse(data.data).claims.P2.should.deepEqual([
{
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P2',
snaktype: 'value',
datavalue: {
type: 'wikibase-entityid',
value: { 'entity-type': 'item', id: 'Q5111731' },
},
},
qualifiers: {
P1: [
{
property: 'P1',
snaktype: 'value',
datavalue: { type: 'string', value: '17' },
},
],
P2: [
{
property: 'P2',
snaktype: 'value',
datavalue: {
type: 'wikibase-entityid',
value: { 'entity-type': 'item', id: 'Q13406268' },
},
},
],
},
},
{
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P2',
snaktype: 'value',
datavalue: {
type: 'wikibase-entityid',
value: { 'entity-type': 'item', id: 'Q2622002' },
},
},
qualifiers: {
P4: [
{
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+1789-08-04T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 11,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
},
],
P8: [
{
property: 'P8',
snaktype: 'value',
datavalue: {
type: 'quantity',
value: { amount: '+9001', unit: `${instance.replace('https:', 'http:')}/entity/Q7727` },
},
},
],
P9: [
{
property: 'P9',
snaktype: 'value',
datavalue: {
type: 'monolingualtext',
value: { text: 'bulgroz', language: 'fr' },
},
},
],
},
},
]);
});
it('should format an entity claim with rich qualifier', async () => {
const qualifiers = {
P8: [{ value: { amount: 100, unit: 'Q6982035' } }],
};
const { data } = await editEntity({
id,
claims: {
P2: [{ value: 'Q54173', qualifiers }],
},
});
JSON.parse(data.data).claims.P2[0].qualifiers.P8[0].should.deepEqual({
property: 'P8',
snaktype: 'value',
datavalue: {
type: 'quantity',
value: {
amount: '+100',
unit: `${instance.replace('https:', 'http:')}/entity/Q6982035`,
},
},
});
});
it('should format a rich-value time claim', async () => {
const { data } = await editEntity({
id,
claims: {
P4: [{ time: '1802-02-26', precision: 11 }],
},
});
JSON.parse(data.data).claims.P4[0].should.deepEqual({
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+1802-02-26T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 11,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
},
});
});
it('should format a rich-value time claim with precision 10 or less', async () => {
const { data } = await editEntity({
id,
claims: {
P4: [
{ time: '1802-02-00', precision: 10 },
{ time: '1802-00-00', precision: 9 },
],
},
});
JSON.parse(data.data).claims.P4.should.deepEqual([
{
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+1802-02-00T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 10,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
},
},
{
rank: 'normal',
type: 'statement',
mainsnak: {
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+1802-00-00T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 9,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
},
},
]);
});
it('should format an entity claim with a special snaktype', async () => {
const { data } = await editEntity({
id,
claims: {
P2: [{ value: { snaktype: 'somevalue' } }],
P3: [{ snaktype: 'novalue' }],
},
});
JSON.parse(data.data).claims.P2[0].mainsnak.should.deepEqual({
property: 'P2',
snaktype: 'somevalue',
});
JSON.parse(data.data).claims.P3[0].mainsnak.should.deepEqual({
property: 'P3',
snaktype: 'novalue',
});
});
it('should format an entity claim with a qualifier with a special snaktype', async () => {
const qualifiers = {
P4: { snaktype: 'somevalue' },
};
const { data } = await editEntity({
id,
claims: {
P2: [{ value: 'Q54173', qualifiers }],
},
});
JSON.parse(data.data).claims.P2[0].qualifiers.P4[0].should.deepEqual({
property: 'P4',
snaktype: 'somevalue',
});
});
it('should format an entity claim with a low precision time claim', async () => {
const qualifiers = {
P4: { value: '2019-04-01T00:00:00.000Z' },
};
const { data } = await editEntity({
id,
claims: {
P2: [{ value: 'Q54173', qualifiers }],
},
});
JSON.parse(data.data).claims.P2[0].qualifiers.P4[0].should.deepEqual({
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+2019-04-01T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 11,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
});
});
it('should format an entity claim with a time qualifier', async () => {
const qualifiers = {
P4: { value: '2019-04-01T00:00:00.000Z' },
};
const { data } = await editEntity({
id,
claims: {
P2: [{ value: 'Q54173', qualifiers }],
},
});
JSON.parse(data.data).claims.P2[0].qualifiers.P4[0].should.deepEqual({
property: 'P4',
snaktype: 'value',
datavalue: {
type: 'time',
value: {
time: '+2019-04-01T00:00:00Z',
timezone: 0,
before: 0,
after: 0,
precision: 11,
calendarmodel: 'http://www.wikidata.org/entity/Q1985727',
},
},
});
});
it('should format an entity claim with a reference', async () => {
const reference = {
P7: 'https://example.org',
P2: 'Q8447',
};
const { data } = await editEntity({
id,
claims: {
P2: { value: 'Q2622002', references: reference },
},
});
JSON.parse(data.data).claims.P2[0].references[0].snaks.should.deepEqual([
{
property: 'P7',
snaktype: 'value',
datavalue: { type: 'string', value: 'https://example.org' },
},
{
property: 'P2',
snaktype: 'value',
datavalue: {
type: 'wikibase-entityid',
value: { 'entity-type': 'item', id: 'Q8447' },
},
},
]);
});
it('should format an entity claim with a reference formatted with a snaks object', async () => {
const reference = {
snaks: {
P7: 'https://example.org',
P2: 'Q8447',
},
};
const { data } = await editEntity({
id,
claims: {
P2: { value: 'Q2622002', references: [reference] },
},
});
JSON.parse(data.data).claims.P2[0].references[0].snaks[0]
.datavalue.value.should.equal('https://example.org');
});
});
describe('sitelinks', () => {
it('should format simplified sitelinks', async () => {
const { data } = await editEntity({
id,
sitelinks: {
frwiki: 'foo',
},
});
JSON.parse(data.data).sitelinks.should.deepEqual({
frwiki: {
site: 'frwiki',
title: 'foo',
},
});
});
it('should format rich sitelinks', async () => {
const { data } = await editEntity({
id,
sitelinks: {
frwiki: {
title: 'foo',
},
},
});
JSON.parse(data.data).sitelinks.should.deepEqual({
frwiki: {
site: 'frwiki',
title: 'foo',
},
});
});
it('should format sitelinks with badges', async () => {
const { data } = await editEntity({
id,
sitelinks: {
frwiki: {
title: 'foo',
badges: ['Q608', 'Q609'],
},
},
});
JSON.parse(data.data).sitelinks.should.deepEqual({
frwiki: {
site: 'frwiki',
title: 'foo',
badges: ['Q608', 'Q609'],
},
});
});
it('should format sitelinks with stringified badges', async () => {
const { data } = await editEntity({
id,
sitelinks: {
frwiki: {
title: 'foo',
badges: 'Q608|Q609',
},
},
});
JSON.parse(data.data).sitelinks.should.deepEqual({
frwiki: {
site: 'frwiki',
title: 'foo',
badges: ['Q608', 'Q609'],
},
});
});
});
});
//# sourceMappingURL=edit.js.map