Completed
Push — master ( 39044b...ce5fed )
by Oleg
02:16
created

DeleteGenerator::getClassName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DFCodeGeneration\Generator\Tests\Api;
5
6
use Nette\PhpGenerator\ClassType;
7
use Nette\PhpGenerator\Parameter;
8
use Nette\PhpGenerator\PhpFile;
9
use Nette\PhpGenerator\PsrPrinter;
10
use SlayerBirden\DFCodeGeneration\Generator\DataProvider\DataProviderInterface;
11
use SlayerBirden\DFCodeGeneration\Generator\GeneratorInterface;
12
use Twig\Environment;
13
use Twig\Loader\FilesystemLoader;
14
15
final class DeleteGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26 2
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28 2
        $this->dataProvider = $dataProvider;
29 2
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30 2
        $this->twig = new Environment($loader);
31 2
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39 2
    public function generate(): string
40
    {
41 2
        $file = new PhpFile();
42 2
        $file->setStrictTypes();
43 2
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45 2
        $namespace = $file->addNamespace($this->getNameSpace());
46
47 2
        $namespace->addUse('codecept\ApiTester');
48 2
        $namespace->addUse('Codeception\Util\HttpCode');
49 2
        $namespace->addUse($this->dataProvider->provide()['entityName']);
50 2
        if ($this->dataProvider->provide()['has_owner']) {
51
            $namespace->addUse('SlayerBirden\DataFlowServer\Domain\Entities\User');
52
        }
53
54 2
        $class = $namespace->addClass('DeleteCest');
55
56 2
        $class->addMethod('_before')
57 2
            ->setParameters([
58 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
59
            ])
60 2
            ->setBody(
61 2
                $this->twig->load('Delete/before.template.twig')->render($this->dataProvider->provide())
62
            )
63 2
            ->setReturnType('void')
64 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
65
66 2
        $class->addMethod('delete' . $this->dataProvider->provide()['entityClassName'])
67 2
            ->setParameters([
68 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
69
            ])
70 2
            ->setBody(
71 2
                $this->twig->load('Delete/delete.template.twig')->render($this->dataProvider->provide())
72
            )
73 2
            ->setReturnType('void')
74 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
75
76 2
        $class->addMethod('deleteNonExisting' . $this->dataProvider->provide()['entityClassName'])
77 2
            ->setParameters([
78 2
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
79
            ])
80 2
            ->setBody(
81 2
                $this->twig->load('Delete/delete.nonexisting.template.twig')->render($this->dataProvider->provide())
82
            )
83 2
            ->setReturnType('void')
84 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
85
86 2
        if ($this->dataProvider->provide()['has_owner']) {
87
            $class->addMethod('deleteSomeoneElses' . $this->dataProvider->provide()['entityClassName'])
88
                ->setParameters([
89
                    (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
90
                ])
91
                ->setBody(
92
                    $this->twig->load('Delete/delete.someoneeleses.template.twig')
93
                        ->render($this->dataProvider->provide())
94
                )
95
                ->setReturnType('void')
96
                ->setVisibility(ClassType::VISIBILITY_PUBLIC);
97
        }
98
99 2
        return (new PsrPrinter())->printFile($file);
100
    }
101
102
    public function getClassName(): string
103
    {
104
        return $this->getNameSpace() . '\\' . 'DeleteCest';
105
    }
106
107 2
    public function getFileName(): string
108
    {
109 2
        return sprintf(
110 2
            'tests/api/%s/%s/DeleteCest.php',
111 2
            strtolower($this->dataProvider->provide()['moduleName']),
112 2
            $this->dataProvider->provide()['refName']
113
        );
114
    }
115
116 2
    private function getNameSpace(): string
117
    {
118 2
        return sprintf(
119 2
            'codecept\%s\%s',
120 2
            strtolower($this->dataProvider->provide()['moduleName']),
121 2
            $this->dataProvider->provide()['refName']
122
        );
123
    }
124
}
125