Completed
Push — master ( 807973...39044b )
by Oleg
04:12
created

GetsGenerator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
ccs 0
cts 4
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 GetsGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28
        $this->dataProvider = $dataProvider;
29
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30
        $this->twig = new Environment($loader);
31
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39
    public function generate(): string
40
    {
41
        $file = new PhpFile();
42
        $file->setStrictTypes();
43
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45
        $namespace = $file->addNamespace($this->getNameSpace());
46
47
        $namespace->addUse('codecept\ApiTester');
48
        $namespace->addUse('Codeception\Util\HttpCode');
49
        $namespace->addUse($this->dataProvider->provide()['entityName']);
50
        if ($this->dataProvider->provide()['has_owner']) {
51
            $namespace->addUse('SlayerBirden\DataFlowServer\Domain\Entities\User');
52
        }
53
54
        $class = $namespace->addClass('GetsCest');
55
56
        $class->addMethod('_before')
57
            ->setParameters([
58
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
59
            ])
60
            ->setBody(
61
                $this->twig->load('Gets/before.template.twig')->render($this->dataProvider->provide())
62
            )
63
            ->setReturnType('void')
64
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
65
66
        $class->addMethod('getAll' . $this->dataProvider->provide()['pluralEntityName'])
67
            ->setParameters([
68
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
69
            ])
70
            ->setBody(
71
                $this->twig->load('Gets/get.all.template.twig')->render($this->dataProvider->provide())
72
            )
73
            ->setReturnType('void')
74
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
75
76
        $class->addMethod('getSecondPage' . $this->dataProvider->provide()['pluralEntityName'])
77
            ->setParameters([
78
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
79
            ])
80
            ->setBody(
81
                $this->twig->load('Gets/get.secondpage.template.twig')->render($this->dataProvider->provide())
82
            )
83
            ->setReturnType('void')
84
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
85
86
        $class->addMethod('getFiltered' . $this->dataProvider->provide()['pluralEntityName'])
87
            ->setParameters([
88
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
89
            ])
90
            ->setBody(
91
                $this->twig->load('Gets/get.filtered.template.twig')->render($this->dataProvider->provide())
92
            )
93
            ->setReturnType('void')
94
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
95
96
        $class->addMethod('getSorted' . $this->dataProvider->provide()['pluralEntityName'])
97
            ->setParameters([
98
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
99
            ])
100
            ->setBody(
101
                $this->twig->load('Gets/get.sorted.template.twig')->render($this->dataProvider->provide())
102
            )
103
            ->setReturnType('void')
104
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
105
106
        $class->addMethod('getNoResultsFiltered' . $this->dataProvider->provide()['pluralEntityName'])
107
            ->setParameters([
108
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
109
            ])
110
            ->setBody(
111
                $this->twig->load('Gets/get.noresfiltered.template.twig')->render($this->dataProvider->provide())
112
            )
113
            ->setReturnType('void')
114
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
115
116
        $class->addMethod('getWrongFiltered' . $this->dataProvider->provide()['pluralEntityName'])
117
            ->setParameters([
118
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
119
            ])
120
            ->setBody(
121
                $this->twig->load('Gets/get.wrongfiltered.template.twig')->render($this->dataProvider->provide())
122
            )
123
            ->setReturnType('void')
124
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
125
126
        return (new PsrPrinter())->printFile($file);
127
    }
128
129
    public function getClassName(): string
130
    {
131
        return $this->getNameSpace() . '\\' . 'GetsCest';
132
    }
133
134
    public function getFileName(): string
135
    {
136
        return sprintf(
137
            'tests/api/%s/%s/GetsCest.php',
138
            strtolower($this->dataProvider->provide()['moduleName']),
139
            $this->dataProvider->provide()['refName']
140
        );
141
    }
142
143
    private function getNameSpace(): string
144
    {
145
        return sprintf(
146
            'codecept\%s\%s',
147
            strtolower($this->dataProvider->provide()['moduleName']),
148
            $this->dataProvider->provide()['refName']
149
        );
150
    }
151
}
152