Skip to content

Commit 8ad7599

Browse files
committed
remove dependency of magento sequence library
1 parent 1bbd6b2 commit 8ad7599

File tree

8 files changed

+416
-282
lines changed

8 files changed

+416
-282
lines changed

composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
"aws/aws-sdk-php": "^3.132",
1414
"codeception/codeception": "^5.0",
1515
"codeception/module-asserts": "^3.0",
16-
"codeception/module-sequence": "^3.0",
1716
"codeception/module-webdriver": "^4.0",
1817
"composer/composer": "^1.9||^2.0,!=2.2.16",
1918
"csharpru/vault-php": "^4.2.1",

composer.lock

Lines changed: 218 additions & 263 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Codeception/Module/Sequence.php

Whitespace-only changes.

src/Codeception/Util/sq.php

Whitespace-only changes.
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Magento\FunctionalTestingFramework\Codeception\Module;
6+
7+
use Codeception\Module;
8+
use Codeception\Exception\ModuleException;
9+
use Codeception\TestInterface;
10+
11+
/**
12+
* Sequence solves data cleanup issue in alternative way.
13+
* Instead cleaning up the database between tests,
14+
* you can use generated unique names, that should not conflict.
15+
* When you create article on a site, for instance, you can assign it a unique name and then check it.
16+
*
17+
* This module has no actions, but introduces a function `sq` for generating unique sequences within test and
18+
* `sqs` for generating unique sequences across suite.
19+
*
20+
* ### Usage
21+
*
22+
* Function `sq` generates sequence, the only parameter it takes, is id.
23+
* You can get back to previously generated sequence using that id:
24+
*
25+
* ``` php
26+
* <?php
27+
* sq('post1'); // post1_521fbc63021eb
28+
* sq('post2'); // post2_521fbc6302266
29+
* sq('post1'); // post1_521fbc63021eb
30+
* ```
31+
*
32+
* Example:
33+
*
34+
* ``` php
35+
* <?php
36+
* $I->wantTo('create article');
37+
* $I->click('New Article');
38+
* $I->fillField('Title', sq('Article'));
39+
* $I->fillField('Body', 'Demo article with Lorem Ipsum');
40+
* $I->click('save');
41+
* $I->see(sq('Article') ,'#articles')
42+
* ```
43+
*
44+
* Populating Database:
45+
*
46+
* ``` php
47+
* <?php
48+
*
49+
* for ($i = 0; $i<10; $i++) {
50+
* $I->haveInDatabase('users', array('login' => sq("user$i"), 'email' => sq("user$i").'@email.com');
51+
* }
52+
* ```
53+
*
54+
* Cest Suite tests:
55+
*
56+
* ``` php
57+
* <?php
58+
* class UserTest
59+
* {
60+
* public function createUser(AcceptanceTester $I)
61+
* {
62+
* $I->createUser(sqs('user') . '@mailserver.com', sqs('login'), sqs('pwd'));
63+
* }
64+
*
65+
* public function checkEmail(AcceptanceTester $I)
66+
* {
67+
* $I->seeInEmailTo(sqs('user') . '@mailserver.com', sqs('login'));
68+
* }
69+
*
70+
* public function removeUser(AcceptanceTester $I)
71+
* {
72+
* $I->removeUser(sqs('user') . '@mailserver.com');
73+
* }
74+
* }
75+
* ```
76+
*
77+
* ### Config
78+
*
79+
* By default produces unique string with param as a prefix:
80+
*
81+
* ```
82+
* sq('user') => 'user_876asd8as87a'
83+
* ```
84+
*
85+
* This behavior can be configured using `prefix` config param.
86+
*
87+
* Old style sequences:
88+
*
89+
* ```yaml
90+
* Sequence:
91+
* prefix: '_'
92+
* ```
93+
*
94+
* Using id param inside prefix:
95+
*
96+
* ```yaml
97+
* Sequence:
98+
* prefix: '{id}.'
99+
* ```
100+
*/
101+
class Sequence extends Module
102+
{
103+
/**
104+
* @var array<int|string,string>
105+
*/
106+
public static array $hash = [];
107+
108+
/**
109+
* @var array<int|string,string>
110+
*/
111+
public static array $suiteHash = [];
112+
113+
public static string $prefix = '';
114+
115+
/**
116+
* @var array<string, string>
117+
*/
118+
protected array $config = ['prefix' => '{id}_'];
119+
120+
public function _initialize(): void
121+
{
122+
static::$prefix = $this->config['prefix'];
123+
}
124+
125+
public function _after(TestInterface $test): void
126+
{
127+
self::$hash = [];
128+
}
129+
130+
public function _afterSuite(): void
131+
{
132+
self::$suiteHash = [];
133+
}
134+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
namespace Magento\FunctionalTestingFramework\Codeception\Util;
5+
6+
7+
use Magento\FunctionalTestingFramework\Codeception\Module\Sequence;
8+
9+
function sq(int|string|null $id = null): string
10+
{
11+
if ($id && isset(Sequence::$hash[$id])) {
12+
return Sequence::$hash[$id];
13+
}
14+
15+
$prefix = str_replace('{id}', (string)$id, Sequence::$prefix);
16+
$sequence = $prefix . uniqid((string)$id);
17+
if ($id) {
18+
Sequence::$hash[$id] = $sequence;
19+
}
20+
21+
return $sequence;
22+
}
23+
24+
function sqs(int|string|null $id = null): string
25+
{
26+
if ($id && isset(Sequence::$suiteHash[$id])) {
27+
return Sequence::$suiteHash[$id];
28+
}
29+
30+
$prefix = str_replace('{id}', (string)$id, Sequence::$prefix);
31+
$sequence = $prefix . uniqid((string)$id);
32+
if ($id) {
33+
Sequence::$suiteHash[$id] = $sequence;
34+
}
35+
36+
return $sequence;
37+
}

src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// @codingStandardsIgnoreFile
88
namespace Magento\FunctionalTestingFramework\Module;
99

10-
use Codeception\Module\Sequence;
10+
use Magento\FunctionalTestingFramework\Codeception\Module\Sequence;
1111
use Codeception\Exception\ModuleException;
1212

1313
/**
Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,34 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* Copyright © Magento, Inc. All rights reserved.
47
* See COPYING.txt for license details.
58
*/
6-
9+
710
use Magento\FunctionalTestingFramework\Module\MagentoSequence;
811

912
if (!function_exists('msq')) {
1013
/**
1114
* Return unique sequence within test.
1215
*
13-
* @param null $id
14-
* @return string
16+
* @param int|string|null $id Optional identifier for the sequence.
17+
* @return string The generated unique sequence.
1518
*/
16-
function msq($id = null)
19+
function msq(int|string|null $id = null): string
1720
{
18-
if ($id and isset(MagentoSequence::$hash[$id])) {
21+
if ($id !== null && isset(MagentoSequence::$hash[$id])) {
1922
return MagentoSequence::$hash[$id];
2023
}
21-
$prefix = MagentoSequence::$prefix;
22-
$sequence = $prefix . uniqid();
23-
if ($id) {
24-
MagentoSequence::$hash[$id] = $sequence;
24+
25+
$prefix = MagentoSequence::$prefix ?? '';
26+
$sequence = $prefix . uniqid('', true); // Use true for high-entropy ID
27+
28+
if ($id !== null) {
29+
MagentoSequence::$hash[$id] = $sequence; // Avoid dynamic properties
2530
}
31+
2632
return $sequence;
2733
}
2834
}
@@ -31,19 +37,22 @@ function msq($id = null)
3137
/**
3238
* Return unique sequence within suite.
3339
*
34-
* @param null $id
35-
* @return string
40+
* @param int|string|null $id Optional identifier for the suite sequence.
41+
* @return string The generated unique suite sequence.
3642
*/
37-
function msqs($id = null)
43+
function msqs(int|string|null $id = null): string
3844
{
39-
if ($id and isset(MagentoSequence::$suiteHash[$id])) {
45+
if ($id !== null && isset(MagentoSequence::$suiteHash[$id])) {
4046
return MagentoSequence::$suiteHash[$id];
4147
}
42-
$prefix = MagentoSequence::$prefix;
43-
$sequence = $prefix . uniqid();
44-
if ($id) {
45-
MagentoSequence::$suiteHash[$id] = $sequence;
48+
49+
$prefix = MagentoSequence::$prefix ?? '';
50+
$sequence = $prefix . uniqid('', true); // Use true for high-entropy ID
51+
52+
if ($id !== null) {
53+
MagentoSequence::$suiteHash[$id] = $sequence; // Avoid dynamic properties
4654
}
55+
4756
return $sequence;
4857
}
4958
}

0 commit comments

Comments
 (0)