testDir = sys_get_temp_dir() . '/sixshop_entity_test_' . uniqid(); if (!is_dir($this->testDir)) { mkdir($this->testDir, 0755, true); } $this->generator = new EntityGenerator(); $this->extensionInfo = [ 'namespace' => 'SixShop\\Test\\', 'packageName' => 'sixshop/test', 'id' => 'sixshop-test' ]; // Create mock SymfonyStyle $input = new ArrayInput([]); $output = new BufferedOutput(); $this->io = new SymfonyStyle($input, $output); } protected function tearDown(): void { if (is_dir($this->testDir)) { $this->removeDirectory($this->testDir); } } private function removeDirectory(string $dir): void { if (is_dir($dir)) { $files = array_diff(scandir($dir), ['.', '..']); foreach ($files as $file) { $path = $dir . DIRECTORY_SEPARATOR . $file; is_dir($path) ? $this->removeDirectory($path) : unlink($path); } rmdir($dir); } } public function testGenerateBasicEntity(): void { $tableName = 'test_users'; $tableComment = 'Test users table'; $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'name', 'type' => 'string', 'length' => 100], ['name' => 'email', 'type' => 'string', 'length' => 255] ]; $result = $this->generator->generateEntity( $tableName, $tableComment, $fields, $this->extensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/TestUserEntity.php'; $this->assertFileExists($entityFile); $content = file_get_contents($entityFile); $this->assertStringContainsString('class TestUserEntity extends BaseEntity', $content); $this->assertStringContainsString('use SixShop\\Core\\Entity\\BaseEntity;', $content); $this->assertStringContainsString('public function indexTestUser', $content); $this->assertStringContainsString('public function createTestUser', $content); $this->assertStringContainsString('public function saveTestUser', $content); $this->assertStringContainsString('public function readTestUser', $content); $this->assertStringContainsString('public function editTestUser', $content); $this->assertStringContainsString('public function updateTestUser', $content); $this->assertStringContainsString('public function deleteTestUser', $content); } public function testEntityMethodParameters(): void { $tableName = 'products'; $tableComment = 'Products table'; $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'name', 'type' => 'string'] ]; $result = $this->generator->generateEntity( $tableName, $tableComment, $fields, $this->extensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/ProductEntity.php'; $content = file_get_contents($entityFile); // Check method parameters $this->assertStringContainsString('public function indexProduct(array $params, array $pageAndLimit = []):Paginator| Collection', $content); $this->assertStringContainsString('public function createProduct(): array', $content); $this->assertStringContainsString('public function saveProduct(array $data): ProductModel', $content); $this->assertStringContainsString('public function readProduct(int $id):self', $content); $this->assertStringContainsString('public function editProduct(int $id): array', $content); $this->assertStringContainsString('public function updateProduct(int $id, array $params): self', $content); $this->assertStringContainsString('public function deleteProduct(int $id): bool', $content); } public function testEntityNamespaceGeneration(): void { $tableName = 'orders'; $fields = [['name' => 'id', 'type' => 'biginteger']]; $customExtensionInfo = [ 'namespace' => 'MyVendor\\CustomPackage\\', 'packageName' => 'myvendor/custom-package', 'id' => 'myvendor-custom-package' ]; $result = $this->generator->generateEntity( $tableName, 'Orders table', $fields, $customExtensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/OrderEntity.php'; $this->assertFileExists($entityFile); $content = file_get_contents($entityFile); $this->assertStringContainsString('namespace MyVendor\\CustomPackage\\Entity;', $content); $this->assertStringContainsString('use MyVendor\\CustomPackage\\Model\\OrderModel;', $content); $this->assertStringContainsString('class OrderEntity extends BaseEntity', $content); } public function testEntityWithComplexTableName(): void { $tableName = 'user_profiles'; $fields = [['name' => 'id', 'type' => 'biginteger']]; $result = $this->generator->generateEntity( $tableName, 'User profiles table', $fields, $this->extensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/UserProfileEntity.php'; $this->assertFileExists($entityFile); $content = file_get_contents($entityFile); $this->assertStringContainsString('class UserProfileEntity extends BaseEntity', $content); $this->assertStringContainsString('public function indexUserProfile', $content); $this->assertStringContainsString('public function saveUserProfile', $content); } public function testEntityDirectoryCreation(): void { $tableName = 'categories'; $fields = [['name' => 'id', 'type' => 'biginteger']]; // Use a path that doesn't exist $newTestDir = $this->testDir . '/nonexistent/path'; $result = $this->generator->generateEntity( $tableName, 'Categories table', $fields, $this->extensionInfo, $newTestDir, $this->io ); $this->assertTrue($result); $entityFile = $newTestDir . '/src/Entity/CategoryEntity.php'; $this->assertFileExists($entityFile); // Check that directories were created $this->assertTrue(is_dir($newTestDir . '/src/Entity')); } public function testEntityImplementationPatterns(): void { $tableName = 'logs'; $fields = [ ['name' => 'id', 'type' => 'biginteger'], ['name' => 'message', 'type' => 'text'] ]; $result = $this->generator->generateEntity( $tableName, 'Logs table', $fields, $this->extensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/LogEntity.php'; $content = file_get_contents($entityFile); // Check implementation patterns $this->assertStringContainsString('$this->withSearch([', $content); $this->assertStringContainsString('$this->find($id)', $content); $this->assertStringContainsString('$this->findOrEmpty($id)', $content); $this->assertStringContainsString('throw_logic_exception(\'数据不存在\')', $content); $this->assertStringContainsString('new LogModel()', $content); } public function testEntityImportsAndDependencies(): void { $tableName = 'settings'; $fields = [['name' => 'id', 'type' => 'biginteger']]; $result = $this->generator->generateEntity( $tableName, 'Settings table', $fields, $this->extensionInfo, $this->testDir, $this->io ); $this->assertTrue($result); $entityFile = $this->testDir . '/src/Entity/SettingEntity.php'; $content = file_get_contents($entityFile); // Check required imports $this->assertStringContainsString('use SixShop\\Test\\Model\\SettingModel;', $content); $this->assertStringContainsString('use SixShop\\Core\\Entity\\BaseEntity;', $content); $this->assertStringContainsString('use think\\Collection;', $content); $this->assertStringContainsString('use think\\Paginator;', $content); $this->assertStringContainsString('use function SixShop\\Core\\throw_logic_exception;', $content); } }