| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- <?php
- /**
- * Manual Test Script for SixShop Maker Bundle
- *
- * This script performs comprehensive tests of all functionality
- * Run: php tests/manual_test.php
- */
- // Autoload classes
- if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
- require __DIR__ . '/../vendor/autoload.php';
- } elseif (file_exists(__DIR__ . '/../../../../autoload.php')) {
- require __DIR__ . '/../../../../autoload.php';
- } else {
- echo "Error: Composer autoload not found.\n";
- exit(1);
- }
- use SixShop\MakerBundle\Generator\MigrationGenerator;
- use SixShop\MakerBundle\Generator\ModelGenerator;
- use SixShop\MakerBundle\Generator\EntityGenerator;
- use SixShop\MakerBundle\Generator\ControllerGenerator;
- use SixShop\MakerBundle\Generator\ComposerGenerator;
- use SixShop\MakerBundle\Generator\RouteUpdater;
- echo "🧪 SixShop Maker Bundle - Comprehensive Test Suite\n";
- echo "=" . str_repeat("=", 50) . "\n\n";
- $testDir = sys_get_temp_dir() . '/sixshop_test_' . time();
- $passed = 0;
- $failed = 0;
- function test(string $name, callable $test): void
- {
- global $passed, $failed;
- echo "📋 Testing: {$name}... ";
-
- try {
- $result = $test();
- if ($result) {
- echo "✅ PASSED\n";
- $passed++;
- } else {
- echo "❌ FAILED\n";
- $failed++;
- }
- } catch (Exception $e) {
- echo "💥 ERROR: " . $e->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";
|