jenkins-bot submitted this change.

View Change


Approvals: jenkins-bot: Verified Matěj Suchánek: Looks good to me, but someone else must approve Xqt: Looks good to me, approved
Update MediaInfo editing tests

Change MediaInfo edit tests so that they will login and
write to Beta Commons instead of read-only testing.

Bug: T355927
Change-Id: I2853b3191c92a511b3b868ed24223abef2a3df83
---
M pywikibot/families/commons_family.py
M tests/file_tests.py
2 files changed, 119 insertions(+), 72 deletions(-)

diff --git a/pywikibot/families/commons_family.py b/pywikibot/families/commons_family.py
index 428dc16..30773bd 100644
--- a/pywikibot/families/commons_family.py
+++ b/pywikibot/families/commons_family.py
@@ -27,6 +27,9 @@
'beta': 'commons.wikimedia.beta.wmflabs.org'
}

+ # Sites we want to edit but not count as real languages
+ test_codes = ['test', 'beta']
+
interwiki_forward = 'wikipedia'

# Templates that indicate a category redirect
diff --git a/tests/file_tests.py b/tests/file_tests.py
index 40cc008..b5b999f 100755
--- a/tests/file_tests.py
+++ b/tests/file_tests.py
@@ -20,7 +20,6 @@
NoPageError,
NoWikibaseEntityError,
PageRelatedError,
- UserRightsError,
)
from tests import join_images_path
from tests.aspects import TestCase
@@ -456,112 +455,144 @@
item.statements, pywikibot.page._collections.ClaimCollection)


-@unittest.expectedFailure # T355927
-class TestMediaInfoReadonlyEditing(TestCase):
+class TestMediaInfoEditing(TestCase):

"""Test writing structured data of FilePage."""

- # Create valid API requests which will fail to missing permission.
+ login = True
+ write = True

# commons.wikimedia.beta.wmflabs.org
family = 'commons'
code = 'beta'

def test_edit_label(self):
- """Test label editing without writing rights."""
- page = pywikibot.FilePage(self.site, 'File:123_4.jpg')
- item = page.data_item()
- error_message = 'User "None" does not have required user right "edit"'
-
- data = {}
- lang = 'fi'
- label = 'Edit label with editEntity and dict()'
- data.update({'labels': {lang: label}})
- with self.assertRaisesRegex(UserRightsError, error_message):
- item.editEntity(data, summary=label)
-
- data = item.get()
- label = 'Edit label with editEntity and item.get()'
- data.update({'labels': {lang: label}})
- with self.assertRaisesRegex(UserRightsError, error_message):
- item.editEntity(data, summary=label)
-
- data = item.get(force=True)
- label = 'Edit label with editEntity and item.get(force=True)'
- data.update({'labels': {lang: label}})
- with self.assertRaisesRegex(UserRightsError, error_message):
- item.editEntity(data, summary=label)
-
- lang = 'fi'
- label = 'Edit label with editLabels and dict()'
- data = {lang: label}
- with self.assertRaisesRegex(UserRightsError, error_message):
- item.editLabels(data, summary=label)
-
+ """Test label editing."""
# Test label editing when file doesn't exists
page = pywikibot.FilePage(self.site, 'File:123_4_DOESNT_EXISTS.jpg')
item = page.data_item()
+ error_message = "Entity '-1' doesn't exist on commons:beta"
+ lang = 'fi'

data = {}
- lang = 'fi'
label = 'Edit label of missing file with editEntity and dict()'
data.update({'labels': {lang: label}})
- with self.assertRaises(UserRightsError):
+ with self.assertRaisesRegex(NoWikibaseEntityError, error_message):
item.editEntity(data, summary=label)

- lang = 'fi'
label = 'Edit label of missing file with editLabels and dict()'
data = {lang: label}
- with self.assertRaisesRegex(UserRightsError, error_message):
+ with self.assertRaisesRegex(NoWikibaseEntityError, error_message):
item.editLabels(data, summary=label)

