Completed
Pull Request — 4.0 (#4632)
by Kentaro
05:40 queued 01:10
created

Bundle_Store::start()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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