Completed
Pull Request — 4.0 (#4527)
by chihiro
05:24
created

EA10PluginCest::test_template_overwrite()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 30
rs 9.44
c 0
b 0
f 0
1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.ec-cube.co.jp/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
use Codeception\Util\FileSystem;
15
use Codeception\Util\Fixtures;
16
use Doctrine\ORM\EntityManager;
17
use Eccube\Common\EccubeConfig;
18
use Eccube\Entity\Plugin;
19
use Eccube\Repository\PluginRepository;
20
use Page\Admin\CacheManagePage;
21
use Page\Admin\PluginLocalInstallPage;
22
use Page\Admin\PluginManagePage;
23
use Page\Admin\PluginSearchPage;
24
25
class EA10PluginCest
26
{
27
    /** @var EntityManager */
28
    private $em;
29
30
    /** @var \Doctrine\DBAL\Connection */
31
    private $conn;
32
33
    /** @var PluginRepository */
34
    private $pluginRepository;
35
36
    /** @var EccubeConfig */
37
    private $config;
38
39
    public function _before(\AcceptanceTester $I)
40
    {
41
        $I->loginAsAdmin();
42
43
        $this->em = Fixtures::get('entityManager');
44
        $this->conn = $this->em->getConnection();
45
        $this->pluginRepository = $this->em->getRepository(Plugin::class);
46
        $this->config = Fixtures::get('config');
47
        FileSystem::doEmptyDir('repos');
48
    }
49
50
    public function test_install_enable_disable_remove_store(\AcceptanceTester $I)
51
    {
52
        Horizon_Store::start($I)
53
            ->インストール()
54
            ->有効化()
55
            ->無効化()
56
            ->削除();
57
    }
58
59
    public function test_install_enable_disable_remove_local(\AcceptanceTester $I)
60
    {
61
        Horizon_Store::start($I)
62
            ->インストール()
63
            ->有効化()
64
            ->無効化()
65
            ->削除();
66
    }
67
68
    public function test_install_enable_disable_enable_disable_remove_store(\AcceptanceTester $I)
69
    {
70
        Horizon_Store::start($I)
71
            ->インストール()
72
            ->有効化()
73
            ->無効化()
74
            ->有効化()
75
            ->無効化()
76
            ->削除();
77
    }
78
79
    public function test_install_enable_disable_enable_disable_remove_local(\AcceptanceTester $I)
80
    {
81
        Horizon_Local::start($I)
82
            ->インストール()
83
            ->有効化()
84
            ->無効化()
85
            ->有効化()
86
            ->無効化()
87
            ->削除();
88
    }
89
90
    public function test_install_remove_local(\AcceptanceTester $I)
91
    {
92
        Horizon_Local::start($I)
93
            ->インストール()
94
            ->削除();
95
    }
96
97
    public function test_install_remove_store(\AcceptanceTester $I)
98
    {
99
        Horizon_Store::start($I)
100
            ->インストール()
101
            ->削除();
102
    }
103
104
    public function test_install_update_remove_store(\AcceptanceTester $I)
105
    {
106
        Horizon_Store::start($I)
107
            ->インストール()
108
            ->アップデート()
109
            ->削除();
110
    }
111
112
    public function test_install_update_remove_local(\AcceptanceTester $I)
113
    {
114
        Horizon_Local::start($I)
115
            ->インストール()
116
            ->アップデート()
117
            ->削除();
118
    }
119
120
    public function test_install_enable_disable_update_enable_disable_remove_local(\AcceptanceTester $I)
121
    {
122
        Horizon_Local::start($I)
123
            ->インストール()
124
            ->有効化()
125
            ->無効化()
126
            ->アップデート()
127
            ->有効化()
128
            ->無効化()
129
            ->削除();
130
    }
131
132
    public function test_install_enable_disable_update_enable_disable_remove_store(\AcceptanceTester $I)
133
    {
134
        Horizon_Store::start($I)
135
            ->インストール()
136
            ->有効化()
137
            ->無効化()
138
            ->アップデート()
139
            ->有効化()
140
            ->無効化()
141
            ->削除();
142
    }
143
144
    public function test_install_enable_update_disable_remove_store(\AcceptanceTester $I)
145
    {
146
        Horizon_Store::start($I)
147
            ->インストール()
148
            ->有効化()
149
            ->アップデート()
150
            ->削除();
151
    }
152
153
    public function test_install_enable_update_disable_remove_local(\AcceptanceTester $I)
154
    {
155
        Horizon_Local::start($I)
156
            ->インストール()
157
            ->有効化()
158
            ->アップデート()
159
            ->無効化()
160
            ->削除();
161
    }
162
163
    public function test_install_update_enable_disable_remove_local(\AcceptanceTester $I)
164
    {
165
        Horizon_Local::start($I)
166
            ->インストール()
167
            ->アップデート()
168
            ->有効化()
169
            ->無効化()
170
            ->削除();
171
    }
172
173
    public function test_install_update_enable_disable_remove_store(\AcceptanceTester $I)
174
    {
175
        Horizon_Store::start($I)
176
            ->インストール()
177
            ->アップデート()
178
            ->有効化()
179
            ->無効化()
180
            ->削除();
181
    }
182
183
    public function test_install_enable_enable(\AcceptanceTester $I)
184
    {
185
        Horizon_Store::start($I)
186
            ->インストール()
187
            ->新しいタブで開く()
188
            ->有効化()
189
            ->前のタブに戻る()
190
            ->既に有効なものを有効化();
191
    }
192
193
    public function test_install_disable_disable(\AcceptanceTester $I)
194
    {
195
        Horizon_Store::start($I)
196
            ->インストール()
197
            ->有効化()
198
            ->新しいタブで開く()
199
            ->無効化()
200
            ->前のタブに戻る()
201
            ->既に無効なものを無効化();
202
    }
203
204
    public function test_install_assets_local(\AcceptanceTester $I)
205
    {
206
        $this->publishPlugin('Assets-1.0.0.tgz');
207
208
        $assetsPath = $this->config['plugin_html_realdir'].'/Assets/assets/assets.js';
209
        $updatedPath = $this->config['plugin_html_realdir'].'/Assets/assets/updated.js';
210
211
        $I->assertFileNotExists($assetsPath);
212
        $I->assertFileNotExists($updatedPath);
213
214
        $ManagePage = PluginLocalInstallPage::go($I)->アップロード('plugins/Assets-1.0.0.tgz');
215
        $I->assertFileExists($assetsPath);
216
        $I->assertFileNotExists($updatedPath);
217
218
        $ManagePage->独自プラグイン_有効化('Assets');
219
        $I->assertFileExists($assetsPath);
220
        $I->assertFileNotExists($updatedPath);
221
222
        $ManagePage->独自プラグイン_無効化('Assets');
223
        $I->assertFileExists($assetsPath);
224
        $I->assertFileNotExists($updatedPath);
225
226
        $ManagePage->独自プラグイン_アップデート('Assets', 'plugins/Assets-1.0.1.tgz');
227
        $I->assertFileExists($assetsPath);
228
        $I->assertFileExists($updatedPath);
229
230
        $ManagePage->独自プラグイン_削除('Assets');
231
        $I->assertFileNotExists($assetsPath);
232
        $I->assertFileNotExists($updatedPath);
233
    }
234
235
    public function test_install_assets_store(\AcceptanceTester $I)
236
    {
237
        // 最初のバージョンを作成
238
        $this->publishPlugin('Assets-1.0.0.tgz');
239
240
        $assetsPath = $this->config['plugin_html_realdir'].'/Assets/assets/assets.js';
241
        $updatedPath = $this->config['plugin_html_realdir'].'/Assets/assets/updated.js';
242
        $I->assertFileNotExists($assetsPath);
243
        $I->assertFileNotExists($updatedPath);
244
245
        $ManagePage = PluginSearchPage::go($I)
246
            ->入手する('Assets')
247
            ->インストール();
248
        $I->assertFileNotExists($assetsPath);
249
        $I->assertFileNotExists($updatedPath);
250
251
        $ManagePage->ストアプラグイン_有効化('Assets');
252
        $I->assertFileExists($assetsPath);
253
        $I->assertFileNotExists($updatedPath);
254
255
        $ManagePage->ストアプラグイン_無効化('Assets');
256
        $I->assertFileExists($assetsPath);
257
        $I->assertFileNotExists($updatedPath);
258
259
        // 新しいバージョンを作成
260
        $this->publishPlugin('Assets-1.0.1.tgz');
261
262
        $I->reloadPage();
263
        $ManagePage->ストアプラグイン_アップデート('Assets')->アップデート();
264
        $I->assertFileExists($assetsPath);
265
        $I->assertFileExists($updatedPath);
266
267
        $ManagePage->ストアプラグイン_削除('Assets');
268
        $I->assertFileNotExists($assetsPath);
269
        $I->assertFileNotExists($updatedPath);
270
    }
271
272 View Code Duplication
    public function test_extend_same_table_store(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
273
    {
274
        $Horizon = Horizon_Store::start($I);
275
        $Boomerang = Boomerang_Store::start($I);
276
277
        $Horizon->インストール()->有効化();
278
        $Boomerang->インストール()->有効化();
279
280
        $Horizon->検証()->無効化()->削除();
281
        $Boomerang->検証()->無効化()->削除();
282
    }
283
284 View Code Duplication
    public function test_extend_same_table_disabled_remove_store(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
285
    {
286
        $Horizon = Horizon_Store::start($I);
287
        $Boomerang = Boomerang_Store::start($I);
288
289
        $Horizon->インストール()->有効化()->無効化();
290
        $Boomerang->インストール()->有効化()->無効化();
291
292
        $Horizon->検証()->削除();
293
        $Boomerang->検証()->削除();
294
    }
295
296 View Code Duplication
    public function test_extend_same_table_local(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
297
    {
298
        $Horizon = Horizon_Local::start($I);
299
        $Boomerang = Boomerang_Local::start($I);
300
301
        $Horizon->インストール()->有効化();
302
        $Boomerang->インストール()->有効化();
303
304
        $Horizon->検証()->無効化()->削除();
305
        $Boomerang->検証()->無効化()->削除();
306
    }
307
308 View Code Duplication
    public function test_extend_same_table_disabled_remove_local(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
309
    {
310
        $Horizon = Horizon_Local::start($I);
311
        $Boomerang = Boomerang_Local::start($I);
312
313
        $Horizon->インストール()->有効化()->無効化();
314
        $Boomerang->インストール()->有効化()->無効化();
315
316
        $Horizon->検証()->削除();
317
        $Boomerang->検証()->削除();
318
    }
319
320 View Code Duplication
    public function test_extend_same_table_crossed_store(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
321
    {
322
        $Horizon = Horizon_Store::start($I);
323
        $Boomerang = Boomerang_Store::start($I);
324
325
        $Horizon->インストール()->有効化()->無効化();
326
        $Boomerang->インストール()->有効化();
327
328
        $Horizon->検証()->削除();
329
        $Boomerang->検証()->無効化()->削除();
330
    }
331
332 View Code Duplication
    public function test_extend_same_table_crossed_local(\AcceptanceTester $I)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
333
    {
334
        $Horizon = Horizon_Local::start($I);
335
        $Boomerang = Boomerang_Local::start($I);
336
337
        $Horizon->インストール()->有効化()->無効化();
338
        $Boomerang->インストール()->有効化();
339
340
        $Horizon->検証()->削除();
341
        $Boomerang->検証()->無効化()->削除();
342
    }
343
344
    public function test_dependency_each_install_plugin(\AcceptanceTester $I)
345
    {
346
        $Horizon = Horizon_Store::start($I);
347
        $Emperor = Emperor_Store::start($I);
348
349
        $Horizon->インストール()->有効化();
350
        $Emperor->インストール()->有効化();
351
    }
352
353
    public function test_dependency_plugin_install(\AcceptanceTester $I)
354
    {
355
        $Horizon = Horizon_Store::start($I);
356
        $Emperor = Emperor_Store::start($I, $Horizon);
357
358
        $Emperor->インストール()
359
            ->依存より先に有効化();
360
361
        $Horizon->有効化();
362
363
        $Emperor->有効化();
364
365
        $Horizon->依存されているのが有効なのに無効化();
366
        $Emperor->無効化();
367
        $Horizon->無効化();
368
369
        $Horizon->依存されているのが削除されていないのに削除();
370
        $Emperor->削除();
371
        $Horizon->削除();
372
    }
373
374
    public function test_dependency_plugin_update(\AcceptanceTester $I)
375
    {
376
        $Horizon = Horizon_Store::start($I);
377
        $Emperor = Emperor_Store::start($I, $Horizon);
378
379
        $Emperor->インストール();
380
381
        $Horizon->検証()
382
            ->有効化();
383
384
        $Emperor
385
            ->有効化()
386
            ->無効化()
387
            ->アップデート();
388
389
        $Horizon->検証();
390
    }
391
392
    public function test_install_error(\AcceptanceTester $I)
393
    {
394
        $this->publishPlugin('InstallError.tgz');
395
        $Horizon = Horizon_Store::start($I);
396
397
        PluginSearchPage::go($I)
398
            ->入手する('InstallError')
399
            ->インストール('システムエラーが発生しました。');
400
401
        // エラー後に他のプラグインがインストールできる
402
        $Horizon->インストール();
403
    }
404
405
    /**
406
     * @see https://github.com/EC-CUBE/ec-cube/pull/4527
407
     */
408
    public function test_template_overwrite(\AcceptanceTester $I)
409
    {
410
        $plugin = new Local_Plugin($I, 'Template');
411
        $plugin->インストール();
412
        $plugin->有効化();
413
414
        // テンプレートの確認
415
        $I->amOnPage('/template');
416
        $I->see('hello');
417
418
        // テンプレートをapp/template/plugin/[Plugin Code]に設置
419
        $dir = $this->config->get('eccube_theme_app_dir').'/plugin/Template';
420
        $fs = new \Symfony\Component\Filesystem\Filesystem();
421
        $fs->mkdir($dir);
422
        $fs->dumpFile($dir.'/index.twig', 'bye');
423
424
        // キャッシュ削除すると反映される
425
        $page = CacheManagePage::go($I);
426
        $page->キャッシュ削除();
427
428
        // 上書きされていることを確認
429
        $I->amOnPage('/template');
430
        $I->see('bye');
431
432
        $I->amOnPage('/'.$this->config->get('eccube_admin_route').'/store/plugin');
433
        $plugin->無効化();
434
        $plugin->削除();
435
436
        $fs->remove($dir);
437
    }
438
439
    private function publishPlugin($fileName)
440
    {
441
        copy(codecept_data_dir().'/'.'plugins/'.$fileName, codecept_root_dir().'/repos/'.$fileName);
442
    }
443
}
444
445
abstract class Abstract_Plugin
446
{
447
    /** @var AcceptanceTester */
448
    protected $I;
449
450
    /** @var EntityManager */
451
    protected $em;
452
453
    /** @var \Doctrine\DBAL\Connection */
454
    protected $conn;
455
456
    /** @var PluginRepository */
457
    protected $pluginRepository;
458
459
    /** @var EccubeConfig */
460
    protected $config;
461
462
    protected $initialized = false;
463
464
    protected $enabled = false;
465
466
    protected $removed = false;
467
468
    protected $tables = [];
469
470
    protected $columns = [];
471
472
    protected $traits = [];
473
474
    public function __construct(\AcceptanceTester $I)
475
    {
476
        $this->I = $I;
477
        $this->em = Fixtures::get('entityManager');
478
        $this->conn = $this->em->getConnection();
479
        $this->pluginRepository = $this->em->getRepository(Plugin::class);
480
        $this->config = Fixtures::get('config');
481
    }
482
483 View Code Duplication
    public function tableExists()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
484
    {
485
        foreach ($this->tables as $table) {
486
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '".$table."';")->fetch()['count'] > 0;
0 ignored issues
show
Security introduced by
If $table can contain user-input, it is usually preferable to use a parameter placeholder like :paramName and pass the dynamic input as second argument array('param' => $table).

Instead of embedding dynamic parameters in SQL, Doctrine also allows you to pass them separately and insert a placeholder instead:

function findUser(Doctrine\DBAL\Connection $con, $email) {
    // Unsafe
    $con->executeQuery("SELECT * FROM users WHERE email = '".$email."'");

    // Safe
    $con->executeQuery(
        "SELECT * FROM users WHERE email = :email",
        array('email' => $email)
    );
}
Loading history...
487
            $this->I->assertTrue($exists, 'テーブルがあるはず '.$table);
488
        }
489
    }
490
491 View Code Duplication
    public function tableNotExists()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
492
    {
493
        foreach ($this->tables as $table) {
494
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '".$table."';")->fetch()['count'] > 0;
0 ignored issues
show
Security introduced by
If $table can contain user-input, it is usually preferable to use a parameter placeholder like :paramName and pass the dynamic input as second argument array('param' => $table).

Instead of embedding dynamic parameters in SQL, Doctrine also allows you to pass them separately and insert a placeholder instead:

function findUser(Doctrine\DBAL\Connection $con, $email) {
    // Unsafe
    $con->executeQuery("SELECT * FROM users WHERE email = '".$email."'");

    // Safe
    $con->executeQuery(
        "SELECT * FROM users WHERE email = :email",
        array('email' => $email)
    );
}
Loading history...
495
            $this->I->assertFalse($exists, 'テーブルがないはず '.$table);
496
        }
497
    }
498
499 View Code Duplication
    public function columnExists()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
500
    {
501
        foreach ($this->columns as $column) {
502
            list($tableName, $columnName) = explode('.', $column);
503
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '${tableName}' AND column_name = '${columnName}';")->fetch()['count'] == 1;
504
            $this->I->assertTrue($exists, 'カラムがあるはず '.$column);
505
        }
506
    }
507
508 View Code Duplication
    public function columnNotExists()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
509
    {
510
        foreach ($this->columns as $column) {
511
            list($tableName, $columnName) = explode('.', $column);
512
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '${tableName}' AND column_name = '${columnName}';")->fetch()['count'] == 1;
513
            $this->I->assertFalse($exists, 'カラムがないはず '.$column);
514
        }
515
    }
516
517
    public function traitExists()
518
    {
519
        foreach ($this->traits as $trait => $target) {
520
            $this->I->assertContains($trait, file_get_contents($this->config['kernel.project_dir'].'/app/proxy/entity/'.$target.'.php'), 'Traitがあるはず '.$trait);
521
        }
522
    }
523
524
    public function traitNotExists()
525
    {
526
        foreach ($this->traits as $trait => $target) {
527
            $file = $this->config['kernel.project_dir'].'/app/proxy/entity/'.$target.'.php';
528
            if (file_exists($file)) {
529
                $this->I->assertNotContains($trait, file_get_contents($file), 'Traitがないはず '.$trait);
530
            } else {
531
                $this->I->assertTrue(true, 'Traitがないはず');
532
            }
533
        }
534
    }
535
536
    public function 新しいタブで開く()
537
    {
538
        $this->I->executeJS("window.open(location.href, 'other')");
539
        $this->I->switchToWindow('other');
540
541
        return $this;
542
    }
543
544
    public function 前のタブに戻る()
545
    {
546
        $this->I->switchToPreviousTab();
547
548
        return $this;
549
    }
550
551
    public function 検証()
552
    {
553
        $this->I->wait(1);
554
        if ($this->initialized) {
555
            $this->tableExists();
556
            $this->columnExists();
557
        } else {
558
            $this->tableNotExists();
559
            $this->columnNotExists();
560
        }
561
562
        if ($this->enabled) {
563
            $this->traitExists();
564
        } else {
565
            $this->traitNotExists();
566
        }
567
568
        return $this;
569
    }
570
}
571
572
class Store_Plugin extends Abstract_Plugin
573
{
574
    /** @var PluginManagePage */
575
    protected $ManagePage;
576
577
    /** @var Plugin */
578
    protected $Plugin;
579
580
    protected $code;
581
582
    /** @var Store_Plugin */
583
    protected $dependency;
584
585
    public function __construct(AcceptanceTester $I, $code, Store_Plugin $dependency = null)
586
    {
587
        parent::__construct($I);
588
        $this->code = $code;
589
        $this->publishPlugin($this->code.'-1.0.0.tgz');
590
        if ($dependency) {
591
            $this->dependency = $dependency;
592
            $this->ManagePage = $dependency->ManagePage;
593
            $this->Plugin = $this->pluginRepository->findByCode($code);
594
        }
595
    }
596
597
    public function インストール()
598
    {
599
        /*
600
         * インストール
601
         */
602
        $this->ManagePage = PluginSearchPage::go($this->I)
603
            ->入手する($this->code)
604
            ->インストール();
605
606
        $this->検証();
607
608
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
609
        $this->I->assertFalse($this->Plugin->isInitialized(), '初期化されていない');
610
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていない');
611
612
        if ($this->dependency) {
613
            $this->dependency->ManagePage = $this->ManagePage;
614
            $this->dependency->Plugin = $this->pluginRepository->findByCode($this->dependency->code);
615
        }
616
617
        return $this;
618
    }
619
620
    public function 有効化()
621
    {
622
        $this->ManagePage->ストアプラグイン_有効化($this->code);
623
624
        $this->initialized = true;
625
        $this->enabled = true;
626
627
        $this->検証();
628
629
        $this->em->refresh($this->Plugin);
630
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
631
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
632
633
        return $this;
634
    }
635
636
    public function 既に有効なものを有効化()
637
    {
638
        $this->ManagePage->ストアプラグイン_有効化($this->code, '既に有効です。');
639
640
        $this->initialized = true;
641
        $this->enabled = true;
642
643
        $this->検証();
644
645
        $this->em->refresh($this->Plugin);
646
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
647
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
648
649
        return $this;
650
    }
651
652
    public function 無効化()
653
    {
654
        $this->ManagePage->ストアプラグイン_無効化($this->code);
655
656
        $this->enabled = false;
657
658
        $this->検証();
659
660
        $this->em->refresh($this->Plugin);
661
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
662
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
663
664
        return $this;
665
    }
666
667
    public function 既に無効なものを無効化()
668
    {
669
        $this->ManagePage->ストアプラグイン_無効化($this->code, '既に無効です。');
670
671
        $this->enabled = false;
672
673
        $this->検証();
674
675
        $this->em->refresh($this->Plugin);
676
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
677
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
678
679
        return $this;
680
    }
681
682 View Code Duplication
    public function 削除()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
683
    {
684
        $this->ManagePage->ストアプラグイン_削除($this->code);
685
686
        $this->initialized = false;
687
        $this->enabled = false;
688
689
        $this->検証();
690
691
        $this->em->refresh($this->Plugin);
692
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
693
        $this->I->assertNull($this->Plugin, '削除されている');
694
695
        return $this;
696
    }
697
698
    public function アップデート()
699
    {
700
        $this->publishPlugin($this->code.'-1.0.1.tgz');
701
702
        $this->I->reloadPage();
703
        $this->ManagePage->ストアプラグイン_アップデート($this->code)->アップデート();
704
705
        $this->initialized = true;
706
        $this->enabled = false;
707
708
        $this->検証();
709
710
        $this->em->refresh($this->Plugin);
711
        $this->I->assertEquals($this->initialized, $this->Plugin->isInitialized(), '初期化');
712
        $this->I->assertEquals($this->enabled, $this->Plugin->isEnabled(), '有効/無効');
713
714
        return $this;
715
    }
716
717
    protected function publishPlugin($fileName)
718
    {
719
        $published = copy(codecept_data_dir().'/'.'plugins/'.$fileName, codecept_root_dir().'/repos/'.$fileName);
720
        $this->I->assertTrue($published, "公開できた ${fileName}");
721
    }
722
}
723
724
class Local_Plugin extends Abstract_Plugin
725
{
726
    /** @var PluginManagePage */
727
    private $ManagePage;
728
729
    /** @var Plugin */
730
    private $Plugin;
731
732
    /** @var string */
733
    private $code;
734
735
    public function __construct(AcceptanceTester $I, $code)
736
    {
737
        parent::__construct($I);
738
        $this->code = $code;
739
    }
740
741
    public function インストール()
742
    {
743
        $this->ManagePage = PluginLocalInstallPage::go($this->I)
744
            ->アップロード('plugins/'.$this->code.'-1.0.0.tgz');
745
746
        $this->initialized = true;
747
748
        $this->I->see('プラグインをインストールしました。', PluginManagePage::完了メーッセージ);
749
750
        $this->検証();
751
752
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
753
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されていない');
754
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていない');
755
756
        return $this;
757
    }
758
759
    public function 有効化()
760
    {
761
        $this->ManagePage->独自プラグイン_有効化($this->code);
762
763
        $this->enabled = true;
764
765
        $this->検証();
766
767
        $this->em->refresh($this->Plugin);
768
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
769
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
770
771
        return $this;
772
    }
773
774
    public function 無効化()
775
    {
776
        $this->ManagePage->独自プラグイン_無効化($this->code);
777
778
        $this->enabled = false;
779
780
        $this->検証();
781
782
        $this->em->refresh($this->Plugin);
783
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
784
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
785
786
        return $this;
787
    }
788
789 View Code Duplication
    public function 削除()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
790
    {
791
        $this->ManagePage->独自プラグイン_削除($this->code);
792
793
        $this->initialized = false;
794
        $this->enabled = false;
795
796
        $this->I->see('プラグインを削除しました。', PluginManagePage::完了メーッセージ);
797
798
        $this->検証();
799
800
        $this->em->refresh($this->Plugin);
801
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
802
        $this->I->assertNull($this->Plugin, '削除されている');
803
804
        return $this;
805
    }
806
807
    public function アップデート()
808
    {
809
        $this->ManagePage->独自プラグイン_アップデート($this->code, 'plugins/'.$this->code.'-1.0.1.tgz');
810
811
        $this->検証();
812
813
        $this->em->refresh($this->Plugin);
814
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
815
        $this->I->assertEquals($this->enabled, $this->Plugin->isEnabled(), '有効/無効');
816
817
        return $this;
818
    }
819
}
820
821 View Code Duplication
class Horizon_Local extends Local_Plugin
0 ignored issues
show
Duplication introduced by
This class seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
822
{
823
    public function __construct(AcceptanceTester $I)
824
    {
825
        parent::__construct($I, 'Horizon');
826
        $this->tables[] = 'dtb_dash';
827
        $this->columns[] = 'dtb_cart.is_horizon';
828
        $this->columns[] = 'dtb_cart.dash_id';
829
        $this->traits['\Plugin\Horizon\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
830
    }
831
832
    public function アップデート()
833
    {
834
        // アップデートで新たしいカラムが追加される
835
        $this->columns[] = 'dtb_dash.new_column';
836
        return parent::アップデート();
837
    }
838
839
    public static function start(AcceptanceTester $I)
840
    {
841
        return new self($I);
842
    }
843
}
844
845
class Horizon_Store extends Store_Plugin
846
{
847
    public function __construct(AcceptanceTester $I)
848
    {
849
        parent::__construct($I, 'Horizon');
850
        $this->tables[] = 'dtb_dash';
851
        $this->columns[] = 'dtb_cart.is_horizon';
852
        $this->columns[] = 'dtb_cart.dash_id';
853
        $this->traits['\Plugin\Horizon\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
854
    }
855
856
    public function アップデート()
857
    {
858
        // アップデートで新たしいカラムが追加される
859
        $this->columns[] = 'dtb_dash.new_column';
860
        return parent::アップデート();
861
    }
862
863
    public static function start(AcceptanceTester $I)
864
    {
865
        $result = new self($I);
866
867
        return $result;
868
    }
869
870
    public function 依存されているのが有効なのに無効化()
871
    {
872
        $this->ManagePage->ストアプラグイン_無効化($this->code, '「ホライゾン」を無効にする前に、「エンペラー」を無効にしてください。');
873
874
        $this->検証();
875
876
        $this->em->refresh($this->Plugin);
877
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されているはず');
878
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されているはず');
879
880
        return $this;
881
    }
882
883
    public function 依存されているのが削除されていないのに削除()
884
    {
885
        $this->ManagePage->ストアプラグイン_削除($this->code, '「エンペラー」が「ホライゾン」に依存しているため削除できません。');
886
887
        $this->検証();
888
889
        $this->em->refresh($this->Plugin);
890
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
891
        $this->I->assertNotNull($this->Plugin, '削除されていない');
892
893
        return $this;
894
    }
895
}
896
897
class Emperor_Store extends Store_Plugin
898
{
899
    public function __construct(AcceptanceTester $I, Store_Plugin $dependency = null)
900
    {
901
        parent::__construct($I, 'Emperor', $dependency);
902
        $this->publishPlugin('Horizon-1.0.0.tgz');
903
        $this->tables[] = 'dtb_foo';
904
        $this->columns[] = 'dtb_cart.foo_id';
905
        $this->traits['\Plugin\Emperor\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
906
    }
907
908
    public static function start(AcceptanceTester $I, Store_Plugin $dependency = null)
909
    {
910
        return new self($I, $dependency);
911
    }
912
913
    public function アップデート()
914
    {
915
        $this->tables = ['dtb_bar'];
916
        $this->columns = ['dtb_cart.bar_id'];
917
        $this->traits['\Plugin\Emperor\Entity\Cart2Trait'] = 'src/Eccube/Entity/Cart';
918
919
        return parent::アップデート();
920
    }
921
922
    public function 依存より先に有効化()
923
    {
924
        $this->ManagePage->ストアプラグイン_有効化($this->code, '「ホライゾン」を先に有効化してください。');
925
926
        $this->検証();
927
928
        $this->em->refresh($this->Plugin);
929
        $this->I->assertFalse($this->Plugin->isInitialized(), '初期化されていないはず');
930
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていないはず');
931
932
        return $this;
933
    }
934
}
935
936 View Code Duplication
class Boomerang_Store extends Store_Plugin
0 ignored issues
show
Duplication introduced by
This class seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
937
{
938
    public function __construct(AcceptanceTester $I)
939
    {
940
        parent::__construct($I, 'Boomerang');
941
        $this->tables[] = 'dtb_bar';
942
        $this->columns[] = 'dtb_cart.is_boomerang';
943
        $this->columns[] = 'dtb_cart.bar_id';
944
        $this->traits['\Plugin\Boomerang\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
945
    }
946
947
    public static function start(AcceptanceTester $I)
948
    {
949
        return new self($I);
950
    }
951
}
952
953
class Boomerang_Local extends Local_Plugin
954
{
955
    public function __construct(AcceptanceTester $I)
956
    {
957
        parent::__construct($I, 'Boomerang');
958
        $this->tables[] = 'dtb_bar';
959
        $this->columns[] = 'dtb_cart.is_boomerang';
960
        $this->traits['\Plugin\Boomerang\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
961
    }
962
963
    public static function start(AcceptanceTester $I)
964
    {
965
        return new self($I);
966
    }
967
}
968