diff --git a/.gitattributes b/.gitattributes index 62575cea0..65c0a70bc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,4 @@ tests/ export-ignore .phpcs.xml.dist export-ignore phpdoc.dist.xml export-ignore phpunit.xml.dist export-ignore +phpunit10.xml.dist export-ignore diff --git a/.github/workflows/quicktest.yml b/.github/workflows/quicktest.yml index a0305edbc..5190e33e4 100644 --- a/.github/workflows/quicktest.yml +++ b/.github/workflows/quicktest.yml @@ -90,12 +90,18 @@ jobs: - name: Access localhost on port 9002 run: curl -i http://localhost:9002 - - name: Show PHPUnit version - run: vendor/bin/phpunit --version + - name: Grab PHPUnit version + id: phpunit_version + run: echo "VERSION=$(vendor/bin/phpunit --version | grep --only-matching --max-count=1 --extended-regexp '\b[0-9]+\.[0-9]+')" >> $GITHUB_OUTPUT - - name: Run the unit tests + - name: Run the unit tests (PHPUnit < 10) + if: ${{ ! startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} run: composer test + - name: Run the unit tests (PHPUnit 10+) + if: ${{ startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} + run: composer test10 + - name: Stop proxy server continue-on-error: true run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a24c93504..93f733684 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -114,16 +114,25 @@ jobs: - name: Access localhost on port 9002 run: curl -i http://localhost:9002 - - name: Show PHPUnit version - run: vendor/bin/phpunit --version + - name: Grab PHPUnit version + id: phpunit_version + run: echo "VERSION=$(vendor/bin/phpunit --version | grep --only-matching --max-count=1 --extended-regexp '\b[0-9]+\.[0-9]+')" >> $GITHUB_OUTPUT - - name: Run the unit tests, no code coverage - if: ${{ matrix.coverage == false }} + - name: Run the unit tests, no code coverage (PHPUnit < 10) + if: ${{ matrix.coverage == false && ! startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} run: composer test - - name: Run the unit tests with code coverage - if: ${{ matrix.coverage == true }} - run: vendor/bin/phpunit --coverage-clover clover.xml + - name: Run the unit tests, no code coverage (PHPUnit 10+) + if: ${{ matrix.coverage == false && startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} + run: composer test10 + + - name: Run the unit tests with code coverage (PHPUnit < 10) + if: ${{ matrix.coverage == true && ! startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} + run: composer coverage -- --coverage-clover clover.xml + + - name: Run the unit tests with code coverage (PHPUnit 10+) + if: ${{ matrix.coverage == true && startsWith( steps.phpunit_version.outputs.VERSION, '10.' ) }} + run: composer coverage10 -- --coverage-clover clover.xml - name: Stop proxy server continue-on-error: true diff --git a/.phpcs.xml.dist b/.phpcs.xml.dist index 985ccd146..2be1b2317 100644 --- a/.phpcs.xml.dist +++ b/.phpcs.xml.dist @@ -247,4 +247,9 @@ /tests/*\.php$ + + + /tests/*\.php$ + + diff --git a/composer.json b/composer.json index 0c7acc7d7..ccafa9c09 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,7 @@ "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "php-parallel-lint/php-parallel-lint": "^1.3.2", "php-parallel-lint/php-console-highlighter": "^1.0.0", - "yoast/phpunit-polyfills": "^1.0.0", + "yoast/phpunit-polyfills": "^2.0.0", "roave/security-advisories": "dev-latest" }, "suggest": { @@ -84,8 +84,23 @@ "test": [ "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" ], + "test10": [ + "@php ./vendor/phpunit/phpunit/phpunit -c phpunit10.xml.dist --no-coverage" + ], "coverage": [ "@php ./vendor/phpunit/phpunit/phpunit" + ], + "coverage10": [ + "@php ./vendor/phpunit/phpunit/phpunit -c phpunit10.xml.dist" ] + }, + "scripts-descriptions": { + "lint": "Lint PHP files to find parse errors.", + "checkcs": "Check the entire codebase for code-style issues.", + "fixcs": "Fix all auto-fixable code-style issues in the entire codebase.", + "test": "Run the unit tests on PHPUnit 5.x - 9.x without code coverage.", + "test10": "Run the unit tests on PHPUnit 10.x without code coverage.", + "coverage": "Run the unit tests on PHPUnit 5.x - 9.x with code coverage.", + "coverage10": "Run the unit tests on PHPUnit 10.x with code coverage." } } diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 393afcbcb..854fb0950 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -4,6 +4,7 @@ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/7.5/phpunit.xsd" backupGlobals="true" bootstrap="tests/bootstrap.php" + beStrictAboutTestsThatDoNotTestAnything="true" convertDeprecationsToExceptions="true" colors="true" verbose="true" diff --git a/phpunit10.xml.dist b/phpunit10.xml.dist new file mode 100644 index 000000000..8826f5bfe --- /dev/null +++ b/phpunit10.xml.dist @@ -0,0 +1,36 @@ + + + + + tests + + + + + + ./src/ + + + + + + + + + diff --git a/src/Transport/Curl.php b/src/Transport/Curl.php index 0b3794808..3995197f4 100644 --- a/src/Transport/Curl.php +++ b/src/Transport/Curl.php @@ -177,6 +177,11 @@ public function request($url, $headers = [], $data = [], $options = []) { $this->stream_handle = @fopen($options['filename'], 'wb'); if ($this->stream_handle === false) { $error = error_get_last(); + if (!is_array($error)) { + // Shouldn't be possible, but can happen in test situations. + $error = ['message' => 'Failed to open stream']; + } + throw new Exception($error['message'], 'fopen'); } } diff --git a/src/Transport/Fsockopen.php b/src/Transport/Fsockopen.php index 97a1f7373..15a5ba9b0 100644 --- a/src/Transport/Fsockopen.php +++ b/src/Transport/Fsockopen.php @@ -282,6 +282,11 @@ public function request($url, $headers = [], $data = [], $options = []) { $download = @fopen($options['filename'], 'wb'); if ($download === false) { $error = error_get_last(); + if (!is_array($error)) { + // Shouldn't be possible, but can happen in test situations. + $error = ['message' => 'Failed to open stream']; + } + throw new Exception($error['message'], 'fopen'); } } diff --git a/tests/Auth/Basic/BasicTest.php b/tests/Auth/Basic/BasicTest.php index 1ca8ee117..34f914f7d 100644 --- a/tests/Auth/Basic/BasicTest.php +++ b/tests/Auth/Basic/BasicTest.php @@ -44,14 +44,14 @@ public function testUsingArray($transport) { $result = json_decode($request->body); $this->assertIsObject($result, 'Decoded response body is not an object'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'authenticated', $result, 'Property "authenticated" not available in decoded response' ); $this->assertTrue($result->authenticated, 'Authentication failed'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'user', $result, 'Property "user" not available in decoded response' @@ -91,14 +91,14 @@ public function testUsingInstantiation($transport) { $result = json_decode($request->body); $this->assertIsObject($result, 'Decoded response body is not an object'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'authenticated', $result, 'Property "authenticated" not available in decoded response' ); $this->assertTrue($result->authenticated, 'Authentication failed'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'user', $result, 'Property "user" not available in decoded response' @@ -141,14 +141,14 @@ public function testUsingInstantiationWithDelayedSettingOfCredentials($transport $result = json_decode($request->body); $this->assertIsObject($result, 'Decoded response body is not an object'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'authenticated', $result, 'Property "authenticated" not available in decoded response' ); $this->assertTrue($result->authenticated, 'Authentication failed'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'user', $result, 'Property "user" not available in decoded response' @@ -189,12 +189,12 @@ public function testPOSTUsingInstantiation($transport) { $result = json_decode($request->body); $this->assertIsObject($result, 'Decoded response body is not an object'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'headers', $result, 'Property "headers" not available in decoded response' ); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'Authorization', $result->headers, 'Property "headers->Authorization" not available in decoded response' @@ -205,7 +205,7 @@ public function testPOSTUsingInstantiation($transport) { $this->assertArrayHasKey(1, $auth, 'Authorization header failed to be split into two parts'); $this->assertSame(base64_encode('user:passwd'), $auth[1], 'Unexpected authorization string in headers'); - $this->assertObjectHasAttribute( + $this->assertObjectHasProperty( 'data', $result, 'Property "data" not available in decoded response' diff --git a/tests/Auth/Basic/ConstructorTest.php b/tests/Auth/Basic/ConstructorTest.php index a7b392a51..bb98ba78d 100644 --- a/tests/Auth/Basic/ConstructorTest.php +++ b/tests/Auth/Basic/ConstructorTest.php @@ -34,7 +34,7 @@ public function testInvalidInputType($input) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_ARRAY); } @@ -59,7 +59,7 @@ public function testInvalidArgumentCount($input) { * * @return array */ - public function dataInvalidArgumentCount() { + public static function dataInvalidArgumentCount() { return [ 'empty array' => [[]], 'array with only one element' => [['user']], diff --git a/tests/Autoload/AutoloadTest.php b/tests/Autoload/AutoloadTest.php index 4a8cd358b..e9876bf04 100644 --- a/tests/Autoload/AutoloadTest.php +++ b/tests/Autoload/AutoloadTest.php @@ -2,6 +2,7 @@ namespace WpOrg\Requests\Tests\Autoload; +use Exception; use Requests; use Requests_Exception_Transport_cURL; use Requests_Utility_FilteredIterator; @@ -21,8 +22,17 @@ final class AutoloadTest extends TestCase { * Verify that a deprecation notice is thrown when the "old" Requests class is loaded via a require/include. */ public function testDeprecationNoticeThrownForOldRequestsClass() { - $this->expectDeprecation(); - $this->expectDeprecationMessage(self::MSG); + // PHPUnit 10 compatible way to test the deprecation notice. + set_error_handler( + static function ($errno, $errstr) { + restore_error_handler(); + throw new Exception($errstr, $errno); + }, + E_USER_DEPRECATED + ); + + $this->expectException(Exception::class); + $this->expectExceptionMessage(self::MSG); require_once dirname(dirname(__DIR__)) . '/library/Requests.php'; } @@ -31,8 +41,17 @@ public function testDeprecationNoticeThrownForOldRequestsClass() { * Verify that a deprecation notice is thrown when one of the other "old" Requests classes is autoloaded. */ public function testDeprecationNoticeThrownForOtherOldRequestsClass() { - $this->expectDeprecation(); - $this->expectDeprecationMessage(self::MSG); + // PHPUnit 10 compatible way to test the deprecation notice. + set_error_handler( + static function ($errno, $errstr) { + restore_error_handler(); + throw new Exception($errstr, $errno); + }, + E_USER_DEPRECATED + ); + + $this->expectException(Exception::class); + $this->expectExceptionMessage(self::MSG); $this->assertNotEmpty(Requests_Exception_Transport_cURL::EASY); } @@ -91,7 +110,7 @@ public function testLoad($class_name, $expected) { * * @return array */ - public function dataLoad() { + public static function dataLoad() { return [ 'Request for class not in this package should be rejected' => [ 'class_name' => 'Unrelated\Package\ClassName', diff --git a/tests/Cookie/ConstructorTest.php b/tests/Cookie/ConstructorTest.php index 9aabcf664..d9b32b065 100644 --- a/tests/Cookie/ConstructorTest.php +++ b/tests/Cookie/ConstructorTest.php @@ -50,7 +50,7 @@ public function testInvalidValue($input) { * * @return array */ - public function dataInvalidStringInput() { + public static function dataInvalidStringInput() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -75,7 +75,7 @@ public function testInvalidAttributes($input) { * * @return array */ - public function dataInvalidAttributes() { + public static function dataInvalidAttributes() { $except = array_intersect(TypeProviderHelper::GROUP_ITERABLE, TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); return TypeProviderHelper::getAllExcept($except); } @@ -101,7 +101,7 @@ public function testInvalidFlags($input) { * * @return array */ - public function dataInvalidFlags() { + public static function dataInvalidFlags() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } @@ -126,7 +126,7 @@ public function testInvalidReferenceTime($input) { * * @return array */ - public function dataInvalidReferenceTime() { + public static function dataInvalidReferenceTime() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_INT); } @@ -152,7 +152,7 @@ public function testMinimalArguments($name, $value) { * * @return array */ - public function dataMinimalArguments() { + public static function dataMinimalArguments() { return [ 'empty name and value' => [ 'name' => '', @@ -199,7 +199,7 @@ public function testFlagMerging($flags, $expected) { * * @return array */ - public function dataFlagMerging() { + public static function dataFlagMerging() { return [ 'empty array' => [ 'flags' => [], @@ -269,7 +269,7 @@ public function testSetReferenceTime($time, $expected = null) { * * @return array */ - public function dataSetReferenceTime() { + public static function dataSetReferenceTime() { return [ 'null' => [ 'time' => null, @@ -302,7 +302,7 @@ public function testAttributesAreNormalized($attributes, $expected) { * * @return array */ - public function dataAttributesAreNormalized() { + public static function dataAttributesAreNormalized() { return [ 'empty array' => [ 'attributes' => [], diff --git a/tests/Cookie/DomainMatchesTest.php b/tests/Cookie/DomainMatchesTest.php index 9ae5e70b2..c3bd86b92 100644 --- a/tests/Cookie/DomainMatchesTest.php +++ b/tests/Cookie/DomainMatchesTest.php @@ -34,7 +34,7 @@ public function testInvalidInput($input) { * * @return array */ - public function dataInvalidInput() { + public static function dataInvalidInput() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -62,13 +62,13 @@ public function testManuallySetCookie($domain) { * * @return array */ - public function dataManuallySetCookie() { + public static function dataManuallySetCookie() { $domains = [ 'example.com', 'example.net', ]; - return $this->textArrayToDataprovider($domains); + return self::textArrayToDataprovider($domains); } /** @@ -117,7 +117,7 @@ public function testDomainMatch($original, $check, $matches, $domain_matches) { * * @return array */ - public function dataDomainMatch() { + public static function dataDomainMatch() { return [ 'Empty string' => [ 'original' => 'example.com', diff --git a/tests/Cookie/Jar/ConstructorTest.php b/tests/Cookie/Jar/ConstructorTest.php index ba02766cf..98952f824 100644 --- a/tests/Cookie/Jar/ConstructorTest.php +++ b/tests/Cookie/Jar/ConstructorTest.php @@ -34,7 +34,7 @@ public function testInvalidInputType($input) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } @@ -64,7 +64,7 @@ public function testValidInputType($input) { * * @return array */ - public function dataValidInputType() { + public static function dataValidInputType() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_ARRAY); } } diff --git a/tests/Cookie/Jar/NormalizeCookieTest.php b/tests/Cookie/Jar/NormalizeCookieTest.php index 0c28bdfdf..f90afb9d8 100644 --- a/tests/Cookie/Jar/NormalizeCookieTest.php +++ b/tests/Cookie/Jar/NormalizeCookieTest.php @@ -55,7 +55,7 @@ public function testNormalizationWithKey($cookie, $expected_name) { * * @return array */ - public function dataNormalization() { + public static function dataNormalization() { return [ 'unbaked cookie (string)' => [ 'cookie' => self::COOKIE_VALUE, diff --git a/tests/Cookie/NormalizeTest.php b/tests/Cookie/NormalizeTest.php index ed6a0bcb6..7a4c74eac 100644 --- a/tests/Cookie/NormalizeTest.php +++ b/tests/Cookie/NormalizeTest.php @@ -36,7 +36,7 @@ public function testNormalizeAttributes($attributes, $expected) { * * @return array */ - public function dataNormalizeAttributes() { + public static function dataNormalizeAttributes() { return [ /* * Test cases specific to the normalize() method. @@ -275,7 +275,7 @@ public function dataNormalizeAttributes() { * * @return array */ - public function dataNormalizeAttributesExpiresUnsupportedType() { + public static function dataNormalizeAttributesExpiresUnsupportedType() { $types = TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_INT, TypeProviderHelper::GROUP_STRING); $data = []; @@ -296,7 +296,7 @@ public function dataNormalizeAttributesExpiresUnsupportedType() { * * @return array */ - public function dataNormalizeAttributesMaxAgeUnsupportedType() { + public static function dataNormalizeAttributesMaxAgeUnsupportedType() { $types = TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_INT, TypeProviderHelper::GROUP_STRING); $data = []; @@ -317,7 +317,7 @@ public function dataNormalizeAttributesMaxAgeUnsupportedType() { * * @return array */ - public function dataNormalizeAttributesDomainUnsupportedType() { + public static function dataNormalizeAttributesDomainUnsupportedType() { $types = TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); $data = []; diff --git a/tests/Cookie/ParseTest.php b/tests/Cookie/ParseTest.php index d844df219..3e29dd713 100644 --- a/tests/Cookie/ParseTest.php +++ b/tests/Cookie/ParseTest.php @@ -55,7 +55,7 @@ public function testParseInvalidName($input) { * * @return array */ - public function dataInvalidStringInput() { + public static function dataInvalidStringInput() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -401,7 +401,7 @@ public function testParsingHeaderWithOrigin($header, $origin, $expected, $expect * * @return array */ - public function dataParsingHeaderWithOrigin() { + public static function dataParsingHeaderWithOrigin() { return [ // Varying origin path. 'Origin: http://example.com (no trailing slash for path)' => [ diff --git a/tests/Cookie/PathMatchesTest.php b/tests/Cookie/PathMatchesTest.php index f1a62b70b..8faa2d44d 100644 --- a/tests/Cookie/PathMatchesTest.php +++ b/tests/Cookie/PathMatchesTest.php @@ -36,7 +36,7 @@ public function testManuallySetCookie($path) { * * @return array */ - public function dataManuallySetCookie() { + public static function dataManuallySetCookie() { $paths = [ '', '/', @@ -44,7 +44,7 @@ public function dataManuallySetCookie() { '/test/', ]; - return $this->textArrayToDataprovider($paths); + return self::textArrayToDataprovider($paths); } /** @@ -72,7 +72,7 @@ public function testPathMatch($original, $check, $matches) { * * @return array */ - public function dataPathMatchUndesiredInputTypes() { + public static function dataPathMatchUndesiredInputTypes() { $data = []; $all_types = TypeProviderHelper::getAll(); foreach ($all_types as $key => $value) { @@ -111,7 +111,7 @@ public function dataPathMatchUndesiredInputTypes() { * * @return array */ - public function dataPathMatch() { + public static function dataPathMatch() { return [ 'Exact match: "/"' => [ 'original' => '/', diff --git a/tests/Cookie/UriMatchesTest.php b/tests/Cookie/UriMatchesTest.php index 1dfed6021..749b7e9a9 100644 --- a/tests/Cookie/UriMatchesTest.php +++ b/tests/Cookie/UriMatchesTest.php @@ -68,7 +68,7 @@ public function testUrlMatch($domain, $path, $check, $matches, $domain_matches) * * @return array */ - public function dataUrlMatch() { + public static function dataUrlMatch() { return [ // Domain handling. 'Domain handling: same domain name, same TLD' => [ @@ -211,7 +211,7 @@ public function testUrlMatchSecure($secure, $scheme, $expected) { * * @return array */ - public function dataUrlMatchSecure() { + public static function dataUrlMatchSecure() { return [ 'Secure matching: off, scheme: http' => [ 'secure' => false, @@ -261,7 +261,7 @@ public function testManuallySetCookie($url) { * * @return array */ - public function dataManuallySetCookie() { + public static function dataManuallySetCookie() { $urls = [ 'http://example.com', 'http://example.com/', @@ -272,6 +272,6 @@ public function dataManuallySetCookie() { 'http://example.net/test/', ]; - return $this->textArrayToDataprovider($urls); + return self::textArrayToDataprovider($urls); } } diff --git a/tests/Exception/Http/HttpTest.php b/tests/Exception/Http/HttpTest.php index 1d53b806c..e5871d892 100644 --- a/tests/Exception/Http/HttpTest.php +++ b/tests/Exception/Http/HttpTest.php @@ -39,7 +39,7 @@ public function testException($expected_msg, $expected_reason, $reason = null) { * * @return array */ - public function dataException() { + public static function dataException() { return [ 'null (or not passed)' => [ 'expected_msg' => 'Unknown', @@ -72,7 +72,7 @@ public function testGetClass($code, $expected) { * * @return array */ - public function dataGetClass() { + public static function dataGetClass() { $default = StatusUnknown::class; return [ diff --git a/tests/Exception/Http/StatusUnknownTest.php b/tests/Exception/Http/StatusUnknownTest.php index 1101ad53b..d7bd9963a 100644 --- a/tests/Exception/Http/StatusUnknownTest.php +++ b/tests/Exception/Http/StatusUnknownTest.php @@ -33,7 +33,7 @@ public function testException($expected_code, $data = null) { * * @return array */ - public function dataException() { + public static function dataException() { $response_with_status = new Response(); $response_with_status->status_code = 12345; diff --git a/tests/Exception/Transport/Curl/CurlTest.php b/tests/Exception/Transport/Curl/CurlTest.php index c975ae1fe..366ff092e 100644 --- a/tests/Exception/Transport/Curl/CurlTest.php +++ b/tests/Exception/Transport/Curl/CurlTest.php @@ -50,7 +50,7 @@ public function testException( * * @return array */ - public function dataException() { + public static function dataException() { return [ 'Everything set to null (or not passed)' => [ 'expected_msg' => '-1 Unknown', diff --git a/tests/Hooks/DispatchTest.php b/tests/Hooks/DispatchTest.php index e9f670599..0b28ab08e 100644 --- a/tests/Hooks/DispatchTest.php +++ b/tests/Hooks/DispatchTest.php @@ -2,7 +2,6 @@ namespace WpOrg\Requests\Tests\Hooks; -use stdClass; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Hooks; use WpOrg\Requests\Tests\TestCase; @@ -50,7 +49,7 @@ public function testInvalidHookname($input) { * * @return array */ - public function dataInvalidHookname() { + public static function dataInvalidHookname() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -75,7 +74,7 @@ public function testInvalidParameters($input) { * * @return array */ - public function dataInvalidParameters() { + public static function dataInvalidParameters() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } @@ -181,9 +180,7 @@ static function(&$text) { * @return void */ public function testDispatchWithSingleRegisteredHook() { - $mock = $this->getMockBuilder(stdClass::class) - ->setMethods(['callback']) - ->getMock(); + $mock = $this->getMockedStdClassWithMethods(['callback']); $mock->expects($this->once()) ->method('callback'); @@ -199,9 +196,7 @@ public function testDispatchWithSingleRegisteredHook() { * @return void */ public function testDispatchWithMultipleRegisteredHooks() { - $mock = $this->getMockBuilder(stdClass::class) - ->setMethods(['callback_a', 'callback_b', 'callback_c']) - ->getMock(); + $mock = $this->getMockedStdClassWithMethods(['callback_a', 'callback_b', 'callback_c']); $mock->expects($this->never()) ->method('callback_a'); diff --git a/tests/Hooks/RegisterTest.php b/tests/Hooks/RegisterTest.php index 57ce95c90..b14639d74 100644 --- a/tests/Hooks/RegisterTest.php +++ b/tests/Hooks/RegisterTest.php @@ -51,7 +51,7 @@ public function testInvalidHookname($input) { * * @return array */ - public function dataInvalidHookname() { + public static function dataInvalidHookname() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -76,11 +76,11 @@ public function testInvalidCallback($input) { * * @return array */ - public function dataInvalidCallback() { + public static function dataInvalidCallback() { return [ 'null' => [null], 'non-existent function' => ['functionname'], - 'non-existent method' => [[$this, 'dummyCallbackDoesNotExist']], + 'non-existent method' => [[__CLASS__, 'dummyCallbackDoesNotExist']], 'empty array' => [[]], 'plain object' => [new stdClass(), 'method'], ]; @@ -107,7 +107,7 @@ public function testInvalidPriority($input) { * * @return array */ - public function dataInvalidPriority() { + public static function dataInvalidPriority() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_INT, ['numeric string']); } diff --git a/tests/IdnaEncoder/IdnaEncoderTest.php b/tests/IdnaEncoder/IdnaEncoderTest.php index dd2a24e15..af7baea21 100644 --- a/tests/IdnaEncoder/IdnaEncoderTest.php +++ b/tests/IdnaEncoder/IdnaEncoderTest.php @@ -38,7 +38,7 @@ public function testInvalidInputType($data) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -62,7 +62,7 @@ public function testEncoding($data, $expected) { * * @return array */ - public function dataEncoding() { + public static function dataEncoding() { return [ 'empty string' => [ 'data' => '', @@ -242,7 +242,7 @@ public function testInvalidUnicode($data) { * * @return array */ - public function dataInvalidUnicode() { + public static function dataInvalidUnicode() { return [ 'Five-byte character' => ["\xfb\xb6\xb6\xb6\xb6"], 'Six-byte character' => ["\xfd\xb6\xb6\xb6\xb6\xb6"], diff --git a/tests/Ipv6/CheckIpv6Test.php b/tests/Ipv6/CheckIpv6Test.php index 6193c1250..25f322fd0 100644 --- a/tests/Ipv6/CheckIpv6Test.php +++ b/tests/Ipv6/CheckIpv6Test.php @@ -39,7 +39,7 @@ public function testInvalidInputType($ip) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -61,7 +61,7 @@ public function testValidInputType($ip) { * * @return array */ - public function dataValidInputType() { + public static function dataValidInputType() { return [ 'string' => ['::1'], 'stringable' => [new StringableObject('0:1234:dc0:41:216:3eff:fe67:3e01')], diff --git a/tests/Ipv6/CompressTest.php b/tests/Ipv6/CompressTest.php index 22e82f959..22b298910 100644 --- a/tests/Ipv6/CompressTest.php +++ b/tests/Ipv6/CompressTest.php @@ -39,7 +39,7 @@ public function testInvalidInputType($ip) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -61,7 +61,7 @@ public function testValidInputType($ip) { * * @return array */ - public function dataValidInputType() { + public static function dataValidInputType() { return [ 'string' => ['::1'], 'stringable' => [new StringableObject('0:1234:dc0:41:216:3eff:fe67:3e01')], diff --git a/tests/Ipv6/UncompressTest.php b/tests/Ipv6/UncompressTest.php index 4153fd090..3eed170c5 100644 --- a/tests/Ipv6/UncompressTest.php +++ b/tests/Ipv6/UncompressTest.php @@ -39,7 +39,7 @@ public function testInvalidInputType($ip) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -61,7 +61,7 @@ public function testValidInputType($ip) { * * @return array */ - public function dataValidInputType() { + public static function dataValidInputType() { return [ 'string' => ['::1'], 'stringable' => [new StringableObject('0:1234:dc0:41:216:3eff:fe67:3e01')], diff --git a/tests/Iri/ConstructorTest.php b/tests/Iri/ConstructorTest.php index 2c9405726..16757d760 100644 --- a/tests/Iri/ConstructorTest.php +++ b/tests/Iri/ConstructorTest.php @@ -34,7 +34,7 @@ public function testInvalidInput($iri) { * * @return array */ - public function dataInvalidInput() { + public static function dataInvalidInput() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_STRINGABLE); } diff --git a/tests/Iri/IriTest.php b/tests/Iri/IriTest.php index 1017eb96c..a763fb08c 100644 --- a/tests/Iri/IriTest.php +++ b/tests/Iri/IriTest.php @@ -42,6 +42,7 @@ namespace WpOrg\Requests\Tests\Iri; +use Exception; use WpOrg\Requests\Iri; use WpOrg\Requests\Tests\TestCase; @@ -391,7 +392,18 @@ public function testWriteAliased() public function testNonexistantProperty() { - $this->expectNotice('Undefined property: WpOrg\Requests\Iri::nonexistant_prop'); + // PHPUnit 10 compatible way to test the notice. + set_error_handler( + static function ($errno, $errstr) { + restore_error_handler(); + throw new Exception($errstr, $errno); + }, + E_USER_NOTICE + ); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('Undefined property: WpOrg\Requests\Iri::nonexistant_prop'); + $iri = new Iri(); $this->assertFalse(isset($iri->nonexistant_prop)); $should_fail = $iri->nonexistant_prop; diff --git a/tests/Port/GetTest.php b/tests/Port/GetTest.php index 86eb6df76..5b3b65806 100644 --- a/tests/Port/GetTest.php +++ b/tests/Port/GetTest.php @@ -34,7 +34,7 @@ public function testGetPortThrowsExceptionOnInvalidInputType($input) { * * @return array */ - public function dataGetPortThrowsExceptionOnInvalidInputType() { + public static function dataGetPortThrowsExceptionOnInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -59,7 +59,7 @@ public function testGetPortThrowsExceptionOnUnsupportedPortType($input) { * * @return array */ - public function dataGetPortThrowsExceptionOnUnsupportedPortType() { + public static function dataGetPortThrowsExceptionOnUnsupportedPortType() { return [ 'type not supported' => ['FTP'], 'empty string' => [''], @@ -85,7 +85,7 @@ public function testGetPort($input, $expected) { * * @return array */ - public function dataGetPort() { + public static function dataGetPort() { return [ 'lowercase type' => [ 'input' => 'https', diff --git a/tests/Proxy/Http/ConstructorTest.php b/tests/Proxy/Http/ConstructorTest.php index 366c91ec7..769e3acbb 100644 --- a/tests/Proxy/Http/ConstructorTest.php +++ b/tests/Proxy/Http/ConstructorTest.php @@ -33,7 +33,7 @@ public function testInvalidParameterType($input) { * * @return array */ - public function dataInvalidParameterType() { + public static function dataInvalidParameterType() { return TypeProviderHelper::getAllExcept( TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_STRING, diff --git a/tests/Requests/DecodeChunkedTest.php b/tests/Requests/DecodeChunkedTest.php index d97a44b95..a1ebdf242 100644 --- a/tests/Requests/DecodeChunkedTest.php +++ b/tests/Requests/DecodeChunkedTest.php @@ -41,7 +41,7 @@ public function testChunked($body, $expected) { * * @return array */ - public function dataChunked() { + public static function dataChunked() { return [ [ 'body' => "25\r\nThis is the data in the first chunk\r\n\r\n1A\r\nand this is the second one\r\n0\r\n", @@ -98,7 +98,7 @@ public function testNotActuallyChunked($body) { * * @return array */ - public function dataNotActuallyChunked() { + public static function dataNotActuallyChunked() { return [ 'empty string' => [''], 'invalid chunk size' => ['Hello! This is a non-chunked response!'], diff --git a/tests/Requests/DecompressionTest.php b/tests/Requests/DecompressionTest.php index 9dd410f3b..e8bbd8ace 100644 --- a/tests/Requests/DecompressionTest.php +++ b/tests/Requests/DecompressionTest.php @@ -54,7 +54,7 @@ public function testCompatibleInflate($expected, $compressed) { * * @return array */ - public function dataDecompressNotCompressed() { + public static function dataDecompressNotCompressed() { return [ 'not compressed: empty string' => [ 'expected' => '', @@ -76,8 +76,8 @@ public function dataDecompressNotCompressed() { * * @return array */ - public function dataCompatibleInflateNotCompressed() { - $data = $this->dataDecompressNotCompressed(); + public static function dataCompatibleInflateNotCompressed() { + $data = self::dataDecompressNotCompressed(); foreach ($data as $key => $value) { $data[$key]['expected'] = false; } @@ -90,7 +90,7 @@ public function dataCompatibleInflateNotCompressed() { * * @return array */ - public function dataGzip() { + public static function dataGzip() { return [ /* * Test data generated using CLI command: @@ -119,7 +119,7 @@ public function dataGzip() { * * @return array */ - public function dataDeflate() { + public static function dataDeflate() { return [ // TODO: What is this byte stream representing? Looks like GZIP header with ZLIB compressed data... 'deflate: foobar' => [ @@ -142,7 +142,7 @@ public function dataDeflate() { * * @return array */ - public function dataDeflateWithoutHeaders() { + public static function dataDeflateWithoutHeaders() { return [ /* * Test data generated using CLI command: @@ -232,7 +232,7 @@ public function testCompatibleGzinflateInvalidInputType($input) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } } diff --git a/tests/Requests/FlattenTest.php b/tests/Requests/FlattenTest.php index f02e8b785..58d101a28 100644 --- a/tests/Requests/FlattenTest.php +++ b/tests/Requests/FlattenTest.php @@ -34,7 +34,7 @@ public function testInvalidData($input) { * * @return array */ - public function dataInvalidData() { + public static function dataInvalidData() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ITERABLE); } @@ -61,7 +61,7 @@ public function testFlatten($input) { * * @return array */ - public function dataFlatten() { + public static function dataFlatten() { $to_flatten = ['key1' => 'value1', 'key2' => 'value2']; return [ diff --git a/tests/Requests/RequestsTest.php b/tests/Requests/RequestsTest.php index 1eabff3bd..e229ace17 100644 --- a/tests/Requests/RequestsTest.php +++ b/tests/Requests/RequestsTest.php @@ -37,7 +37,7 @@ public function testRequestInvalidUrl($input) { * * @return array */ - public function dataRequestInvalidUrl() { + public static function dataRequestInvalidUrl() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -64,7 +64,7 @@ public function testRequestInvalidType($input) { * * @return array */ - public function dataInvalidTypeNotString() { + public static function dataInvalidTypeNotString() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING); } @@ -109,7 +109,7 @@ public function testRequestMultipleInvalidRequests($input) { * * @return array */ - public function dataRequestMultipleInvalidRequests() { + public static function dataRequestMultipleInvalidRequests() { $except = array_intersect(TypeProviderHelper::GROUP_ITERABLE, TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); return TypeProviderHelper::getAllExcept($except); } @@ -137,7 +137,7 @@ public function testRequestMultipleInvalidOptions($input) { * * @return array */ - public function dataInvalidTypeNotArray() { + public static function dataInvalidTypeNotArray() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } diff --git a/tests/Requests/SetCertificatePathTest.php b/tests/Requests/SetCertificatePathTest.php index 80138b1ac..bdf07b310 100644 --- a/tests/Requests/SetCertificatePathTest.php +++ b/tests/Requests/SetCertificatePathTest.php @@ -35,7 +35,7 @@ public function testInvalidData($input) { * * @return array */ - public function dataInvalidData() { + public static function dataInvalidData() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_BOOL, TypeProviderHelper::GROUP_STRINGABLE); } @@ -59,7 +59,7 @@ public function testValidData($input) { * * @return array */ - public function dataValidData() { + public static function dataValidData() { return [ 'boolean false' => [false], 'boolean true' => [true], diff --git a/tests/Response/DecodeBodyTest.php b/tests/Response/DecodeBodyTest.php index 0422a13aa..e76f739be 100644 --- a/tests/Response/DecodeBodyTest.php +++ b/tests/Response/DecodeBodyTest.php @@ -37,7 +37,7 @@ public function testInvalidJsonResponse($body) { * * @return array */ - public function dataInvalidJsonResponse() { + public static function dataInvalidJsonResponse() { $data = [ 'text string, not JSON (syntax error)' => ['Invalid JSON'], 'invalid JSON: single quotes (syntax error)' => ["{ 'bar': 'baz' }"], diff --git a/tests/Response/Headers/ArrayAccessTest.php b/tests/Response/Headers/ArrayAccessTest.php index 183d62a3d..760d607b5 100644 --- a/tests/Response/Headers/ArrayAccessTest.php +++ b/tests/Response/Headers/ArrayAccessTest.php @@ -50,7 +50,7 @@ public function testCaseInsensitiveArrayAccess($key) { * * @return array */ - public function dataCaseInsensitiveArrayAccess() { + public static function dataCaseInsensitiveArrayAccess() { return [ 'access using case as set' => ['Content-Type'], 'access using lowercase' => ['content-type'], @@ -104,7 +104,7 @@ public function testOffsetSetDoesNotTryToLowercaseNonStringKeys($key, $request_k * * @return array */ - public function dataOffsetSetDoesNotTryToLowercaseNonStringKeys() { + public static function dataOffsetSetDoesNotTryToLowercaseNonStringKeys() { return [ 'integer key' => [10], 'boolean false key' => [false, 0], @@ -150,7 +150,7 @@ public function testOffsetGetReturnsNullForNonRegisteredHeader($key) { * * @return array */ - public function dataOffsetGetReturnsNullForNonRegisteredHeader() { + public static function dataOffsetGetReturnsNullForNonRegisteredHeader() { return [ // This test case also tests that no "passing null to non-nullable" deprecation is thrown in PHP 8.1. 'null' => [null], diff --git a/tests/Response/Headers/FlattenTest.php b/tests/Response/Headers/FlattenTest.php index 5a9fc0c68..37fded5aa 100644 --- a/tests/Response/Headers/FlattenTest.php +++ b/tests/Response/Headers/FlattenTest.php @@ -32,7 +32,7 @@ public function testFlatten($input, $expected) { * * @return array */ - public function dataFlatten() { + public static function dataFlatten() { return [ 'string' => ['text', 'text'], 'empty array' => [[], ''], @@ -62,7 +62,7 @@ public function testInvalidValue($input) { * * @return array */ - public function dataInvalidValue() { + public static function dataInvalidValue() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING, TypeProviderHelper::GROUP_ARRAY); } } diff --git a/tests/Response/Headers/GetValuesTest.php b/tests/Response/Headers/GetValuesTest.php index 18b450a3f..43e76655a 100644 --- a/tests/Response/Headers/GetValuesTest.php +++ b/tests/Response/Headers/GetValuesTest.php @@ -34,7 +34,7 @@ public function testInvalidOffset($key) { * * @return array */ - public function dataInvalidOffset() { + public static function dataInvalidOffset() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRING, TypeProviderHelper::GROUP_INT); } @@ -63,7 +63,7 @@ public function testGetValues($key, $expected) { * * @return array */ - public function dataGetValues() { + public static function dataGetValues() { return [ 'using case as set, single entry header' => [ 'key' => 'Content-Type', diff --git a/tests/Response/IsRedirectTest.php b/tests/Response/IsRedirectTest.php index 53df1a99a..58c69e4e0 100644 --- a/tests/Response/IsRedirectTest.php +++ b/tests/Response/IsRedirectTest.php @@ -32,7 +32,7 @@ public function testIsRedirect($code) { * * @return array */ - public function dataIsRedirect() { + public static function dataIsRedirect() { $data = []; $codes = [300, 301, 302, 303]; @@ -69,7 +69,7 @@ public function testNotRedirect($code) { * * @return array */ - public function dataNotRedirect() { + public static function dataNotRedirect() { $data = []; $data['Non-blocking request: status code: false (default value)'] = [false]; diff --git a/tests/Session/ConstructorTest.php b/tests/Session/ConstructorTest.php index ac7d057fb..ee3cdf412 100644 --- a/tests/Session/ConstructorTest.php +++ b/tests/Session/ConstructorTest.php @@ -34,7 +34,7 @@ public function testInvalidUrl($input) { * * @return array */ - public function dataInvalidUrl() { + public static function dataInvalidUrl() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_STRINGABLE); } @@ -91,7 +91,7 @@ public function testInvalidOptions($input) { * * @return array */ - public function dataInvalidTypeNotArray() { + public static function dataInvalidTypeNotArray() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } @@ -105,6 +105,8 @@ public function dataInvalidTypeNotArray() { * @return void */ public function testValidUrl($input) { + $this->skipOnUnavailableHttpbinHost(); + $this->assertInstanceOf(Session::class, new Session($input)); } @@ -113,11 +115,11 @@ public function testValidUrl($input) { * * @return array */ - public function dataValidUrl() { + public static function dataValidUrl() { return [ 'null' => [null], - 'string' => [$this->httpbin('/')], - 'stringable object' => [new Iri($this->httpbin('/'))], + 'string' => [self::getHttpbinUrl('/')], + 'stringable object' => [new Iri(self::getHttpbinUrl('/'))], ]; } } diff --git a/tests/Session/RequestMultipleTest.php b/tests/Session/RequestMultipleTest.php index b86df3c90..5501afd3f 100644 --- a/tests/Session/RequestMultipleTest.php +++ b/tests/Session/RequestMultipleTest.php @@ -35,7 +35,7 @@ public function testInvalidRequests($input) { * * @return array */ - public function dataInvalidRequests() { + public static function dataInvalidRequests() { $except = array_intersect(TypeProviderHelper::GROUP_ITERABLE, TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); return TypeProviderHelper::getAllExcept($except); } @@ -62,7 +62,7 @@ public function testInvalidOptions($input) { * * @return array */ - public function dataInvalidOptions() { + public static function dataInvalidOptions() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } diff --git a/tests/Ssl/MatchDomainTest.php b/tests/Ssl/MatchDomainTest.php index f8c19cb57..64823d8a1 100644 --- a/tests/Ssl/MatchDomainTest.php +++ b/tests/Ssl/MatchDomainTest.php @@ -33,7 +33,7 @@ public function testInvalidInputType($input) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } diff --git a/tests/Ssl/SslTestCase.php b/tests/Ssl/SslTestCase.php index 68b283127..a08b16e3b 100644 --- a/tests/Ssl/SslTestCase.php +++ b/tests/Ssl/SslTestCase.php @@ -44,7 +44,7 @@ protected function fakeCertificate($dnsname, $with_san = true) { * * @return array */ - public function dataMatch() { + public static function dataMatch() { return [ 'top-level domain (stringable object)' => [ 'host' => new StringableObject('example.com'), @@ -66,7 +66,7 @@ public function dataMatch() { * * @return array */ - public function dataNoMatch() { + public static function dataNoMatch() { return [ // Check that we need at least 3 components. 'not a domain; wildcard reference' => [ diff --git a/tests/Ssl/VerifyCertificateTest.php b/tests/Ssl/VerifyCertificateTest.php index b49a66e9d..1afcf474c 100644 --- a/tests/Ssl/VerifyCertificateTest.php +++ b/tests/Ssl/VerifyCertificateTest.php @@ -33,7 +33,7 @@ public function testInvalidInputHost($input) { * * @return array */ - public function dataInvalidInputHost() { + public static function dataInvalidInputHost() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -58,7 +58,7 @@ public function testInvalidInputCert($input) { * * @return array */ - public function dataInvalidInputCert() { + public static function dataInvalidInputCert() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); } @@ -87,7 +87,7 @@ public function testMatchViaCertificate($host, $reference, $with_san = true) { * * @return array */ - public function dataMatchViaCertificate() { + public static function dataMatchViaCertificate() { return [ 'top-level domain; missing SAN, fallback to CN' => [ 'host' => 'example.com', @@ -142,7 +142,7 @@ public function testNoMatchViaCertificate($host, $reference, $with_san = true) { * * @return array */ - public function dataNoMatchViaCertificate() { + public static function dataNoMatchViaCertificate() { return [ 'top-level domain; missing SAN, fallback to invalid CN' => [ 'host' => 'example.net', @@ -207,7 +207,7 @@ public function testWithInvalidCertificates($host, $certificate, $expected) { * * @return array */ - public function dataWithInvalidCertificates() { + public static function dataWithInvalidCertificates() { return [ 'empty array' => [ 'host' => 'example.com', diff --git a/tests/Ssl/VerifyReferenceNameTest.php b/tests/Ssl/VerifyReferenceNameTest.php index 32cb7d786..87dca1b18 100644 --- a/tests/Ssl/VerifyReferenceNameTest.php +++ b/tests/Ssl/VerifyReferenceNameTest.php @@ -34,7 +34,7 @@ public function testInvalidInputType($input) { * * @return array */ - public function dataInvalidInputType() { + public static function dataInvalidInputType() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -57,7 +57,7 @@ public function testVerifyReferenceName($reference, $expected) { * * @return array */ - public function dataVerifyReferenceName() { + public static function dataVerifyReferenceName() { return [ 'empty string' => [ 'reference' => '', diff --git a/tests/TestCase.php b/tests/TestCase.php index 93d1e617e..eb188596c 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,6 +3,7 @@ namespace WpOrg\Requests\Tests; use Exception; +use stdClass; use WpOrg\Requests\Requests; use WpOrg\Requests\Tests\TypeProviderHelper; use Yoast\PHPUnitPolyfills\TestCases\TestCase as Polyfill_TestCase; @@ -33,7 +34,7 @@ public function skipWhenTransportNotAvailable($transport) { } /** - * Retrieve a URL to use for testing. + * Retrieve a URL to use for testing and mark the test as skipped if the server for that URL is unavailable. * * @param string $suffix The query path to add to the base URL. * @param bool $ssl Whether to get the URL using the `http` or the `https` protocol. @@ -42,6 +43,19 @@ public function skipWhenTransportNotAvailable($transport) { * @return string */ public function httpbin($suffix = '', $ssl = false) { + $this->skipOnUnavailableHttpbinHost($ssl); + + return self::getHttpbinUrl($suffix, $ssl); + } + + /** + * Check if a test which depends on a certain server type to be available should run or not. + * + * @param bool $ssl Whether the URL under tests will be using the `http` or the `https` protocol. + * + * @return void + */ + public function skipOnUnavailableHttpbinHost($ssl = false) { if ($ssl === false && REQUESTS_TEST_SERVER_HTTP_AVAILABLE === false) { $this->markTestSkipped(sprintf('Host %s not available. This needs investigation', REQUESTS_TEST_HOST_HTTP)); } @@ -49,7 +63,18 @@ public function httpbin($suffix = '', $ssl = false) { if ($ssl === true && REQUESTS_TEST_SERVER_HTTPS_AVAILABLE === false) { $this->markTestSkipped(sprintf('Host %s not available. This needs investigation', REQUESTS_TEST_HOST_HTTPS)); } + } + /** + * Retrieve a URL to use for testing. + * + * @param string $suffix The query path to add to the base URL. + * @param bool $ssl Whether to get the URL using the `http` or the `https` protocol. + * Defaults to `false`, which will result in a URL using `http`. + * + * @return string + */ + public static function getHttpbinUrl($suffix = '', $ssl = false) { $host = $ssl ? 'https://' . \REQUESTS_TEST_HOST_HTTPS : 'http://' . \REQUESTS_TEST_HOST_HTTP; return rtrim($host, '/') . '/' . ltrim($suffix, '/'); } @@ -59,7 +84,7 @@ public function httpbin($suffix = '', $ssl = false) { * * @return array */ - public function transportProvider() { + public static function transportProvider() { $data = []; foreach (Requests::DEFAULT_TRANSPORTS as $transport) { @@ -77,7 +102,7 @@ public function transportProvider() { * * @return array[] Array which is usable as a test data provider with named data sets. */ - public function textArrayToDataprovider($input) { + public static function textArrayToDataprovider($input) { $data = []; foreach ($input as $value) { if (!is_string($value)) { @@ -100,4 +125,32 @@ public function textArrayToDataprovider($input) { return $data; } + + /** + * Helper method to retrieve a mock object based on stdClass with select methods mocked. + * + * The `setMethods()` method was silently deprecated in PHPUnit 8.3 and removed in PHPUnit 10. + * + * Note: the `getMockBuilder()` and `addMethods()` methods are also soft deprecated as of + * PHPUnit 10.x, and are expected to be hard deprecated in PHPUnit 11 and removed in PHPUnit 12. + * Dealing with that is something for a later iteration of the test suite. + * {@link https://github.com/WordPress/Requests/issues/814} + * + * @param array $methods The names of the methods to mock. + * + * @return \PHPUnit\Framework\MockObject\MockObject + */ + protected function getMockedStdClassWithMethods($methods) { + $mock = $this->getMockBuilder(stdClass::class); + + if (\method_exists($mock, 'addMethods')) { + // PHPUnit 8.3.0+. + return $mock->addMethods($methods) + ->getMock(); + } + + // PHPUnit < 8.3.0. + return $mock->setMethods($methods) + ->getMock(); + } } diff --git a/tests/Transport/BaseTestCase.php b/tests/Transport/BaseTestCase.php index 7a2b83d85..84bb46ecf 100644 --- a/tests/Transport/BaseTestCase.php +++ b/tests/Transport/BaseTestCase.php @@ -2,7 +2,6 @@ namespace WpOrg\Requests\Tests\Transport; -use stdClass; use WpOrg\Requests\Capability; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\Http\StatusUnknown; @@ -220,7 +219,7 @@ public function testRequestInvalidUrl($input) { * * @return array */ - public function dataRequestInvalidUrl() { + public static function dataRequestInvalidUrl() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } @@ -262,10 +261,10 @@ public function testRequestInvalidHeaders($input) { public function testIncorrectDataTypeAcceptedPOST($data, $expected) { $request = Requests::post($this->httpbin('/post'), [], $data, $this->getOptions()); $this->assertIsObject($request, 'POST request did not return an object'); - $this->assertObjectHasAttribute('status_code', $request, 'POST request object does not have a "status_code" property'); + $this->assertObjectHasProperty('status_code', $request, 'POST request object does not have a "status_code" property'); $this->assertSame(200, $request->status_code, 'POST request status code is not 200'); - $this->assertObjectHasAttribute('body', $request, 'POST request object does not have a "body" property'); + $this->assertObjectHasProperty('body', $request, 'POST request object does not have a "body" property'); $result = json_decode($request->body, true); $this->assertIsArray($result, 'Json decoded POST request body is not an array'); @@ -278,7 +277,7 @@ public function testIncorrectDataTypeAcceptedPOST($data, $expected) { * * @return array */ - public function dataIncorrectDataTypeAccepted() { + public static function dataIncorrectDataTypeAccepted() { return [ 'null' => [null, ''], ]; @@ -309,7 +308,7 @@ public function testRequestInvalidData($input) { * * @return array */ - public function dataIncorrectDataTypeException() { + public static function dataIncorrectDataTypeException() { return TypeProviderHelper::getAllExcept( TypeProviderHelper::GROUP_NULL, TypeProviderHelper::GROUP_STRING, @@ -359,7 +358,7 @@ public function testRequestMultipleReturnsEmptyArrayWhenRequestsIsEmpty($input) * * @return array */ - public function dataRequestMultipleReturnsEmptyArrayWhenRequestsIsEmpty() { + public static function dataRequestMultipleReturnsEmptyArrayWhenRequestsIsEmpty() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_EMPTY); } @@ -388,7 +387,7 @@ public function testRequestMultipleInvalidRequests($input) { * * @return array */ - public function dataRequestMultipleInvalidRequests() { + public static function dataRequestMultipleInvalidRequests() { $except = array_intersect(TypeProviderHelper::GROUP_ITERABLE, TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); return TypeProviderHelper::getAllExcept($except, TypeProviderHelper::GROUP_EMPTY); } @@ -418,7 +417,7 @@ public function testRequestMultipleInvalidOptions($input) { * * @return array */ - public function dataInvalidTypeNotArray() { + public static function dataInvalidTypeNotArray() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY); } @@ -917,7 +916,7 @@ public function testSNISupport($options) { * * @return array */ - public function dataSNISupport($options) { + public static function dataSNISupport() { return [ 'Without options' => [ 'options' => [], @@ -1117,7 +1116,7 @@ public function testAlternatePort() { } public function testProgressCallback() { - $mock = $this->getMockBuilder(stdClass::class)->setMethods(['progress'])->getMock(); + $mock = $this->getMockedStdClassWithMethods(['progress']); $mock->expects($this->atLeastOnce())->method('progress'); $hooks = new Hooks(); $hooks->register('request.progress', [$mock, 'progress']); @@ -1130,9 +1129,7 @@ public function testProgressCallback() { } public function testAfterRequestCallback() { - $mock = $this->getMockBuilder(stdClass::class) - ->setMethods(['after_request']) - ->getMock(); + $mock = $this->getMockedStdClassWithMethods(['after_request']); $mock->expects($this->atLeastOnce()) ->method('after_request') diff --git a/tests/Utility/CaseInsensitiveDictionary/ArrayAccessTest.php b/tests/Utility/CaseInsensitiveDictionary/ArrayAccessTest.php index 69abc359e..211bf6b47 100644 --- a/tests/Utility/CaseInsensitiveDictionary/ArrayAccessTest.php +++ b/tests/Utility/CaseInsensitiveDictionary/ArrayAccessTest.php @@ -116,7 +116,7 @@ public function testAccessValidEntries($key, $value) { * * @return array */ - public function dataAccessValidEntries() { + public static function dataAccessValidEntries() { $data = []; foreach (self::DATASET_REVERSED as $key => $value) { @@ -171,7 +171,7 @@ public function testAccessInvalidEntry($key) { * * @return array */ - public function dataAccessInvalidEntry() { + public static function dataAccessInvalidEntry() { return [ 'string key' => ['Non-existant entry'], 'integer key' => [25], diff --git a/tests/Utility/FilteredIterator/ConstructorTest.php b/tests/Utility/FilteredIterator/ConstructorTest.php index fb1bf52bb..a7446eee5 100644 --- a/tests/Utility/FilteredIterator/ConstructorTest.php +++ b/tests/Utility/FilteredIterator/ConstructorTest.php @@ -32,7 +32,7 @@ public function testValidData($input) { * * @return array */ - public function dataValidData() { + public static function dataValidData() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_ITERABLE); } @@ -57,7 +57,7 @@ public function testInvalidData($input) { * * @return array */ - public function dataInvalidData() { + public static function dataInvalidData() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ITERABLE); } @@ -87,10 +87,10 @@ public function testValidCallback($input) { * * @return array */ - public function dataValidCallback() { + public static function dataValidCallback() { return [ 'existing PHP native function' => ['strtolower'], - 'dummy callback method' => [[$this, 'dummyCallback']], + 'dummy callback method' => [[__CLASS__, 'dummyCallback']], ]; } @@ -120,7 +120,7 @@ public function testInvalidCallback($input) { * * @return array */ - public function dataInvalidCallback() { + public static function dataInvalidCallback() { return [ 'null' => [null], 'non-existent function' => ['functionname'], @@ -133,5 +133,5 @@ public function dataInvalidCallback() { * * @return void */ - public function dummyCallback() {} + public static function dummyCallback() {} } diff --git a/tests/Utility/FilteredIterator/CurrentTest.php b/tests/Utility/FilteredIterator/CurrentTest.php index 76f87627e..f70f1a74e 100644 --- a/tests/Utility/FilteredIterator/CurrentTest.php +++ b/tests/Utility/FilteredIterator/CurrentTest.php @@ -37,7 +37,7 @@ public function testCallbackIsAppliedIfValid($data, $callback, $expected) { * * @return array */ - public function dataCallbackIsAppliedIfValid() { + public static function dataCallbackIsAppliedIfValid() { $original = [ 'key1' => 'lowercase', 'key2' => 'UPPER CASE', diff --git a/tests/Utility/FilteredIterator/SerializationTest.php b/tests/Utility/FilteredIterator/SerializationTest.php index 478bd52ab..f16969993 100644 --- a/tests/Utility/FilteredIterator/SerializationTest.php +++ b/tests/Utility/FilteredIterator/SerializationTest.php @@ -47,7 +47,7 @@ public function testSerializeDeserializeObjects($value) { * * @return array */ - public function dataSerializeDeserializeObjects() { + public static function dataSerializeDeserializeObjects() { return [ 'FilteredIterator object with one value, callback: md5' => [ 'value' => new FilteredIterator([1], 'md5'), diff --git a/tests/Utility/InputValidator/HasArrayAccessTest.php b/tests/Utility/InputValidator/HasArrayAccessTest.php index 466efc3ee..dcd3ae890 100644 --- a/tests/Utility/InputValidator/HasArrayAccessTest.php +++ b/tests/Utility/InputValidator/HasArrayAccessTest.php @@ -29,7 +29,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); } @@ -51,7 +51,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ARRAY_ACCESSIBLE); } } diff --git a/tests/Utility/InputValidator/IsCurlHandleTest.php b/tests/Utility/InputValidator/IsCurlHandleTest.php index d7ce1bf0f..5e42e146e 100644 --- a/tests/Utility/InputValidator/IsCurlHandleTest.php +++ b/tests/Utility/InputValidator/IsCurlHandleTest.php @@ -47,7 +47,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { if (isset(self::$curl_handle) === false) { self::$curl_handle = curl_init('http://httpbin.org/anything'); } @@ -75,7 +75,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAll(); } } diff --git a/tests/Utility/InputValidator/IsIterableTest.php b/tests/Utility/InputValidator/IsIterableTest.php index e3b5a2e66..f55eaaf1e 100644 --- a/tests/Utility/InputValidator/IsIterableTest.php +++ b/tests/Utility/InputValidator/IsIterableTest.php @@ -29,7 +29,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_ITERABLE); } @@ -51,7 +51,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_ITERABLE); } } diff --git a/tests/Utility/InputValidator/IsNumericArrayKeyTest.php b/tests/Utility/InputValidator/IsNumericArrayKeyTest.php index 4f0dbbc3f..096d6994d 100644 --- a/tests/Utility/InputValidator/IsNumericArrayKeyTest.php +++ b/tests/Utility/InputValidator/IsNumericArrayKeyTest.php @@ -29,7 +29,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_INT, ['numeric string']); } @@ -51,7 +51,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_INT, ['numeric string']); } } diff --git a/tests/Utility/InputValidator/IsStringOrStringableTest.php b/tests/Utility/InputValidator/IsStringOrStringableTest.php index c08c10812..5f47cc17e 100644 --- a/tests/Utility/InputValidator/IsStringOrStringableTest.php +++ b/tests/Utility/InputValidator/IsStringOrStringableTest.php @@ -29,7 +29,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { return TypeProviderHelper::getSelection(TypeProviderHelper::GROUP_STRINGABLE); } @@ -51,7 +51,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAllExcept(TypeProviderHelper::GROUP_STRINGABLE); } } diff --git a/tests/Utility/InputValidator/IsStringableObjectTest.php b/tests/Utility/InputValidator/IsStringableObjectTest.php index c02dcfaf9..211d0f9e4 100644 --- a/tests/Utility/InputValidator/IsStringableObjectTest.php +++ b/tests/Utility/InputValidator/IsStringableObjectTest.php @@ -29,7 +29,7 @@ public function testValid($input) { * * @return array */ - public function dataValid() { + public static function dataValid() { return TypeProviderHelper::getSelection(['Stringable object']); } @@ -51,7 +51,7 @@ public function testInvalid($input) { * * @return array */ - public function dataInvalid() { + public static function dataInvalid() { return TypeProviderHelper::getAllExcept(['Stringable object']); } }