- def test_edit_claims(self):
- """Test claim editing without writing rights."""
- error_message = 'User "None" does not have required user right "edit"'
- wikidata_site = pywikibot.Site('wikidata', 'wikidata')
-
- # Test adding claim existing file
+ # Test label editing when file exists
page = pywikibot.FilePage(self.site, 'File:123_4.jpg')
item = page.data_item()
+ lang = 'fi'
+
+ label = 'Edit label with editEntity and dict()'
+ data = {}
+ data.update({'labels': {lang: label}})
+ item.editEntity(data, summary=label)
+ item.get(force=True)
+ self.assertEqual(item.labels['fi'], label)
+
+ label = 'Edit label with editEntity and item'
+ item.labels['fi'] = label
+ item.editEntity(item.toJSON(), summary=label)
+ item.get(force=True)
+ self.assertEqual(item.labels['fi'], label)
+
+ label = 'Edit label with editLabels and dict()'
+ data = {lang: label}
+ item.editLabels(data, summary=label)
+ item.get(force=True)
+ self.assertEqual(item.labels['fi'], label)
+
+ def test_edit_claims(self):
+ """Test addClaim and removeClaim editing."""
+ wikidata_site = pywikibot.Site('beta', 'wikidata')

# Create claim
- finna_id = 'test123'
- new_claim = pywikibot.Claim(wikidata_site, 'P9478')
- new_claim.setTarget(finna_id)

- # Do actual edit
- with self.assertRaisesRegex(UserRightsError, error_message):
- item.addClaim(new_claim)
-
- # Test removing first claim using item.statements
- for property_id in item.statements:
- for statement in item.statements[property_id]:
- with self.assertRaisesRegex(UserRightsError, error_message):
- summary = f'Removing {property_id}'
- item.removeClaims(statement, summary=summary)
- break
-
- # Test removing first claim using item.claims
- for property_id in item.claims:
- for claim in item.claims[property_id]:
- with self.assertRaisesRegex(UserRightsError, error_message):
- summary = f'Removing {property_id}'
- item.removeClaims(claim, summary=summary)
- break
+ property_id = 'P766' # date of publication
+ new_claim = pywikibot.Claim(wikidata_site, 'P766')
+ new_claim_value = pywikibot.WbTime(2024, 1, 1)
+ new_claim.setTarget(new_claim_value)

# Test adding claim to non-existing file
page = pywikibot.FilePage(self.site, 'File:123_4_DOESNT_EXISTS.jpg')
item = page.data_item()

- # Create claim
- finna_id = 'test123'
- new_claim = pywikibot.Claim(wikidata_site, 'P9478')
- new_claim.setTarget(finna_id)
-
- # Do actual edit
+ # Insert claim to non-existing file
with self.assertRaises(NoWikibaseEntityError):
item.addClaim(new_claim)

+ # Insert claim using site object to non-existing file
+ with self.assertRaises(NoWikibaseEntityError):
+ self.site.addClaim(item, new_claim)
+
+ # Test adding claim existing file
+ page = pywikibot.FilePage(self.site, 'File:123_4.jpg')
+ item = page.data_item()
+
+ # Test adding claim using MediaInfo.addClaim()
+ item.addClaim(new_claim)
+
+ # Test that claim can be found
+ claim_found = False
+ item.get(force=True)
+ for statement in item.statements.get(property_id):
+ value = statement.getTarget()
+ if value == new_claim_value:
+ claim_found = True
+ summary = f'Removing {property_id} with {value}'
+ item.removeClaims(statement, summary=summary)
+
+ self.assertTrue(claim_found)
+
+ # Test that the claim was removed
+
+ claim_found = False
+ item.get(force=True)
+ for statement in item.statements.get(property_id, []):
+ value = statement.getTarget()
+ if value == new_claim_value:
+ claim_found = True
+
+ self.assertFalse(claim_found)
+
+ # Add claim using site object
+ self.site.addClaim(item, new_claim)
+
+ # Test that the claim can be found and remove it using site object
+
+ claim_found = False
+ item.get(force=True)
+ for statement in item.statements.get(property_id):
+ value = statement.getTarget()
+ remove_statements = []
+ if value == new_claim_value:
+ remove_statements.append(statement)
+ claim_found = True
+
+ self.assertTrue(claim_found)
+
+ # Note removeClaims() parameter needs to be array
+ summary = f'Removing {property_id} with {value} using site object'
+ self.site.removeClaims(remove_statements, summary=summary)
+
+ # Test that the claims were actually removed
+
+ claim_found = False
+ item.get(force=True)
+ for statement in item.statements.get(property_id, []):
+ value = statement.getTarget()
+ if value == new_claim_value:
+ claim_found = True
+
+ self.assertFalse(claim_found)
+

if __name__ == '__main__':
with suppress(SystemExit):

To view, visit change 1004301. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I2853b3191c92a511b3b868ed24223abef2a3df83
Gerrit-Change-Number: 1004301
Gerrit-PatchSet: 1
Gerrit-Owner: Zache-tool <kimmo.virtanen@gmail.com>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged