manual_test.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <?php
  2. /**
  3. * Manual Test Script for SixShop Maker Bundle
  4. *
  5. * This script performs comprehensive tests of all functionality
  6. * Run: php tests/manual_test.php
  7. */
  8. // Autoload classes
  9. if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
  10. require __DIR__ . '/../vendor/autoload.php';
  11. } elseif (file_exists(__DIR__ . '/../../../../autoload.php')) {
  12. require __DIR__ . '/../../../../autoload.php';
  13. } else {
  14. echo "Error: Composer autoload not found.\n";
  15. exit(1);
  16. }
  17. use SixShop\MakerBundle\Generator\MigrationGenerator;
  18. use SixShop\MakerBundle\Generator\ModelGenerator;
  19. use SixShop\MakerBundle\Generator\EntityGenerator;
  20. use SixShop\MakerBundle\Generator\ControllerGenerator;
  21. use SixShop\MakerBundle\Generator\ComposerGenerator;
  22. use SixShop\MakerBundle\Generator\RouteUpdater;
  23. echo "🧪 SixShop Maker Bundle - Comprehensive Test Suite\n";
  24. echo "=" . str_repeat("=", 50) . "\n\n";
  25. $testDir = sys_get_temp_dir() . '/sixshop_test_' . time();
  26. $passed = 0;
  27. $failed = 0;
  28. function test(string $name, callable $test): void
  29. {
  30. global $passed, $failed;
  31. echo "📋 Testing: {$name}... ";
  32. try {
  33. $result = $test();
  34. if ($result) {
  35. echo "✅ PASSED\n";
  36. $passed++;
  37. } else {
  38. echo "❌ FAILED\n";
  39. $failed++;
  40. }
  41. } catch (Exception $e) {
  42. echo "💥 ERROR: " . $e->getMessage() . "\n";
  43. $failed++;
  44. }
  45. }
  46. function setupTestDir(): string
  47. {
  48. global $testDir;
  49. if (!is_dir($testDir)) {
  50. mkdir($testDir, 0755, true);
  51. }
  52. return $testDir;
  53. }
  54. function cleanupTestDir(): void
  55. {
  56. global $testDir;
  57. if (is_dir($testDir)) {
  58. $iterator = new RecursiveIteratorIterator(
  59. new RecursiveDirectoryIterator($testDir, RecursiveDirectoryIterator::SKIP_DOTS),
  60. RecursiveIteratorIterator::CHILD_FIRST
  61. );
  62. foreach ($iterator as $file) {
  63. if ($file->isDir()) {
  64. rmdir($file->getRealPath());
  65. } else {
  66. unlink($file->getRealPath());
  67. }
  68. }
  69. rmdir($testDir);
  70. }
  71. }
  72. // Test 1: MigrationGenerator
  73. test("MigrationGenerator - Create Table", function() {
  74. $testDir = setupTestDir();
  75. $generator = new MigrationGenerator($testDir . '/migrations');
  76. $fields = [
  77. ['name' => 'id', 'type' => 'biginteger', 'null' => false],
  78. ['name' => 'name', 'type' => 'string', 'length' => 100, 'null' => false],
  79. ['name' => 'email', 'type' => 'string', 'length' => 255, 'null' => false, 'unique' => true]
  80. ];
  81. $result = $generator->generateMigration('users', $fields, 'create');
  82. // Check if file was created
  83. $files = glob($testDir . '/migrations/*_create_users_table.php');
  84. return $result && count($files) === 1;
  85. });
  86. test("MigrationGenerator - Add Column", function() {
  87. $testDir = setupTestDir();
  88. $generator = new MigrationGenerator($testDir . '/migrations');
  89. $fields = [
  90. ['name' => 'phone', 'type' => 'string', 'length' => 20, 'null' => true]
  91. ];
  92. $result = $generator->generateMigration('users', $fields, 'add_column');
  93. $files = glob($testDir . '/migrations/*_add_column_to_users_table.php');
  94. return $result && count($files) === 1;
  95. });
  96. test("MigrationGenerator - Drop Column", function() {
  97. $testDir = setupTestDir();
  98. $generator = new MigrationGenerator($testDir . '/migrations');
  99. $fields = [
  100. ['name' => 'deprecated_field']
  101. ];
  102. $result = $generator->generateMigration('users', $fields, 'drop_column');
  103. $files = glob($testDir . '/migrations/*_drop_column_from_users_table.php');
  104. return $result && count($files) === 1;
  105. });
  106. // Test 2: ComposerGenerator
  107. test("ComposerGenerator - Package Name Validation", function() {
  108. $generator = new ComposerGenerator();
  109. $validNames = ['vendor/package', 'sixshop/hello-world'];
  110. $invalidNames = ['invalid', 'vendor/', '/package'];
  111. foreach ($validNames as $name) {
  112. if (!$generator->validatePackageName($name)) {
  113. return false;
  114. }
  115. }
  116. foreach ($invalidNames as $name) {
  117. if ($generator->validatePackageName($name)) {
  118. return false;
  119. }
  120. }
  121. return true;
  122. });
  123. test("ComposerGenerator - Namespace Conversion", function() {
  124. $generator = new ComposerGenerator();
  125. $testCases = [
  126. 'sixshop/hello-world' => 'SixShop\\HelloWorld\\',
  127. 'vendor/simple' => 'Vendor\\Simple\\',
  128. 'my-vendor/complex-name' => 'MyVendor\\ComplexName\\'
  129. ];
  130. foreach ($testCases as $package => $expected) {
  131. $result = $generator->convertPackageNameToNamespace($package);
  132. if ($result !== $expected) {
  133. return false;
  134. }
  135. }
  136. return true;
  137. });
  138. test("ComposerGenerator - Generate composer.json", function() {
  139. $testDir = setupTestDir();
  140. $generator = new ComposerGenerator();
  141. $packageInfo = [
  142. 'packageName' => 'sixshop/test-extension',
  143. 'description' => 'A test extension',
  144. 'namespace' => 'SixShop\\TestExtension\\',
  145. 'id' => 'sixshop-test-extension'
  146. ];
  147. $result = $generator->generateComposerJson($packageInfo, $testDir);
  148. return $result && file_exists($testDir . '/composer.json');
  149. });
  150. // Test 3: ModelGenerator
  151. test("ModelGenerator - Generate Model", function() {
  152. $testDir = setupTestDir();
  153. $generator = new ModelGenerator();
  154. $fields = [
  155. ['name' => 'id', 'type' => 'biginteger'],
  156. ['name' => 'name', 'type' => 'string', 'length' => 100],
  157. ['name' => 'price', 'type' => 'decimal', 'precision' => 10, 'scale' => 2]
  158. ];
  159. $extensionInfo = [
  160. 'namespace' => 'SixShop\\Test\\',
  161. 'packageName' => 'sixshop/test',
  162. 'id' => 'sixshop-test'
  163. ];
  164. $result = $generator->generateModel('products', 'Products table', $fields, $extensionInfo, $testDir);
  165. return $result && file_exists($testDir . '/src/Model/ProductModel.php');
  166. });
  167. // Test 4: EntityGenerator
  168. test("EntityGenerator - Generate Entity", function() {
  169. $testDir = setupTestDir();
  170. $generator = new EntityGenerator();
  171. $fields = [
  172. ['name' => 'id', 'type' => 'biginteger'],
  173. ['name' => 'name', 'type' => 'string']
  174. ];
  175. $extensionInfo = [
  176. 'namespace' => 'SixShop\\Test\\',
  177. 'packageName' => 'sixshop/test',
  178. 'id' => 'sixshop-test'
  179. ];
  180. $result = $generator->generateEntity('products', 'Products table', $fields, $extensionInfo, $testDir);
  181. return $result && file_exists($testDir . '/src/Entity/ProductEntity.php');
  182. });
  183. // Test 5: ControllerGenerator
  184. test("ControllerGenerator - Generate Controllers", function() {
  185. $testDir = setupTestDir();
  186. $generator = new ControllerGenerator();
  187. $fields = [
  188. ['name' => 'id', 'type' => 'biginteger'],
  189. ['name' => 'name', 'type' => 'string']
  190. ];
  191. $extensionInfo = [
  192. 'namespace' => 'SixShop\\Test\\',
  193. 'packageName' => 'sixshop/test',
  194. 'id' => 'sixshop-test'
  195. ];
  196. $result = $generator->generateControllers('products', 'Products table', $fields, $extensionInfo, $testDir);
  197. $adminExists = file_exists($testDir . '/src/Controller/Admin/ProductController.php');
  198. $apiExists = file_exists($testDir . '/src/Controller/Api/ProductController.php');
  199. return $result && $adminExists && $apiExists;
  200. });
  201. // Test 6: Complete Workflow
  202. test("Complete Workflow - All Components", function() {
  203. $testDir = setupTestDir();
  204. $tableName = 'orders';
  205. $tableComment = 'Orders management';
  206. $fields = [
  207. ['name' => 'id', 'type' => 'biginteger', 'null' => false],
  208. ['name' => 'user_id', 'type' => 'biginteger', 'null' => false],
  209. ['name' => 'total', 'type' => 'decimal', 'precision' => 10, 'scale' => 2],
  210. ['name' => 'status', 'type' => 'string', 'length' => 20, 'default' => 'pending']
  211. ];
  212. $extensionInfo = [
  213. 'namespace' => 'SixShop\\Shop\\',
  214. 'packageName' => 'sixshop/shop',
  215. 'id' => 'sixshop-shop'
  216. ];
  217. // Generate migration
  218. $migrationGenerator = new MigrationGenerator($testDir . '/database/migrations');
  219. $migrationResult = $migrationGenerator->generateMigration($tableName, $fields, 'create');
  220. // Generate model
  221. $modelGenerator = new ModelGenerator();
  222. $modelResult = $modelGenerator->generateModel($tableName, $tableComment, $fields, $extensionInfo, $testDir);
  223. // Generate entity
  224. $entityGenerator = new EntityGenerator();
  225. $entityResult = $entityGenerator->generateEntity($tableName, $tableComment, $fields, $extensionInfo, $testDir);
  226. // Generate controllers
  227. $controllerGenerator = new ControllerGenerator();
  228. $controllerResult = $controllerGenerator->generateControllers($tableName, $tableComment, $fields, $extensionInfo, $testDir);
  229. // Verify all files exist
  230. $migrationExists = !empty(glob($testDir . '/database/migrations/*_create_orders_table.php'));
  231. $modelExists = file_exists($testDir . '/src/Model/OrderModel.php');
  232. $entityExists = file_exists($testDir . '/src/Entity/OrderEntity.php');
  233. $adminControllerExists = file_exists($testDir . '/src/Controller/Admin/OrderController.php');
  234. $apiControllerExists = file_exists($testDir . '/src/Controller/Api/OrderController.php');
  235. return $migrationResult && $modelResult && $entityResult && $controllerResult &&
  236. $migrationExists && $modelExists && $entityExists && $adminControllerExists && $apiControllerExists;
  237. });
  238. // Test 7: Field Type Handling
  239. test("Field Type Support", function() {
  240. $generator = new MigrationGenerator();
  241. $supportedTypes = $generator->getSupportedFieldTypes();
  242. $expectedTypes = [
  243. 'integer', 'biginteger', 'string', 'text', 'boolean',
  244. 'decimal', 'float', 'datetime', 'timestamp', 'date',
  245. 'time', 'binary', 'json'
  246. ];
  247. foreach ($expectedTypes as $type) {
  248. if (!in_array($type, $supportedTypes)) {
  249. return false;
  250. }
  251. }
  252. return true;
  253. });
  254. // Test 8: Template Content Validation
  255. test("Template Content Quality", function() {
  256. $testDir = setupTestDir();
  257. // Generate complete set
  258. $generator = new ModelGenerator();
  259. $extensionInfo = [
  260. 'namespace' => 'SixShop\\Test\\',
  261. 'packageName' => 'sixshop/test',
  262. 'id' => 'sixshop-test'
  263. ];
  264. $fields = [
  265. ['name' => 'name', 'type' => 'string', 'length' => 100]
  266. ];
  267. $generator->generateModel('items', 'Test items', $fields, $extensionInfo, $testDir);
  268. $content = file_get_contents($testDir . '/src/Model/ItemModel.php');
  269. // Check for required elements
  270. $checks = [
  271. 'class ItemModel extends Model',
  272. 'protected function getOptions(): array',
  273. "'name' => 'items'",
  274. "'pk' => 'id'",
  275. "'auto_timestamp' => true"
  276. ];
  277. foreach ($checks as $check) {
  278. if (strpos($content, $check) === false) {
  279. return false;
  280. }
  281. }
  282. return true;
  283. });
  284. echo "\n" . str_repeat("=", 60) . "\n";
  285. echo "📊 Test Results Summary\n";
  286. echo str_repeat("=", 60) . "\n";
  287. echo "✅ Passed: {$passed}\n";
  288. echo "❌ Failed: {$failed}\n";
  289. echo "📈 Success Rate: " . round(($passed / ($passed + $failed)) * 100, 1) . "%\n";
  290. if ($failed === 0) {
  291. echo "\n🎉 All tests passed! The SixShop Maker Bundle is working correctly.\n";
  292. } else {
  293. echo "\n⚠️ Some tests failed. Please review the output above.\n";
  294. }
  295. echo "\n💡 To run manual tests:\n";
  296. echo "- Extension generation: php bin/sixshop-maker\n";
  297. echo "- Migration generation: php bin/sixshop-maker create_migration\n";
  298. echo "- Comprehensive demo: php test/comprehensive_demo.php\n";
  299. // Cleanup
  300. cleanupTestDir();
  301. echo "\n🧹 Cleanup completed.\n";