/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testPreUpdateForNewEnumWithLongEnumCode() { $entityConfig1 = new Config(new EntityConfigId('extend', 'Test\\EnumValue1')); $entityConfig1->set('is_extend', true); $fieldConfig1 = new Config(new FieldConfigId('extend', 'Test\\EnumValue1', 'field1', 'enum')); $fieldConfig1->set('state', ExtendScope::STATE_NEW); $enumFieldConfig1 = new Config(new FieldConfigId('enum', 'Test\\EnumValue1', 'field1', 'enum')); $entityConfigs = [$entityConfig1]; $fieldConfigs = [$fieldConfig1]; $enumCode1 = ExtendHelper::generateEnumCode('Test\\EnumValue1', 'field1'); $enumValueClassName1 = ExtendHelper::buildEnumValueClassName($enumCode1); $extendConfigProvider = $this->getMockBuilder('Oro\\Bundle\\EntityConfigBundle\\Provider\\ConfigProvider')->disableOriginalConstructor()->getMock(); $enumConfigProvider = $this->getMockBuilder('Oro\\Bundle\\EntityConfigBundle\\Provider\\ConfigProvider')->disableOriginalConstructor()->getMock(); $this->configManager->expects($this->any())->method('getProvider')->will($this->returnValueMap([['extend', $extendConfigProvider], ['enum', $enumConfigProvider]])); $extendConfigProvider->expects($this->at(0))->method('getConfigs')->will($this->returnValue($entityConfigs)); $extendConfigProvider->expects($this->at(1))->method('getConfigs')->with($entityConfig1->getId()->getClassName())->will($this->returnValue($fieldConfigs)); $enumConfigProvider->expects($this->at(0))->method('getConfig')->with($entityConfig1->getId()->getClassName(), 'field1')->will($this->returnValue($enumFieldConfig1)); $this->configManager->expects($this->once())->method('hasConfigEntityModel')->will($this->returnValueMap([[$enumValueClassName1, false]])); $configManagerAt = 3; $this->configManager->expects($this->at($configManagerAt++))->method('createConfigEntityModel')->with($enumValueClassName1, ConfigModelManager::MODE_HIDDEN); $relationBuilderAt = 0; $this->relationBuilder->expects($this->at($relationBuilderAt++))->method('updateEntityConfigs')->with($enumValueClassName1, ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode1), 'plural_label' => ExtendHelper::getEnumTranslationKey('plural_label', $enumCode1), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode1)], 'extend' => ['owner' => ExtendScope::OWNER_SYSTEM, 'is_extend' => true, 'table' => $this->nameGenerator->generateEnumTableName($enumCode1, true), 'inherit' => ExtendHelper::BASE_ENUM_VALUE_CLASS], 'enum' => ['code' => $enumCode1, 'public' => false, 'multiple' => false]]); $this->setAddEnumValueEntityFieldsExpectations($enumValueClassName1, $enumCode1, $configManagerAt, $relationBuilderAt); $this->relationBuilder->expects($this->at($relationBuilderAt++))->method('addManyToOneRelation')->with($this->identicalTo($entityConfig1), $enumValueClassName1, 'field1', 'name', ['enum' => ['enum_code' => $enumCode1]], 'enum'); $this->extension->preUpdate(); }
/** * Adds enumerable field * * Take in attention that this method creates new private enum if the enum with the given code * is not exist yet. If you want to create a public enum use {@link createEnum} method before. * * @param Schema $schema * @param Table|string $table A Table object or table name * @param string $associationName A relation name * @param string $enumCode The target enum identifier * @param bool $isMultiple Indicates whether several options can be selected for this enum * or it supports only one selected option * @param bool|string[] $immutable Indicates whether the changing the list of enum values and * public flag is allowed or not. More details can be found * in entity_config.yml * @param array $options */ public function addEnumField(Schema $schema, $table, $associationName, $enumCode, $isMultiple = false, $immutable = false, array $options = []) { $enumTableName = $this->nameGenerator->generateEnumTableName($enumCode); $selfTable = $this->getTable($table, $schema); // make sure a table that is used to store enum values exists if (!$schema->hasTable($enumTableName)) { $this->createEnum($schema, $enumCode, $isMultiple, false, $immutable); } // create appropriate relation $options['enum']['enum_code'] = $enumCode; if ($isMultiple) { $options['extend']['without_default'] = true; $this->addManyToManyRelation($schema, $selfTable, $associationName, $enumTableName, ['name'], ['name'], ['name'], $options, 'multiEnum'); // create a column that will contain selected options // this column is required to avoid group by clause when multiple enum is shown in a datagrid $selfTable->addColumn($this->nameGenerator->generateMultiEnumSnapshotColumnName($associationName), 'string', ['notnull' => false, 'length' => ExtendHelper::MAX_ENUM_SNAPSHOT_LENGTH]); } else { $this->addManyToOneRelation($schema, $selfTable, $associationName, $enumTableName, 'name', $options, 'enum'); } }
/** * @param string $enumValueClassName The full class name of an entity is used to store enum values * @param string $enumCode The unique identifier of an enum * @param bool $isMultiple Indicates whether several options can be selected for this enum * or it supports only one selected option * @param bool|null $isPublic Indicates whether this enum can be used by any entity or * it is designed to use in one entity only * NULL means unspecified. In this case this attribute will not be * changed for existing enum entity and will be set to FALSE * for new enum entity */ protected function createEnumValueConfigEntityModel($enumValueClassName, $enumCode, $isMultiple, $isPublic) { if ($this->configManager->hasConfigEntityModel($enumValueClassName)) { if (null !== $isPublic) { $this->relationBuilder->updateEntityConfigs($enumValueClassName, ['enum' => ['public' => $isPublic]]); } return; } if (null === $isPublic) { $isPublic = false; } // create entity $this->configManager->createConfigEntityModel($enumValueClassName, ConfigModelManager::MODE_HIDDEN); $this->relationBuilder->updateEntityConfigs($enumValueClassName, ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode), 'plural_label' => ExtendHelper::getEnumTranslationKey('plural_label', $enumCode), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode)], 'extend' => ['owner' => ExtendScope::OWNER_SYSTEM, 'is_extend' => true, 'table' => $this->nameGenerator->generateEnumTableName($enumCode, true), 'inherit' => ExtendHelper::BASE_ENUM_VALUE_CLASS], 'enum' => ['code' => $enumCode, 'public' => $isPublic, 'multiple' => $isMultiple]]); // create fields $this->configManager->createConfigFieldModel($enumValueClassName, 'id', 'string'); $this->relationBuilder->updateFieldConfigs($enumValueClassName, 'id', ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode, 'id'), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode, 'id')], 'importexport' => ['identity' => true]]); $this->configManager->createConfigFieldModel($enumValueClassName, 'name', 'string'); $this->relationBuilder->updateFieldConfigs($enumValueClassName, 'name', ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode, 'name'), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode, 'name')], 'datagrid' => ['is_visible' => false]]); $this->configManager->createConfigFieldModel($enumValueClassName, 'priority', 'integer'); $this->relationBuilder->updateFieldConfigs($enumValueClassName, 'priority', ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode, 'priority'), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode, 'priority')], 'datagrid' => ['is_visible' => false]]); $this->configManager->createConfigFieldModel($enumValueClassName, 'default', 'boolean'); $this->relationBuilder->updateFieldConfigs($enumValueClassName, 'default', ['entity' => ['label' => ExtendHelper::getEnumTranslationKey('label', $enumCode, 'default'), 'description' => ExtendHelper::getEnumTranslationKey('description', $enumCode, 'default')], 'datagrid' => ['is_visible' => false]]); }
/** * @expectedException \InvalidArgumentException * @expectedExceptionMessage The enum code length must be less or equal 21 characters. Code: test_56789012345678901 */ public function testGenerateEnumTableNameWithTooLongEnumCode() { $this->nameGenerator->generateEnumTableName('test_56789012345678901'); }