Skip to content

Commit da6b98f

Browse files
Merge pull request #20177 from MauricioFauth/tracker-clock
Replace Util::date() with ClockInterface
2 parents 3766910 + 9bbcc34 commit da6b98f

8 files changed

Lines changed: 52 additions & 85 deletions

File tree

phpstan-baseline.neon

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,7 +3610,7 @@ parameters:
36103610
path: src/Controllers/Table/StructureController.php
36113611

36123612
-
3613-
message: '#^Parameter \#2 \$entries of method PhpMyAdmin\\Tracking\\Tracking\:\:getDownloadInfoForExport\(\) expects array\<int, array\<string, int\|string\>\>, array\<mixed\> given\.$#'
3613+
message: '#^Parameter \#3 \$entries of method PhpMyAdmin\\Tracking\\Tracking\:\:getDownloadInfoForExport\(\) expects array\<int, array\<string, int\|string\>\>, array\<mixed\> given\.$#'
36143614
identifier: argument.type
36153615
count: 1
36163616
path: src/Controllers/Table/TrackingController.php
@@ -16647,7 +16647,7 @@ parameters:
1664716647
Use dependency injection instead\.$#
1664816648
'''
1664916649
identifier: staticMethod.deprecated
16650-
count: 4
16650+
count: 3
1665116651
path: tests/unit/Tracking/TrackerTest.php
1665216652

1665316653
-
@@ -16671,7 +16671,7 @@ parameters:
1667116671
Use dependency injection instead\.$#
1667216672
'''
1667316673
identifier: staticMethod.deprecated
16674-
count: 3
16674+
count: 2
1667516675
path: tests/unit/Tracking/TrackingTest.php
1667616676

1667716677
-

psalm-baseline.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10642,7 +10642,6 @@
1064210642
<code><![CDATA[Config::getInstance()]]></code>
1064310643
<code><![CDATA[Config::getInstance()]]></code>
1064410644
<code><![CDATA[Config::getInstance()]]></code>
10645-
<code><![CDATA[Config::getInstance()]]></code>
1064610645
</DeprecatedMethod>
1064710646
<InvalidPropertyAssignmentValue>
1064810647
<code><![CDATA[$config->selectedServer]]></code>
@@ -10663,7 +10662,6 @@
1066310662
<code><![CDATA[Config::getInstance()]]></code>
1066410663
<code><![CDATA[DatabaseInterface::getInstance()]]></code>
1066510664
<code><![CDATA[DatabaseInterface::getInstance()]]></code>
10666-
<code><![CDATA[DatabaseInterface::getInstance()]]></code>
1066710665
</DeprecatedMethod>
1066810666
<MixedArrayAccess>
1066910667
<code><![CDATA[$entries[0]['statement']]]></code>

src/Controllers/Table/TrackingController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpMyAdmin\Controllers\Table;
66

77
use DateTimeImmutable;
8+
use PhpMyAdmin\Clock\Clock;
89
use PhpMyAdmin\Controllers\InvocableController;
910
use PhpMyAdmin\Core;
1011
use PhpMyAdmin\Current;
@@ -130,7 +131,7 @@ public function __invoke(ServerRequest $request): Response
130131

