From bd1c29879da088cb2550291ecfe59b3b42c2fd3d Mon Sep 17 00:00:00 2001 From: Fred Blanc Date: Tue, 16 Mar 2021 23:40:34 +0100 Subject: [PATCH] OCP --- run.php | 4 +-- src/CsvDataImporter.php | 6 ++-- .../AbstractRepository.php} | 23 +++++++-------- src/Repository/ImportedRepository.php | 28 +++++++++++++++++++ src/Repository/UsersRepository.php | 28 +++++++++++++++++++ tests/CsvDataImporterTest.php | 17 +++++++++-- tests/TestsFacility.php | 6 ++++ var/import/users.csv | 3 +- 8 files changed, 94 insertions(+), 21 deletions(-) rename src/{Repository.php => Repository/AbstractRepository.php} (54%) create mode 100644 src/Repository/ImportedRepository.php create mode 100644 src/Repository/UsersRepository.php diff --git a/run.php b/run.php index fa1df23..c9599f2 100644 --- a/run.php +++ b/run.php @@ -2,7 +2,7 @@ use solid\CsvDataImporter; use solid\Loader; -use solid\Repository; +use solid\Repository\ImportedRepository; require 'vendor/autoload.php'; @@ -11,7 +11,7 @@ 'solid', 'local' ); -$repository = new Repository($db); +$repository = new ImportedRepository($db); $loader = new Loader('var/import/data.csv'); $importer = new CsvDataImporter($repository, $loader); diff --git a/src/CsvDataImporter.php b/src/CsvDataImporter.php index aba05dd..2fd815b 100644 --- a/src/CsvDataImporter.php +++ b/src/CsvDataImporter.php @@ -2,12 +2,14 @@ namespace solid; +use solid\Repository\AbstractRepository; + class CsvDataImporter { - private Repository $repository; + private AbstractRepository $repository; private Loader $loader; - public function __construct(Repository $repository, Loader $loader) + public function __construct(AbstractRepository $repository, Loader $loader) { $this->repository = $repository; $this->loader = $loader; diff --git a/src/Repository.php b/src/Repository/AbstractRepository.php similarity index 54% rename from src/Repository.php rename to src/Repository/AbstractRepository.php index 7c76d73..aaf442b 100644 --- a/src/Repository.php +++ b/src/Repository/AbstractRepository.php @@ -2,30 +2,34 @@ declare(strict_types=1); -namespace solid; +namespace solid\Repository; use PDO; use PDOException; -class Repository +abstract class AbstractRepository { - private PDO $db; + protected PDO $db; public function __construct(PDO $db) { $this->db = $db; } + abstract protected function beforeInserts(): void; + abstract protected function insert(array $record): void; + + abstract public function getCount(): int; + public function importData(array $records): void { try { $this->db->beginTransaction(); - $this->db->exec('DELETE FROM imported'); + $this->beforeInserts(); foreach ($records as $record) { - $this->db->prepare('INSERT INTO imported VALUES (?, ?, ?)') - ->execute($record); + $this->insert($record); } $this->db->commit(); @@ -34,11 +38,4 @@ public function importData(array $records): void throw $e; } } - - public function getCount(): int - { - $data = $this->db->query('SELECT COUNT(*) AS nb FROM imported')->fetch(); - - return (int) $data['nb']; - } } diff --git a/src/Repository/ImportedRepository.php b/src/Repository/ImportedRepository.php new file mode 100644 index 0000000..efa6738 --- /dev/null +++ b/src/Repository/ImportedRepository.php @@ -0,0 +1,28 @@ +db->exec('DELETE FROM imported'); + } + + protected function insert(array $record): void + { + $this->db->prepare('INSERT INTO imported VALUES (?, ?, ?)') + ->execute($record); + } + + public function getCount(): int + { + $data = $this->db->query('SELECT COUNT(*) AS nb FROM imported')->fetch(); + + return (int) $data['nb']; + } +} diff --git a/src/Repository/UsersRepository.php b/src/Repository/UsersRepository.php new file mode 100644 index 0000000..d612a52 --- /dev/null +++ b/src/Repository/UsersRepository.php @@ -0,0 +1,28 @@ +db->exec('DELETE FROM users'); + } + + protected function insert(array $record): void + { + $this->db->prepare('INSERT INTO users VALUES (?, ?, ?)') + ->execute($record); + } + + public function getCount(): int + { + $data = $this->db->query('SELECT COUNT(*) AS nb FROM users')->fetch(); + + return (int) $data['nb']; + } +} diff --git a/tests/CsvDataImporterTest.php b/tests/CsvDataImporterTest.php index 56745e5..0929fe0 100644 --- a/tests/CsvDataImporterTest.php +++ b/tests/CsvDataImporterTest.php @@ -7,14 +7,15 @@ use PHPUnit\Framework\TestCase; use solid\CsvDataImporter; use solid\Loader; -use solid\Repository; +use solid\Repository\ImportedRepository; +use solid\Repository\UsersRepository; class CsvDataImporterTest extends TestCase { public function testImport(): void { $db = TestsFacility::createDb(); - $repository = new Repository($db); + $repository = new ImportedRepository($db); $loader = new Loader('var/import/data.csv'); $importer = new CsvDataImporter($repository, $loader); @@ -22,4 +23,16 @@ public function testImport(): void $this->assertSame(3, $repository->getCount()); } + + public function testUsers(): void + { + $db = TestsFacility::createDb(); + $repository = new UsersRepository($db); + $loader = new Loader('var/import/users.csv'); + + $importer = new CsvDataImporter($repository, $loader); + $importer->import(); + + $this->assertSame(2, $repository->getCount()); + } } diff --git a/tests/TestsFacility.php b/tests/TestsFacility.php index 7f46584..7b1ca6f 100644 --- a/tests/TestsFacility.php +++ b/tests/TestsFacility.php @@ -31,5 +31,11 @@ private static function loadFixtures(PDO $db): void champ2 TINYTEXT NOT NULL, champ3 TINYTEXT NOT NULL )'); + + $db->exec('CREATE TABLE users ( + id TINYTEXT NOT NULL, + login TINYTEXT NOT NULL, + fullname TINYTEXT NOT NULL + )'); } } diff --git a/var/import/users.csv b/var/import/users.csv index d3c5f0d..084e9f6 100644 --- a/var/import/users.csv +++ b/var/import/users.csv @@ -1,3 +1,2 @@ 1;toto;Toto -2;titi;Titi -3;pouet;Pouet \ No newline at end of file +2;titi;Titi \ No newline at end of file