Passed
Push — master ( 9d91f5...63d5b5 )
by Bukashk0zzz
13:08
created

AbstractGeneratorTest::createOffers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 37
rs 9.328
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
/*
4
 * This file is part of the Bukashk0zzzYmlGenerator
5
 *
6
 * (c) Denis Golubovskiy <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Bukashk0zzz\YmlGenerator\Tests;
13
14
use Bukashk0zzz\YmlGenerator\Generator;
15
use Bukashk0zzz\YmlGenerator\Model\Category;
16
use Bukashk0zzz\YmlGenerator\Model\Currency;
17
use Bukashk0zzz\YmlGenerator\Model\Delivery;
18
use Bukashk0zzz\YmlGenerator\Model\ShopInfo;
19
use Bukashk0zzz\YmlGenerator\Settings;
20
use Faker\Factory as Faker;
21
22
/**
23
 * Abstract Generator test
24
 */
25
abstract class AbstractGeneratorTest extends \PHPUnit_Framework_TestCase
26
{
27
    /**
28
     * @var \Faker\Generator
29
     */
30
    protected $faker;
31
32
    /**
33
     * @var Settings
34
     */
35
    protected $settings;
36
37
    /**
38
     * @var ShopInfo
39
     */
40
    protected $shopInfo;
41
42
    /**
43
     * @var array
44
     */
45
    protected $currencies;
46
47
    /**
48
     * @var array
49
     */
50
    protected $categories;
51
52
    /**
53
     * @var array
54
     */
55
    protected $deliveries;
56
57
    /**
58
     * @var string
59
     */
60
    protected $offerType;
61
62
    /**
63
     * Test setup
64
     */
65
    protected function setUp()
66
    {
67
        $this->faker = Faker::create();
68
69
        $this->settings = $this->createSettings();
70
        $this->shopInfo = $this->createShopInfo();
71
        $this->currencies = $this->createCurrencies();
72
        $this->categories = $this->createCategories();
73
        $this->deliveries = $this->createDeliveries();
74
    }
75
76
    /**
77
     * @return \Bukashk0zzz\YmlGenerator\Model\Offer\AbstractOffer
78
     */
79
    abstract protected function createOffer();
80
81
    /**
82
     * Produces an XML file and writes to $this->settings->getOutputFile()
83
     */
84
    protected function generateFile()
85
    {
86
        static::assertTrue((new Generator($this->settings))->generate(
87
            $this->shopInfo,
88
            $this->currencies,
89
            $this->categories,
90
            $this->createOffers(),
91
            $this->deliveries
92
        ));
93
    }
94
95
    /**
96
     * Test generation
97
     */
98
    protected function runGeneratorTest()
99
    {
100
        $this->generateFile();
101
        $this->validateFileWithDtd();
102
    }
103
104
    /**
105
     * @return array
106
     */
107
    protected function createOffers()
108
    {
109
        $offers = [];
110
        foreach (\range(1, 2) as $id) {
111
            $offers[] = $this
112
                ->createOffer()
113
                ->setId($id)
114
                ->setAvailable($this->faker->boolean)
115
                ->setUrl($this->faker->url)
116
                ->setPrice($this->faker->numberBetween(1, 9999))
117
                ->setOldPrice($this->faker->numberBetween(1, 9999))
118
                ->setPurchasePrice($this->faker->numberBetween(1, 9999))
119
                ->setWeight($this->faker->numberBetween(1, 9999))
120
                ->setDimensions(
121
                    $this->faker->randomFloat(3, 0),
122
                    $this->faker->randomFloat(3, 0),
123
                    $this->faker->randomFloat(3, 0)
124
                )
125
                ->setCurrencyId('UAH')
126
                ->setCategoryId($id)
127
                ->setDelivery($this->faker->boolean)
128
                ->setLocalDeliveryCost($this->faker->numberBetween(1, 9999))
129
                ->setDescription($this->faker->sentence)
130
                ->setSalesNotes($this->faker->text(45))
131
                ->setManufacturerWarranty($this->faker->boolean)
132
                ->setCountryOfOrigin('Украина')
133
                ->setDownloadable($this->faker->boolean)
134
                ->setAdult($this->faker->boolean)
135
                ->setMarketCategory($this->faker->word)
136
                ->setCpa($this->faker->numberBetween(0, 1))
137
                ->setBarcodes([$this->faker->ean13, $this->faker->ean13])
138
                ->setAutoDiscount($this->faker->boolean)
139
            ;
140
        }
141
142
        return $offers;
143
    }
144
145
    /**
146
     * Validate yml file using dtd
147
     */
148
    private function validateFileWithDtd()
149
    {
150
        $systemId = 'data://text/plain;base64,'.\base64_encode(\file_get_contents(__DIR__.'/dtd/'.$this->offerType.'.dtd'));
151
        $root = 'yml_catalog';
152
153
        $ymlFile = new \DOMDocument();
154
        $ymlFile->loadXML(\file_get_contents($this->settings->getOutputFile()));
155
156
        $creator = new \DOMImplementation();
157
        $ymlFileWithDtd = $creator->createDocument(null, null, $creator->createDocumentType($root, null, $systemId));
158
        $ymlFileWithDtd->encoding = 'windows-1251';
159
160
        $oldNode = $ymlFile->getElementsByTagName($root)->item(0);
161
        $newNode = $ymlFileWithDtd->importNode($oldNode, true);
162
        $ymlFileWithDtd->appendChild($newNode);
163
164
        try {
165
            static::assertTrue($ymlFileWithDtd->validate());
166
        } catch (\Exception $exception) {
167
            echo $exception->getMessage();
168
            static::fail('YML file not valid');
169
        }
170
    }
171
172
    /**
173
     * @return Settings
174
     */
175
    private function createSettings()
176
    {
177
        return (new Settings())
178
            ->setOutputFile(\tempnam(\sys_get_temp_dir(), 'YMLGeneratorTest'))
179
            ->setEncoding('utf-8')
180
            ->setIndentString("\t")
181
        ;
182
    }
183
184
    /**
185
     * @return ShopInfo
186
     */
187
    private function createShopInfo()
188
    {
189
        return (new ShopInfo())
190
            ->setName($this->faker->name)
191
            ->setCompany($this->faker->company)
192
            ->setUrl($this->faker->url)
193
            ->setPlatform($this->faker->name)
194
            ->setVersion($this->faker->numberBetween(1, 999))
195
            ->setAgency($this->faker->name)
196
            ->setEmail($this->faker->email)
197
            ->setAutoDiscount($this->faker->boolean)
198
        ;
199
    }
200
201
    /**
202
     * @return array
203
     */
204
    private function createCurrencies()
205
    {
206
        $currencies = [];
207
        $currencies[] = (new Currency())
208
            ->setId('UAH')
209
            ->setRate(1)
210
        ;
211
212
        return $currencies;
213
    }
214
215
    /**
216
     * @return array
217
     */
218
    private function createCategories()
219
    {
220
        $categories = [];
221
        $categories[] = (new Category())
222
            ->setId(1)
223
            ->setName($this->faker->name)
224
        ;
225
226
        $categories[] = (new Category())
227
            ->setId(2)
228
            ->setParentId(1)
229
            ->setName($this->faker->name)
230
        ;
231
232
        return $categories;
233
    }
234
235
    /**
236
     * @return array
237
     */
238
    private function createDeliveries()
239
    {
240
        $deliveries = [];
241
        $deliveries[] = (new Delivery())
242
            ->setCost(1)
243
            ->setDays(2);
244
245
        $deliveries[] = (new Delivery())
246
            ->setCost(2)
247
            ->setDays(1)
248
            ->setOrderBefore(14);
249
250
        return $deliveries;
251
    }
252
}
253