2021-06-01 19:31:37 +00:00
|
|
|
<?php
|
|
|
|
|
|
2023-11-30 13:42:44 +00:00
|
|
|
use MediaWiki\MainConfigNames;
|
2021-10-26 17:17:20 +00:00
|
|
|
use MediaWiki\Tests\Unit\Permissions\MockAuthorityTrait;
|
2022-07-22 16:37:48 +00:00
|
|
|
use MediaWiki\User\UserIdentityValue;
|
2023-08-19 03:35:06 +00:00
|
|
|
use MediaWiki\Utils\MWTimestamp;
|
2021-10-26 17:17:20 +00:00
|
|
|
|
2021-06-01 19:31:37 +00:00
|
|
|
/**
|
|
|
|
|
* @covers ApiQueryImageInfo
|
|
|
|
|
* @group API
|
|
|
|
|
* @group medium
|
|
|
|
|
* @group Database
|
|
|
|
|
*/
|
|
|
|
|
class ApiQueryImageInfoTest extends ApiTestCase {
|
2021-10-26 17:17:20 +00:00
|
|
|
use MockAuthorityTrait;
|
2021-06-01 19:31:37 +00:00
|
|
|
|
|
|
|
|
private const IMAGE_NAME = 'Random-11m.png';
|
|
|
|
|
|
|
|
|
|
private const OLD_IMAGE_TIMESTAMP = '20201105235241';
|
|
|
|
|
|
|
|
|
|
private const NEW_IMAGE_TIMESTAMP = '20201105235242';
|
|
|
|
|
|
|
|
|
|
private const OLD_IMAGE_SIZE = 12345;
|
|
|
|
|
|
|
|
|
|
private const NEW_IMAGE_SIZE = 54321;
|
|
|
|
|
|
2021-10-26 17:17:20 +00:00
|
|
|
private const NO_COMMENT_TIMESTAMP = '20201105235239';
|
|
|
|
|
|
2023-11-30 13:42:44 +00:00
|
|
|
private const IMAGE_2_NAME = 'Random-2.png';
|
|
|
|
|
private const IMAGE_2_TIMESTAMP = '20230101000000';
|
|
|
|
|
private const IMAGE_2_SIZE = 12345;
|
|
|
|
|
|
2022-07-22 16:37:48 +00:00
|
|
|
private $testUser = null;
|
2023-11-30 13:42:44 +00:00
|
|
|
private $anonUser = null;
|
2022-07-22 16:37:48 +00:00
|
|
|
|
2021-06-01 19:31:37 +00:00
|
|
|
public function addDBData() {
|
|
|
|
|
parent::addDBData();
|
2022-07-22 16:37:48 +00:00
|
|
|
$this->testUser = new UserIdentityValue( 12364321, 'Dummy User' );
|
|
|
|
|
|
2021-10-26 17:17:20 +00:00
|
|
|
$actorId = $this->getServiceContainer()
|
|
|
|
|
->getActorStore()
|
2022-07-22 16:37:48 +00:00
|
|
|
->acquireActorId( $this->testUser, $this->db );
|
2021-06-01 19:31:37 +00:00
|
|
|
$this->db->insert(
|
|
|
|
|
'image',
|
|
|
|
|
[
|
|
|
|
|
'img_name' => 'Random-11m.png',
|
|
|
|
|
'img_size' => self::NEW_IMAGE_SIZE,
|
|
|
|
|
'img_width' => 1000,
|
|
|
|
|
'img_height' => 1800,
|
|
|
|
|
'img_metadata' => '',
|
|
|
|
|
'img_bits' => 16,
|
|
|
|
|
'img_media_type' => 'BITMAP',
|
|
|
|
|
'img_major_mime' => 'image',
|
|
|
|
|
'img_minor_mime' => 'png',
|
|
|
|
|
'img_description_id' => $this->getServiceContainer()
|
|
|
|
|
->getCommentStore()
|
|
|
|
|
->createComment( $this->db, "'''comment'''" )->id,
|
2021-10-26 17:17:20 +00:00
|
|
|
'img_actor' => $actorId,
|
2021-06-01 19:31:37 +00:00
|
|
|
'img_timestamp' => $this->db->timestamp( self::NEW_IMAGE_TIMESTAMP ),
|
|
|
|
|
'img_sha1' => 'sy02psim0bgdh0jt4vdltuzoh7j80ru',
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
$this->db->insert(
|
|
|
|
|
'oldimage',
|
|
|
|
|
[
|
|
|
|
|
'oi_name' => 'Random-11m.png',
|
2021-10-26 17:17:20 +00:00
|
|
|
'oi_archive_name' => self::OLD_IMAGE_TIMESTAMP . 'Random-11m.png',
|
2021-06-01 19:31:37 +00:00
|
|
|
'oi_size' => self::OLD_IMAGE_SIZE,
|
|
|
|
|
'oi_width' => 1000,
|
|
|
|
|
'oi_height' => 1800,
|
|
|
|
|
'oi_metadata' => '',
|
|
|
|
|
'oi_bits' => 16,
|
|
|
|
|
'oi_media_type' => 'BITMAP',
|
|
|
|
|
'oi_major_mime' => 'image',
|
|
|
|
|
'oi_minor_mime' => 'png',
|
|
|
|
|
'oi_description_id' => $this->getServiceContainer()
|
|
|
|
|
->getCommentStore()
|
|
|
|
|
->createComment( $this->db, 'deleted comment' )->id,
|
2021-10-26 17:17:20 +00:00
|
|
|
'oi_actor' => $actorId,
|
2021-06-01 19:31:37 +00:00
|
|
|
'oi_timestamp' => $this->db->timestamp( self::OLD_IMAGE_TIMESTAMP ),
|
|
|
|
|
'oi_sha1' => 'sy02psim0bgdh0jt4vdltuzoh7j80ru',
|
|
|
|
|
'oi_deleted' => File::DELETED_FILE | File::DELETED_COMMENT | File::DELETED_USER,
|
|
|
|
|
]
|
|
|
|
|
);
|
2021-10-26 17:17:20 +00:00
|
|
|
$this->db->insert(
|
|
|
|
|
'oldimage',
|
|
|
|
|
[
|
|
|
|
|
'oi_name' => 'Random-11m.png',
|
|
|
|
|
'oi_archive_name' => self::NO_COMMENT_TIMESTAMP . 'Random-11m.png',
|
|
|
|
|
'oi_size' => self::OLD_IMAGE_SIZE,
|
|
|
|
|
'oi_width' => 1000,
|
|
|
|
|
'oi_height' => 1800,
|
|
|
|
|
'oi_metadata' => '',
|
|
|
|
|
'oi_bits' => 16,
|
|
|
|
|
'oi_media_type' => 'BITMAP',
|
|
|
|
|
'oi_major_mime' => 'image',
|
|
|
|
|
'oi_minor_mime' => 'png',
|
|
|
|
|
'oi_description_id' => $this->getServiceContainer()
|
|
|
|
|
->getCommentStore()
|
|
|
|
|
->createComment( $this->db, '' )->id,
|
|
|
|
|
'oi_actor' => $actorId,
|
|
|
|
|
'oi_timestamp' => $this->db->timestamp( self::NO_COMMENT_TIMESTAMP ),
|
|
|
|
|
'oi_sha1' => 'sy02psim0bgdh0jt4vdltuzoh7j80ru',
|
|
|
|
|
'oi_deleted' => 0,
|
|
|
|
|
]
|
|
|
|
|
);
|
2023-11-30 13:42:44 +00:00
|
|
|
|
|
|
|
|
// Set up temp user config
|
|
|
|
|
$this->overrideConfigValue(
|
|
|
|
|
MainConfigNames::AutoCreateTempUser,
|
|
|
|
|
[
|
|
|
|
|
'enabled' => true,
|
|
|
|
|
'expireAfterDays' => null,
|
|
|
|
|
'actions' => [ 'edit' ],
|
|
|
|
|
'genPattern' => '*Unregistered $1',
|
|
|
|
|
'matchPattern' => '*$1',
|
|
|
|
|
'serialProvider' => [ 'type' => 'local' ],
|
|
|
|
|
'serialMapping' => [ 'type' => 'plain-numeric' ],
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
$this->tempUser = new UserIdentityValue( 1236764321, '*Unregistered 1' );
|
|
|
|
|
$tempActorId = $this->getServiceContainer()
|
|
|
|
|
->getActorStore()
|
|
|
|
|
->acquireActorId( $this->tempUser, $this->db );
|
|
|
|
|
$this->db->insert(
|
|
|
|
|
'image',
|
|
|
|
|
[
|
|
|
|
|
'img_name' => self::IMAGE_2_NAME,
|
|
|
|
|
'img_size' => self::IMAGE_2_SIZE,
|
|
|
|
|
'img_width' => 1000,
|
|
|
|
|
'img_height' => 1800,
|
|
|
|
|
'img_metadata' => '',
|
|
|
|
|
'img_bits' => 16,
|
|
|
|
|
'img_media_type' => 'BITMAP',
|
|
|
|
|
'img_major_mime' => 'image',
|
|
|
|
|
'img_minor_mime' => 'png',
|
|
|
|
|
'img_description_id' => $this->getServiceContainer()
|
|
|
|
|
->getCommentStore()
|
|
|
|
|
->createComment( $this->db, "'''comment'''" )->id,
|
|
|
|
|
'img_actor' => $tempActorId,
|
|
|
|
|
'img_timestamp' => $this->db->timestamp( self::IMAGE_2_TIMESTAMP ),
|
|
|
|
|
'img_sha1' => 'aaaaasim0bgdh0jt4vdltuzoh7',
|
|
|
|
|
]
|
|
|
|
|
);
|
2021-06-01 19:31:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function getImageInfoFromResult( array $result ) {
|
|
|
|
|
$this->assertArrayHasKey( 'query', $result );
|
|
|
|
|
$this->assertArrayHasKey( 'pages', $result['query'] );
|
|
|
|
|
$this->assertArrayHasKey( '-1', $result['query']['pages'] );
|
|
|
|
|
$info = $result['query']['pages']['-1'];
|
|
|
|
|
$this->assertSame( NS_FILE, $info['ns'] );
|
|
|
|
|
$this->assertSame( 'File:' . self::IMAGE_NAME, $info['title'] );
|
|
|
|
|
$this->assertTrue( $info['missing'] );
|
|
|
|
|
$this->assertTrue( $info['known'] );
|
|
|
|
|
$this->assertSame( 'local', $info['imagerepository'] );
|
|
|
|
|
$this->assertFalse( $info['badfile'] );
|
|
|
|
|
$this->assertIsArray( $info['imageinfo'] );
|
|
|
|
|
return $info['imageinfo'][0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetImageInfoLatestImage() {
|
|
|
|
|
[ $result, ] = $this->doApiRequest( [
|
|
|
|
|
'action' => 'query',
|
|
|
|
|
'prop' => 'imageinfo',
|
|
|
|
|
'titles' => 'File:' . self::IMAGE_NAME,
|
|
|
|
|
'iiprop' => implode( '|', ApiQueryImageInfo::getPropertyNames() ),
|
|
|
|
|
'iistart' => self::NEW_IMAGE_TIMESTAMP,
|
|
|
|
|
'iiend' => self::NEW_IMAGE_TIMESTAMP,
|
|
|
|
|
] );
|
|
|
|
|
$image = $this->getImageInfoFromResult( $result );
|
|
|
|
|
$this->assertSame( MWTimestamp::convert( TS_ISO_8601, self::NEW_IMAGE_TIMESTAMP ), $image['timestamp'] );
|
|
|
|
|
$this->assertSame( "'''comment'''", $image['comment'] );
|
2022-07-22 16:37:48 +00:00
|
|
|
$this->assertSame( $this->testUser->getName(), $image['user'] );
|
|
|
|
|
$this->assertSame( $this->testUser->getId(), $image['userid'] );
|
2021-06-01 19:31:37 +00:00
|
|
|
$this->assertSame( self::NEW_IMAGE_SIZE, $image['size'] );
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-30 13:42:44 +00:00
|
|
|
public function testGetImageCreatedByTempUser() {
|
|
|
|
|
[ $result, ] = $this->doApiRequest( [
|
|
|
|
|
'action' => 'query',
|
|
|
|
|
'prop' => 'imageinfo',
|
|
|
|
|
'titles' => 'File:' . self::IMAGE_2_NAME
|
|
|
|
|
] );
|
|
|
|
|
$image = $result['query']['pages']['-1']['imageinfo'][0];
|
|
|
|
|
$this->assertArrayHasKey( 'temp', $image );
|
|
|
|
|
$this->assertTrue( $image['temp'] );
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-26 17:17:20 +00:00
|
|
|
public function testGetImageEmptyComment() {
|
|
|
|
|
[ $result, ] = $this->doApiRequest( [
|
|
|
|
|
'action' => 'query',
|
|
|
|
|
'prop' => 'imageinfo',
|
|
|
|
|
'titles' => 'File:' . self::IMAGE_NAME,
|
|
|
|
|
'iiprop' => implode( '|', ApiQueryImageInfo::getPropertyNames() ),
|
|
|
|
|
'iistart' => self::NO_COMMENT_TIMESTAMP,
|
|
|
|
|
'iiend' => self::NO_COMMENT_TIMESTAMP,
|
|
|
|
|
] );
|
|
|
|
|
$image = $this->getImageInfoFromResult( $result );
|
|
|
|
|
$this->assertSame( MWTimestamp::convert( TS_ISO_8601, self::NO_COMMENT_TIMESTAMP ), $image['timestamp'] );
|
|
|
|
|
$this->assertSame( '', $image['comment'] );
|
|
|
|
|
$this->assertArrayNotHasKey( 'commenthidden', $image );
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-01 19:31:37 +00:00
|
|
|
public function testGetImageInfoOldRestrictedImage() {
|
|
|
|
|
[ $result, ] = $this->doApiRequest( [
|
|
|
|
|
'action' => 'query',
|
|
|
|
|
'prop' => 'imageinfo',
|
|
|
|
|
'titles' => 'File:' . self::IMAGE_NAME,
|
|
|
|
|
'iiprop' => implode( '|', ApiQueryImageInfo::getPropertyNames() ),
|
|
|
|
|
'iistart' => self::OLD_IMAGE_TIMESTAMP,
|
|
|
|
|
'iiend' => self::OLD_IMAGE_TIMESTAMP,
|
|
|
|
|
],
|
|
|
|
|
null,
|
|
|
|
|
false,
|
2022-08-05 19:39:42 +00:00
|
|
|
$this->getTestUser()->getAuthority()
|
2021-06-01 19:31:37 +00:00
|
|
|
);
|
|
|
|
|
$image = $this->getImageInfoFromResult( $result );
|
|
|
|
|
$this->assertSame( MWTimestamp::convert( TS_ISO_8601, self::OLD_IMAGE_TIMESTAMP ), $image['timestamp'] );
|
|
|
|
|
$this->assertTrue( $image['commenthidden'] );
|
|
|
|
|
$this->assertArrayNotHasKey( "comment", $image );
|
|
|
|
|
$this->assertTrue( $image['userhidden'] );
|
|
|
|
|
$this->assertArrayNotHasKey( 'user', $image );
|
|
|
|
|
$this->assertArrayNotHasKey( 'userid', $image );
|
|
|
|
|
$this->assertTrue( $image['filehidden'] );
|
|
|
|
|
$this->assertSame( self::OLD_IMAGE_SIZE, $image['size'] );
|
|
|
|
|
}
|
2021-10-26 17:17:20 +00:00
|
|
|
|
|
|
|
|
public function testGetImageInfoOldRestrictedImage_sysop() {
|
|
|
|
|
[ $result, ] = $this->doApiRequest( [
|
|
|
|
|
'action' => 'query',
|
|
|
|
|
'prop' => 'imageinfo',
|
|
|
|
|
'titles' => 'File:' . self::IMAGE_NAME,
|
|
|
|
|
'iiprop' => implode( '|', ApiQueryImageInfo::getPropertyNames() ),
|
|
|
|
|
'iistart' => self::OLD_IMAGE_TIMESTAMP,
|
|
|
|
|
'iiend' => self::OLD_IMAGE_TIMESTAMP,
|
|
|
|
|
],
|
|
|
|
|
null,
|
|
|
|
|
false,
|
|
|
|
|
$this->mockRegisteredUltimateAuthority()
|
|
|
|
|
);
|
|
|
|
|
$image = $this->getImageInfoFromResult( $result );
|
|
|
|
|
$this->assertSame( MWTimestamp::convert( TS_ISO_8601, self::OLD_IMAGE_TIMESTAMP ), $image['timestamp'] );
|
|
|
|
|
$this->assertTrue( $image['commenthidden'] );
|
|
|
|
|
$this->assertSame( 'deleted comment', $image['comment'] );
|
|
|
|
|
$this->assertTrue( $image['userhidden'] );
|
2022-07-22 16:37:48 +00:00
|
|
|
$this->assertSame( $this->testUser->getName(), $image['user'] );
|
|
|
|
|
$this->assertSame( $this->testUser->getId(), $image['userid'] );
|
2021-10-26 17:17:20 +00:00
|
|
|
$this->assertTrue( $image['filehidden'] );
|
|
|
|
|
$this->assertSame( self::OLD_IMAGE_SIZE, $image['size'] );
|
|
|
|
|
}
|
2021-06-01 19:31:37 +00:00
|
|
|
}
|