Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/Models/Citizen.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,7 @@ public function getDateOfBirth(): ?DateTime
*/
public function getAge(): ?int
{
if (!$this->dateOfBirth) {
throw new UnsupportedOperationException('Citizen date of birth is null.');
}

return (new DateTime())->diff($this->dateOfBirth)->y;
return $this->dateOfBirth ? new DateTime()->diff($this->dateOfBirth)->y : null;
}

/**
Expand Down
114 changes: 59 additions & 55 deletions tests/Feature/Europe/AlbaniaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,90 +3,94 @@
namespace Reducktion\Socrates\Tests\Feature\Europe;

use DateTime;
use PHPUnit\Framework\Attributes\DataProvider;
use Reducktion\Socrates\Constants\Country;
use Reducktion\Socrates\Constants\Gender;
use Reducktion\Socrates\Exceptions\InvalidLengthException;
use Reducktion\Socrates\Tests\Feature\FeatureTestCase;

class AlbaniaTest extends FeatureTestCase
{
private array $people;
private array $invalidIds;

protected function setUp(): void
public static function peopleDataProvider(): array
{
parent::setUp();

$this->people = [
return [
'bardhana' => [
'nid' => 'I05101999I',
'gender' => Gender::Female,
'dob' => new DateTime('1980-01-01'),
'age' => $this->calculateAge(new DateTime('1980-01-01')),
'person' => [
'nid' => 'I05101999I',
'gender' => Gender::Female,
'dob' => new DateTime('1980-01-01'),
'age' => self::calculateAge(new DateTime('1980-01-01')),
],
],
'shufti' => [
'nid' => 'I90201535E',
'gender' => Gender::Male,
'dob' => new DateTime('1989-02-01'),
'age' => $this->calculateAge(new DateTime('1989-02-01')),
'person' => [
'nid' => 'I90201535E',
'gender' => Gender::Male,
'dob' => new DateTime('1989-02-01'),
'age' => self::calculateAge(new DateTime('1989-02-01')),
],
],
'shyqe' => [
'nid' => 'J45423004V',
'gender' => Gender::Female,
'dob' => new DateTime('1994-04-23'),
'age' => $this->calculateAge(new DateTime('1994-04-23')),
'person' => [
'nid' => 'J45423004V',
'gender' => Gender::Female,
'dob' => new DateTime('1994-04-23'),
'age' => self::calculateAge(new DateTime('1994-04-23')),
],
],
'elseid' => [
'nid' => 'H71211672R',
'gender' => Gender::Male,
'dob' => new DateTime('1977-12-11'),
'age' => $this->calculateAge(new DateTime('1977-12-11')),
'person' => [
'nid' => 'H71211672R',
'gender' => Gender::Male,
'dob' => new DateTime('1977-12-11'),
'age' => self::calculateAge(new DateTime('1977-12-11')),
],
],
'hasna' => [
'nid' => 'I85413200A',
'gender' => Gender::Female,
'dob' => new DateTime('1988-04-13'),
'age' => $this->calculateAge(new DateTime('1988-04-13')),
'person' => [
'nid' => 'I85413200A',
'gender' => Gender::Female,
'dob' => new DateTime('1988-04-13'),
'age' => self::calculateAge(new DateTime('1988-04-13')),
],
],
];
}

$this->invalidIds = [
'I05101999Q',
'J45423004Y',
'I85413200J',
'I90201535M',
'H71211672A',
public static function invalidIdsDataProvider(): array
{
return [
['I05101999Q'],
['J45423004Y'],
['I85413200J'],
['I90201535M'],
['H71211672A'],
];
}

public function test_extract_behaviour(): void
#[DataProvider('peopleDataProvider')]
public function test_extract_behaviour(array $person): void
{
foreach ($this->people as $person) {
$citizen = $this->socrates->getCitizenDataFromId($person['nid'], Country::Albania);
self::assertEquals($person['gender'], $citizen->getGender());
self::assertEquals($person['dob'], $citizen->getDateOfBirth());
self::assertEquals($person['age'], $citizen->getAge());
}

$this->expectException(InvalidLengthException::class);

$this->socrates->getCitizenDataFromId('I051019992I', Country::Albania);
$citizen = $this->socrates->getCitizenDataFromId($person['nid'], Country::Albania);
self::assertEquals($person['gender'], $citizen->getGender());
self::assertEquals($person['dob'], $citizen->getDateOfBirth());
self::assertEquals($person['age'], $citizen->getAge());
}

public function test_validation_behaviour(): void
#[DataProvider('peopleDataProvider')]
public function test_validation_with_valid_ids_passes(array $person): void
{
foreach ($this->people as $person) {
self::assertTrue(
$this->socrates->validateId($person['nid'], Country::Albania)
);
}
self::assertTrue($this->socrates->validateId($person['nid'], Country::Albania));
}

foreach ($this->invalidIds as $invalidId) {
self::assertFalse(
$this->socrates->validateId($invalidId, Country::Albania)
);
}
#[DataProvider('invalidIdsDataProvider')]
public function test_validation_with_invalid_ids_fails(string $invalidId): void
{
self::assertFalse($this->socrates->validateId($invalidId, Country::Albania));
}

public function test_validation_using_ids_with_invalid_length_throw_exception(): void
{
$this->expectException(InvalidLengthException::class);

$this->socrates->validateId('I0785101999I', Country::Albania);
Expand Down
175 changes: 83 additions & 92 deletions tests/Feature/Europe/BelgiumTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,138 +3,129 @@
namespace Reducktion\Socrates\Tests\Feature\Europe;

use DateTime;
use PHPUnit\Framework\Attributes\DataProvider;
use Reducktion\Socrates\Constants\Country;
use Reducktion\Socrates\Constants\Gender;
use Reducktion\Socrates\Exceptions\InvalidLengthException;
use Reducktion\Socrates\Tests\Feature\FeatureTestCase;

class BelgiumTest extends FeatureTestCase
{
private array $people;
private array $bisNumbers;
private array $invalidIds;

public function setUp(): void
public static function peopleDataProvider(): array
{
parent::setUp();

$this->people = [
return [
'shahin' => [
'id' => '93.05.18-223.61',
'gender' => Gender::Male,
'dob' => new DateTime('1993-05-18'),
'age' => $this->calculateAge(new DateTime('1993-05-18')),
'person' => [
'id' => '93.05.18-223.61',
'gender' => Gender::Male,
'dob' => new DateTime('1993-05-18'),
'age' => self::calculateAge(new DateTime('1993-05-18')),
],
],
'naoual' => [
'id' => '730111-361-73',
'gender' => Gender::Male,
'dob' => new DateTime('1973-01-11'),
'age' => $this->calculateAge(new DateTime('1973-01-11')),
'person' => [
'id' => '730111-361-73',
'gender' => Gender::Male,
'dob' => new DateTime('1973-01-11'),
'age' => self::calculateAge(new DateTime('1973-01-11')),
],
],
'xavi' => [
'id' => '75.12.05-137.14',
'gender' => Gender::Male,
'dob' => new DateTime('1975-12-05'),
'age' => $this->calculateAge(new DateTime('1975-12-05')),
'person' => [
'id' => '75.12.05-137.14',
'gender' => Gender::Male,
'dob' => new DateTime('1975-12-05'),
'age' => self::calculateAge(new DateTime('1975-12-05')),
],
],
'kurt' => [
'id' => '71.09.07-213.64',
'gender' => Gender::Male,
'dob' => new DateTime('1971-09-07'),
'age' => $this->calculateAge(new DateTime('1971-09-07')),
'person' => [
'id' => '71.09.07-213.64',
'gender' => Gender::Male,
'dob' => new DateTime('1971-09-07'),
'age' => self::calculateAge(new DateTime('1971-09-07')),
],
],
'mark' => [
'id' => '40.00.01-001.33',
'gender' => Gender::Male,
'dob' => new DateTime('1940-01-01'),
'age' => $this->calculateAge(new DateTime('1940-01-01')),
]
];

$this->bisNumbers = [
'person' => [
'id' => '40.00.01-001.33',
'gender' => Gender::Male,
'dob' => new DateTime('1940-01-01'),
'age' => self::calculateAge(new DateTime('1940-01-01')),
],
],
// BIS numbers
'dobAndGenderUnknown1' => [
'id' => '11200274580',
'gender' => null,
'dob' => null,
'person' => [
'id' => '11200274580',
'gender' => null,
'dob' => null,
],
],
'dobAndGenderUnknown2' => [
'id' => '00200203376',
'gender' => null,
'dob' => null,
'person' => [
'id' => '00200203376',
'gender' => null,
'dob' => null,
],
],
'dobUnknownGenderKnown' => [
'id' => '00400048320',
'gender' => Gender::Male,
'dob' => null,
'person' => [
'id' => '00400048320',
'gender' => Gender::Male,
'dob' => null,
],
],
'dobAndGenderKnown' => [
'id' => '00421090786',
'gender' => Gender::Male,
'dob' => new DateTime('2000-02-10'),
'person' => [
'id' => '00421090786',
'gender' => Gender::Male,
'dob' => new DateTime('2000-02-10'),
'age' => self::calculateAge(new DateTime('2000-02-10')),
],
],
];
}

$this->invalidIds = [
'12.12.12-132.32',
'97.12.03-123.12',
'01.06.18-468.99',
'64.04.09-874.43',
'12.10.23-954.11',
'00.08.24-282.48', // invalid age
'01.11.16-000.06', // invalid sequence number
'01.11.16-999.74' // invalid sequence number
public static function invalidIdsDataProvider(): array
{
return [
['12.12.12-132.32'],
['97.12.03-123.12'],
['01.06.18-468.99'],
['64.04.09-874.43'],
['12.10.23-954.11'],
['00.08.24-282.48'], // invalid age
['01.11.16-000.06'], // invalid sequence number
['01.11.16-999.74'], // invalid sequence number
];
}

public function test_extract_behaviour(): void
#[DataProvider('peopleDataProvider')]
public function test_extract_behaviour(array $person): void
{
foreach ($this->people as $person) {
$citizen = $this->socrates->getCitizenDataFromId($person['id'], Country::Belgium);
self::assertEquals($person['gender'], $citizen->getGender());
self::assertEquals($person['dob'], $citizen->getDateOfBirth());
self::assertEquals($person['age'], $citizen->getAge());
}

$this->expectException(InvalidLengthException::class);

$this->socrates->getCitizenDataFromId('12.12.12-1323.32', Country::Belgium);
$citizen = $this->socrates->getCitizenDataFromId($person['id'], Country::Belgium);
self::assertEquals($person['gender'], $citizen->getGender());
self::assertEquals($person['dob'], $citizen->getDateOfBirth());
self::assertEquals($person['age'], $citizen->getAge());
}

public function test_validation_behaviour(): void
#[DataProvider('peopleDataProvider')]
public function test_validation_with_valid_ids_passes(array $person): void
{
foreach ($this->people as $person) {
self::assertTrue(
$this->socrates->validateId($person['id'], Country::Belgium)
);
}

foreach ($this->invalidIds as $id) {
self::assertFalse(
$this->socrates->validateId($id, Country::Belgium)
);
}

$this->expectException(InvalidLengthException::class);

$this->socrates->getCitizenDataFromId('12.12.12-1323.32', Country::Belgium);
self::assertTrue($this->socrates->validateId($person['id'], Country::Belgium));
}

public function test_bis_number_validation(): void
#[DataProvider('invalidIdsDataProvider')]
public function test_validation_with_invalid_ids_fails(string $invalidId): void
{
foreach ($this->bisNumbers as $bisNumber) {
self::assertTrue(
$this->socrates->validateId($bisNumber['id'], Country::Belgium)
);
}
self::assertFalse($this->socrates->validateId($invalidId, Country::Belgium));
}

public function test_bis_number_extraction(): void
public function test_validation_using_ids_with_invalid_length_throw_exception(): void
{
foreach ($this->bisNumbers as $bisNumber) {
$citizen = $this->socrates->getCitizenDataFromId($bisNumber['id'], Country::Belgium);
$this->expectException(InvalidLengthException::class);

self::assertEquals($bisNumber['gender'], $citizen->getGender());
self::assertEquals($bisNumber['dob'], $citizen->getDateOfBirth());
}
$this->socrates->getCitizenDataFromId('12.12.12-1323.32', Country::Belgium);
}
}
Loading