Passed
Push — master ( 6f905d...2edd34 )
by Oleg
02:55
created

Add::getSuccessCase()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 0
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
ccs 4
cts 4
cp 1
crap 1
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 Add extends AbstractTest
12
{
13 1
    public function generate(): string
14
    {
15 1
        $class = new ClassGenerator($this->getClassName());
16
17 1
        $class->addMethodFromGenerator(
18 1
            (new MethodGenerator('_before'))
19 1
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
20 1
                ->setBody($this->generateHaveInRepo())
21
        );
22
23 1
        $class->addMethodFromGenerator(
24 1
            (new MethodGenerator('addEntity'))
25 1
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
26 1
                ->setBody($this->getSuccessCase())
27
        );
28
29 1
        $class->addMethodFromGenerator(
30 1
            (new MethodGenerator('addInvalidEntity'))
31 1
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
32 1
                ->setBody($this->getValidationCase())
33
        );
34
35 1
        $class->addMethodFromGenerator(
36 1
            (new MethodGenerator('addFailedConstraintEntity'))
37 1
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
38 1
                ->setBody($this->getUniqueConstraintCase())
39
        );
40
41 1
        return (new FileGenerator())
42 1
            ->setClass($class)
43 1
            ->generate();
44
    }
45
46 1
    private function getSuccessCase(): string
47
    {
48
        $body = <<<'BODY'
49 1
$I->wantTo('create %1$s');
50
$I->haveHttpHeader('Content-Type', 'application/json');
51
$I->sendPOST('/%1$s', %2$s);
52
$I->seeResponseCodeIs(HttpCode::OK);
53
$I->seeResponseContainsJson([
54
    'success' => true,
55
    'data' => [
56
        '%1$s' => %2$s
57
    ]
58
]);
59
BODY;
60
61 1
        $provider = $this->entityProviderFactory->create($this->entityClassName);
62
63 1
        return sprintf($body, $provider->getShortName(), var_export($provider->getPostParams(), true));
64
    }
65
66 1
    private function getValidationCase(): string
67
    {
68 1
        $provider = $this->entityProviderFactory->create($this->entityClassName);
69 1
        $params = $provider->getPostParams();
70 1
        if (count($params) > 0) {
71
            $body = <<<'BODY'
72 1
$I->wantTo('create incomplete %1$s');
73
$I->haveHttpHeader('Content-Type', 'application/json');
74
$I->sendPOST('/%1$s', %2$s);
75
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
76
$I->seeResponseContainsJson([
77
    'success' => false,
78
    'data' => [
79
        'validation' => %3$s
80
    ]
81
]);
82
BODY;
83
84 1
            $validation = [];
85 1
            foreach ($params as $key => $val) {
86 1
                $validation[] = [
87 1
                    'field' => $key
88
                ];
89 1
                unset($params[$key]);
90 1
                break;
91
            }
92 1
            return sprintf($body, $provider->getShortName(), var_export($params, true), var_export($validation, true));
93
        } else {
94
            return '//TODO add validation case';
95
        }
96
    }
97
98 1
    private function getUniqueConstraintCase(): string
99
    {
100 1
        if (!$this->getLatestProvider()->hasUnique()) {
101
            return '//TODO add unique case';
102
        }
103
104 1
        $params = $this->getHaveInRepoParams();
105 1
        foreach ($params as $key => $param) {
106 1
            if (is_object($param) && method_exists($param, 'getId')) {
107 1
                $params[$key] = $param->getId();
108
            }
109
        }
110
111
        $body = <<<'BODY'
112 1
$I->wantTo('create %1$s with failed constraint');
113
$I->haveHttpHeader('Content-Type', 'application/json');
114
$I->sendPOST('/%1$s', %2$s);
115
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
116
$I->seeResponseContainsJson([
117
    'success' => false,
118
]);
119
BODY;
120
121 1
        return sprintf($body, $this->getLatestProvider()->getShortName(), var_export($params, true));
122
    }
123
124 1
    public function getClassName(): string
125
    {
126 1
        return 'Add' . $this->getLatestProvider()->getBaseName() . 'Cest';
127
    }
128
}
129