Completed
Push — kurozumi-patch-9 ( 9ae5a9 )
by Kiyotaka
04:39
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
    /**
440
     * @see https://github.com/EC-CUBE/ec-cube/pull/4638
441
     */
442
    public function test_enhance_plugin_entity(\AcceptanceTester $I)
443
    {
444
        $Boomerang = Boomerang_Store::start($I)
445
            ->インストール()
446
            ->有効化()
447
            ->カート作成();
448
449
        $I->see('[1]');
450
451
        Boomerang10_Store::start($I, $Boomerang)
452
            ->インストール()
453
            ->有効化();
454
455
        $Boomerang->カート一覧();
456
        $I->see('[1]');
457
    }
458
459
    private function publishPlugin($fileName)
460
    {
461
        copy(codecept_data_dir().'/'.'plugins/'.$fileName, codecept_root_dir().'/repos/'.$fileName);
462
    }
463
}
464
465
abstract class Abstract_Plugin
466
{
467
    /** @var AcceptanceTester */
468
    protected $I;
469
470
    /** @var EntityManager */
471
    protected $em;
472
473
    /** @var \Doctrine\DBAL\Connection */
474
    protected $conn;
475
476
    /** @var PluginRepository */
477
    protected $pluginRepository;
478
479
    /** @var EccubeConfig */
480
    protected $config;
481
482
    protected $initialized = false;
483
484
    protected $enabled = false;
485
486
    protected $removed = false;
487
488
    protected $tables = [];
489
490
    protected $columns = [];
491
492
    protected $traits = [];
493
494
    public function __construct(\AcceptanceTester $I)
495
    {
496
        $this->I = $I;
497
        $this->em = Fixtures::get('entityManager');
498
        $this->conn = $this->em->getConnection();
499
        $this->pluginRepository = $this->em->getRepository(Plugin::class);
500
        $this->config = Fixtures::get('config');
501
    }
502
503 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...
504
    {
505
        foreach ($this->tables as $table) {
506
            $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...
507
            $this->I->assertTrue($exists, 'テーブルがあるはず '.$table);
508
        }
509
    }
510
511 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...
512
    {
513
        foreach ($this->tables as $table) {
514
            $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...
515
            $this->I->assertFalse($exists, 'テーブルがないはず '.$table);
516
        }
517
    }
518
519 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...
520
    {
521
        foreach ($this->columns as $column) {
522
            list($tableName, $columnName) = explode('.', $column);
523
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '${tableName}' AND column_name = '${columnName}';")->fetch()['count'] == 1;
524
            $this->I->assertTrue($exists, 'カラムがあるはず '.$column);
525
        }
526
    }
527
528 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...
529
    {
530
        foreach ($this->columns as $column) {
531
            list($tableName, $columnName) = explode('.', $column);
532
            $exists = $this->conn->executeQuery("SELECT count(*) AS count FROM information_schema.columns WHERE table_name = '${tableName}' AND column_name = '${columnName}';")->fetch()['count'] == 1;
533
            $this->I->assertFalse($exists, 'カラムがないはず '.$column);
534
        }
535
    }
536
537
    public function traitExists()
538
    {
539
        foreach ($this->traits as $trait => $target) {
540
            $this->I->assertContains($trait, file_get_contents($this->config['kernel.project_dir'].'/app/proxy/entity/'.$target.'.php'), 'Traitがあるはず '.$trait);
541
        }
542
    }
543
544
    public function traitNotExists()
545
    {
546
        foreach ($this->traits as $trait => $target) {
547
            $file = $this->config['kernel.project_dir'].'/app/proxy/entity/'.$target.'.php';
548
            if (file_exists($file)) {
549
                $this->I->assertNotContains($trait, file_get_contents($file), 'Traitがないはず '.$trait);
550
            } else {
551
                $this->I->assertTrue(true, 'Traitがないはず');
552
            }
553
        }
554
    }
555
556
    public function 新しいタブで開く()
557
    {
558
        $this->I->executeJS("window.open(location.href, 'other')");
559
        $this->I->switchToWindow('other');
560
561
        return $this;
562
    }
563
564
    public function 前のタブに戻る()
565
    {
566
        $this->I->switchToPreviousTab();
567
568
        return $this;
569
    }
570
571
    public function 検証()
572
    {
573
        $this->I->wait(1);
574
        if ($this->initialized) {
575
            $this->tableExists();
576
            $this->columnExists();
577
        } else {
578
            $this->tableNotExists();
579
            $this->columnNotExists();
580
        }
581
582
        if ($this->enabled) {
583
            $this->traitExists();
584
        } else {
585
            $this->traitNotExists();
586
        }
587
588
        return $this;
589
    }
590
}
591
592
class Store_Plugin extends Abstract_Plugin
593
{
594
    /** @var PluginManagePage */
595
    protected $ManagePage;
596
597
    /** @var Plugin */
598
    protected $Plugin;
599
600
    protected $code;
601
602
    /** @var Store_Plugin */
603
    protected $dependency;
604
605
    public function __construct(AcceptanceTester $I, $code, Store_Plugin $dependency = null)
606
    {
607
        parent::__construct($I);
608
        $this->code = $code;
609
        $this->publishPlugin($this->code.'-1.0.0.tgz');
610
        if ($dependency) {
611
            $this->dependency = $dependency;
612
            $this->ManagePage = $dependency->ManagePage;
613
            $this->Plugin = $this->pluginRepository->findByCode($code);
614
        }
615
    }
616
617
    public function インストール()
618
    {
619
        /*
620
         * インストール
621
         */
622
        $this->ManagePage = PluginSearchPage::go($this->I)
623
            ->入手する($this->code)
624
            ->インストール();
625
626
        $this->検証();
627
628
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
629
        $this->I->assertFalse($this->Plugin->isInitialized(), '初期化されていない');
630
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていない');
631
632
        if ($this->dependency) {
633
            $this->dependency->ManagePage = $this->ManagePage;
634
            $this->dependency->Plugin = $this->pluginRepository->findByCode($this->dependency->code);
635
        }
636
637
        return $this;
638
    }
639
640
    public function 有効化()
641
    {
642
        $this->ManagePage->ストアプラグイン_有効化($this->code);
643
644
        $this->initialized = true;
645
        $this->enabled = true;
646
647
        $this->検証();
648
649
        $this->em->refresh($this->Plugin);
650
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
651
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
652
653
        return $this;
654
    }
655
656
    public function 既に有効なものを有効化()
657
    {
658
        $this->ManagePage->ストアプラグイン_有効化($this->code, '既に有効です。');
659
660
        $this->initialized = true;
661
        $this->enabled = true;
662
663
        $this->検証();
664
665
        $this->em->refresh($this->Plugin);
666
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
667
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
668
669
        return $this;
670
    }
671
672
    public function 無効化()
673
    {
674
        $this->ManagePage->ストアプラグイン_無効化($this->code);
675
676
        $this->enabled = false;
677
678
        $this->検証();
679
680
        $this->em->refresh($this->Plugin);
681
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
682
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
683
684
        return $this;
685
    }
686
687
    public function 既に無効なものを無効化()
688
    {
689
        $this->ManagePage->ストアプラグイン_無効化($this->code, '既に無効です。');
690
691
        $this->enabled = false;
692
693
        $this->検証();
694
695
        $this->em->refresh($this->Plugin);
696
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
697
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
698
699
        return $this;
700
    }
701
702 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...
703
    {
704
        $this->ManagePage->ストアプラグイン_削除($this->code);
705
706
        $this->initialized = false;
707
        $this->enabled = false;
708
709
        $this->検証();
710
711
        $this->em->refresh($this->Plugin);
712
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
713
        $this->I->assertNull($this->Plugin, '削除されている');
714
715
        return $this;
716
    }
717
718
    public function アップデート()
719
    {
720
        $this->publishPlugin($this->code.'-1.0.1.tgz');
721
722
        $this->I->reloadPage();
723
        $this->ManagePage->ストアプラグイン_アップデート($this->code)->アップデート();
724
725
        $this->initialized = true;
726
        $this->enabled = false;
727
728
        $this->検証();
729
730
        $this->em->refresh($this->Plugin);
731
        $this->I->assertEquals($this->initialized, $this->Plugin->isInitialized(), '初期化');
732
        $this->I->assertEquals($this->enabled, $this->Plugin->isEnabled(), '有効/無効');
733
734
        return $this;
735
    }
736
737
    protected function publishPlugin($fileName)
738
    {
739
        $published = copy(codecept_data_dir().'/'.'plugins/'.$fileName, codecept_root_dir().'/repos/'.$fileName);
740
        $this->I->assertTrue($published, "公開できた ${fileName}");
741
    }
742
}
743
744
class Local_Plugin extends Abstract_Plugin
745
{
746
    /** @var PluginManagePage */
747
    private $ManagePage;
748
749
    /** @var Plugin */
750
    private $Plugin;
751
752
    /** @var string */
753
    private $code;
754
755
    public function __construct(AcceptanceTester $I, $code)
756
    {
757
        parent::__construct($I);
758
        $this->code = $code;
759
    }
760
761
    public function インストール()
762
    {
763
        $this->ManagePage = PluginLocalInstallPage::go($this->I)
764
            ->アップロード('plugins/'.$this->code.'-1.0.0.tgz');
765
766
        $this->initialized = true;
767
768
        $this->I->see('プラグインをインストールしました。', PluginManagePage::完了メーッセージ);
769
770
        $this->検証();
771
772
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
773
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されていない');
774
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていない');
775
776
        return $this;
777
    }
778
779
    public function 有効化()
780
    {
781
        $this->ManagePage->独自プラグイン_有効化($this->code);
782
783
        $this->enabled = true;
784
785
        $this->検証();
786
787
        $this->em->refresh($this->Plugin);
788
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
789
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されている');
790
791
        return $this;
792
    }
793
794
    public function 無効化()
795
    {
796
        $this->ManagePage->独自プラグイン_無効化($this->code);
797
798
        $this->enabled = false;
799
800
        $this->検証();
801
802
        $this->em->refresh($this->Plugin);
803
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
804
        $this->I->assertFalse($this->Plugin->isEnabled(), '無効化されている');
805
806
        return $this;
807
    }
808
809 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...
810
    {
811
        $this->ManagePage->独自プラグイン_削除($this->code);
812
813
        $this->initialized = false;
814
        $this->enabled = false;
815
816
        $this->I->see('プラグインを削除しました。', PluginManagePage::完了メーッセージ);
817
818
        $this->検証();
819
820
        $this->em->refresh($this->Plugin);
821
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
822
        $this->I->assertNull($this->Plugin, '削除されている');
823
824
        return $this;
825
    }
826
827
    public function アップデート()
828
    {
829
        $this->ManagePage->独自プラグイン_アップデート($this->code, 'plugins/'.$this->code.'-1.0.1.tgz');
830
831
        $this->検証();
832
833
        $this->em->refresh($this->Plugin);
834
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されている');
835
        $this->I->assertEquals($this->enabled, $this->Plugin->isEnabled(), '有効/無効');
836
837
        return $this;
838
    }
839
}
840
841
class Horizon_Local extends Local_Plugin
842
{
843
    public function __construct(AcceptanceTester $I)
844
    {
845
        parent::__construct($I, 'Horizon');
846
        $this->tables[] = 'dtb_dash';
847
        $this->columns[] = 'dtb_cart.is_horizon';
848
        $this->columns[] = 'dtb_cart.dash_id';
849
        $this->traits['\Plugin\Horizon\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
850
    }
851
852
    public function アップデート()
853
    {
854
        // アップデートで新たしいカラムが追加される
855
        $this->columns[] = 'dtb_dash.new_column';
856
        return parent::アップデート();
857
    }
858
859
    public static function start(AcceptanceTester $I)
860
    {
861
        return new self($I);
862
    }
863
}
864
865
class Horizon_Store extends Store_Plugin
866
{
867
    public function __construct(AcceptanceTester $I)
868
    {
869
        parent::__construct($I, 'Horizon');
870
        $this->tables[] = 'dtb_dash';
871
        $this->columns[] = 'dtb_cart.is_horizon';
872
        $this->columns[] = 'dtb_cart.dash_id';
873
        $this->traits['\Plugin\Horizon\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
874
    }
875
876
    public function アップデート()
877
    {
878
        // アップデートで新たしいカラムが追加される
879
        $this->columns[] = 'dtb_dash.new_column';
880
        return parent::アップデート();
881
    }
882
883
    public static function start(AcceptanceTester $I)
884
    {
885
        $result = new self($I);
886
887
        return $result;
888
    }
889
890
    public function 依存されているのが有効なのに無効化()
891
    {
892
        $this->ManagePage->ストアプラグイン_無効化($this->code, '「ホライゾン」を無効にする前に、「エンペラー」を無効にしてください。');
893
894
        $this->検証();
895
896
        $this->em->refresh($this->Plugin);
897
        $this->I->assertTrue($this->Plugin->isInitialized(), '初期化されているはず');
898
        $this->I->assertTrue($this->Plugin->isEnabled(), '有効化されているはず');
899
900
        return $this;
901
    }
902
903
    public function 依存されているのが削除されていないのに削除()
904
    {
905
        $this->ManagePage->ストアプラグイン_削除($this->code, '「エンペラー」が「ホライゾン」に依存しているため削除できません。');
906
907
        $this->検証();
908
909
        $this->em->refresh($this->Plugin);
910
        $this->Plugin = $this->pluginRepository->findByCode($this->code);
911
        $this->I->assertNotNull($this->Plugin, '削除されていない');
912
913
        return $this;
914
    }
915
}
916
917
class Emperor_Store extends Store_Plugin
918
{
919
    public function __construct(AcceptanceTester $I, Store_Plugin $dependency = null)
920
    {
921
        parent::__construct($I, 'Emperor', $dependency);
922
        $this->publishPlugin('Horizon-1.0.0.tgz');
923
        $this->tables[] = 'dtb_foo';
924
        $this->columns[] = 'dtb_cart.foo_id';
925
        $this->traits['\Plugin\Emperor\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
926
    }
927
928
    public static function start(AcceptanceTester $I, Store_Plugin $dependency = null)
929
    {
930
        return new self($I, $dependency);
931
    }
932
933
    public function アップデート()
934
    {
935
        $this->tables = ['dtb_bar'];
936
        $this->columns = ['dtb_cart.bar_id'];
937
        $this->traits['\Plugin\Emperor\Entity\Cart2Trait'] = 'src/Eccube/Entity/Cart';
938
939
        return parent::アップデート();
940
    }
941
942
    public function 依存より先に有効化()
943
    {
944
        $this->ManagePage->ストアプラグイン_有効化($this->code, '「ホライゾン」を先に有効化してください。');
945
946
        $this->検証();
947
948
        $this->em->refresh($this->Plugin);
949
        $this->I->assertFalse($this->Plugin->isInitialized(), '初期化されていないはず');
950
        $this->I->assertFalse($this->Plugin->isEnabled(), '有効化されていないはず');
951
952
        return $this;
953
    }
954
}
955
956
class Boomerang_Store extends Store_Plugin
957
{
958
    public function __construct(AcceptanceTester $I)
959
    {
960
        parent::__construct($I, 'Boomerang');
961
        $this->tables[] = 'dtb_bar';
962
        $this->columns[] = 'dtb_cart.is_boomerang';
963
        $this->columns[] = 'dtb_cart.bar_id';
964
        $this->traits['\Plugin\Boomerang\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
965
    }
966
967
    public static function start(AcceptanceTester $I)
968
    {
969
        return new self($I);
970
    }
971
972
    public function カート一覧()
973
    {
974
        $this->I->amOnPage('/boomerang');
975
    }
976
977
    public function カート作成()
978
    {
979
        $this->I->amOnPage('/boomerang/new');
980
        $this->I->seeCurrentUrlMatches('/^\/boomerang$/');
981
        return $this;
982
    }
983
}
984
985
class Boomerang10_Store extends Store_Plugin
986
{
987
    public function __construct(AcceptanceTester $I, Store_Plugin $dependency = null)
988
    {
989
        parent::__construct($I, 'Boomerang10', $dependency);
990
        $this->columns[] = 'dtb_bar.mail';
991
    }
992
993
    public static function start(AcceptanceTester $I, Store_Plugin $dependency = null)
0 ignored issues
show
Unused Code introduced by
The parameter $dependency is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
994
    {
995
        return new self($I, $dependency = null);
996
    }
997
}
998
999
class Boomerang_Local extends Local_Plugin
1000
{
1001
    public function __construct(AcceptanceTester $I)
1002
    {
1003
        parent::__construct($I, 'Boomerang');
1004
        $this->tables[] = 'dtb_bar';
1005
        $this->columns[] = 'dtb_cart.is_boomerang';
1006
        $this->traits['\Plugin\Boomerang\Entity\CartTrait'] = 'src/Eccube/Entity/Cart';
1007
    }
1008
1009
    public static function start(AcceptanceTester $I)
1010
    {
1011
        return new self($I);
1012
    }
1013
}
1014