Completed
Push — master ( 81ce9d...1672d9 )
by Oleg
03:54
created

Add   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Test Coverage

Coverage 97.96%

Importance

Changes 0
Metric Value
dl 0
loc 116
ccs 48
cts 49
cp 0.9796
rs 10
c 0
b 0
f 0
wmc 11

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getSuccessCase() 0 18 1
B getValidationCase() 0 29 3
A getClassName() 0 3 1
B generate() 0 31 1
B getUniqueConstraintCase() 0 24 5
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 3
    public function generate(): string
14
    {
15 3
        $class = new ClassGenerator($this->getClassName());
16
17 3
        $class->addMethodFromGenerator(
18 3
            (new MethodGenerator('_before'))
19 3
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
20 3
                ->setBody($this->generateHaveInRepo())
21
        );
22
23 3
        $class->addMethodFromGenerator(
24 3
            (new MethodGenerator('addEntity'))
25 3
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
26 3
                ->setBody($this->getSuccessCase())
27
        );
28
29 3
        $class->addMethodFromGenerator(
30 3
            (new MethodGenerator('addInvalidEntity'))
31 3
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
32 3
                ->setBody($this->getValidationCase())
33
        );
34
35 3
        $class->addMethodFromGenerator(
36 3
            (new MethodGenerator('addFailedConstraintEntity'))
37 3
                ->setParameter((new ParameterGenerator('I'))->setType('\ApiTester'))
38 3
                ->setBody($this->getUniqueConstraintCase())
39
        );
40
41 3
        return (new FileGenerator())
42 3
            ->setClass($class)
43 3
            ->generate();
44
    }
45
46 3
    private function getSuccessCase(): string
47
    {
48
        $body = <<<'BODY'
49 3
$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 3
        $provider = $this->entityProviderFactory->create($this->entityClassName);
62
63 3
        return sprintf($body, $provider->getShortName(), var_export($provider->getPostParams(), true));
64
    }
65
66 3
    private function getValidationCase(): string
67
    {
68 3
        $provider = $this->entityProviderFactory->create($this->entityClassName);
69 3
        $params = $provider->getPostParams();
70 3
        if (count($params) > 0) {
71
            $body = <<<'BODY'
72 3
$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 3
            $validation = [];
85 3
            foreach ($params as $key => $val) {
86 3
                $validation[] = [
87 3
                    'field' => $key
88
                ];
89 3
                unset($params[$key]);
90 3
                break;
91
            }
92 3
            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 3
    private function getUniqueConstraintCase(): string
99
    {
100 3
        if (!$this->getLatestProvider()->hasUnique()) {
101 2
            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 3
    public function getClassName(): string
125
    {
126 3
        return 'Add' . $this->getLatestProvider()->getBaseName() . 'Cest';
127
    }
128
}
129