aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/includes/filerepo
Commit message (Collapse)AuthorAgeFilesLines
...
* tests: Use $this->getDb() instead of wfGetDB() in integration testsAmir Sarabadani2023-09-251-3/+3
| | | | | | | Deprecated long time ago. Bug: T330641 Change-Id: Ia57f12d350c3346029aafae25534c9ed262a7e98
* tests: Migrate more cases to SQBAmir Sarabadani2023-09-211-4/+12
| | | | | Bug: T344971 Change-Id: Ia69d82d6a6e623b9032240dc910fb47ff5887661
* maintenance: Migrate another batch to SelectQueryBuilderAmir Sarabadani2023-09-211-0/+2
| | | | | | | Around fifty-ish. Found becuase of fixed MigrateSelect. Bug: T344971 Change-Id: If85428d5a033822bfd8ee1f6ab730863bfad55bd
* Namespace TitleValue under \MediaWiki\TitleJames D. Forrester2023-09-181-0/+1
| | | | | | | One of the big ones, so doing this alone. Bug: T166010 Change-Id: I4c901d5c32696d8334ec30cede7d9b6f3d8d645e
* In query builders, use insertInto() and deleteFrom() instead of insert() and ↵Tim Starling2023-09-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | delete() The design principle for SelectQueryBuilder was to make the chained builder calls look as much like SQL as possible, so that developers could leverage their knowledge of SQL to understand what the query builder is doing. That's why SelectQueryBuilder::select() takes a list of fields, and by the same principle, it makes sense for UpdateQueryBuilder::update() to take a table. However with "insert" and "delete", the SQL designers chose to add prepositions "into" and "from", and I think it makes sense to follow that here. In terms of natural language, we update a table, but we don't delete a table, or insert a table. We delete rows from a table, or insert rows into a table. The table is not the object of the verb. So, add insertInto() as an alias for insert(), and add deleteFrom() as an alias for delete(). Use the new methods in MW core callers where PHPStorm knows the type. Change-Id: Idb327a54a57a0fb2288ea067472c1e9727016000
* Merge "rdbms: Drop old class aliases"jenkins-bot2023-08-291-1/+2
|\
| * rdbms: Drop old class aliasesJames D. Forrester2023-08-241-1/+2
| | | | | | | | | | | | | | | | Bug: T344536 Depends-On: I565541d781caaf564ae0c1877f5cb086e3650f22 Depends-On: Ia5fdf3242f9510e4f21670f3746d9364ae2935c6 Depends-On: I6f4b158bdc3ef20a1660e66accca0ffc17104f49 Change-Id: Ia87f1be7e0e68eb7cf792cb1f5ae64ecdfa2c015
* | Reorg: Move Status to MediaWiki\Status\Amir Sarabadani2023-08-252-0/+2
|/ | | | | | | | | | This class is used heavily basically everywhere, moving it to Utils wouldn't make much sense. Also with this change, we can move StatusValue to MediaWiki\Status as well. Bug: T321882 Depends-On: I5f89ecf27ce1471a74f31c6018806461781213c3 Change-Id: I04c1dcf5129df437589149f0f3e284974d7c98fa
* mark various anonymous functions as staticReedy2023-08-221-3/+3
| | | | Change-Id: Iefe896769359f0d32e52bf20aa03e1c3715d5074
* tests: Use namespaced Wikimedia\Rdbms\IDatabaseUmherirrender2023-08-201-1/+2
| | | | | Bug: T344536 Change-Id: I29c80fe2ac3effd5e9df4402c598dc33c1b23d5e
* Avoid DB access in non-database testsDaimona Eaytoy2023-08-061-1/+4
| | | | | | | | Mock the needed dependencies to avoid database access when possible, and add the test to the Database group otherwise. Bug: T155147 Change-Id: Ic5c39ab35ab4d993721713285180f072497a5a40
* Migrate more calls of Database::select* to SelectQueryBuilderAmir Sarabadani2023-07-261-0/+4
| | | | | | | | | Using a php parser written on top of ANTLR4, done semi-automatically. I checked everything and made adjustments. Bug: T311866 Change-Id: I6150c6909bce8f3dbd745a26380cc0af9d9c547f
* tests: Migrate calls to Database::update to UpdateQueryBuilderAmir Sarabadani2023-07-141-2/+5
| | | | | Bug: T330640 Change-Id: I30f9e84658fbd996b5512e96dda3f6412ebf3a20
* tests: Migrate Database::delete calls to DeleteQueryBuilderAmir Sarabadani2023-07-141-1/+4
| | | | | Bug: T340065 Change-Id: I92e85efd5d23d100a5df38aedb8edaecc5cbfc65
* tests: Make some PHPUnit data providers staticUmherirrender2023-05-201-2/+2
| | | | | | | | | Initally used a new sniff with autofix (T333745), but some provide are defined non-static in TestBase class and need more work to make them static in a compatible way Bug: T332865 Change-Id: I889d33424f0c01fb26f2d86f8d4fc3de3e568843
* objectcache,resourceloader,rdbms,jobqueue: Widen @covers annotationsTimo Tijhof2023-04-102-92/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Follows-up I4c7d826c7ec654b, I1287f3979aba1bf1. We lose useful coverage and spend valuable time keeping these accurate through refactors (or worse, forget to do so). The theoretically "bad" accidental coverage is almost never actually bad. Having said that, I'm not removing them wholesale (yet). I've audited each of these specific files to confirm it is a general test of the specified subject class, and also kept it limited to those specified classes. That's imho more than 100% of the benefit for less than 1% of the cost (more because `@covers` is more valuable than the fragile and corrosive individual private method tracking in tests that inevitably get out of date with no local incentive to keep them up to date). Cases like structure tests keep `@coversNothing` etc and we still don't count coverage of other classes. There may be a handful of large legacy classes where some methods are effectively class-like in complexity and that's why it's good for PHPUnit to offer the precision instrument but that doesn't meant we have to use that by-default for everything. I think best practice is to write good narrow unit tests, that reflect how the code should be used in practice. Not to write bad tests and hide part of its coverage within the same class or even namespace. Fortunately, that's generally what we do already it's just that we also kept these annotations still in many cases. This wastes time to keep methods in sync, time to realize (and fix) when other people inevitably didn't keep them in sync, time to find uncovered code only to realize it is already covered, time for a less experienced engineer to feel obligate to and do write a low quality test to cover the "missing" branch in an unrealistic way, time wasted in on-boarding by using such "bad" tests as example for how to use the code and then having to unlearn it months/years later, loss of telemetry in knowing what code actually isn't propertly tested due to being masked by a bad test, and lost oppertunities to find actually ununused/unreachable code and to think about how to instead structure the code such that maybe that code can be removed. ------ Especially cases like LBFactoryTest.php were getting out of hand, and in GlobalIdGeneratorTest.php we even resorted to reminding people with inline comments to keep tags in sync. Change-Id: I69b5385868cc6b451e5f2ebec9539694968bf58c
* Just another 80 or so PHPStorm inspection fixes (#4)Tim Starling2023-03-251-1/+1
| | | | | | | | | | | | | * Unnecessary regex modifier. I agree with this inspection which flags /s modifiers on regexes that don't use a dot. * Property declared dynamically. * Unused local variable. But it's acceptable for an unused local variable to take the return value of a method under test, when it is being tested for its side-effects. And it's acceptable for an unused local variable to document unused list expansion elements, or the nature of array keys in a foreach. Change-Id: I067b5b45dd1138c00e7269b66d3d1385f202fe7f
* tests: Make some PHPUnit data providers staticTim Starling2023-03-242-8/+8
| | | | | | | | | | | | | Just methods where adding "static" to the declaration was enough, I didn't do anything with providers that used $this. Initially by search and replace. There were many mistakes which I found mostly by running the PHPStorm inspection which searches for $this usage in a static method. Later I used the PHPStorm "make static" action which avoids the more obvious mistakes. Bug: T332865 Change-Id: I47ed6692945607dfa5c139d42edbd934fa4f3a36
* Reorg: Namespace the Title classJames D. Forrester2023-03-022-0/+2
| | | | | | | | | | | | | | | | | | | This is moderately messy. Process was principally: * xargs rg --files-with-matches '^use Title;' | grep 'php$' | \ xargs -P 1 -n 1 sed -i -z 's/use Title;/use MediaWiki\\Title\\Title;/1' * rg --files-without-match 'MediaWiki\\Title\\Title;' . | grep 'php$' | \ xargs rg --files-with-matches 'Title\b' | \ xargs -P 1 -n 1 sed -i -z 's/\nuse /\nuse MediaWiki\\Title\\Title;\nuse /1' * composer fix Then manual fix-ups for a few files that don't have any use statements. Bug: T166010 Follows-Up: Ia5d8cb759dc3bc9e9bbe217d0fb109e2f8c4101a Change-Id: If8fc9d0d95fc1a114021e282a706fc3e7da3524b
* Reorg: Migrate WikiMap to WikiMap/ out of includesAmir Sarabadani2023-02-276-0/+8
| | | | | | | And WikiReference Bug: T321882 Change-Id: I60cf4b9ef02b9d58118caa39172677ddfe03d787
* DatabaseSqlite: fix null blobsTim Starling2022-11-221-2/+0
| | | | | | | | | For a zero-length blob, sqlite3_column_blob() will return NULL. In PHP<8.1, this caused the returned value to be null. PHP 8.1, PDO was refactored to take better notice of the type reported by the DB. The null pointer is ignored and an empty string is returned. Change-Id: I98eed22ba8c5c637d485025a8e571f3aef46c5e3
* LocalFileTest: use encodeBlob/decodeBlob for img_metadataTim Starling2022-11-221-7/+9
| | | | | | Should fix a PG test failure. Change-Id: I21b0e37589309a97e811432ef0a37b219b141477
* Use short array destructuring instead of list()Tim Starling2022-10-211-2/+2
| | | | | | | | Introduced in PHP 7.1. Because it's shorter and looks nice. I used regex replacement. Change-Id: I0555e199d126cd44501f859cb4589f8bd49694da
* tests: Migrate `setMwGlobals()` to `overrideConfigValue(s)`Derick Alangi2022-07-275-22/+32
| | | | Change-Id: I13a82dc57a86f74c713a11eff26488bee06903e2
* Replace trivial usa of mock builder with createMock() shortcutThiemo Kreuz2022-07-151-3/+1
| | | | | | | | | | | createMock() does the same, but is much easier to read. A small difference is that some of the replacements made in this patch didn't use disableOriginalConstructor() before. In case this was relevant we should see the respective test fail. If not we can save some CPU cycles and skip these constructors. Change-Id: Ib98fb06e0fe753b7a53cb087a47e1159515a8ad5
* Remove deprecated wfLocalFile and wfFindFileUmherirrender2022-07-071-13/+0
| | | | | Bug: T249020 Change-Id: I9988e0abcec39ec0c6e92a92d40363a45483f016
* tests: Use Title::makeTitle instead of Title::newFromTextUmherirrender2022-07-061-7/+7
| | | | | | Avoid parsing known titles in tests to improve performance Change-Id: Ibfccfe696f0b8bfda0b99abae324e60bbecef7d8
* tests: Use namespaced IDatabase classUmherirrender2022-05-281-0/+2
| | | | Change-Id: I7171ff26faee00d9eaabc33c2f3d91049ea0b40d
* Add convenience methods for asserting status.daniel2022-03-162-8/+8
| | | | | | | This ensures that assertions work in a uniform way, and provides meaningful messages in cause of failure. Change-Id: Ic01715b9a55444d3df6b5d4097e78cb8ac082b3e
* phpcs: Disable `Generic.Files.LineLength` for test filesTimo Tijhof2022-02-181-5/+0
| | | | | | | | | | | There is a common and reasonable need for longer lines in tests. The nudge for shorter lines doesn't seem valuable here. The natural breaks will likely still fall in 80-100 given the enforced practice for non-test code, e.g. whether through habit, or 80-100 column markers in text editors, or the finite width of diff and code review interfaces. Change-Id: I879479e13551789a67624ce66f0946d2f185e6ee
* Clean up tests that misused the parameters of assertSame/EqualsFunc2022-02-081-2/+2
| | | | | | | | | | | | Expected value is the first parameter to assertSame() or assertEquals(). And turn to use assertCount() for some assertions aginst count of array. Based on code search `assert(?:Same|Equals)\(.+,.+expected` and I look through files roughly, so some assertions that don't contains 'expected' are also fixed. In the meantime, some assertions that I am not clear about are not touched. Change-Id: I75798b60d29fd19b33f4fdf34ed3c788db420d01
* Merge "filerepo: Simplify and document 'favicon' FileRepo option"jenkins-bot2022-01-281-4/+5
|\
| * filerepo: Simplify and document 'favicon' FileRepo optionTimo Tijhof2022-01-261-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This was originally added in changes linked to T77093 without coordination with maintainers and took various shortcuts and lacked proper integration. * Rather than reading a global variable from LocalRepo::getInfo, inject this option from Setup.php, the same as for other local settings. * Apply the wfExpandUrl() call in the base class getInfo() method. This is done so that $wgForeignFileRepos and $wgLocalFileRepo settings via LocalSettings.php or wmf-config get the same treatment and benefit (support for paths) as $wgFavicon, which one would generally expect. Other reasons to do this at run-time are 1) We can't safely call wfExpandUrl() during Setup.php as it is too early, and 2) We generally avoid doing computational work during Setup.php given it's not needed for most web requests to most entry points (T189966, etc.). * Document the option in DefaultSettings.php. * Fix bad doc in FileRepo.php, to reflect that it is optional and may be null. * Remove now-redundant hack in ForeignDBRepo::getInfo, which had to jump over its parent class previously to avoid inheriting the other hack in LocalRepo::getInfo, which is now gone as well. Bug: T77093 Change-Id: I9102b5a246ff81a3435748a3fd1c759a4b884a51
* | phpunit: use ->getServiceContainer() in integration testsAlexander Vorwerk2022-01-273-11/+7
|/ | | | Change-Id: I38299cb65eeaadfdc0eb05db4e8c0b0119cfb37d
* Replace usages of deprecated wfWikiID()Alexander Vorwerk2021-12-215-6/+6
| | | | | | | | The global function wfWikiID() is deprecated since 1.35 and it's usages should be replaced with WikiMap::getCurrentWikiId(). Bug: T298059 Change-Id: I22d96b7aec17323d15a9bc401d4511ad2ee14165
* Revert "Remove last User dependencies from File"Majavah2021-11-261-3/+0
| | | | | | | | | This reverts commit 73a25838b461a952914190cb48eaaefee11d7659. Reason for revert: T296508 Bug: T296508 Change-Id: I8af37665eeb284b85157a72459d43261ec4829ed
* Remove last User dependencies from FilePetr Pchelko2021-11-261-0/+3
| | | | Change-Id: I953fcc66b5cde1ef481178b08e16c50b8a118702
* Remove or replace usages of "sanity"Reedy2021-11-211-1/+1
| | | | | | | Still some more to go... Bug: T254646 Change-Id: Ia117f01e443c35b4765f3275cab4f2707e1be96f
* Use ParserCache for local file description rendersPetr Pchelko2021-11-111-2/+16
| | | | | | | | | | | Currently for every File page view, if the file is local, CommonsMetadata extension renders the file page twice - once to extract the metadata, and once to show the page. Metadata extraction parse was always uncached, so let's at least use PoolCounter and ParserCache for this parse. Bug: T292302 Change-Id: If6e1a1a72d794f4fb87105b7528ea0afe92a585f
* Merge "File: remove deprecated methods"jenkins-bot2021-11-051-9/+0
|\
| * File: remove deprecated methodsPetr Pchelko2021-11-011-9/+0
| | | | | | | | Change-Id: I961e62f812f2e1b86b858be7eeee8bc042542689
* | Merge "Replace `new stdClass` with more compact array syntax"jenkins-bot2021-11-021-1/+1
|\ \ | |/ |/|
| * Replace `new stdClass` with more compact array syntaxThiemo Kreuz2021-11-021-1/+1
| | | | | | | | | | | | | | It does the exact same. The resulting object is still an stdClass instance. Change-Id: Ief68609943ee30aa95732d24021c921dfbad166c
* | Drop experimental FileJournal system without deprecationJames D. Forrester2021-11-011-1/+0
|/ | | | | | | The feature was introduced in 2012 with d19f54602f (just before the gerrit migration). Change-Id: Ia3f59ad0ddeb1f610947b14e22b0694ff4c6ed84
* tests: Swap assertion order in unit testsUmherirrender2021-08-041-10/+10
| | | | | | | Changes from patch set Icb93c79f4843b59dae80d3eda1a880457a1a68f2 Also some swaps from assertEquals to assertSame/True/False/Null Change-Id: Ife497ae6cb1888b77eb25e85b76df72adc65641a
* build: Updating dependencieslibraryupgrader2021-07-222-4/+4
| | | | | | | | | | | | | | composer: * mediawiki/mediawiki-codesniffer: 36.0.0 → 37.0.0 The following sniffs now pass and were enabled: * Generic.ControlStructures.InlineControlStructure * MediaWiki.PHPUnit.AssertCount.NotUsed npm: * svgo: 2.3.0 → 2.3.1 * https://npmjs.com/advisories/1754 (CVE-2021-33587) Change-Id: I2a9bbee2fecbf7259876d335f565ece4b3622426
* Replace getMasterDB methods with getPrimaryDBJames D. Forrester2021-07-141-2/+2
| | | | | Bug: T254646 Change-Id: I68198bc39b174ea1920b4acc2617cb6c6ce406e9
* Manual and automatic image metadata reserializationTim Starling2021-06-261-14/+160
| | | | | | | | | | | | | | | | | | | | | | | * Add automatic splitting of large metadata on upload or refresh. If the reserializeMetadata option is enabled, metadata stored with PHP serialization will be automatically reserialized to JSON. * Inject configuration variable $wgUpdateCompatibleMetadata via LocalRepo instead of accessing it directly. * In refreshImageMetadata.php and rebuildImages.php, construct a new LocalRepo with config overrides, instead of overwriting config globals. Add a helper to RepoGroup to help with this. * In refreshImageMetadata.php, add new options --convert-to-json and --split which reserialize metadata and optionally split out large items to blob storage. Also, refreshImageMetadata.php was totally broken in the non-force mode since metadata refresh on page view was disabled in b814245d9f3bb. The maintenance script was relying on newFileFromRow() magically upgrading the row, which doesn't happen anymore. So, call maybeUpgradeRow() directly. Bug: T275268 Change-Id: I7bf7d9cef71641e287ca4346b568b381f4ada50e
* Optionally split out parts of file metadata to BlobStoreTim Starling2021-06-111-28/+290
| | | | | | | | | | | | | | * Optionally store metadata in the database in JSON format instead of PHP serialization. The new JSON format has a top-level "envelope" array which gives us a place to store things that are not part of the handler metadata. * Optionally split metadata items, putting items above a threshold into the text table. The FileRepo and MediaHandler must both opt in. * For staged deployment, the read side of these changes is always active. Only the write side is configurable. Bug: T275268 Change-Id: I876ea5c9d3a1881e278f689d2f8a3ae20240c703
* Use the unserialized form of image metadata internallyTim Starling2021-06-081-2/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Image metadata is usually a serialized string representing an array. Passing the string around internally and having everything unserialize it is an awkward convention. Also, many image handlers were reading the file twice: once for getMetadata() and again for getImageSize(). Often getMetadata() would actually read the width and height and then throw it away. So, in filerepo: * Add File::getMetadataItem(), which promises to allow partial loading of metadata per my proposal on T275268 in a future commit. * Add File::getMetadataArray(), which returns the unserialized array. Some file handlers were returning non-serializable strings from getMetadata(), so I gave them a legacy array form ['_error' => ...] * Changed MWFileProps to return the array form of metadata. * Deprecate the weird File::getImageSize(). It was apparently not called by anything, but was overridden by UnregisteredLocalFile. * Wrap serialize/unserialize with File::getMetadataForDb() and File::loadMetadataFromDb() in preparation for T275268. In MediaHandler: * Merged MediaHandler::getImageSize() and MediaHandler::getMetadata() into getSizeAndMetadata(). Deprecated the old methods. * Instead of isMetadataValid() we now have isFileMetadataValid(), which only gets a File object, so it can decide what data it needs to load. * Simplified getPageDimensions() by having it return false for non-paged media. It was not called in that case, but was implemented anyway. In specific handlers: * Rename DjVuHandler::getUnserializedMetadata() and extractTreesFromMetadata() for clarity. "Metadata" in these function names meant an XML string. * Updated DjVuImage::getImageSize() to provide image sizes in the new style. * In ExifBitmapHandler, getRotationForExif() now takes just the Orientation tag, rather than a serialized string. Also renamed for clarity. * In GIFMetadataExtractor, return the width, height and bits per channel instead of throwing them away. There was some conflation in decodeBPP() which I picked apart. Refer to GIF89a section 18. * In JpegMetadataExtractor, process the SOF0/SOF2 segment to extract bits per channel, width, height and components (channel count). This is essentially a port of PHP's getimagesize(), so should be bugwards compatible. * In PNGMetadataExtractor, return the width and height, which were previously assigned to unused local variables. I verified the implementation by referring to the specification. * In SvgHandler, retain the version validation from unpackMetadata(), but rename the function since it now takes an array as input. In tests: * In ExifBitmapTest, refactored some tests by using a provider. * In GIFHandlerTest and PNGHandlerTest, I removed the tests in which getMetadata() returns null, since it doesn't make sense when ported to getMetadataArray(). I added tests for empty arrays instead. * In tests, I retained serialization of input data since I figure it's useful to confirm that existing database rows will continue to be read correctly. I removed serialization of expected values, replacing them with plain data. * In tests, I replaced access to private class constants like BROKEN_FILE with string literals, since stability is essential. If the class constant changes, the test should fail. Elsewhere: * In maintenance/refreshImageMetadata.php, I removed the check for shrinking image metadata, since it's not easy to implement and is not future compatible. Image metadata is expected to shrink in future. Bug: T275268 Change-Id: I039785d5b6439d71dcc21dcb972177dba5c3a67d