Skip to content
2 changes: 1 addition & 1 deletion src/Context/GivenStepDefinitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ public function given_a_request_to_a_url_respond_with_file( $url_or_pattern, PyS
mkdir( $dir, 0777, true /*recursive*/ );
}

$config_file_contents = <<<FILE
$config_file_contents = <<<'FILE'
require:
- mock-requests.php
FILE;
Expand Down
43 changes: 43 additions & 0 deletions tests/tests/TestBehatTags.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use WP_CLI\Utils;
use PHPUnit\Framework\Attributes\DataProvider;

// phpcs:ignore Universal.Files.SeparateFunctionsFromOO.Mixed
class TestBehatTags extends TestCase {

/**
Expand Down Expand Up @@ -192,4 +193,46 @@ public function test_behat_tags_extension(): void {

putenv( false === $env_github_token ? 'GITHUB_TOKEN' : "GITHUB_TOKEN=$env_github_token" );
}

public function test_behat_tags_db_version(): void {
$db_type = getenv( 'WP_CLI_TEST_DBTYPE' );

$behat_tags = dirname( dirname( __DIR__ ) ) . '/utils/behat-tags.php';
require $behat_tags;
// @phpstan-ignore-next-line
$db_version = get_db_version();
$minimum_db_version = $db_version . '.1';

$contents = '';
$expecteds = array();

switch ( $db_type ) {
case 'mariadb':
$contents = "@require-mariadb-$minimum_db_version @less-than-mariadb-$db_version";
$expecteds[] = '~@require-mysql';
$expecteds[] = '~@require-sqlite';
$expecteds[] = "~@require-mariadb-$minimum_db_version";
$expecteds[] = "~@less-than-mariadb-$db_version";
break;
case 'sqlite':
$expecteds[] = '~@require-mariadb';
$expecteds[] = '~@require-mysql';
$expecteds[] = '~@require-mysql-or-mariadb';
break;
case 'mysql':
default:
$contents = "@require-mysql-$minimum_db_version @less-than-mysql-$db_version";
$expecteds[] = '~@require-mariadb';
$expecteds[] = '~@require-sqlite';
$expecteds[] = "~@require-mysql-$minimum_db_version";
$expecteds[] = "~@less-than-mysql-$db_version";
break;
}

file_put_contents( $this->temp_dir . '/features/extension.feature', $contents );

$expected = '--tags=' . implode( '&&', array_merge( array( '~@github-api', '~@broken' ), $expecteds ) );
$output = exec( "cd {$this->temp_dir}; php $behat_tags" );
$this->assertSame( $expected, $output );
}
}
24 changes: 20 additions & 4 deletions utils/behat-tags.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ function version_tags(
return $skip_tags;
}

function get_db_version() {
$version_string = exec( getenv( 'WP_CLI_TEST_DBTYPE' ) === 'mariadb' ? 'mariadb --version' : 'mysql -V' );
preg_match( '@[0-9]+\.[0-9]+\.[0-9]+@', $version_string, $version );
return $version[0];
}

$features_folder = getenv( 'BEHAT_FEATURES_FOLDER' ) ?: 'features';
$wp_version = getenv( 'WP_VERSION' );
$wp_version_reqs = array();
Expand Down Expand Up @@ -79,10 +85,16 @@ function version_tags(
$skip_tags[] = '@broken-trunk';
}

$db_version = get_db_version();

switch ( getenv( 'WP_CLI_TEST_DBTYPE' ) ) {
case 'mariadb':
$skip_tags[] = '@require-mysql';
$skip_tags[] = '@require-sqlite';
$skip_tags = array_merge(
$skip_tags,
[ '@require-mysql', '@require-sqlite' ],
version_tags( 'require-mariadb', $db_version, '<', $features_folder ),
version_tags( 'less-than-mariadb', $db_version, '>=', $features_folder )
);
break;
case 'sqlite':
$skip_tags[] = '@require-mariadb';
Expand All @@ -91,8 +103,12 @@ function version_tags(
break;
case 'mysql':
default:
$skip_tags[] = '@require-mariadb';
$skip_tags[] = '@require-sqlite';
$skip_tags = array_merge(
$skip_tags,
[ '@require-mariadb', '@require-sqlite' ],
version_tags( 'require-mysql', $db_version, '<', $features_folder ),
version_tags( 'less-than-mysql', $db_version, '>=', $features_folder )
);
break;
}

Expand Down