Completed
Pull Request — 4.0 (#4632)
by Kentaro
04:44
created

Bundle_Store::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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