public function testNgRestConfigAW()
 {
     $config = new ConfigBuilder('model\\class\\name');
     $config->aw->load(['class' => 'luya\\admin\\aws\\ChangePassword', 'alias' => 'Change Password']);
     $cfg = $config->getConfig();
     $this->assertArrayHasKey('aw', $cfg);
     $aw = $cfg['aw'];
     $this->assertArrayHasKey('00a8a03b008f1b28d968f894d83c2e87c64c046c', $aw);
     $obj = $aw['00a8a03b008f1b28d968f894d83c2e87c64c046c'];
     $this->assertArrayHasKey('objectConfig', $obj);
     $this->assertArrayHasKey('alias', $obj);
     $this->assertArrayHasKey('icon', $obj);
     $ngRestConfig = new Config(['apiEndpoint' => 'api-admin-test', 'primaryKey' => 'id']);
     $ngRestConfig->setConfig($cfg);
 }
 /**
  * Inject data from the model into the config, usage exmple in ngRestConfig method context:
  *
  * ```php
  * public function ngRestConfig($config)
  * {
  *     // ...
  *     $this->ngRestConfigDefine($config, 'list', ['firstname', 'lastname', 'image_id']);
  *     $this->ngRestConfigDefine($config, 'create', ['firstname', 'lastname', 'description', 'position', 'image_id']);
  *     $this->ngRestConfigDefine($config, 'update', ['firstname', 'lastname', 'description', 'position', 'image_id']);
  *     // ....
  *     return $config;
  * }
  * ```
  *
  * You can also use an array defintion to handle booth types at the same time
  *
  * ```php
  * public function ngRestConfig($config)
  * {
  *     // ...
  *     $this->ngRestConfigDefine($config, ['create', 'update'], ['firstname', 'lastname', 'description', 'position', 'image_id']);
  *     // ....
  *     return $config;
  * }
  * ```
  *
  * @param \luya\admin\ngrest\ConfigBuilder $config The config which the defintion should be append
  * @param string|array $assignedType This can be a string with a type or an array with multiple types
  * @param array $fields An array with fields assign to types type based on the an `ngRestAttributeTypes` defintion.
  * @throws \yii\base\InvalidConfigException
  * @since 1.0.0-beta4
  */
 public function ngRestConfigDefine(ConfigBuilder $config, $assignedType, array $fields)
 {
     $types = $this->ngRestAttributeTypes();
     $extraTypes = $this->ngRestExtraAttributeTypes();
     $scenarios = $this->scenarios();
     $assignedType = (array) $assignedType;
     foreach ($assignedType as $type) {
         $scenario = false;
         $scenarioFields = [];
         if ($type == 'create' || $type == 'update') {
             $scenario = 'rest' . $type;
             if (!isset($scenarios[$scenario])) {
                 throw new InvalidConfigException("The scenario '{$scenario}' does not exists in your scenarios list, have you forgote to defined the '{$scenario}' in the scenarios() method?");
             } else {
                 $scenarioFields = $scenarios[$scenario];
             }
         }
         foreach ($fields as $field) {
             if (!isset($types[$field]) && !isset($extraTypes[$field])) {
                 throw new InvalidConfigException("The ngrest attribue '{$field}' does not exists in ngRestAttributeTypes() nor in ngRestExtraAttributeTypes() method.");
             }
             if ($scenario && !in_array($field, $scenarioFields)) {
                 throw new InvalidConfigException("The field '{$field}' does not exists in the scenario '{$scenario}'. You have to define them in the scenarios() method.");
             }
             if (isset($extraTypes[$field])) {
                 $typeField = 'extraField';
                 $definition = $extraTypes[$field];
             } else {
                 $typeField = 'field';
                 $definition = $types[$field];
             }
             $args = [];
             if (is_array($definition)) {
                 if (array_key_exists('class', $definition)) {
                     $method = $definition['class'];
                     unset($definition['class']);
                 } else {
                     $method = $config->prepandAdminPlugin($definition[0]);
                     $args = array_slice($definition, 1);
                 }
             } else {
                 $method = $config->prepandAdminPlugin($definition);
             }
             $config->{$type}->{$typeField}($field, $this->getAttributeLabel($field))->addPlugin($method, $args);
         }
     }
 }