getMessage() . "\n"; $failed++; } } function setupTestDir(): string { global $testDir; if (!is_dir($testDir)) { mkdir($testDir, 0755, true); } return $testDir; } function cleanupTestDir(): void { global $testDir; if (is_dir($testDir)) { $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($testDir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($iterator as $file) { if ($file->isDir()) { rmdir($file->getRealPath()); } else { unlink($file->getRealPath()); } } rmdir($testDir); } } // Test 1: MigrationGenerator test("MigrationGenerator - Create Table", function() { $testDir = setupTestDir(); $generator = new MigrationGenerator($testDir . '/migrations'); $fields = [ ['name' => 'id', 'type' => 'biginteger', 'null' => false], ['name' => 'name', 'type' => 'string', 'length' => 100, 'null' => false], ['name' => 'email', 'type' => 'string', 'length' => 255, 'null' => false, 'unique' => true] ]; $result = $generator->generateMigration('users', $fields, 'create'); // Check if file was created $files = glob($testDir . '/migrations/*_create_users_table.php'); return $result && count($files) === 1; }); test("MigrationGenerator - Add Column", function() { $testDir = setupTestDir(); $generator = new MigrationGenerator($testDir . '/migrations'); $fields = [ ['name' => 'phone', 'type' => 'string', 'length' => 20, 'null' => true] ]; $result = $generator->generateMigration('users', $fields, 'add_column'); $files = glob($testDir . '/migrations/*_add_column_to_users_table.php'); return $result && count($files) === 1; }); test("MigrationGenerator - Drop Column", function() { $testDir = setupTestDir(); $generator = new MigrationGenerator($testDir . '/migrations'); $fields = [ ['name' => 'deprecated_field'] ]; $result = $generator->generateMigration('users', $fields, 'drop_column'); $files = glob($testDir . '/migrations/*_drop_column_from_users_table.php'); return $result && count($files) === 1; }); // Test 2: ComposerGenerator test("ComposerGenerator - Package Name Validation", function() { $generator = new ComposerGenerator(); $validNames = ['vendor/package', 'sixshop/hello-world']; $invalidNames = ['invalid', 'vendor/', '/package']; foreach ($validNames as $name) { if (!$generator->validatePackageName($name)) { return false; } } foreach ($invalidNames as $name) { if ($generator->validatePackageName($name)) { return false; } } return true; }); test("ComposerGenerator - Namespace Conversion", function() { $generator = new ComposerGenerator(); $testCases = [ 'sixshop/hello-world' => 'SixShop\\HelloWorld\\', 'vendor/simple' => 'Vendor\\Simple\\', 'my-vendor/complex-name' => 'MyVendor\\ComplexName\\' ]; foreach ($testCases as $package => $expected) { $result = $generator->convertPackageNameToNamespace($package); if ($result !== $expected) { return false; } } return true; }); test("ComposerGenerator - Generate composer.json", function() { $testDir = setupTestDir(); $generator = new ComposerGenerator(); $packageInfo = [ 'packageName' => 'sixshop/test-extension', 'description' => 'A test extension', 'namespace' => 'SixShop\\TestExtension\\', 'id' => 'sixshop-test-extension' ]; $result = $generator->generateComposerJson($packageInfo, $testDir); return $result && file_exists($testDir . '/composer.json'); }); // Test 3: ModelGenerator test("ModelGenerator - Generate Model", function() { $testDir = setupTestDir(); $generator = new ModelGenerator(); $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'name', 'type' => 'string', 'length' => 100], ['name' => 'price', 'type' => 'decimal', 'precision' => 10, 'scale' => 2] ]; $extensionInfo = [ 'namespace' => 'SixShop\\Test\\', 'packageName' => 'sixshop/test', 'id' => 'sixshop-test' ]; $result = $generator->generateModel('products', 'Products table', $fields, $extensionInfo, $testDir); return $result && file_exists($testDir . '/src/Model/ProductModel.php'); }); // Test 4: EntityGenerator test("EntityGenerator - Generate Entity", function() { $testDir = setupTestDir(); $generator = new EntityGenerator(); $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'name', 'type' => 'string'] ]; $extensionInfo = [ 'namespace' => 'SixShop\\Test\\', 'packageName' => 'sixshop/test', 'id' => 'sixshop-test' ]; $result = $generator->generateEntity('products', 'Products table', $fields, $extensionInfo, $testDir); return $result && file_exists($testDir . '/src/Entity/ProductEntity.php'); }); // Test 5: ControllerGenerator test("ControllerGenerator - Generate Controllers", function() { $testDir = setupTestDir(); $generator = new ControllerGenerator(); $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'name', 'type' => 'string'] ]; $extensionInfo = [ 'namespace' => 'SixShop\\Test\\', 'packageName' => 'sixshop/test', 'id' => 'sixshop-test' ]; $result = $generator->generateControllers('products', 'Products table', $fields, $extensionInfo, $testDir); $adminExists = file_exists($testDir . '/src/Controller/Admin/ProductController.php'); $apiExists = file_exists($testDir . '/src/Controller/Api/ProductController.php'); return $result && $adminExists && $apiExists; }); // Test 6: Complete Workflow test("Complete Workflow - All Components", function() { $testDir = setupTestDir(); $tableName = 'orders'; $tableComment = 'Orders management'; $fields = [ ['name' => 'id', 'type' => 'biginteger', 'null' => false], ['name' => 'user_id', 'type' => 'biginteger', 'null' => false], ['name' => 'total', 'type' => 'decimal', 'precision' => 10, 'scale' => 2], ['name' => 'status', 'type' => 'string', 'length' => 20, 'default' => 'pending'] ]; $extensionInfo = [ 'namespace' => 'SixShop\\Shop\\', 'packageName' => 'sixshop/shop', 'id' => 'sixshop-shop' ]; // Generate migration $migrationGenerator = new MigrationGenerator($testDir . '/database/migrations'); $migrationResult = $migrationGenerator->generateMigration($tableName, $fields, 'create'); // Generate model $modelGenerator = new ModelGenerator(); $modelResult = $modelGenerator->generateModel($tableName, $tableComment, $fields, $extensionInfo, $testDir); // Generate entity $entityGenerator = new EntityGenerator(); $entityResult = $entityGenerator->generateEntity($tableName, $tableComment, $fields, $extensionInfo, $testDir); // Generate controllers $controllerGenerator = new ControllerGenerator(); $controllerResult = $controllerGenerator->generateControllers($tableName, $tableComment, $fields, $extensionInfo, $testDir); // Verify all files exist $migrationExists = !empty(glob($testDir . '/database/migrations/*_create_orders_table.php')); $modelExists = file_exists($testDir . '/src/Model/OrderModel.php'); $entityExists = file_exists($testDir . '/src/Entity/OrderEntity.php'); $adminControllerExists = file_exists($testDir . '/src/Controller/Admin/OrderController.php'); $apiControllerExists = file_exists($testDir . '/src/Controller/Api/OrderController.php'); return $migrationResult && $modelResult && $entityResult && $controllerResult && $migrationExists && $modelExists && $entityExists && $adminControllerExists && $apiControllerExists; }); // Test 7: Field Type Handling test("Field Type Support", function() { $generator = new MigrationGenerator(); $supportedTypes = $generator->getSupportedFieldTypes(); $expectedTypes = [ 'integer', 'biginteger', 'string', 'text', 'boolean', 'decimal', 'float', 'datetime', 'timestamp', 'date', 'time', 'binary', 'json' ]; foreach ($expectedTypes as $type) { if (!in_array($type, $supportedTypes)) { return false; } } return true; }); // Test 8: Template Content Validation test("Template Content Quality", function() { $testDir = setupTestDir(); // Generate complete set $generator = new ModelGenerator(); $extensionInfo = [ 'namespace' => 'SixShop\\Test\\', 'packageName' => 'sixshop/test', 'id' => 'sixshop-test' ]; $fields = [ ['name' => 'name', 'type' => 'string', 'length' => 100] ]; $generator->generateModel('items', 'Test items', $fields, $extensionInfo, $testDir); $content = file_get_contents($testDir . '/src/Model/ItemModel.php'); // Check for required elements $checks = [ 'class ItemModel extends Model', 'protected function getOptions(): array', "'name' => 'items'", "'pk' => 'id'", "'auto_timestamp' => true" ]; foreach ($checks as $check) { if (strpos($content, $check) === false) { return false; } } return true; }); echo "\n" . str_repeat("=", 60) . "\n"; echo "๐Ÿ“Š Test Results Summary\n"; echo str_repeat("=", 60) . "\n"; echo "โœ… Passed: {$passed}\n"; echo "โŒ Failed: {$failed}\n"; echo "๐Ÿ“ˆ Success Rate: " . round(($passed / ($passed + $failed)) * 100, 1) . "%\n"; if ($failed === 0) { echo "\n๐ŸŽ‰ All tests passed! The SixShop Maker Bundle is working correctly.\n"; } else { echo "\nโš ๏ธ Some tests failed. Please review the output above.\n"; } echo "\n๐Ÿ’ก To run manual tests:\n"; echo "- Extension generation: php bin/sixshop-maker\n"; echo "- Migration generation: php bin/sixshop-maker create_migration\n"; echo "- Comprehensive demo: php test/comprehensive_demo.php\n"; // Cleanup cleanupTestDir(); echo "\n๐Ÿงน Cleanup completed.\n";