diff --git a/src/Concerns/Migrations.php b/src/Concerns/Migrations.php index 7c4e409..a6d4970 100644 --- a/src/Concerns/Migrations.php +++ b/src/Concerns/Migrations.php @@ -14,16 +14,29 @@ */ trait Migrations { - protected bool $load_migrations_laravel = false; - - protected string $load_migrations_playground_test; + /** + * @var array> + */ + protected array $load_migrations = [ + // Grouped by organizations and keyed by packages. + // 'gammamatrix' => [ + // 'playground-cms' => [], + // 'playground-leads' => [], + // 'playground-matrix' => [], + // 'playground-test' => [ + // 'migrations-testing', + // ], + // ], + ]; - protected string $load_migrations_package = ''; + protected bool $load_migrations_laravel = false; - protected string $load_migrations_package_migration = ''; + protected bool $load_migrations_package = false; protected bool $load_migrations_playground = false; + protected string $load_migrations_playground_test; + /** * Define database migrations. * @@ -44,88 +57,174 @@ protected function defineDatabaseMigrations() $this->loadMigrationsFrom($folderForVendor.'/gammamatrix/playground-test/database/migrations-playground'); } if ($this->load_migrations_package) { - $this->loadPackageMigration($folderForVendor, $this->load_migrations_package); + $this->loadPackageMigrations(); + } + if ($this->load_migrations) { + $this->loadMigrationsFromPackages($folderForVendor); } } } - protected function loadPackageMigration( - string $folderForVendor, - string $package, - string $migrations = null - ): void { + protected function loadPackageMigrations(): void + { + if (empty($this->package_providers_dir) + || ! Str::endsWith($this->package_providers_dir, '/tests/Unit') + ) { + throw new ValueError( + 'Expecting package_providers_dir to be set in PackageProviders' + ); + } - $organization = Str::of($package)->before('/')->toString(); - $organization_package = Str::of($package)->after('/')->toString(); + $folderForPackage = Str::of($this->package_providers_dir)->before('/tests/Unit')->toString(); - if (empty($organization)) { - throw new ValueError('Expecting the Packagist Organization to be provided.'); - } + $folderForPackageMigrations = sprintf('%1$s/database/migrations', $folderForPackage); - if (empty($organization_package)) { + if (! is_dir($folderForPackageMigrations)) { throw new ValueError(sprintf( - 'Expecting the Packagist Organization [%1$s] Package to be provided in the $package [%2$s]', - $organization, - $package + 'Expecting the package to have database migrations: [%1$s]', + $folderForPackageMigrations )); } - $folderForOrganization = sprintf('%1$s/%2$s', $folderForVendor, $organization); + $this->loadMigrationsFrom($folderForPackageMigrations); + } - if (! is_dir($folderForOrganization)) { - throw new ValueError(sprintf( - 'Expecting the Composer vendor folder for [%1$s] to exist: [%2$s]', - $organization, - $folderForOrganization - )); - } + /** + * @param array $packages + */ + private function loadMigrationsFromPackages_org( + string $folderForOrganization, + string $organization, + array $packages + ): void { + foreach ($packages as $package => $migrations) { + + if (empty($package) || ! is_string($package)) { + throw new ValueError(sprintf( + 'Expecting the package to be provided from the Packagist Organization [%1$s]: [%2$s] ', + $organization, + $folderForOrganization + )); + } - $folderForOrganizationPackage = sprintf('%1$s/%2$s', $folderForOrganization, $organization_package); + if (empty($migrations) || ! is_array($migrations)) { + $migrations = [ + 'migrations', + ]; + } - if (! is_dir($folderForOrganizationPackage)) { - throw new ValueError(sprintf( - 'Expecting the package to be found under Composer vendor folder for [%1$s]: [%2$s]', - $package, - $folderForOrganizationPackage - )); - } + $folderForOrganizationPackage = sprintf('%1$s/%2$s', $folderForOrganization, $package); + // dump([ + // '__METHOD__' => __METHOD__, + // '$package' => $package, + // '$migrations' => $migrations, + // '$organization' => $organization, + // '$folderForOrganization' => $folderForOrganization, + // '$folderForOrganizationPackage' => $folderForOrganizationPackage, + // ]); + if (! is_dir($folderForOrganizationPackage)) { + throw new ValueError(sprintf( + 'Expecting the package to be found under Composer vendor folder for [%1$s]: [%2$s]', + $package, + $folderForOrganizationPackage + )); + } - $folderForOrganizationPackageDatabase = $folderForOrganizationPackage.'/database'; + $folderForOrganizationPackageDatabase = $folderForOrganizationPackage.'/database'; - if (! is_dir($folderForOrganizationPackageDatabase)) { - throw new ValueError(sprintf( - 'Expecting the organization [%1$s] to have a database folder under: [%2$s]', + if (! is_dir($folderForOrganizationPackageDatabase)) { + throw new ValueError(sprintf( + 'Expecting the organization [%1$s] to have a database folder under: [%2$s]', + $organization, + $folderForOrganizationPackageDatabase + )); + } + + // if (empty($migrations)) { + // throw new ValueError(sprintf( + // 'Expecting a folder, for the set of migrations, to be provided: [%1$s]', + // $folderForOrganizationPackageDatabase + // )); + // } + + $this->loadMigrationsFromPackages_migrations( + $folderForOrganizationPackageDatabase, $organization, - $folderForOrganizationPackageDatabase - )); + $package, + $migrations, + ); } + } - if (is_null($migrations)) { - if ($this->load_migrations_package_migration) { - $migrations = trim($this->load_migrations_package_migration, '/\\'); - } else { - $migrations = 'migrations'; + /** + * @param array $migrations + */ + private function loadMigrationsFromPackages_migrations( + string $folderForOrganizationPackageDatabase, + string $organization, + string $package, + array $migrations + ): void { + + foreach ($migrations as $migration) { + $folderForMigrations = $folderForOrganizationPackageDatabase.'/'.$migration; + + if (! is_dir($folderForMigrations)) { + throw new ValueError(sprintf( + 'Expecting the organization [%1$s] to have a set of database migrations: [%2$s]', + $organization, + $folderForMigrations + )); } - } - if (empty($migrations)) { - throw new ValueError(sprintf( - 'Expecting a folder, for the set of migrations, to be provided: [%1$s]', - $folderForOrganizationPackageDatabase - )); + if (! is_dir($folderForOrganizationPackageDatabase)) { + throw new ValueError(sprintf( + 'Expecting the organization [%1$s] to have a database folder under: [%2$s]', + $organization, + $folderForOrganizationPackageDatabase + )); + } + + // dd([ + // '__METHOD__' => __METHOD__, + // '$folderForOrganizationPackageDatabase' => $folderForOrganizationPackageDatabase, + // '$folderForMigrations' => $folderForMigrations, + // '$migration' => $migration, + // // '$migrations' => $migrations, + // '$organization' => $organization, + // '$package' => $package, + // // '$packages' => $packages, + // // '$this->load_migrations' => $this->load_migrations, + // ]); + + $this->loadMigrationsFrom($folderForMigrations); } + } - $folderForMigrations = $folderForOrganizationPackageDatabase.'/'.$migrations; + protected function loadMigrationsFromPackages(string $folderForVendor): void + { + foreach ($this->load_migrations as $organization => $packages) { - if (! is_dir($folderForMigrations)) { - throw new ValueError(sprintf( - 'Expecting the organization [%1$s] to have a set of database migrations: [%2$s]', + if (empty($organization)) { + throw new ValueError('Expecting the Packagist Organization to be provided.'); + } + + $folderForOrganization = sprintf('%1$s/%2$s', $folderForVendor, $organization); + + if (! is_dir($folderForOrganization)) { + throw new ValueError(sprintf( + 'Expecting the Composer vendor folder for [%1$s] to exist: [%2$s]', + $organization, + $folderForOrganization + )); + } + + $this->loadMigrationsFromPackages_org( + $folderForOrganization, $organization, - $folderForMigrations - )); + $packages, + ); } - - $this->loadMigrationsFrom($folderForMigrations); } /** @@ -199,6 +298,9 @@ private function verifyPlaygroundTestExists(): string return $folderForVendor; } + /** + * @deprecated + */ protected function loadPlaygroundMigration(string $folder): void { $playground_database = sprintf('%1$s/playground/database', dirname(dirname(dirname(__DIR__)))); diff --git a/src/Concerns/Orchestrating.php b/src/Concerns/Orchestrating.php index c39e7f3..9f34a29 100644 --- a/src/Concerns/Orchestrating.php +++ b/src/Concerns/Orchestrating.php @@ -9,6 +9,7 @@ use Illuminate\Support\Carbon; use Playground\Models\User; use Playground\Test\Models\DefaultUser; +use Playground\Test\Models\UserWithSanctum; /** * \Playground\Test\Concerns\Orchestrating diff --git a/tests/Unit/PackageProviders.php b/tests/Unit/PackageProviders.php index e6a34cc..ee54c1d 100644 --- a/tests/Unit/PackageProviders.php +++ b/tests/Unit/PackageProviders.php @@ -11,6 +11,8 @@ */ trait PackageProviders { + protected string $package_providers_dir = __DIR__; + protected function getPackageProviders($app) { return [