131132
// Export as file download
132133
if ($reportExportType === 'sqldumpfile') {
133-
$downloadInfo = $this->tracking->getDownloadInfoForExport($tableParam, $entries);
134+
$downloadInfo = $this->tracking->getDownloadInfoForExport(new Clock(), $tableParam, $entries);
134135
$response = $this->responseFactory->createResponse();
135136
Core::downloadHeader($downloadInfo['filename'], 'text/x-sql', mb_strlen($downloadInfo['dump']));
136137

src/Tracking/Tracker.php

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace PhpMyAdmin\Tracking;
99

10+
use PhpMyAdmin\Clock\Clock;
1011
use PhpMyAdmin\Config;
1112
use PhpMyAdmin\ConfigStorage\Features\TrackingFeature;
1213
use PhpMyAdmin\ConfigStorage\Relation;
@@ -25,6 +26,7 @@
2526
use PhpMyAdmin\SqlParser\Statements\TruncateStatement;
2627
use PhpMyAdmin\SqlParser\Statements\UpdateStatement;
2728
use PhpMyAdmin\Util;
29+
use Psr\Clock\ClockInterface;
2830

2931
use function in_array;
3032
use function preg_quote;
@@ -134,9 +136,9 @@ public static function isTracked(string $dbName, string $tableName): bool
134136
*
135137
* @return string Comment, contains date and username
136138
*/
137-
public static function getLogComment(): string
139+
public static function getLogComment(ClockInterface $clock): string
138140
{
139-
$date = Util::date('Y-m-d H:i:s');
141+
$date = $clock->now()->format('Y-m-d H:i:s');
140142
$user = preg_replace('/\s+/', ' ', Config::getInstance()->selectedServer['user']);
141143

142144
return '# log ' . $date . ' ' . $user . "\n";
@@ -174,7 +176,8 @@ public static function createVersion(
174176

175177
$exportSqlPlugin->useSqlBackquotes(true);
176178

177-
$date = Util::date('Y-m-d H:i:s');
179+
$clock = new Clock();
180+
$date = $clock->now()->format('Y-m-d H:i:s');
178181

179182
// Get data definition snapshot of table
180183

@@ -199,18 +202,17 @@ public static function createVersion(
199202

200203
// Get DROP TABLE / DROP VIEW and CREATE TABLE SQL statements
201204
$createSql = '';
202-
203205
if ($config->selectedServer['tracking_add_drop_table'] && ! $isView) {
204-
$createSql .= self::getLogComment()
206+
$createSql .= self::getLogComment($clock)
205207
. 'DROP TABLE IF EXISTS ' . Util::backquote($tableName) . ";\n";
206208
}
207209

208210
if ($config->selectedServer['tracking_add_drop_view'] && $isView) {
209-
$createSql .= self::getLogComment()
211+
$createSql .= self::getLogComment($clock)
210212
. 'DROP VIEW IF EXISTS ' . Util::backquote($tableName) . ";\n";
211213
}
212214

213-
$createSql .= self::getLogComment() . $exportSqlPlugin->getTableDef($dbName, $tableName);
215+
$createSql .= self::getLogComment($clock) . $exportSqlPlugin->getTableDef($dbName, $tableName);
214216

215217
// Save version
216218
$trackingFeature = $relation->getRelationParameters()->trackingFeature;
@@ -259,20 +261,20 @@ public static function createDatabaseVersion(
259261
$dbi = DatabaseInterface::getInstance();
260262
$relation = new Relation($dbi);
261263

262-
$date = Util::date('Y-m-d H:i:s');
264+
$clock = new Clock();
265+
$date = $clock->now()->format('Y-m-d H:i:s');
263266

264267
$config = Config::getInstance();
265268
if ($trackingSet === '') {
266269
$trackingSet = $config->selectedServer['tracking_default_statements'];
267270
}
268271

269272
$createSql = '';
270-
271273
if ($config->selectedServer['tracking_add_drop_database']) {
272-
$createSql .= self::getLogComment() . 'DROP DATABASE IF EXISTS ' . Util::backquote($dbName) . ";\n";
274+
$createSql .= self::getLogComment($clock) . 'DROP DATABASE IF EXISTS ' . Util::backquote($dbName) . ";\n";
273275
}
274276

275-
$createSql .= self::getLogComment() . $query;
277+
$createSql .= self::getLogComment($clock) . $query;
276278

277279
$trackingFeature = $relation->getRelationParameters()->trackingFeature;
278280
if ($trackingFeature === null) {
@@ -619,7 +621,8 @@ public static function handleQuery(string $query): void
619621
default => '',
620622
};
621623

622-
$date = Util::date('Y-m-d H:i:s');
624+
$clock = new Clock();
625+
$date = $clock->now()->format('Y-m-d H:i:s');
623626

624627
// Cut off `dbname`. from query
625628
$query = preg_replace(
@@ -629,7 +632,7 @@ public static function handleQuery(string $query): void
629632
);
630633

631634
// Add log information
632-
$query = self::getLogComment() . $query;
635+
$query = self::getLogComment($clock) . $query;
633636

634637
$relation = new Relation($dbi);
635638
$trackingFeature = $relation->getRelationParameters()->trackingFeature;

src/Tracking/Tracking.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace PhpMyAdmin\Tracking;
99

1010
use DateTimeImmutable;
11+
use PhpMyAdmin\Clock\Clock;
1112
use PhpMyAdmin\Config;
1213
use PhpMyAdmin\ConfigStorage\Relation;
1314
use PhpMyAdmin\Core;
@@ -20,12 +21,12 @@
2021
use PhpMyAdmin\Template;
2122
use PhpMyAdmin\Url;
2223
use PhpMyAdmin\Util;
24+
use Psr\Clock\ClockInterface;
2325
use Webmozart\Assert\Assert;
2426

2527
use function __;
2628
use function array_merge;
2729
use function array_multisort;
28-
use function date;
2930
use function explode;
3031
use function htmlspecialchars;
3132
use function in_array;
@@ -616,7 +617,8 @@ public function getTrackedData(string $dbname, string $tablename, string $versio
616617
$logSchemaEntries = explode('# log ', (string) $mixed['schema_sql']);
617618
$logDataEntries = explode('# log ', (string) $mixed['data_sql']);
618619

619-
$ddlDateFrom = $date = Util::date('Y-m-d H:i:s');
620+
$clock = new Clock();
621+
$ddlDateFrom = $date = $clock->now()->format('Y-m-d H:i:s');
620622

621623
$ddlog = [];
622624
$firstIteration = true;
@@ -829,14 +831,14 @@ public function exportAsSqlExecution(array $entries): void
829831
* @return array<string, string>
830832
* @psalm-return array{filename: non-empty-string, dump: non-empty-string}
831833
*/
832-
public function getDownloadInfoForExport(string $table, array $entries): array
834+
public function getDownloadInfoForExport(ClockInterface $clock, string $table, array $entries): array
833835
{
834836
ini_set('url_rewriter.tags', '');
835837

836838
// Replace all multiple whitespaces by a single space
837839
$table = htmlspecialchars((string) preg_replace('/\s+/', ' ', $table));
838840
$dump = '# ' . sprintf(__('Tracking report for table `%s`'), $table) . "\n"
839-
. '# ' . date('Y-m-d H:i:sP') . "\n";
841+
. '# ' . $clock->now()->format('Y-m-d H:i:sP') . "\n";
840842
foreach ($entries as $entry) {
841843
$dump .= $entry['statement'];
842844
}

src/Util.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
use function chr;
2727
use function count;
2828
use function ctype_digit;
29-
use function date;
3029
use function decbin;
3130
use function explode;
3231
use function extension_loaded;
@@ -1558,16 +1557,6 @@ public static function generateRandom(int $length, bool $asHex = false): string
15581557
return $asHex ? bin2hex($result) : $result;
15591558
}
15601559

1561-
/**
1562-
* Wrapper around PHP date function
1563-
*
1564-
* @param string $format Date format string
1565-
*/
1566-
public static function date(string $format): string
1567-
{
1568-
return date($format);
1569-
}
1570-
15711560
/**
15721561
* Wrapper around php's set_time_limit
15731562
*

tests/unit/Tracking/TrackerTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
use PhpMyAdmin\Dbal\ConnectionType;
1313
use PhpMyAdmin\Dbal\DatabaseInterface;
1414
use PhpMyAdmin\Tests\AbstractTestCase;
15+
use PhpMyAdmin\Tests\Clock\MockClock;
1516
use PhpMyAdmin\Tests\Stubs\DummyResult;
1617
use PhpMyAdmin\Tracking\Tracker;
17-
use PhpMyAdmin\Util;
1818
use PHPUnit\Framework\Attributes\CoversClass;
1919
use PHPUnit\Framework\Attributes\DataProvider;
2020
use ReflectionMethod;
@@ -136,12 +136,12 @@ public function testIsTracked(): void
136136
*/
137137
public function testGetLogComment(): void
138138
{
139-
$date = Util::date('Y-m-d H:i:s');
140-
Config::getInstance()->selectedServer['user'] = 'pma_test_user';
139+
$config = Config::$instance = new Config();
140+
$config->selectedServer['user'] = 'pma_test_user';
141141

142142
self::assertSame(
143-
'# log ' . $date . " pma_test_user\n",
144-
Tracker::getLogComment(),
143+
"# log 2015-10-21 05:28:00 pma_test_user\n",
144+
Tracker::getLogComment(MockClock::from('2015-10-21T05:28:00-02:00')),
145145
);
146146
}
147147

tests/unit/Tracking/TrackingTest.php

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,20 @@
1414
use PhpMyAdmin\SqlQueryForm;
1515
use PhpMyAdmin\Template;
1616
use PhpMyAdmin\Tests\AbstractTestCase;
17+
use PhpMyAdmin\Tests\Clock\MockClock;
1718
use PhpMyAdmin\Tests\Stubs\DummyResult;
1819
use PhpMyAdmin\Tracking\LogType;
1920
use PhpMyAdmin\Tracking\TrackedData;
2021
use PhpMyAdmin\Tracking\TrackedDataType;
2122
use PhpMyAdmin\Tracking\Tracking;
2223
use PhpMyAdmin\Tracking\TrackingChecker;
2324
use PhpMyAdmin\Url;
24-
use PhpMyAdmin\Util;
2525
use PHPUnit\Framework\Attributes\CoversClass;
2626
use PHPUnit\Framework\Attributes\DataProvider;
2727
use ReflectionProperty;
2828

2929
use function __;
3030
use function _pgettext;
31-
use function date;
3231
use function htmlspecialchars;
3332
use function ini_get;
3433
use function ini_restore;
@@ -558,9 +557,10 @@ public function testGetDownloadInfoForExport(): void
558557
ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,form=,fieldset=');
559558
$entries = [['statement' => 'first statement'], ['statement' => 'second statement']];
560559
$expectedDump = '# Tracking report for table `test&gt; table`' . "\n"
561-
. '# ' . date('Y-m-d H:i:sP') . "\n"
560+
. '# 2015-10-21 05:28:00-02:00' . "\n"
562561
. 'first statementsecond statement';
563-
$actual = $tracking->getDownloadInfoForExport('test> table', $entries);
562+
$clock = MockClock::from('2015-10-21T05:28:00-02:00');
563+
$actual = $tracking->getDownloadInfoForExport($clock, 'test> table', $entries);
564564
self::assertSame('log_test&gt; table.sql', $actual['filename']);
565565
self::assertSame($expectedDump, $actual['dump']);
566566
self::assertSame('', ini_get('url_rewriter.tags'));
@@ -600,61 +600,35 @@ public function testDeleteTracking(): void
600600
self::assertTrue($tracking->deleteTracking('testdb', 'testtable'));
601601
}
602602

603-
/**
604-
* Test for changeTrackingData()
605-
*/
606603
public function testChangeTrackingData(): void
607604
{
608-
$dbi = $this->getMockBuilder(DatabaseInterface::class)
609-
->disableOriginalConstructor()
610-
->getMock();
611-
612-
$sqlQuery1 = 'UPDATE `pmadb`.`tracking`' .
613-
" SET `schema_sql` = '# new_data_processed'" .
614-
" WHERE `db_name` = 'pma_db'" .
615-
" AND `table_name` = 'pma_table'" .
616-
" AND `version` = '1.0'";
617-
618-
$date = Util::date('Y-m-d H:i:s');
619-
620605
$newData = [
621-
['date' => $date, 'username' => 'user1', 'statement' => 'test_statement1'],
622-
['date' => $date, 'username' => 'user2', 'statement' => 'test_statement2'],
606+
['date' => '2026-02-25 19:29:34', 'username' => 'user1', 'statement' => 'test_statement1'],
607+
['date' => '2026-02-25 19:29:34', 'username' => 'user2', 'statement' => 'test_statement2'],
623608
];
624609

625-
$sqlQuery2 = 'UPDATE `pmadb`.`tracking`' .
626-
" SET `data_sql` = '# log " . $date . " user1test_statement1\n" .
627-
'# log ' . $date . " user2test_statement2\n'" .
628-
" WHERE `db_name` = 'pma_db'" .
629-
" AND `table_name` = 'pma_table'" .
630-
" AND `version` = '1.0'";
631-
632-
$resultStub1 = self::createMock(DummyResult::class);
633-
$resultStub2 = self::createMock(DummyResult::class);
634-
635-
$dbi->method('queryAsControlUser')
636-
->willReturnMap([[$sqlQuery1, $resultStub1], [$sqlQuery2, $resultStub2]]);
637-
638-
$dbi->expects(self::any())->method('quoteString')
639-
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
610+
$dbiDummy = $this->createDbiDummy();
611+
$dbiDummy->addResult(
612+
'UPDATE `pmadb`.`tracking`' .
613+
" SET `data_sql` = '# log 2026-02-25 19:29:34 user1test_statement1 " .
614+
"# log 2026-02-25 19:29:34 user2test_statement2 '" .
615+
" WHERE `db_name` = 'pma_db'" .
616+
" AND `table_name` = 'pma_table'" .
617+
" AND `version` = '1.0'",
618+
true,
619+
);
620+
$dbi = $this->createDatabaseInterface($dbiDummy);
640621

641622
$tracking = new Tracking(
642623
self::createStub(SqlQueryForm::class),
643624
self::createStub(Template::class),
644-
new Relation(DatabaseInterface::getInstance()),
625+
new Relation($dbi, new Config()),
645626
$dbi,
646627
self::createStub(TrackingChecker::class),
647628
);
648629

649-
self::assertTrue(
650-
$tracking->changeTrackingData(
651-
'pma_db',
652-
'pma_table',
653-
'1.0',
654-
TrackedDataType::DML,
655-
$newData,
656-
),
657-
);
630+
self::assertTrue($tracking->changeTrackingData('pma_db', 'pma_table', '1.0', TrackedDataType::DML, $newData));
631+
$dbiDummy->assertAllQueriesConsumed();
658632
}
659633

660634
/**

0 commit comments

Comments
 (0)