mediawiki-extensions-Common.../tests/phpunit/LicenseParserTest.php

289 行
9.1 KiB
PHP

<?php
namespace CommonsMetadata;
/**
* @covers \CommonsMetadata\LicenseParser
* @group Extensions/CommonsMetadata
*/
class LicenseParserTest extends \MediaWikiIntegrationTestCase {
/** @var LicenseParser */
protected $licenseParser;
public function setUp(): void {
parent::setUp();
$this->licenseParser = new LicenseParser();
}
public function testEmptyString() {
$licenseString = '';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
}
public function testTotallyWrongString() {
$licenseString = 'foo';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
}
public function testCCLicenseWithoutVersion() {
$licenseString = 'cc-by-sa';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
}
public function testNonFreeLicense() {
$licenseString = 'cc-by-nc-sa-3.0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
$licenseString = 'cc-by-nd-2.1';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
}
public function testNormalCCLicense() {
$licenseString = 'cc-by-sa-1.0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseFamilyEquals( 'cc', $data );
$this->assertLicenseTypeEquals( 'cc-by-sa', $data );
$this->assertLicenseVersionEquals( '1.0', $data );
$this->assertLicenseRegionEquals( null, $data );
$this->assertLicenseNameEquals( 'cc-by-sa-1.0', $data );
}
public function testNormalCCLicenseInUppercase() {
$licenseString = 'CC-BY-SA-1.0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseFamilyEquals( 'cc', $data );
$this->assertLicenseTypeEquals( 'cc-by-sa', $data );
$this->assertLicenseNameEquals( 'cc-by-sa-1.0', $data );
}
public function testNormalCCLicenseWithSpaces() {
$licenseString = 'CC BY-SA 1.0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseFamilyEquals( 'cc', $data );
$this->assertLicenseTypeEquals( 'cc-by-sa', $data );
$this->assertLicenseNameEquals( 'cc-by-sa-1.0', $data );
}
public function testCCSALicense() {
$licenseString = 'CC-SA-1.0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseFamilyEquals( 'cc', $data );
$this->assertLicenseTypeEquals( 'cc-sa', $data );
$this->assertLicenseNameEquals( 'cc-sa-1.0', $data );
}
public function testRegionalCCLicense() {
$licenseString = 'cc-by-2.0-fr';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseTypeEquals( 'cc-by', $data );
$this->assertLicenseRegionEquals( 'fr', $data );
$this->assertLicenseNameEquals( 'cc-by-2.0-fr', $data );
}
public function testRegionalCCLicenseWithInvalidRegion() {
$licenseString = 'cc-by-2.0-foo';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseIsNotRecognized( $data );
}
public function testRegionalCCLicenseWithSpecialRegion() {
$licenseString = 'cc-by-2.0-scotland';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseTypeEquals( 'cc-by', $data );
$this->assertLicenseRegionEquals( 'scotland', $data );
$this->assertLicenseNameEquals( 'cc-by-2.0-scotland', $data );
}
public function testCC0() {
$licenseString = 'CC0';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseTypeEquals( 'cc0', $data );
$this->assertLicenseVersionEquals( null, $data );
$this->assertLicenseNameEquals( 'cc0', $data );
}
public function testPD() {
$licenseString = 'Public Domain';
$data = $this->licenseParser->parseLicenseString( $licenseString );
$this->assertLicenseFamilyEquals( 'pd', $data );
$this->assertLicenseNameEquals( 'pd', $data );
}
/**
* @dataProvider provideGetLicensePriorityData
* @param array $greaterLicenseData
* @param array $smallerLicenseData
*/
public function testGetLicensePriority( $greaterLicenseData, $smallerLicenseData ) {
$this->assertLicenseHasGreaterPriority( $greaterLicenseData, $smallerLicenseData );
}
public static function provideGetLicensePriorityData() {
return [
[ // PD wins over CC
[ // this should have higher priority...
'family' => 'pd',
'type' => null,
'version' => null,
'region' => null,
'name' => 'pd',
],
[ // ...than this
'family' => 'cc',
'type' => 'cc-by-sa',
'version' => '2.0',
'region' => null,
'name' => 'cc-by-sa-2.0',
],
],
[ // CC wins over unknown
[ // this should have higher priority...
'family' => 'cc',
'type' => 'cc-by-sa',
'version' => '2.5',
'region' => null,
'name' => 'cc-by-sa-2.5',
],
[ // ...than this
'family' => 'gfdl',
'type' => null,
'version' => null,
'region' => null,
'name' => 'gfdl',
],
],
[ // BY wins over BY-SA
[ // this should have higher priority...
'family' => 'cc',
'type' => 'cc-by',
'version' => '2.5',
'region' => null,
'name' => 'cc-by-sa-2.5',
],
[ // ...than this
'family' => 'cc',
'type' => 'cc-by-sa',
'version' => '2.0',
'region' => null,
'name' => 'cc-by-sa-2.0',
],
],
[ // higher CC wins
[ // this should have higher priority...
'family' => 'cc',
'type' => 'cc-by-sa',
'version' => '2.5',
'region' => null,
'name' => 'cc-by-sa-2.5',
],
[ // ...than this
'family' => 'cc',
'type' => 'cc-by-sa',
'version' => '2.0',
'region' => null,
'name' => 'cc-by-sa-2.0',
],
],
];
}
public function testSortDataByLicensePriority() {
$licenses = [ 'gfdl', 'public domain', '', 'cc-by-sa-2.0', 'cc-by-2.0',
'cc-by-sa-3.5', 'cc-by-3.5', 'foobar' ];
$expectedSortedLicenses = [ 'public domain', 'cc-by-3.5', 'cc-by-2.0', 'cc-by-sa-3.5',
'cc-by-sa-2.0', 'gfdl', '', 'foobar' ];
$actualSortedLicenses = $this->licenseParser->sortDataByLicensePriority( $licenses,
static function ( $v ) {
return $v;
}
);
$this->assertArrayEquals( $expectedSortedLicenses, $actualSortedLicenses, true );
// test that array keys are kept
$licenses = [ 'a' => 'cc-by-2.0', 'b' => 'cc-by-3.5' ];
$expectedSortedLicenses = [ 'b' => 'cc-by-3.5', 'a' => 'cc-by-2.0' ];
$actualSortedLicenses = $this->licenseParser->sortDataByLicensePriority( $licenses,
static function ( $v ) {
return $v;
}
);
$this->assertArrayEquals( $expectedSortedLicenses, $actualSortedLicenses, true, true );
// test with the same data structure that's used by the collector
$licenseData = [
[
'UsageTerms' => 'foo',
],
[
'LicenseShortName' => 'cc-by-sa-2.0',
'UsageTerms' => 'Creative Commons',
],
[
'LicenseShortName' => 'cc-by-sa-4.0',
'UsageTerms' => 'Creative Commons',
],
];
$expectedSortOrder = [ 2, 1, 0 ];
$sortedLicenseData = $this->licenseParser->sortDataByLicensePriority( $licenseData,
static function ( $license ) {
if ( !isset( $license['LicenseShortName'] ) ) {
return '';
}
return $license['LicenseShortName'];
}
);
$this->assertArrayEquals( $licenseData, $sortedLicenseData, false, true );
$this->assertArrayEquals( $expectedSortOrder, array_keys( $sortedLicenseData ), true );
}
protected function assertLicenseIsRecognized( $licenseData ) {
$this->assertNotNull( $licenseData );
}
protected function assertLicenseIsNotRecognized( $licenseData ) {
$this->assertNull( $licenseData );
}
protected function assertLicenseElementEquals( $expected, $element, $licenseData ) {
$this->assertIsArray( $licenseData );
$this->assertArrayHasKey( $element, $licenseData );
$this->assertEquals( $expected, $licenseData[$element] );
}
protected function assertLicenseFamilyEquals( $family, $licenseData ) {
$this->assertLicenseElementEquals( $family, 'family', $licenseData );
}
protected function assertLicenseTypeEquals( $type, $licenseData ) {
$this->assertLicenseElementEquals( $type, 'type', $licenseData );
}
protected function assertLicenseVersionEquals( $version, $licenseData ) {
$this->assertLicenseElementEquals( $version, 'version', $licenseData );
}
protected function assertLicenseRegionEquals( $region, $licenseData ) {
$this->assertLicenseElementEquals( $region, 'region', $licenseData );
}
protected function assertLicenseNameEquals( $name, $licenseData ) {
$this->assertLicenseElementEquals( $name, 'name', $licenseData );
}
protected function assertLicenseHasGreaterPriority( $greaterLicenseData, $smallerLicenseData ) {
$getLicensePriorityMethod = new \ReflectionMethod(
$this->licenseParser, 'getLicensePriority' );
$getLicensePriorityMethod->setAccessible( true );
$greaterLicensePriority = $getLicensePriorityMethod->invokeArgs(
$this->licenseParser, [ $greaterLicenseData ] );
$smallerLicensePriority = $getLicensePriorityMethod->invokeArgs(
$this->licenseParser, [ $smallerLicenseData ] );
$this->assertGreaterThan( $smallerLicensePriority, $greaterLicensePriority );
}
}