Completed
Push — master ( 6ffec3...6f905d )
by Oleg
06:32
created

Update::getSuccessCase()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 0
dl 0
loc 19
ccs 0
cts 5
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DFCodeGeneration\Generator\Tests;
5
6
use Zend\Code\Generator\ClassGenerator;
7
use Zend\Code\Generator\FileGenerator;
8
use Zend\Code\Generator\MethodGenerator;
9
use Zend\Code\Generator\ParameterGenerator;
10
11
class Update extends AbstractTest
12
{
13
    public function generate(): string
14
    {
15
        $class = new ClassGenerator($this->getClassName());
16
17
        $class->addMethodFromGenerator(
18
            (new MethodGenerator('_before'))
19
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
20
                ->setBody($this->generateHaveInRepo(2))
21
        );
22
23
        $class->addMethodFromGenerator(
24
            (new MethodGenerator('updateEntity'))
25
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
26
                ->setBody($this->getSuccessCase())
27
        );
28
29
        $class->addMethodFromGenerator(
30
            (new MethodGenerator('updateNonExistingEntity'))
31
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
32
                ->setBody($this->getNonExistingCase())
33
        );
34
35
        $class->addMethodFromGenerator(
36
            (new MethodGenerator('updateSetIdEntity'))
37
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
38
                ->setBody($this->getUpdateSetIdCase())
39
        );
40
41
        $class->addMethodFromGenerator(
42
            (new MethodGenerator('updateInvalidInput'))
43
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
44
                ->setBody($this->getInvalidInputCase())
45
        );
46
47
        $class->addMethodFromGenerator(
48
            (new MethodGenerator('updateFailedConstraint'))
49
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
50
                ->setBody($this->getUniqueConstraintCase())
51
        );
52
53
        return (new FileGenerator())
54
            ->setClass($class)
55
            ->generate();
56
    }
57
58
    private function getSuccessCase(): string
59
    {
60
        $body = <<<'BODY'
61
$I->wantTo('update %1$s');
62
$I->haveHttpHeader('Content-Type', 'application/json');
63
$I->sendPUT('/%1$s/%2$d', %3$s);
64
$I->seeResponseCodeIs(HttpCode::OK);
65
$I->seeResponseContainsJson([
66
    'success' => true,
67
    'data' => [
68
        '%1$s' => %3$s
69
    ]
70
]);
71
BODY;
72
73
        $provider = $this->entityProviderFactory->create($this->entityClassName);
74
75
        return sprintf($body, $provider->getShortName(), $this->getLatestProvider()->getId(),
76
            var_export($provider->getPostParams(), true));
77
    }
78
79
    private function getNonExistingCase(): string
80
    {
81
        $body = <<<'BODY'
82
$I->wantTo('update non existing %1$s');
83
$I->haveHttpHeader('Content-Type', 'application/json');
84
$I->sendPUT('/%1$s/0', %2$s);
85
$I->seeResponseCodeIs(HttpCode::NOT_FOUND);
86
$I->seeResponseContainsJson([
87
    'success' => false,
88
    'data' => [
89
        '%1$s' => null
90
    ]
91
]);
92
BODY;
93
94
        $provider = $this->entityProviderFactory->create($this->entityClassName);
95
96
        return sprintf($body, $provider->getShortName(), var_export($provider->getPostParams(), true));
97
    }
98
99
    private function getUpdateSetIdCase(): string
100
    {
101
        $body = <<<'BODY'
102
$I->wantTo('update %1$s and attempt to set id');
103
$I->haveHttpHeader('Content-Type', 'application/json');
104
$I->sendPUT('/%1$s/%4$d', %2$s);
105
$I->seeResponseCodeIs(HttpCode::OK);
106
$I->seeResponseContainsJson([
107
    'success' => true,
108
    'data' => [
109
        '%1$s' => %3$s
110
    ]
111
]);
112
BODY;
113
        $first = reset($this->providers);
114
        $last = end($this->providers);
115
116
117
        $provider = $this->entityProviderFactory->create($this->entityClassName);
118
        $paramsWithId = $provider->getPostParams();
119
        $paramsWithId['id'] = $last->getId();
120
121
        $expected = $provider->getPostParams();
122
        $expected['id'] = $first->getId();
123
124
        return sprintf($body, $provider->getShortName(), var_export($paramsWithId, true), var_export($expected, true),
125
            $first->getId());
126
    }
127
128
    private function getInvalidInputCase(): string
129
    {
130
        $provider = $this->entityProviderFactory->create($this->entityClassName);
131
        $params = $provider->getPostParams();
132
        if (count($params) > 0) {
133
            $body = <<<'BODY'
134
$I->wantTo('update %1$s set invalid input');
135
$I->haveHttpHeader('Content-Type', 'application/json');
136
$I->sendPUT('/%1$s/%4$d', %2$s);
137
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
138
$I->seeResponseContainsJson([
139
    'success' => false,
140
    'data' => [
141
        'validation' => %3$s
142
    ]
143
]);
144
BODY;
145
146
            $validation = [];
147
            foreach ($params as $key => $val) {
148
                $validation[] = [
149
                    'field' => $key
150
                ];
151
                unset($params[$key]);
152
                break;
153
            }
154
            return sprintf($body, $provider->getShortName(), var_export($params, true), var_export($validation, true),
155
                $this->getLatestProvider()->getId());
156
        } else {
157
            return '//TODO add validation case';
158
        }
159
    }
160
161
    private function getUniqueConstraintCase(): string
162
    {
163
        if (!$this->getLatestProvider()->hasUnique()) {
164
            return '//TODO add unique case';
165
        }
166
167
        $params = $this->getHaveInRepoParams();
168
169
        $body = <<<'BODY'
170
$I->wantTo('update %1$s, fail constraint');
171
$I->haveHttpHeader('Content-Type', 'application/json');
172
$I->sendPUT('/%1$s/%3$d', %2$s);
173
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
174
$I->seeResponseContainsJson([
175
    'success' => false,
176
]);
177
BODY;
178
179
        return sprintf($body, $this->getLatestProvider()->getShortName(), var_export($params, true),
180
            $this->getLatestProvider()->getId());
181
    }
182
183
    public function getClassName(): string
184
    {
185
        return 'Update' . $this->getLatestProvider()->getBaseName() . 'Cest';
186
    }
187
}
188