Skip to content

Commit e35cc63

Browse files
authored
Merge pull request #18 from redmatter/1.0_dump_populate_cleanup
v1.0 - Adding dump populate cleanup options
2 parents 120ef9c + aa08da0 commit e35cc63

File tree

7 files changed

+679
-23
lines changed

7 files changed

+679
-23
lines changed

examples/codeception.yml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,16 @@ modules:
1818
Codeception\Extension\MultiDb:
1919
connectors:
2020
Primary:
21-
dsn: "mysql:host=primary.db.example.com;port=3306;dbname=Demo1"
22-
user: 'demo_primary'
23-
password: ''
21+
dsn: "mysql:host=primary.db.example.com;port=3306;dbname=DemoConfig"
22+
user: 'demo'
23+
password: 'notsecure'
24+
dump: 'tests/_data/primary.sql'
25+
populate: true
26+
cleanup: true
2427
Secondary:
25-
dsn: "mysql:host=secondary.db.example.com;port=3306;dbname=Demo2"
26-
user: 'demo_secondary'
27-
password: ''
28+
dsn: "mysql:host=secondary.db.example.com;port=3306;dbname=DemoWarehouse"
29+
user: 'demo'
30+
password: 'notsecure'
31+
dump: 'tests/_data/secondary.sql'
32+
populate: true
33+
cleanup: true

examples/tests/_data/dump.sql

Lines changed: 0 additions & 1 deletion
This file was deleted.

examples/tests/_data/primary.sql

Lines changed: 463 additions & 0 deletions
Large diffs are not rendered by default.

