Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/symfonytest/symfonyconfigtest


https://github.com/symfonytest/symfonyconfigtest

symfony symfony-bundle

Last synced: 3 days ago
JSON representation

Awesome Lists containing this project

README

        

# Symfony Config Test

*By Matthias Noback and contributors*

[![Build Status](https://github.com/SymfonyTest/SymfonyConfigTest/actions/workflows/ci.yaml/badge.svg)](https://github.com/SymfonyTest/SymfonyConfigTest/actions/workflows/ci.yaml)

Writing configuration classes using the [Symfony Config
Component](https://symfony.com/doc/current/components/config/definition.html) can be quite hard. To help you verify the
validity of the resulting config node tree, this library provides a PHPUnit test case and some custom assertions.

## Installation

Using Composer:

composer require --dev matthiasnoback/symfony-config-test

## Usage

Create a test case and use the trait from ``Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait``.
Then implement ``getConfiguration()``:

```php
root('root');
$rootNode
->isRequired()
->children()
->scalarNode('required_value')
->isRequired()
->end()
->end();

return $treeBuilder;
}
}
```

When you provide an empty array as the value for this configuration, you would expect an exception since the
``required_value`` node is required. You can assert that a given set of configuration values is invalid using the
``assertConfigurationIsInvalid()`` method:

```php
assertConfigurationIsInvalid(
[
[] // no values at all
],
'required_value' // (part of) the expected exception message - optional
);
}
}
```

### Test processed configuration values

You may also want to verify that after processing an array of configuration values the result will be as expected:

```php
assertProcessedConfigurationEquals([
['required_value' => 'first value'],
['required_value' => 'last value']
], [
'required_value'=> 'last value'
]);
}
}
```

Please note: the first argument of each of the ``assert*`` methods is an *array of arrays*. The extra nesting level
allows you to test the merge process. See also the section [Merging
options](https://symfony.com/doc/current/components/config/definition.html#merging-options) of the Config Component
documentation.

### Test a subset of the configuration tree

Using this library it's possible to test just one branch of your configuration tree. Consider the following node tree
definition, which contains the branches `array_node_1` and `array_node_2`:

```php
root('root');
$rootNode
->children()
->arrayNode('array_node_1')
->isRequired()
->children()
->scalarNode('required_value_1')
->isRequired()
->end()
->end()
->end()
->arrayNode('array_node_2')
->isRequired()
->children()
->scalarNode('required_value_2')
->isRequired()
->end()
->end()
->end()
->end();

return $treeBuilder;
}
}
```

If you want to test, for instance, only the `array_node_1` branch from the example below, and ignore the `array_node_2`,
provide `array_node_1` as the argument for the `$breadcrumbPath` parameter of the test helper functions, for example:

```php
/**
* @test
*/
public function processed_configuration_for_array_node_1(): void
{
$this->assertProcessedConfigurationEquals(
[
['array_node_1' => ['required_value_1' => 'original value']],
['array_node_1' => ['required_value_1' => 'final value']]
],
[
'array_node_1' => [
'required_value_1' => 'final value'
]
],
// the path of the nodes you want to focus on in this test:
'array_node_1'
);
}
```

This would trigger no validation errors for any value in the `array_node_2` branch.

Note that the `$breadcrumbPath` can be even more specific, e.g. `"doctrine.orm"` (which would skip configuration
processing for branch `"doctrine.dbal"`, etc.).

Also note that you can only traverse over array nodes using the `.` in the breadcrumb path. The last part of the breadcrumb path can be any other type of node.

#### Test a subset of the prototyped configuration tree

You can traverse through prototype array nodes using `*` as its name in the breadcrumb path.

```php
root('root');
$rootNode
->children()
->arrayNode('array_node')
->useAttributeAsKey('name')
->prototype('array')
->children()
->scalarNode('default_value')->cannotBeEmpty()->defaultValue('foobar')->end()
->scalarNode('required_value')->isRequired()->end()
->end()
->end()
->end()
->end();

return $treeBuilder;
}
}
```

If you want to test whether `default_value` is set to `foobar` by default, but don't want the test to be affected by
requirements on `required_value` node, you can define its path as `array_node.*.default_value`, for example:

```php
/**
* @test
*/
public function processed_configuration_for_array_node_1(): void
{
$this->assertProcessedConfigurationEquals(
[
['array_node' => ['prototype_name' => null]],
],
[
'array_node' => [
'prototype_name' => [
'default_value' => 'foobar'
]
]
],
// the path of the nodes you want to focus on in this test:
'array_node.*.default_value'
);
}
```

## Version Guidance

| Version | Released | PHPUnit | Status |
|---------|--------------| ----------------------|------------|
| 5.x | Jun 2, 2023 | 9.6 and 10.x and 11.x | Latest |
| 4.x | Mar 5, 2018 | 7.x and 8.x and 9.x | Bugfixes |
| 3.x | Nov 30, 2017 | 6.x   | EOL |
| 2.x | Jun 18, 2016 | 4.x and 5.x | EOL |
| 1.x | Oct 12, 2014 | 3.x | EOL |