public function testIfWillValidateDbRefArrayOfDocumentsAndSkipNotUpdatableModels() { $model = new ModelWithDbRefArrayWithValidatorNotUpdatable(); $model->addresses[] = new EmbeddedModelWithValidator(); $model->addresses[] = new EmbeddedModelWithValidator(); $validator = new Validator($model); $result = $validator->validate(); codecept_debug($validator->getErrors()); // Should pass even when adress is not valid $this->assertTrue($result, 'That validation passed, even if db refs are not valid, as they are not updatable'); }
public function testIfWillValidateEmbeddedArrayOfDocuments() { $model = new ModelWithEmbedArrayWithValidator(); $model->addresses[] = new EmbeddedModelWithValidator(); $model->addresses[] = new EmbeddedModelWithValidator(); $validator = new Validator($model); $result = $validator->validate(); codecept_debug($validator->getErrors()); // Should fail $this->assertFalse($result, 'That model is not valid'); // Should fail too - one of two models has empty street $model->addresses[0]->street = 'Franklin St.'; $result2 = $validator->validate(); $this->assertFalse($result2, 'That model is not valid'); // Should pass $model->addresses[1]->street = 'Wall St.'; $result3 = $validator->validate(); $this->assertTrue($result3, 'That model is valid'); }
/** * Validate model, optionally only selected fields * @param string[] $fields * @return boolean */ public function validate($fields = []) { $valid = []; if (empty($fields)) { $fields = array_keys($this->meta->fields()); } foreach ($fields as $name) { $fieldMeta = $this->meta->field($name); // Reset errors $this->errors[$name] = []; // Check if meta for field exists if (empty($fieldMeta)) { throw new InvalidArgumentException(sprintf("Unknown field `%s` in model `%s`", $name, get_class($this->model))); } // Validate sub documents // Skip fields that are not updatable if ($fieldMeta->owned && $fieldMeta->updatable) { if (is_array($this->model->{$name})) { // Handle arrays of documents foreach ($this->model->{$name} as $model) { $validator = new Validator($model); $isValid = $validator->validate(); $valid[] = (int) $isValid; if (!$isValid) { $errors = $validator->getErrors(); $this->setErrors($errors); } } } elseif (!empty($this->model->{$name})) { // Handle single documents $validator = new Validator($this->model->{$name}); $isValid = $validator->validate(); $valid[] = (int) $isValid; if (!$isValid) { $errors = $validator->getErrors(); $this->setErrors($errors); } } } // Skip field without validators if (empty($fieldMeta->validators)) { continue; } $valid[] = (int) $this->validateEntity($name, $fieldMeta->validators); } // Model validators $typeValidators = $this->meta->type()->validators; if (!empty($typeValidators)) { $typeName = $this->meta->type()->name; // Reset errors $this->errors[$typeName] = []; $valid[] = (int) $this->validateEntity($typeName, $typeValidators); } return count($valid) === array_sum($valid); }