examples/tests/_data/secondary.sql

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
-- schema
2+
3+
--
4+
-- Table structure for table `Audit`
5+
--
6+
7+
CREATE TABLE IF NOT EXISTS `DemoWarehouse`.`Audit` (
8+
`OrganisationID` int(10) unsigned NOT NULL,
9+
`UserID` int(10) unsigned DEFAULT NULL,
10+
`Time` datetime NOT NULL,
11+
`JSON` text NOT NULL,
12+
13+
KEY `UserID` (`UserID`),
14+
KEY `OrganisationID` (`OrganisationID`),
15+
KEY `Time` (`Time`)
16+
);
17+
18+
ALTER TABLE `Audit`
19+
ADD FOREIGN KEY (`OrganisationID`) REFERENCES `DemoConfig`.`Organisation`(`ID`)
20+
ON DELETE CASCADE ON UPDATE CASCADE;
21+
22+
-- data
23+
24+
-- `DemoWarehouse`.`Audit`
25+
INSERT INTO `DemoWarehouse`.`Audit` VALUES
26+
(1,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
27+
(2,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
28+
(3,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
29+
(4,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
30+
(5,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
31+
(6,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
32+
(7,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
33+
(8,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
34+
(9,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
35+
(10,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
36+
(11,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
37+
(12,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
38+
(13,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
39+
(14,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
40+
(15,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
41+
(16,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
42+
(17,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
43+
(18,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
44+
(19,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
45+
(20,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
46+
(21,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
47+
(22,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
48+
(23,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
49+
(24,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
50+
(25,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
51+
(26,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
52+
(27,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
53+
(28,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
54+
(29,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
55+
(30,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
56+
(31,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
57+
(32,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
58+
(33,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
59+
(34,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
60+
(35,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
61+
(36,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
62+
(37,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
63+
(38,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
64+
(39,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
65+
(40,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
66+
(41,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
67+
(42,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
68+
(43,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
69+
(44,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
70+
(45,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
71+
(46,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
72+
(47,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
73+
(48,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
74+
(49,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
75+
(50,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
76+
(51,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
77+
(52,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
78+
(53,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
79+
(54,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
80+
(55,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
81+
(56,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
82+
(57,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
83+
(58,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
84+
(59,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
85+
(60,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
86+
(61,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
87+
(62,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
88+
(63,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
89+
(64,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
90+
(65,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
91+
(66,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
92+
(67,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
93+
(68,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
94+
(69,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
95+
(70,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
96+
(71,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
97+
(72,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
98+
(73,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
99+
(74,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
100+
(75,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
101+
(76,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
102+
(77,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
103+
(78,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
104+
(79,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
105+
(80,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
106+
(81,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
107+
(82,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
108+
(83,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
109+
(84,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
110+
(85,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
111+
(86,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
112+
(87,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
113+
(88,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
114+
(89,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
115+
(90,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
116+
(91,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
117+
(92,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
118+
(93,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
119+
(94,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
120+
(95,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
121+
(96,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
122+
(97,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
123+
(98,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
124+
(99,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}'),
125+
(100,NULL,'2016-06-17 12:35:59','{\"Description\": \"Organisation created\", \"OrderNumber\": 15371}');

examples/tests/acceptance.suite.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,3 @@ modules:
1313
config:
1414
PhpBrowser:
1515
url: 'http://localhost/myapp/'
16-
Codeception\Extension\MultiDb:
17-
connectors:
18-
Primary:
19-
dsn: "mysql:host=server1.example.com;port=3306;dbname=PrimaryDb"
20-
user: 'dbuser'
21-
password: ''
22-
Secondary:
23-
dsn: "mysql:host=server2.example.com;port=3306;dbname=SecondaryDb"
24-
user: 'dbuser'
25-
password: ''

examples/tests/acceptance/DemoCest.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,26 @@ public function tryToTest(AcceptanceTester $I)
1212

1313
$user_id = $I->transaction(function () use ($I) {
1414
$I->executeSql('SELECT NOW()');
15-
$user_id = $I->haveInDb('PrimaryDb.User', [
16-
'UserName'=>'someone@example.com',
15+
$user_id = $I->haveInDb('DemoConfig.User', [
16+
'OrganisationID'=>1,
1717
'Name'=>'Some One',
18-
'CreatedAt'=>'@asis NOW()'
18+
'Email'=>'someone@example.com',
19+
'Address'=>'PO Box 1213, London, United Kingdom',
20+
'Active'=>'YES',
1921
]);
20-
$I->haveInDb('PrimaryDb.UserPassword', [
22+
$I->haveInDb('DemoConfig.UserPassword', [
2123
'UserID'=>$user_id,
22-
'Password'=>'topsecret',
23-
'CreatedAt'=>'@asis NOW()'
24+
'Hash'=>'@asis UNHEX(SHA1("topsecret"))',
25+
'CreatedAt'=>'@asis NOW()',
26+
'ExpiresAt'=>'@asis DATE_ADD(CreatedAt, INTERVAL 10 DAY)'
2427
]);
2528

2629
return $user_id;
2730
});
31+
32+
$I->amConnectedToDb('Secondary');
33+
codecept_debug(
34+
$I->getFromDb('DemoWarehouse.Audit', ['OrganisationID'=>1])
35+
);
2836
}
2937
}

src/Codeception/Extension/MultiDb.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Codeception\Exception\ModuleConfig as ModuleConfigException;
1414
use Codeception\Module;
1515
use Codeception\TestCase;
16+
use Codeception\Configuration;
1617

1718
/**
1819
* MultiDb - Module that allows tests to perform setup queries and assertions across multiple databases.
@@ -85,6 +86,70 @@ public function _initialize()
8586
$this->timezone = $this->config['timezone'];
8687

8788
parent::_initialize();
89+
90+
foreach ($this->config['connectors'] as $connector => $connectorConfig) {
91+
if ($connectorConfig['populate']) {
92+
if ($connectorConfig['cleanup']) {
93+
$this->cleanup($connector);
94+
}
95+
$this->loadDump($connector);
96+
}
97+
}
98+
}
99+
100+
/**
101+
* Load SQL dump for a connector
102+
*
103+
* @param string $connector
104+
*
105+
* @throws ModuleConfigException
106+
* @throws ModuleException
107+
*/
108+
protected function loadDump($connector)
109+
{
110+
$config = $this->config['connectors'][$connector];
111+
112+
if ($config['dump'] && ($config['cleanup'] || $config['populate'])) {
113+
if (!file_exists(Configuration::projectDir() . $config['dump'])) {
114+
throw new ModuleConfigException(
115+
__CLASS__,
116+
"\n{$connector} - Dump file doesn't exist. Please check path: {$config['dump']}"
117+
);
118+
}
119+
$sql = file_get_contents(Configuration::projectDir() . $config['dump']);
120+
// remove any comments of the form /* ... */
121+
$sql = preg_replace('%/\*(?!!\d+)(?:(?!\*/).)*\*/%s', '', $sql);
122+
if ($sql) {
123+
$sql = explode("\n", $sql);
124+
}
125+
126+
try {
127+
$this->debugSection(__CLASS__, "{$connector} - Loading dump from {$config['dump']}");
128+
$this->getDriver($connector)->load($sql);
129+
} catch (\PDOException $e) {
130+
throw new ModuleException(
131+
__CLASS__,
132+
$e->getMessage() . "\nSQL query being executed: " . $sql
133+
);
134+
}
135+
}
136+
}
137+
138+
/**
139+
* Cleanup databases
140+
*
141+
* @param $connector
142+
*
143+
* @throws ModuleException
144+
*/
145+
protected function cleanup($connector)
146+
{
147+
try {
148+
$this->debugSection(__CLASS__, "$connector - Cleaning up");
149+
$this->getDriver($connector)->cleanup();
150+
} catch (\Exception $e) {
151+
throw new ModuleException(__CLASS__, $e->getMessage());
152+
}
88153
}
89154

90155
// HOOK: before scenario

0 commit comments

Comments
 (0)