diff --git a/src/Bootstrappers/BootFiles.php b/src/Bootstrappers/BootFiles.php index 13ad0504..7629e7ed 100644 --- a/src/Bootstrappers/BootFiles.php +++ b/src/Bootstrappers/BootFiles.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Pest\Bootstrappers; +use Pest\Support\DatasetInfo; use Pest\Support\Str; use function Pest\testDirectory; use Pest\TestSuite; @@ -79,20 +80,9 @@ final class BootFiles { $files = (new PhpUnitFileIterator)->getFilesAsArray($testsPath, '.php'); - foreach ($files as $fullPath) { - $filename = Str::afterLast($fullPath, DIRECTORY_SEPARATOR); - - if ($filename === 'Datasets.php') { - $this->load($fullPath); - - continue; - } - - $directoryFullPath = Str::beforeLast($fullPath, DIRECTORY_SEPARATOR); - $directory = Str::afterLast($directoryFullPath, DIRECTORY_SEPARATOR); - - if ($directory === 'Datasets') { - $this->load($fullPath); + foreach ($files as $file) { + if (DatasetInfo::isADatasetsFile($file) || DatasetInfo::isInsideADatasetsDirectory($file)) { + $this->load($file); } } } diff --git a/src/Functions.php b/src/Functions.php index a1dad4fe..ea53c22c 100644 --- a/src/Functions.php +++ b/src/Functions.php @@ -9,8 +9,8 @@ use Pest\PendingCalls\TestCall; use Pest\PendingCalls\UsesCall; use Pest\Repositories\DatasetsRepository; use Pest\Support\Backtrace; +use Pest\Support\DatasetInfo; use Pest\Support\HigherOrderTapProxy; -use Pest\Support\Str; use Pest\TestSuite; use PHPUnit\Framework\TestCase; @@ -61,16 +61,7 @@ if (! function_exists('dataset')) { */ function dataset(string $name, Closure|iterable $dataset): void { - $file = Backtrace::datasetsFile(); - $filename = Str::afterLast($file, DIRECTORY_SEPARATOR); - $scope = Str::beforeLast($file, DIRECTORY_SEPARATOR); - - if (Str::afterLast($scope, DIRECTORY_SEPARATOR) === 'Datasets') { - $scope = Str::beforeLast($scope, DIRECTORY_SEPARATOR); - } elseif ($filename !== 'Datasets.php') { - $scope = $file; - } - + $scope = DatasetInfo::scope(Backtrace::datasetsFile()); DatasetsRepository::set($name, $dataset, $scope); } } diff --git a/src/Support/DatasetInfo.php b/src/Support/DatasetInfo.php new file mode 100644 index 00000000..cfcf65b6 --- /dev/null +++ b/src/Support/DatasetInfo.php @@ -0,0 +1,38 @@ +toBe($inside); +})->with([ + ['file' => '/var/www/project/tests/Datasets/Numbers.php', 'inside' => true], + ['file' => '/var/www/project/tests/Datasets.php', 'inside' => false], + ['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'inside' => true], + ['file' => '/var/www/project/tests/Features/Numbers.php', 'inside' => false], + ['file' => '/var/www/project/tests/Features/Datasets.php', 'inside' => false], +]); + +it('can check if dataset is defined inside a Datasets.php file', function (string $path, bool $inside) { + expect(DatasetInfo::isADatasetsFile($path))->toBe($inside); +})->with([ + ['file' => '/var/www/project/tests/Datasets/Numbers.php', 'inside' => false], + ['file' => '/var/www/project/tests/Datasets.php', 'inside' => true], + ['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'inside' => false], + ['file' => '/var/www/project/tests/Features/Numbers.php', 'inside' => false], + ['file' => '/var/www/project/tests/Features/Datasets.php', 'inside' => true], +]); + +it('computes the dataset scope', function (string $file, string $scope) { + expect(DatasetInfo::scope($file))->toBe($scope); +})->with([ + ['file' => '/var/www/project/tests/Datasets/Numbers.php', 'scope' => '/var/www/project/tests'], + ['file' => '/var/www/project/tests/Datasets.php', 'scope' => '/var/www/project/tests'], + ['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features'], + ['file' => '/var/www/project/tests/Features/Numbers.php', 'scope' => '/var/www/project/tests/Features/Numbers.php'], + ['file' => '/var/www/project/tests/Features/Datasets.php', 'scope' => '/var/www/project/tests/Features'], + ['file' => '/var/www/project/tests/Features/Controllers/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers'], + ['file' => '/var/www/project/tests/Features/Controllers/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers/Numbers.php'], + ['file' => '/var/www/project/tests/Features/Controllers/Datasets.php', 'scope' => '/var/www/project/tests/Features/Controllers'], +]);