diff --git a/README.md b/README.md index 161a6d5..ec89c7e 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,63 @@ csv-validator ============= -CSV validator library. +CSV validator library + +That uses the constraints of Symfony framework: [http://symfony.com/doc/current/reference/constraints.html](http://symfony.com/doc/current/reference/constraints.html). + +Installation +------------ + +You need [composer]("https://getcomposer.org/"): + + composer require deblan/csv-validator dev-master -Works in progress. You should not use this package. Example ------- -Read the source of `example.php`. +``` +setHasLegend(true); + +// Initialisation of the validator +$validator = new Validator($parser, Validation::createValidator()); + +// The first field must contain an email +$validator->addFieldConstraint(0, new Email()); + +// The second field must contain a date +$validator->addFieldConstraint(1, new Date()); + +// An line must contain 3 columns +$validator->addDataConstraint(new Callback(function($data, ExecutionContextInterface $context) { + if (count($data) !== 6) { // 6 because of the legend (3 fields * 2) + $context->addViolation('The line must contain 3 columns'); + } +})); + +$validator->validate(); + +if ($validator->isValid() === false) { + foreach ($validator->getErrors() as $violation) { + $line = $violation->getLine(); + $column = $violation->getColumn(); + $message = $violation->getViolation()->getMessage(); + + // Up to you! + } +} +``` diff --git a/example.php b/example.php index 52713f5..9fb13a1 100644 --- a/example.php +++ b/example.php @@ -5,18 +5,31 @@ use Deblan\CsvValidator\Validator; use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Date; +use Symfony\Component\Validator\Constraints\Callback; +use Symfony\Component\Validator\Context\ExecutionContextInterface; -chdir(__DIR__); +require __DIR__.'/vendor/autoload.php'; -require 'vendor/autoload.php'; - -$parser = new CsvParser('example.csv', ';', ''); +// Initialisation of the parser +$parser = new CsvParser(__DIR__.'/tests/fixtures/example.csv'); +$parser->setHasLegend(true); +// Initialisation of the validator $validator = new Validator($parser, Validation::createValidator()); +// The first field must contain an email $validator->addFieldConstraint(0, new Email()); + +// The second field must contain a date $validator->addFieldConstraint(1, new Date()); +// An line must contain 3 columns +$validator->addDataConstraint(new Callback(function($data, ExecutionContextInterface $context) { + if (count($data) !== 6) { // 6 because of the legend (3 fields * 2) + $context->addViolation('The line must contain 3 columns'); + } +})); + $validator->validate(); if ($validator->isValid() === false) { @@ -24,14 +37,7 @@ if ($validator->isValid() === false) { $line = $violation->getLine(); $column = $violation->getColumn(); $message = $violation->getViolation()->getMessage(); - - echo <<generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $this->setExpectedException('\RuntimeException'); + $validator->isValid(); + } + + public function testNoConstraint() + { + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->validate(); + $this->assertEquals(true, $validator->isValid()); + } + + public function testFieldContraintsOk() + { + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(0, new NotBlank()); + $validator->validate(); + $this->assertEquals(true, $validator->isValid()); + $this->assertEquals(0, count($validator->getErrors())); + + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(1, new NotBlank()); + $validator->validate(); + $this->assertEquals(true, $validator->isValid()); + $this->assertEquals(0, count($validator->getErrors())); + + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(0, new NotBlank()); + $validator->addFieldConstraint(1, new NotBlank()); + $validator->validate(); + $this->assertEquals(true, $validator->isValid()); + $this->assertEquals(0, count($validator->getErrors())); + } + + public function testFieldContraintsKo() + { + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(0, new Email()); + $validator->validate(); + $this->assertEquals(false, $validator->isValid()); + $this->assertEquals(4, count($validator->getErrors())); + + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(1, new Email()); + $validator->validate(); + $this->assertEquals(false, $validator->isValid()); + $this->assertEquals(4, count($validator->getErrors())); + + $parser = $this->generateParser('example.csv'); + $validator = $this->generateValidator($parser); + $validator->addFieldConstraint(0, new Email()); + $validator->addFieldConstraint(1, new Email()); + $validator->validate(); + $this->assertEquals(false, $validator->isValid()); + $this->assertEquals(8, count($validator->getErrors())); + } + + protected function generateParser($file) + { + return new CsvParser(__DIR__.'/fixtures/'.$file); + } + + protected function generateValidator(CsvParser $parser) + { + return new Validator($parser, Validation::createValidator()); + } +} diff --git a/tests/fixtures/example.csv b/tests/fixtures/example.csv new file mode 100644 index 0000000..7cadbe7 --- /dev/null +++ b/tests/fixtures/example.csv @@ -0,0 +1,4 @@ +"foo";"bar" +"foo1";"bar1" +"foo2";"bar2" +"foo3";"bar3"