Passed
Push — test ( d838cf...cef4a5 )
by Tom
03:29
created

EnvResolverTest   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 147
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 80
dl 0
loc 147
rs 10
c 0
b 0
f 0
wmc 11

11 Methods

Rating   Name   Duplication   Size   Complexity  
A testAddArgs() 0 14 1
A testAddFileIfExists2() 0 5 1
A testAddLines() 0 19 1
A testResolveString() 0 14 1
A testAddFileIfExists1() 0 5 1
A testStringResolver() 0 32 1
A testInvalidDefinition() 0 7 1
A testAddFile() 0 10 1
A testAddInvalidFile() 0 7 1
A testCreation() 0 4 1
A testGetValue() 0 4 1
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Runner;
6
7
use Ktomk\Pipelines\Cli\Args;
8
use Ktomk\Pipelines\TestCase;
9
10
/**
11
 * Class EnvResolverTest
12
 *
13
 * @covers \Ktomk\Pipelines\Runner\EnvResolver
14
 */
15
class EnvResolverTest extends TestCase
16
{
17
    public function testCreation()
18
    {
19
        $resolver = new EnvResolver(array('UID' => '1000'));
20
        self::assertInstanceOf('Ktomk\Pipelines\Runner\EnvResolver', $resolver);
21
    }
22
23
    public function testGetValue()
24
    {
25
        $resolver = new EnvResolver(array('UID' => '1000'));
26
        self::assertNull($resolver->getValue('UID'));
27
    }
28
29
    public function testAddArgs()
30
    {
31
        $resolver = new EnvResolver(array('UID' => '1000'));
32
        $args = new Args(array(
33
            '-env', 'OVERRIDE=red', '-e', 'OVERRIDE=green',
34
            '--env-file', 'test/data/env/test.env', '-e', 'UID',
35
            '-e', 'MOCHA',
36
        ));
37
        $resolver->addArguments($args);
38
        self::assertSame('annabelle', $resolver->getValue('USER'));
39
        self::assertSame('green', $resolver->getValue('OVERRIDE'));
40
        self::assertNull($resolver->getValue('DECAFFEINATED'));
41
        self::assertSame('1000', $resolver->getValue('UID'), 'exported variable');
42
        self::assertNull($resolver->getValue('MOCHA'), 'unset, file override');
43
    }
44
45
    public function testAddLines()
46
    {
47
        $lines = array(
48
            '# comment',
49
            'DOCKER_ID_USER',
50
            'DOCKER_ID_PASSWORD',
51
            '[email protected]',
52
        );
53
        $resolver = new EnvResolver(array('DOCKER_ID_USER' => 'electra'));
54
        $resolver->addLines($lines);
55
56
        $actual = $resolver->getValue('DOCKER_ID_PASSWORD');
57
        self::assertNull($actual, 'non-existing environment variable');
58
59
        $actual = $resolver->getValue('DOCKER_ID_USER');
60
        self::assertSame('electra', $actual, 'existing variable');
61
62
        $actual = $resolver->getValue('DOCKER_ID_EMAIL');
63
        self::assertSame('[email protected]', $actual, 'set variable');
64
    }
65
66
    public function testAddFile()
67
    {
68
        $resolver = new EnvResolver(array('DOCKER_ID_USER' => 'electra'));
69
        $resolver->addFile(__DIR__ . '/../../../.env.dist');
70
71
        $actual = $resolver->getValue('DOCKER_ID_PASSWORD');
72
        self::assertNull($actual, 'non-existing environment variable');
73
74
        $actual = $resolver->getValue('DOCKER_ID_USER');
75
        self::assertSame('electra', $actual, 'existing variable');
76
    }
77
78
    /**
79
     */
80
    public function testAddInvalidFile()
81
    {
82
        $this->expectException('InvalidArgumentException');
83
        $this->expectExceptionMessage('File read error: \'/abc/xyz/nada-kar-la-da\'');
84
85
        $resolver = new EnvResolver(array('UID' => '1000'));
86
        @$resolver->addFile('/abc/xyz/nada-kar-la-da');
0 ignored issues
show
Bug introduced by
Are you sure the usage of $resolver->addFile('/abc/xyz/nada-kar-la-da') targeting Ktomk\Pipelines\Runner\EnvResolver::addFile() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Security Best Practice introduced by
It seems like you do not handle an error condition for addFile(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

86
        /** @scrutinizer ignore-unhandled */ @$resolver->addFile('/abc/xyz/nada-kar-la-da');

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
87
    }
88
89
    public function testAddFileIfExists1()
90
    {
91
        $resolver = new EnvResolver(array('UID' => '1000'));
92
        $resolver->addFileIfExists('/abc/xyz/nada-kar-la-da');
93
        self::assertNull($resolver->getValue('UID'));
94
    }
95
96
    public function testAddFileIfExists2()
97
    {
98
        $resolver = new EnvResolver(array('UID' => '1000'));
99
        $resolver->addFileIfExists(__DIR__ . '/../../data/env/test.env');
100
        self::assertNull($resolver->getValue('UID'));
101
    }
102
103
    /**
104
     */
105
    public function testInvalidDefinition()
106
    {
107
        $this->expectException('InvalidArgumentException');
108
        $this->expectExceptionMessage('Variable definition error: \'$\'');
109
110
        $resolver = new EnvResolver(array('UID' => '1000'));
111
        $resolver->addDefinition('$');
112
    }
113
114
    public function testResolveString()
115
    {
116
        $resolver = new EnvResolver(array('UID' => '1000'));
117
118
        $actual = $resolver->resolveString('UID');
119
        self::assertSame('UID', $actual, 'no variable');
120
121
        $actual = $resolver->resolveString('$UID');
122
        self::assertSame('', $actual, 'undefined variable');
123
124
        $resolver->addDefinition('UID');
125
126
        $actual = $resolver->resolveString('$UID');
127
        self::assertSame('1000', $actual, 'defined variable');
128
    }
129
130
    public function testStringResolver()
131
    {
132
        $resolver = new EnvResolver(array('UID' => '1000'));
133
        $resolver->addDefinition('UID');
134
        $resolver->addDefinition('GOO_711=55');
135
        $resolver->addDefinition('G=TOP');
136
        $input = array(
137
            'foo' => 'UID',
138
            'bar' => '$BAR',
139
            'baz' => 'baz',
140
            'uid' => '$UID',
141
            'goo' => '$GOO_711',
142
            'g' => '$G',
143
        );
144
        $expected = array(
145
            'foo' => 'UID',
146
            'bar' => '',
147
            'baz' => 'baz',
148
            'uid' => '1000',
149
            'goo' => '55',
150
            'g' => 'TOP',
151
        );
152
153
        self::assertIsCallable($resolver);
154
155
        # string mode
156
        $actual = array_map($resolver, $input);
157
        self::assertSame($expected, $actual);
158
159
        # array mode
160
        $actual = $resolver($input);
161
        self::assertSame($expected, $actual);
162
    }
163
}
164