From 305b0197b8b93ea16af9d6d6d50326fb1c47132d Mon Sep 17 00:00:00 2001 From: Alexandre Almeida Olival Date: Sat, 6 Feb 2021 16:16:09 +0000 Subject: [PATCH] [RELEASE] Socrates v1.3.0 (#113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create Europe folder * Add Europe folder to tests * Implement USA validator * Change name to United States instead * Implement Canada * Follow PSR * Small fix * Sort config validators alphabetically * Add link to source information for the algorithms of Belgium. (#75) * Feature/make classes abstract (#88) * Make Gender.php class abstract * Make Countries.php class abstract * Fix ID validation Belgium. (#91) * Added Chile ID (RUT) validator (#81) * Implement Chile ID validator and tests * Added Argentina ID (CUIL/CUIT) validator (#80) * Implement Argentina ID validator and tests Co-authored-by: Rodolpho Lima * Added Uruguay ID (IC) validator (#95) * implement Uruguay ID validator * improvements uruguay id validator Co-authored-by: Rodolpho Lima * feat: Mexican ID Validator (#78) Implement Mexico * Added Peru ID (CUI) validator (#98) * Added Peru ID validation Co-authored-by: Rodolpho Lima * Add german TIN validator (#97) * Add german TIN validator * Adjust documentation for germany * Added Ecuador ID (IC) validator (#104) * implement ecuador id * fixes ecuador validator Co-authored-by: Rodolpho Lima * Add countries constants * add missing countries and update docs * Remove Laravel locale detection * Remove locale detection test * Add native DateTime support and deprecate the old getDateOfBirth method (#109) * Add getDateOfBirthNative() method * Fix Belgium integration * Update InvalidLengthException.php (#110) * Improve Contributing Guide (#111) * Update CONTRIBUTING.md * Remove unnecessary trim * Remove unnecessary trim * Small fix * [v1.3.0] Disable Luxembourg and improve documentation (#112) * Remove Luxembourg * Improve docs * Fix Luxembourg tests * Update image * Update Build yml file * Add support for PHP 8 (#114) * Add support for PHP 8 Co-authored-by: Joรฃo Cruz Co-authored-by: Yves Bos Co-authored-by: bofalke <54977705+bofalke@users.noreply.github.com> Co-authored-by: Rodolpho Lima Co-authored-by: Rodolpho Lima Co-authored-by: tiagomichaelsousa --- .all-contributorsrc | 2 +- .github/workflows/php.yml | 56 ++- CONTRIBUTING.md | 471 +++++++++++++++++- COUNTRIES.md | 8 +- README.md | 65 ++- composer.json | 2 +- docs/example.png | Bin 110650 -> 166446 bytes src/Config/Countries.php | 156 +++--- src/Constants/Country.php | 70 +++ src/Constants/Gender.php | 2 +- .../AlbaniaCitizenInformationExtractor.php | 8 +- .../Albania/AlbaniaIdValidator.php | 12 +- .../BelgiumCitizenInformationExtractor.php | 25 +- .../Belgium/BelgiumIdValidator.php | 39 +- ...HerzegovinaCitizenInformationExtractor.php | 4 +- .../BosniaAndHerzegovinaIdValidator.php | 4 +- .../BulgariaCitizenInformationExtractor.php | 8 +- .../Bulgaria/BulgariaIdValidator.php | 2 +- .../CroatiaCitizenInformationExtractor.php | 4 +- .../Croatia/CroatiaIdValidator.php | 4 +- ...echRepublicCitizenInformationExtractor.php | 4 +- .../CzechRepublicIdValidator.php | 4 +- ...choslovakiaCitizenInformationExtractor.php | 9 +- .../CzechoslovakiaIdValidator.php | 2 +- .../DenmarkCitizenInformationExtractor.php | 12 +- .../Denmark/DenmarkIdValidator.php | 2 +- .../EstoniaCitizenInformationExtractor.php | 8 +- .../Estonia/EstoniaIdValidator.php | 2 +- .../FinlandCitizenInformationExtractor.php | 10 +- .../Finland/FinlandIdValidator.php | 6 +- .../FranceCitizenInformationExtractor.php | 15 +- .../{ => Europe}/France/FranceIdValidator.php | 2 +- .../{ => Europe}/France/FranceRegionsList.php | 2 +- src/Core/Europe/Germany/GermanIdValidator.php | 49 ++ .../{ => Europe}/Greece/GreeceIdValidator.php | 2 +- .../HungaryCitizenInformationExtractor.php | 8 +- .../Hungary/HungaryIdValidator.php | 2 +- .../IcelandCitizenInformationExtractor.php | 10 +- .../Iceland/IcelandIdValidator.php | 4 +- .../Ireland/IrelandIdValidator.php | 2 +- .../ItalyCitizenInformationExtractor.php | 12 +- .../{ => Europe}/Italy/ItalyIdValidator.php | 4 +- .../{ => Europe}/Italy/ItalyRegionsList.php | 4 +- .../KosovoCitizenInformationExtractor.php | 4 +- .../{ => Europe}/Kosovo/KosovoIdValidator.php | 4 +- .../LatviaCitizenInformationExtractor.php | 10 +- .../{ => Europe}/Latvia/LatviaIdValidator.php | 2 +- .../LithuaniaCitizenInformationExtractor.php | 8 +- .../Lithuania/LithuaniaIdValidator.php | 2 +- .../LuxembourgCitizenInformationExtractor.php | 8 +- .../Luxembourg/LuxembourgIdValidator.php | 2 +- .../Moldova/MoldovaIdValidator.php | 2 +- .../MontenegroCitizenInformationExtractor.php | 4 +- .../Montenegro/MontenegroIdValidator.php | 4 +- .../Netherlands/NetherlandsIdValidator.php | 2 +- ...thMacedoniaCitizenInformationExtractor.php | 4 +- .../NorthMacedoniaIdValidator.php | 4 +- .../NorwayCitizenInformationExtractor.php | 8 +- .../{ => Europe}/Norway/NorwayIdValidator.php | 2 +- .../PolandCitizenInformationExtractor.php | 8 +- .../{ => Europe}/Poland/PolandIdValidator.php | 2 +- .../Portugal/PortugalIdValidator.php | 4 +- .../RomaniaCitizenInformationExtractor.php | 8 +- .../Romania/RomaniaIdValidator.php | 8 +- .../Romania/RomaniaRegionsList.php | 2 +- .../SerbiaCitizenInformationExtractor.php | 4 +- .../{ => Europe}/Serbia/SerbiaIdValidator.php | 4 +- .../SlovakiaCitizenInformationExtractor.php | 6 +- .../Slovakia/SlovakiaIdValidator.php | 4 +- .../SloveniaCitizenInformationExtractor.php | 4 +- .../Slovenia/SloveniaIdValidator.php | 4 +- .../{ => Europe}/Spain/SpainIdValidator.php | 4 +- .../SwedenCitizenInformationExtractor.php | 21 +- .../{ => Europe}/Sweden/SwedenIdValidator.php | 5 +- .../Switzerland/SwitzerlandIdValidator.php | 2 +- .../{ => Europe}/Turkey/TurkeyIdValidator.php | 2 +- .../UkraineCitizenInformationExtractor.php | 12 +- .../Ukraine/UkraineIdValidator.php | 2 +- .../UnitedKingdomIdValidator.php | 12 +- .../YugoslaviaCitizenInformationExtractor.php | 13 +- .../Yugoslavia/YugoslaviaIdValidator.php | 3 +- .../Yugoslavia/YugoslaviaRegions.php | 4 +- .../NorthAmerica/Canada/CanadaIdValidator.php | 47 ++ .../MexicoCitizenInformationExtractor.php | 50 ++ .../NorthAmerica/Mexico/MexicoIdValidator.php | 158 ++++++ .../NorthAmerica/Mexico/MexicoStatesList.php | 49 ++ .../UnitedStates/UnitedStatesIdValidator.php | 58 +++ .../Argentina/ArgentinaIdValidator.php | 44 ++ .../Brazil/BrazilIdValidator.php | 14 +- .../SouthAmerica/Chile/ChileIdValidator.php | 53 ++ .../Ecuador/EcuadorIdValidator.php | 80 +++ .../SouthAmerica/Peru/PeruIdValidator.php | 70 +++ .../Uruguay/UruguayIdValidator.php | 50 ++ src/Exceptions/InvalidLengthException.php | 16 +- src/Models/Citizen.php | 37 +- src/Socrates.php | 8 +- ...CitizenInformationExtractorFactoryTest.php | 24 + tests/Feature/{ => Europe}/AlbaniaTest.php | 36 +- tests/Feature/{ => Europe}/BelgiumTest.php | 49 +- .../{ => Europe}/BosniaAndHerzegovinaTest.php | 37 +- tests/Feature/{ => Europe}/BulgariaTest.php | 39 +- tests/Feature/{ => Europe}/CroatiaTest.php | 41 +- .../{ => Europe}/CzechRepublicTest.php | 35 +- tests/Feature/{ => Europe}/DenmarkTest.php | 35 +- tests/Feature/{ => Europe}/EstoniaTest.php | 35 +- tests/Feature/{ => Europe}/FinlandTest.php | 35 +- tests/Feature/{ => Europe}/FranceTest.php | 61 +-- tests/Feature/Europe/GermanyTest.php | 61 +++ tests/Feature/{ => Europe}/GreeceTest.php | 7 +- tests/Feature/{ => Europe}/HungaryTest.php | 35 +- tests/Feature/{ => Europe}/IcelandTest.php | 33 +- tests/Feature/{ => Europe}/IrelandTest.php | 7 +- tests/Feature/{ => Europe}/ItalyTest.php | 41 +- tests/Feature/{ => Europe}/KosovoTest.php | 37 +- tests/Feature/{ => Europe}/LatviaTest.php | 33 +- tests/Feature/{ => Europe}/LithuaniaTest.php | 36 +- tests/Feature/Europe/LuxembourgTest.php | 30 ++ tests/Feature/{ => Europe}/MoldovaTest.php | 7 +- tests/Feature/{ => Europe}/MontenegroTest.php | 47 +- .../Feature/{ => Europe}/NetherlandsTest.php | 7 +- .../{ => Europe}/NorthMacedoniaTest.php | 47 +- tests/Feature/{ => Europe}/NorwayTest.php | 35 +- tests/Feature/{ => Europe}/PolandTest.php | 35 +- tests/Feature/{ => Europe}/PortugalTest.php | 7 +- tests/Feature/{ => Europe}/RomaniaTest.php | 38 +- tests/Feature/{ => Europe}/SerbiaTest.php | 47 +- tests/Feature/{ => Europe}/SlovakiaTest.php | 37 +- tests/Feature/{ => Europe}/SloveniaTest.php | 47 +- tests/Feature/{ => Europe}/SpainTest.php | 7 +- tests/Feature/{ => Europe}/SwedenTest.php | 35 +- .../Feature/{ => Europe}/SwitzerlandTest.php | 7 +- tests/Feature/{ => Europe}/TurkeyTest.php | 7 +- tests/Feature/{ => Europe}/UkraineTest.php | 35 +- .../{ => Europe}/UnitedKingdomTest.php | 7 +- tests/Feature/FeatureTest.php | 6 + tests/Feature/LuxembourgTest.php | 86 ---- tests/Feature/NorthAmerica/CanadaTest.php | 61 +++ tests/Feature/NorthAmerica/MexicoTest.php | 115 +++++ .../Feature/NorthAmerica/UnitedStatesTest.php | 64 +++ tests/Feature/SouthAmerica/ArgentinaTest.php | 68 +++ .../Feature/{ => SouthAmerica}/BrazilTest.php | 7 +- tests/Feature/SouthAmerica/ChileTest.php | 69 +++ tests/Feature/SouthAmerica/EcuadorTest.php | 63 +++ tests/Feature/SouthAmerica/PeruTest.php | 72 +++ tests/Feature/SouthAmerica/UruguayTest.php | 75 +++ tests/IdValidatorFactoryTest.php | 24 + tests/SocratesTest.php | 14 - 147 files changed, 3006 insertions(+), 976 deletions(-) create mode 100644 src/Constants/Country.php rename src/Core/{ => Europe}/Albania/AlbaniaCitizenInformationExtractor.php (92%) rename src/Core/{ => Europe}/Albania/AlbaniaIdValidator.php (86%) rename src/Core/{ => Europe}/Belgium/BelgiumCitizenInformationExtractor.php (71%) rename src/Core/{ => Europe}/Belgium/BelgiumIdValidator.php (65%) rename src/Core/{ => Europe}/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/BosniaAndHerzegovina/BosniaAndHerzegovinaIdValidator.php (83%) rename src/Core/{ => Europe}/Bulgaria/BulgariaCitizenInformationExtractor.php (86%) rename src/Core/{ => Europe}/Bulgaria/BulgariaIdValidator.php (94%) rename src/Core/{ => Europe}/Croatia/CroatiaCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/Croatia/CroatiaIdValidator.php (92%) rename src/Core/{ => Europe}/CzechRepublic/CzechRepublicCitizenInformationExtractor.php (83%) rename src/Core/{ => Europe}/CzechRepublic/CzechRepublicIdValidator.php (78%) rename src/Core/{ => Europe}/Czechoslovakia/CzechoslovakiaCitizenInformationExtractor.php (80%) rename src/Core/{ => Europe}/Czechoslovakia/CzechoslovakiaIdValidator.php (90%) rename src/Core/{ => Europe}/Denmark/DenmarkCitizenInformationExtractor.php (80%) rename src/Core/{ => Europe}/Denmark/DenmarkIdValidator.php (95%) rename src/Core/{ => Europe}/Estonia/EstoniaCitizenInformationExtractor.php (85%) rename src/Core/{ => Europe}/Estonia/EstoniaIdValidator.php (96%) rename src/Core/{ => Europe}/Finland/FinlandCitizenInformationExtractor.php (85%) rename src/Core/{ => Europe}/Finland/FinlandIdValidator.php (80%) rename src/Core/{ => Europe}/France/FranceCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/France/FranceIdValidator.php (94%) rename src/Core/{ => Europe}/France/FranceRegionsList.php (98%) create mode 100644 src/Core/Europe/Germany/GermanIdValidator.php rename src/Core/{ => Europe}/Greece/GreeceIdValidator.php (95%) rename src/Core/{ => Europe}/Hungary/HungaryCitizenInformationExtractor.php (86%) rename src/Core/{ => Europe}/Hungary/HungaryIdValidator.php (97%) rename src/Core/{ => Europe}/Iceland/IcelandCitizenInformationExtractor.php (81%) rename src/Core/{ => Europe}/Iceland/IcelandIdValidator.php (91%) rename src/Core/{ => Europe}/Ireland/IrelandIdValidator.php (96%) rename src/Core/{ => Europe}/Italy/ItalyCitizenInformationExtractor.php (90%) rename src/Core/{ => Europe}/Italy/ItalyIdValidator.php (96%) rename src/Core/{ => Europe}/Italy/ItalyRegionsList.php (99%) rename src/Core/{ => Europe}/Kosovo/KosovoCitizenInformationExtractor.php (85%) rename src/Core/{ => Europe}/Kosovo/KosovoIdValidator.php (84%) rename src/Core/{ => Europe}/Latvia/LatviaCitizenInformationExtractor.php (85%) rename src/Core/{ => Europe}/Latvia/LatviaIdValidator.php (96%) rename src/Core/{ => Europe}/Lithuania/LithuaniaCitizenInformationExtractor.php (86%) rename src/Core/{ => Europe}/Lithuania/LithuaniaIdValidator.php (95%) rename src/Core/{ => Europe}/Luxembourg/LuxembourgCitizenInformationExtractor.php (78%) rename src/Core/{ => Europe}/Luxembourg/LuxembourgIdValidator.php (97%) rename src/Core/{ => Europe}/Moldova/MoldovaIdValidator.php (95%) rename src/Core/{ => Europe}/Montenegro/MontenegroCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/Montenegro/MontenegroIdValidator.php (84%) rename src/Core/{ => Europe}/Netherlands/NetherlandsIdValidator.php (94%) rename src/Core/{ => Europe}/NorthMacedonia/NorthMacedoniaCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/NorthMacedonia/NorthMacedoniaIdValidator.php (84%) rename src/Core/{ => Europe}/Norway/NorwayCitizenInformationExtractor.php (88%) rename src/Core/{ => Europe}/Norway/NorwayIdValidator.php (97%) rename src/Core/{ => Europe}/Poland/PolandCitizenInformationExtractor.php (88%) rename src/Core/{ => Europe}/Poland/PolandIdValidator.php (94%) rename src/Core/{ => Europe}/Portugal/PortugalIdValidator.php (96%) rename src/Core/{ => Europe}/Romania/RomaniaCitizenInformationExtractor.php (92%) rename src/Core/{ => Europe}/Romania/RomaniaIdValidator.php (74%) rename src/Core/{ => Europe}/Romania/RomaniaRegionsList.php (96%) rename src/Core/{ => Europe}/Serbia/SerbiaCitizenInformationExtractor.php (85%) rename src/Core/{ => Europe}/Serbia/SerbiaIdValidator.php (85%) rename src/Core/{ => Europe}/Slovakia/SlovakiaCitizenInformationExtractor.php (77%) rename src/Core/{ => Europe}/Slovakia/SlovakiaIdValidator.php (79%) rename src/Core/{ => Europe}/Slovenia/SloveniaCitizenInformationExtractor.php (84%) rename src/Core/{ => Europe}/Slovenia/SloveniaIdValidator.php (84%) rename src/Core/{ => Europe}/Spain/SpainIdValidator.php (91%) rename src/Core/{ => Europe}/Sweden/SwedenCitizenInformationExtractor.php (76%) rename src/Core/{ => Europe}/Sweden/SwedenIdValidator.php (93%) rename src/Core/{ => Europe}/Switzerland/SwitzerlandIdValidator.php (95%) rename src/Core/{ => Europe}/Turkey/TurkeyIdValidator.php (95%) rename src/Core/{ => Europe}/Ukraine/UkraineCitizenInformationExtractor.php (77%) rename src/Core/{ => Europe}/Ukraine/UkraineIdValidator.php (95%) rename src/Core/{ => Europe}/UnitedKingdom/UnitedKingdomIdValidator.php (89%) rename src/Core/{ => Europe}/Yugoslavia/YugoslaviaCitizenInformationExtractor.php (82%) rename src/Core/{ => Europe}/Yugoslavia/YugoslaviaIdValidator.php (93%) rename src/Core/{ => Europe}/Yugoslavia/YugoslaviaRegions.php (98%) create mode 100644 src/Core/NorthAmerica/Canada/CanadaIdValidator.php create mode 100644 src/Core/NorthAmerica/Mexico/MexicoCitizenInformationExtractor.php create mode 100644 src/Core/NorthAmerica/Mexico/MexicoIdValidator.php create mode 100644 src/Core/NorthAmerica/Mexico/MexicoStatesList.php create mode 100644 src/Core/NorthAmerica/UnitedStates/UnitedStatesIdValidator.php create mode 100644 src/Core/SouthAmerica/Argentina/ArgentinaIdValidator.php rename src/Core/{ => SouthAmerica}/Brazil/BrazilIdValidator.php (77%) create mode 100644 src/Core/SouthAmerica/Chile/ChileIdValidator.php create mode 100644 src/Core/SouthAmerica/Ecuador/EcuadorIdValidator.php create mode 100644 src/Core/SouthAmerica/Peru/PeruIdValidator.php create mode 100644 src/Core/SouthAmerica/Uruguay/UruguayIdValidator.php create mode 100644 tests/CitizenInformationExtractorFactoryTest.php rename tests/Feature/{ => Europe}/AlbaniaTest.php (63%) rename tests/Feature/{ => Europe}/BelgiumTest.php (55%) rename tests/Feature/{ => Europe}/BosniaAndHerzegovinaTest.php (65%) rename tests/Feature/{ => Europe}/BulgariaTest.php (61%) rename tests/Feature/{ => Europe}/CroatiaTest.php (69%) rename tests/Feature/{ => Europe}/CzechRepublicTest.php (62%) rename tests/Feature/{ => Europe}/DenmarkTest.php (63%) rename tests/Feature/{ => Europe}/EstoniaTest.php (62%) rename tests/Feature/{ => Europe}/FinlandTest.php (63%) rename tests/Feature/{ => Europe}/FranceTest.php (57%) create mode 100644 tests/Feature/Europe/GermanyTest.php rename tests/Feature/{ => Europe}/GreeceTest.php (89%) rename tests/Feature/{ => Europe}/HungaryTest.php (61%) rename tests/Feature/{ => Europe}/IcelandTest.php (60%) rename tests/Feature/{ => Europe}/IrelandTest.php (88%) rename tests/Feature/{ => Europe}/ItalyTest.php (65%) rename tests/Feature/{ => Europe}/KosovoTest.php (63%) rename tests/Feature/{ => Europe}/LatviaTest.php (70%) rename tests/Feature/{ => Europe}/LithuaniaTest.php (62%) create mode 100644 tests/Feature/Europe/LuxembourgTest.php rename tests/Feature/{ => Europe}/MoldovaTest.php (88%) rename tests/Feature/{ => Europe}/MontenegroTest.php (63%) rename tests/Feature/{ => Europe}/NetherlandsTest.php (88%) rename tests/Feature/{ => Europe}/NorthMacedoniaTest.php (57%) rename tests/Feature/{ => Europe}/NorwayTest.php (62%) rename tests/Feature/{ => Europe}/PolandTest.php (63%) rename tests/Feature/{ => Europe}/PortugalTest.php (89%) rename tests/Feature/{ => Europe}/RomaniaTest.php (64%) rename tests/Feature/{ => Europe}/SerbiaTest.php (63%) rename tests/Feature/{ => Europe}/SlovakiaTest.php (61%) rename tests/Feature/{ => Europe}/SloveniaTest.php (58%) rename tests/Feature/{ => Europe}/SpainTest.php (88%) rename tests/Feature/{ => Europe}/SwedenTest.php (63%) rename tests/Feature/{ => Europe}/SwitzerlandTest.php (90%) rename tests/Feature/{ => Europe}/TurkeyTest.php (89%) rename tests/Feature/{ => Europe}/UkraineTest.php (62%) rename tests/Feature/{ => Europe}/UnitedKingdomTest.php (90%) delete mode 100644 tests/Feature/LuxembourgTest.php create mode 100644 tests/Feature/NorthAmerica/CanadaTest.php create mode 100644 tests/Feature/NorthAmerica/MexicoTest.php create mode 100644 tests/Feature/NorthAmerica/UnitedStatesTest.php create mode 100644 tests/Feature/SouthAmerica/ArgentinaTest.php rename tests/Feature/{ => SouthAmerica}/BrazilTest.php (91%) create mode 100644 tests/Feature/SouthAmerica/ChileTest.php create mode 100644 tests/Feature/SouthAmerica/EcuadorTest.php create mode 100644 tests/Feature/SouthAmerica/PeruTest.php create mode 100644 tests/Feature/SouthAmerica/UruguayTest.php create mode 100644 tests/IdValidatorFactoryTest.php diff --git a/.all-contributorsrc b/.all-contributorsrc index 4f1333f..1528393 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -74,4 +74,4 @@ "repoType": "github", "repoHost": "https://github.com", "skipCi": true -} +} \ No newline at end of file diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 781e3b3..dfba794 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -1,4 +1,4 @@ -name: Build +name: Run Tests on: push: @@ -12,27 +12,43 @@ on: jobs: build: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['8.0', '7.4', '7.3', '7.2'] + dependency-version: [prefer-lowest, prefer-stable] + + name: PHP ${{ matrix.php }} - ${{ matrix.dependency-version }} steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: mbstring, intl + ini-values: post_max_size=256M, log_errors=1 + coverage: pcov + tools: pecl - - name: Validate composer.json and composer.lock - run: composer validate + - name: Validate composer.json and composer.lock + run: composer validate - - name: Cache Composer packages - id: composer-cache - uses: actions/cache@v2 - with: - path: vendor - key: ${{ runner.os }}-node-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress --no-suggest - - - name: Run test suite - run: vendor/bin/phpunit + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-node-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run test suite + run: vendor/bin/phpunit diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d3610c5..2e64aaa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,13 @@ # CONTRIBUTING -Contributions are welcome, and are accepted via pull requests. -Please review these guidelines before submitting any pull requests. +Thank you for your interest in wanting to contribute to Socrates!
+Up next is a small guide to create your first pull request. Check further below for a +[walk-through](#how-to-implement-a-country-from-scratch) on how to +contribute with a new country from scratch. -## Process +## The Basics + +### Process 1. Fork the project 1. Create a new branch @@ -11,18 +15,469 @@ Please review these guidelines before submitting any pull requests. 1. Open a pull request detailing your changes. 1. Describe what your pull request is (change, bugfix, new country implementation, etc.) -## Guidelines +### Guidelines -* We use PSR-12 as our coding style, make sure to follow it. -* If you have multiple commits, squashing some of them might help us have a better sense of what you did. +* We use [PSR-12](https://www.php-fig.org/psr/psr-12/) as our coding style, make sure to follow it. +* If you have multiple commits, squashing some of them might help us better understand what you did. * You may need to [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) to avoid merge conflicts. -## Setup +### Setup Clone your fork, then install the dev dependencies: ```bash composer install ``` -It is avised to run a Laravel/Vanilla PHP application locally, and pull in your local fork of the package to test. +It is advised to run a Laravel/Vanilla PHP application locally, and pull in your local fork of the package to test. Check [this post](https://johnbraun.blog/posts/creating-a-laravel-package-1) for a guide on how to do it. + +## How to implement a country from scratch + +### Step 1 - Research + +Let's imagine we want to implement the fictional european country of "Socratia".
The first thing we should do +is find out what its two-digit ISO code is. After that, we need to *thoroughly* research and find out what the +Socratia's National Identification Number is (henceforth referred to as NIN) and how it is validated, as well as +collect some example specimens to then write our tests. Additionally, we should find out if the NIN encodes any personal +information on the Citizen - gender, date of birth or place of birth. + +After some imaginary googling we find out that: +- The two-digit ISO code is `SC`. +- The NIN is eleven characters long excluding hyphens. +- The NIN follows the format `GR-DDDDDDDD-C`, G a letter for gender, R a letter for region, the Ds + are numbers representing a date and C is a control number. +- `G` can either be "M" or "F". +- `R` can be "P", "J" or "R" referring to its three regions of "Phpilia", "Javardia" and "Rustara". +- `C` must be an even number, but it can not be "2" if the citizen was registered after 2001 as those particular + numbers have been phased out. + +Clearly there is some citizen information encoded in that ID. This means we will implement both a Validator and +an Extractor.
+ + +### Step 2 - Implement the Validator + +Let's start working on our implementation. First we need to create the validator class.
+Create a directory in `src/Core/Europe/` named "Socratia" and create a new PHP class inside it. +We'll name it `SocratiaIdvalidator` and implement `IdValidator`: + +```php + +Let's go ahead and do that now: + +```php +sanitize($id); + } + + // We usually create a sanitize method to strip the + // ID of any separator characters and check its length. + private function sanitize($string $id): string + { + $id = str_replace('-', '', $id); + + $idLength = strlen($id); + + // We want an eleven character string after stripping it from hyphens, else + // we throw one of our internal exceptions. + + if ($idLength !== 11) { + throw new InvalidLengthException('Socratian NIN', '11', $idLength); + } + + $id = strtoupper($id); + + return $id; + } +} +``` + +Great! We can now check the other conditions and implement the rest of the `validate()` method: + +```php +public function validate(string $id): bool +{ + $id = $this->sanitize($id); + + // Characters #3 to #10 must be digits + $dateDigits = substr($id, 2, 8); + if (!is_numeric($dateDigits)) { + return false; + } + + // `G` can either be "M" or "F" + $genderCharacter = $id[0]; + if ($genderCharacter !== 'M' && $genderCharacter !== 'F') { + return false; + } + + // `R` can be "P", "J" or "R" + $regionCharacter = $id[1]; + if ($regionCharacter !== 'P' && $regionCharacter !== 'J' && $regionCharacter !== 'R') { + return false; + } + + // `C` must be an even number, but it can not be "2" if the citizen was registered after 2001 + $controlDigit = (int) $id[10]; + $year = (int) substr($dateDigits, 0, 4); + if ($controlDigit === 2 && $year >= 2001) { + return false; + } + + if ($controlDigit % 2 !== 0) { + return false; + } + + // Don't accept silly dates like 2010-99-99 + $month = (int) substr($dateDigits, 4, 2); + $day = (int) substr($dateDigits, 6, 2); + try { + new DateTime("$year-$month-$day"); + } catch (Exception $e) { + return false; + } + + // The ID is valid! + return true; +} +``` +That's it for our validator! +Now we head off to `Countries.php` and add the class to the validators array. You'll notice it is alphabetically ordered +and organised by the continent, so let's be sure to add it in the right place: + +```php + \Reducktion\Socrates\Core\Europe\Albania\AlbaniaIdValidator::class, + //... + 'SC' => \Reducktion\Socrates\Core\Europe\Socratia\SocratiaIdValidator::class, + 'SE' => \Reducktion\Socrates\Core\Europe\Sweden\SwedenIdValidator::class, + //... +``` + +Let's also add a constant to `Country.php` with our country code for convenience: + +```php +sanitize($id); + + if (! (new SocratiaIdValidator())->validate($id)) { + // Throw one of our internal exceptions + throw new InvalidIdException(); + } + + // We are good to go +} +``` + +A good practice is to segment each piece logic for each type of information in its own method. +If you recall from above, we can extract the gender, date of birth and place of birth from the Socratian ID. +Our `extract` method then becomes: + +```php +public function extract(string $id): Citizen +{ + $id = $this->sanitize($id); + + if (! (new SocratiaIdValidator())->validate($id)) { + // Throw one of our internal exceptions + throw new InvalidIdException(); + } + + $gender = $this->getGender($id); + $dateOfBirth = $this->getDateOfBirth($id); + $placeOfBirth = $this->getPlaceOfBirth($id); + + $citizen = new Citizen(); + $citizen->setGender($gender); + $citizen->setDateOfBirth($dateOfBirth); + $citizen->setPlaceOfBirth($placeOfBirth); + + return $citizen; +} +``` + +Let us do each in order. Getting the gender is simple. Because we have already validated the ID we +can be confident that the gender character is safe to check: + +```php +public function getGender(string $id): string +{ + // Use our internal "enum" + return $id[0] === 'M' ? Gender::MALE : Gender::FEMALE; +} +``` + +Now for the date: + +```php +public function getDateOfBirth(string $id): DateTime +{ + $dateDigits = substr($id, 2, 8); + + $year = (int) substr($dateDigits, 0, 4); + $month = (int) substr($dateDigits, 4, 2); + $day = (int) substr($dateDigits, 6, 2); + + return new DateTime("$year-$month-$day"); +} +``` + +For the place of birth let us create a separate class in the same directory to hold all possible region values: + +```php + 'Phpilia', + 'J' => 'Javardia', + 'R' => 'Rustaria', + ]; +} +``` + +Getting the place of birth is now as simple as: + +```php +private function getPlaceOfBirth(string $id): string +{ + $regionCharacter = $id[1]; + + if (! isset(SocratiaRegionsList::$regions[$regionCharacter])) { + // Throw another of our internal exceptions + throw new UnrecognisedPlaceOfBirthException( + "The provided character '$regionCharacter' does not match any regions." + ); + } + + return SocratiaRegionsList::$regions[$regionCharacter]; + } +``` + +Finally, as before, let us register our extractor class in the extractors array in `Countries.php`: + +```php + \Reducktion\Socrates\Core\Europe\Albania\AlbaniaCitizenInformationExtractor::class, + //... + 'SC' => \Reducktion\Socrates\Core\Europe\Socratia\SocratiaCitizenInformationExtractor::class, + 'SE' => \Reducktion\Socrates\Core\Europe\Sweden\SwedenCitizenInformationExtractor::class, + //... +``` + +That's it! We have implemented both the validator and the extractor for our fictional country. +However, we are not done yet as we need to... + +### Step 4 - Write Tests + +We want to ensure the quality of the algorithm and the extracted data. To do so, we will now write a test class. +First head over to `tests/Feature/Europe` and create a new `SocratiaTest` test class. We will extend our `FeatureTest` +abstract class: + +```php +people = [ + 'alexandre' => [ + 'id' => 'MR-19940916-4', + 'gender' => Gender::MALE, + 'dob' => new DateTime('1994-09-16'), + 'age' => 26, // as of 2021 + 'pob' => 'Rustaria', + ], + // ... + ]; + + // Try to cover as many edge cases as possible + $this->invalidIds = [ + 'OR-19940916-4', // Gender is wrong + 'MZ-19940916-4', // Place of birth does not exist + 'MR-19941916-4', // Date of birth is invalid + 'MR-19940916-3', // Control digit is not even + 'MR-20020916-3', // Control digit is two but the citizen was born post 2001 + 'MR-020916-3', // ID is too short + // ... + ]; +} +``` + +Now for each of those two data sets we run our validator and extractor classes and check if all is well: + +```php +public function test_extract_behaviour(): void +{ + foreach ($this->people as $person) { + $citizen = Socrates::getCitizenDataFromId($person['id'], Country::SOCRATIA); + + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + } + + $this->expectException(InvalidIdException::class); + + // An invalid ID should not be able to be extracted + Socrates::getCitizenDataFromId('OR-19940916-4', 'SC'); +} + +public function test_validation_behaviour(): void +{ + foreach ($this->people as $person) { + self::assertTrue( + Socrates::validateId($person['id'], 'SC') + ); + } + + foreach ($this->invalidIds as $fc) { + self::assertFalse( + Socrates::validateId($fc, 'SC') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('OR-940916-4', 'SC'); +} +``` + +### Final step - Update the documentation + +Finally we just need to update our `COUNTRIES.md` file for reference: + +```text +| Country | Country Code | Validation | Extraction | +|---------------------------|--------------|--------------------|--------------------| +| Albania ๐Ÿ‡ฆ๐Ÿ‡ฑ | AL | :heavy_check_mark: | :heavy_check_mark: | +(...) +| Socratia ๐Ÿด | SC | :heavy_check_mark: | :heavy_check_mark: | +| Sweden ๐Ÿ‡ธ๐Ÿ‡ช | SE | :heavy_check_mark: | :heavy_check_mark: | +``` + +Congratulations! Now go ahead and implement a real country! ๐Ÿ˜Š \ No newline at end of file diff --git a/COUNTRIES.md b/COUNTRIES.md index b5dca90..70cab75 100644 --- a/COUNTRIES.md +++ b/COUNTRIES.md @@ -3,16 +3,20 @@ | Country | Country Code | Validation | Extraction | |---------------------------|--------------|--------------------|--------------------| | Albania ๐Ÿ‡ฆ๐Ÿ‡ฑ | AL | :heavy_check_mark: | :heavy_check_mark: | +| Argentina ๐Ÿ‡ฆ๐Ÿ‡ท | AR | :heavy_check_mark: | :x: | | Belgium ๐Ÿ‡ง๐Ÿ‡ช | BE | :heavy_check_mark: | :heavy_check_mark: | | Bosnia and Herzegovina ๐Ÿ‡ง๐Ÿ‡ฆ | BA | :heavy_check_mark: | :heavy_check_mark: | | Bulgaria ๐Ÿ‡ง๐Ÿ‡ฌ | BG | :heavy_check_mark: | :heavy_check_mark: | | Brazil ๐Ÿ‡ง๐Ÿ‡ท | BR | :heavy_check_mark: | :x: | +| Chile ๐Ÿ‡จ๐Ÿ‡ฑ | CL | :heavy_check_mark: | :x: | | Croatia ๐Ÿ‡ญ๐Ÿ‡ท | HR | :heavy_check_mark: | :heavy_check_mark: | | Czech Republic ๐Ÿ‡จ๐Ÿ‡ฟ | CZ | :heavy_check_mark: | :heavy_check_mark: | | Denmark ๐Ÿ‡ฉ๐Ÿ‡ฐ | DK | :heavy_check_mark: | :heavy_check_mark: | +| Ecuador ๐Ÿ‡ช๐Ÿ‡จ | EC | :heavy_check_mark: | :x: | | Estonia ๐Ÿ‡ช๐Ÿ‡ช | EE | :heavy_check_mark: | :heavy_check_mark: | | Finland ๐Ÿ‡ซ๐Ÿ‡ฎ | FI | :heavy_check_mark: | :heavy_check_mark: | | France ๐Ÿ‡ซ๐Ÿ‡ท | FR | :heavy_check_mark: | :heavy_check_mark: | +| Germany ๐Ÿ‡ฉ๐Ÿ‡ช | DE | :heavy_check_mark: | :x: | | Greece ๐Ÿ‡ฌ๐Ÿ‡ท | GR | :heavy_check_mark: | :x: | | Hungary ๐Ÿ‡ญ๐Ÿ‡บ | HU | :heavy_check_mark: | :heavy_check_mark: | | Iceland ๐Ÿ‡ฎ๐Ÿ‡ธ | IS | :heavy_check_mark: | :heavy_check_mark: | @@ -21,12 +25,13 @@ | Kosovo ๐Ÿ‡ฝ๐Ÿ‡ฐ | XK | :heavy_check_mark: | :heavy_check_mark: | | Latvia ๐Ÿ‡ฑ๐Ÿ‡ป | LV | :heavy_check_mark: | :heavy_check_mark: | | Lithuania ๐Ÿ‡ฑ๐Ÿ‡น | LT | :heavy_check_mark: | :heavy_check_mark: | -| Luxembourg ๐Ÿ‡ฑ๐Ÿ‡บ | LU | :heavy_check_mark: | :heavy_check_mark: | | Moldova ๐Ÿ‡ฒ๐Ÿ‡ฉ | MD | :heavy_check_mark: | :x: | | Montenegro ๐Ÿ‡ฒ๐Ÿ‡ช | ME | :heavy_check_mark: | :heavy_check_mark: | +| Mรฉxico ๐Ÿ‡ฒ๐Ÿ‡ฝ | ME | :heavy_check_mark: | :heavy_check_mark: | | Netherlands ๐Ÿ‡ณ๐Ÿ‡ฑ | NL | :heavy_check_mark: | :x: | | North Macedonia ๐Ÿ‡ฒ๐Ÿ‡ฐ | MK | :heavy_check_mark: | :heavy_check_mark: | | Norway ๐Ÿ‡ณ๐Ÿ‡ด | NO | :heavy_check_mark: | :heavy_check_mark: | +| Peru ๐Ÿ‡ต๐Ÿ‡ช | PE | :heavy_check_mark: | :x: | | Poland ๐Ÿ‡ต๐Ÿ‡ฑ | PL | :heavy_check_mark: | :heavy_check_mark: | | Portugal ๐Ÿ‡ต๐Ÿ‡น | PT | :heavy_check_mark: | :x: | | Romania ๐Ÿ‡ท๐Ÿ‡ด | RO | :heavy_check_mark: | :heavy_check_mark: | @@ -39,3 +44,4 @@ | Turkey ๐Ÿ‡น๐Ÿ‡ท | TR | :heavy_check_mark: | :x: | | Ukraine ๐Ÿ‡บ๐Ÿ‡ฆ | UA | :heavy_check_mark: | :heavy_check_mark: | | United Kingdom ๐Ÿ‡ฌ๐Ÿ‡ง | GB | :heavy_check_mark: | :x: | +| Uruguay ๐Ÿ‡บ๐Ÿ‡พ | UY | :heavy_check_mark: | :x: | diff --git a/README.md b/README.md index 51a59e5..bf25cfc 100644 --- a/README.md +++ b/README.md @@ -19,19 +19,14 @@ You can now read [a blog post](https://medium.com/@alex.olival/road-to-mastery-building-an-open-source-package-3936f57aed81) about how this package was created and its goals. -**Socrates** is a PHP Package that allows you to validate and retrieve personal data from [National Identification Numbers](https://en.wikipedia.org/wiki/National_identification_number). At the moment, most countries in Europe are supported, but the goal is to eventually support as many countries in the world as possible. +**Socrates** is a PHP Package that allows you to validate and retrieve personal data from [National Identification Numbers](https://en.wikipedia.org/wiki/National_identification_number). +Most countries in Europe are supported as well as some American ones, but the goal is to eventually support as many countries in the world as possible.

Some countries also encode personal information of the citizen, such as gender or the place of birth. This package allows you to extract that information in a consistent way.

-

For Laravel, a Facade and request Validator is also available (see below).

+

A Facade and Validation Rule is also available for Laravel (see below).

This package can be useful for many things, such as validating a user's ID for finance related applications or verifying a user's age without asking for it explicitly. However, we recommend you review your country's data protection laws before storing any information.

[Ports](https://github.com/reducktion/socrates#ports) of this package to other languages are currently in progress. Check further below for which ones are currently available. -Our goals: -* Standardize and centralise what is usually very difficult and sparse information to find. -* Have a consistent API for retrieving citizen information from an ID, if available. -* Test each individual country validation and data extraction algorithm with a number of valid and invalid IDs. -* Support as many countries as viably possible. - ## Installation `composer require reducktion/socrates` @@ -40,63 +35,66 @@ Socrates provides two methods: `validateId` and `getCitizenDataFromId`. Both rec ```php use Reducktion\Socrates\Socrates; +use Reducktion\Socrates\Constants\Country; $socrates = new Socrates(); +$socrates->validateId('14349483 0 ZV3', Country::PORTUGAL); +// or $socrates->validateId('14349483 0 ZV3', 'PT'); ``` -For Laravel, a facade is also available for your convenience: +If you're using Laravel a facade is also available for your convenience: ```php use Reducktion\Socrates\Laravel\Facades\Socrates; +use Reducktion\Socrates\Constants\Country; -Socrates::getCitizenDataFromId('550309-6447', 'SE'); +Socrates::getCitizenDataFromId('550309-6447', Country::SWEDEN); ``` -You can also use the `national_id:[COUNTRY CODE]` request validation rule: +Still in Laravel you can use the `national_id:[COUNTRY CODE]` request validation rule. +Here is an example checking if a request parameter is a valid latvian ID: ```php $request->validate([ - 'id' => 'national_id:lv' + 'national_id' => 'required|string|national_id:lv', ]); ``` -Still in Laravel, the package will try to guess the country to be validated by the default locale: - -```php -App::setLocale('PT'); - -Socrates::validateId('11084129 8 ZX8'); -``` - -However this is **not** recommended. The safest way is to always explicitly pass the country code as the second parameter. ### validateId -This method will return true or false depending on the validity of the ID. +This method will return true or false. In case the ID has the wrong character length, an `InvalidLengthException` will be thrown. ```php -if ($socrates->validateId('719102091', 'NL')) { - echo 'Valid ID.' +if ($socrates->validateId('719102091', Country::NETHERLANDS)) { + echo 'Valid ID.'; } else { - echo 'Invalid ID.' + echo 'Invalid ID.'; } ``` ### getCitizenDataFromId -This method will return an instance of `Citizen`. If the ID is invalid, an `InvalidIdException` will be thrown. If the country does not support data extraction, an `UnsupportedOperationException` will be thrown. +This method will return an instance of `Citizen`.
+If the ID is invalid, an `InvalidIdException` will be thrown.
+If the country does not support data extraction, an `UnsupportedOperationException` will be thrown. ```php -$citizen = $socrates->getCitizenDataFromId('3860123012', 'EE'); +$citizen = $socrates->getCitizenDataFromId('3860123012', Country::ESTONIA); ``` -The `Citizen` class stores the extracted citizen data in a consistent format across all countries. It exposes the `getGender()`, `getDateOfBirth()`, `getAge()` and `getPlaceOfBirth()` methods. -All will return a `string` (for the gender and place of birth), `int`(for age), a `Carbon` instance (for the date of birth) or `null` if the value is empty. +The `Citizen` class stores the extracted citizen data in a consistent format across all countries.
+It exposes the `getGender()`, `getDateOfBirthNative()`, `getDateOfBirth()`, `getAge()` and `getPlaceOfBirth()` methods.

+`getGender` and `getPlaceOfBirth` return a `string`.
+`getAge()` returns an `int`.
+`getDateOfBirthNative()` returns a native `DateTime` and `getDateOfBirth()` returns a `Carbon` instance.
+**It is recommended to use `getDateOfBirthNative()` as Carbon will be removed as a dependency in a future release of Socrates.**

Using the example above, Estonia only encodes the date of birth and gender of the citizen in their ID. So the above methods will return:

```php echo $citizen->getGender(); // 'Male' -echo $citizen->getDateOfBirth(); // A Carbon instance with the date '1986-01-23' -echo $citizen->getAge(); // 34 (as of June 2020) +echo $citizen->getDateOfBirthNative(); // DateTime instance with the date '1986-01-23' +echo $citizen->getDateOfBirth(); // DEPRECATED - Carbon instance with the date '1986-01-23' +echo $citizen->getAge(); // 34 echo $citizen->getPlaceOfBirth(); // null ``` @@ -104,7 +102,8 @@ echo $citizen->getPlaceOfBirth(); // null [Here](COUNTRIES.md) you can see the full list of supported countries and whether they support data extraction. -Four european countries are currently unsupported: Austria ๐Ÿ‡ฆ๐Ÿ‡น, Belarus ๐Ÿ‡ง๐Ÿ‡พ, Cyprus ๐Ÿ‡จ๐Ÿ‡พ and Germany ๐Ÿ‡ฉ๐Ÿ‡ช. This is because we could not find a reliable source for the algorithm, if at all. Help would be appreciated to get these countries supported. +Four european countries are currently unsupported: Austria ๐Ÿ‡ฆ๐Ÿ‡น, Belarus ๐Ÿ‡ง๐Ÿ‡พ, Cyprus ๐Ÿ‡จ๐Ÿ‡พ and Luxembourg ๐Ÿ‡ฑ๐Ÿ‡บ. +A number of countries in the Americas are also unsupproted. This is because we could not find a reliable source for the algorithm, if at all. Help would be appreciated to get these countries supported. ## Testing `composer test` @@ -168,4 +167,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file diff --git a/composer.json b/composer.json index cf87335..a423b0d 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ } ], "require": { - "php": "^7.2", + "php": "^7.2|^8.0", "nesbot/carbon": "^2.35.0" }, "require-dev": { diff --git a/docs/example.png b/docs/example.png index a1a928e6aac4351faee697900722095b03075c48..1bd0f90bd4fe98a5816caf080ea24ef0b778edfd 100644 GIT binary patch literal 166446 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

6K^n+|bRd)+V!Pm?WV#C$%{^kk$9ldqR05 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 literal 110650 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⪼RQtNr0>M~NUrj{mjTlpH^_08&q&qhE4p*V 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
}96da+6dc(vb9xCNn<4we4>wKeS%xV}k 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 Z($u@W!P4jTf)Vt_-kn}M%C{X!`fn-tGr#}< diff --git a/src/Config/Countries.php b/src/Config/Countries.php index 291f433..5bfb4c1 100644 --- a/src/Config/Countries.php +++ b/src/Config/Countries.php @@ -2,7 +2,7 @@ namespace Reducktion\Socrates\Config; -class Countries +abstract class Countries { public static $all = [ 'AF', @@ -258,72 +258,98 @@ class Countries ]; public static $validators = [ - 'AL' => \Reducktion\Socrates\Core\Albania\AlbaniaIdValidator::class, - 'BA' => \Reducktion\Socrates\Core\BosniaAndHerzegovina\BosniaAndHerzegovinaIdValidator::class, - 'BE' => \Reducktion\Socrates\Core\Belgium\BelgiumIdValidator::class, - 'BG' => \Reducktion\Socrates\Core\Bulgaria\BulgariaIdValidator::class, - 'BR' => \Reducktion\Socrates\Core\Brazil\BrazilIdValidator::class, - 'CH' => \Reducktion\Socrates\Core\Switzerland\SwitzerlandIdValidator::class, - 'CZ' => \Reducktion\Socrates\Core\CzechRepublic\CzechRepublicIdValidator::class, - 'DK' => \Reducktion\Socrates\Core\Denmark\DenmarkIdValidator::class, - 'EE' => \Reducktion\Socrates\Core\Estonia\EstoniaIdValidator::class, - 'ES' => \Reducktion\Socrates\Core\Spain\SpainIdValidator::class, - 'FI' => \Reducktion\Socrates\Core\Finland\FinlandIdValidator::class, - 'FR' => \Reducktion\Socrates\Core\France\FranceIdValidator::class, - 'GB' => \Reducktion\Socrates\Core\UnitedKingdom\UnitedKingdomIdValidator::class, - 'GR' => \Reducktion\Socrates\Core\Greece\GreeceIdValidator::class, - 'HR' => \Reducktion\Socrates\Core\Croatia\CroatiaIdValidator::class, - 'HU' => \Reducktion\Socrates\Core\Hungary\HungaryIdValidator::class, - 'IE' => \Reducktion\Socrates\Core\Ireland\IrelandIdValidator::class, - 'IS' => \Reducktion\Socrates\Core\Iceland\IcelandIdValidator::class, - 'IT' => \Reducktion\Socrates\Core\Italy\ItalyIdValidator::class, - 'LT' => \Reducktion\Socrates\Core\Lithuania\LithuaniaIdValidator::class, - 'LU' => \Reducktion\Socrates\Core\Luxembourg\LuxembourgIdValidator::class, - 'LV' => \Reducktion\Socrates\Core\Latvia\LatviaIdValidator::class, - 'MD' => \Reducktion\Socrates\Core\Moldova\MoldovaIdValidator::class, - 'ME' => \Reducktion\Socrates\Core\Montenegro\MontenegroIdValidator::class, - 'MK' => \Reducktion\Socrates\Core\NorthMacedonia\NorthMacedoniaIdValidator::class, - 'NL' => \Reducktion\Socrates\Core\Netherlands\NetherlandsIdValidator::class, - 'NO' => \Reducktion\Socrates\Core\Norway\NorwayIdValidator::class, - 'PL' => \Reducktion\Socrates\Core\Poland\PolandIdValidator::class, - 'PT' => \Reducktion\Socrates\Core\Portugal\PortugalIdValidator::class, - 'RO' => \Reducktion\Socrates\Core\Romania\RomaniaIdValidator::class, - 'RS' => \Reducktion\Socrates\Core\Serbia\SerbiaIdValidator::class, - 'SE' => \Reducktion\Socrates\Core\Sweden\SwedenIdValidator::class, - 'SI' => \Reducktion\Socrates\Core\Slovenia\SloveniaIdValidator::class, - 'SK' => \Reducktion\Socrates\Core\Slovakia\SlovakiaIdValidator::class, - 'TR' => \Reducktion\Socrates\Core\Turkey\TurkeyIdValidator::class, - 'UA' => \Reducktion\Socrates\Core\Ukraine\UkraineIdValidator::class, - 'XK' => \Reducktion\Socrates\Core\Kosovo\KosovoIdValidator::class, + /** + * Validators for european countries. + */ + 'AL' => \Reducktion\Socrates\Core\Europe\Albania\AlbaniaIdValidator::class, + 'BA' => \Reducktion\Socrates\Core\Europe\BosniaAndHerzegovina\BosniaAndHerzegovinaIdValidator::class, + 'BE' => \Reducktion\Socrates\Core\Europe\Belgium\BelgiumIdValidator::class, + 'BG' => \Reducktion\Socrates\Core\Europe\Bulgaria\BulgariaIdValidator::class, + 'CH' => \Reducktion\Socrates\Core\Europe\Switzerland\SwitzerlandIdValidator::class, + 'CZ' => \Reducktion\Socrates\Core\Europe\CzechRepublic\CzechRepublicIdValidator::class, + 'DE' => \Reducktion\Socrates\Core\Europe\Germany\GermanIdValidator::class, + 'DK' => \Reducktion\Socrates\Core\Europe\Denmark\DenmarkIdValidator::class, + 'EE' => \Reducktion\Socrates\Core\Europe\Estonia\EstoniaIdValidator::class, + 'ES' => \Reducktion\Socrates\Core\Europe\Spain\SpainIdValidator::class, + 'FI' => \Reducktion\Socrates\Core\Europe\Finland\FinlandIdValidator::class, + 'FR' => \Reducktion\Socrates\Core\Europe\France\FranceIdValidator::class, + 'GB' => \Reducktion\Socrates\Core\Europe\UnitedKingdom\UnitedKingdomIdValidator::class, + 'GR' => \Reducktion\Socrates\Core\Europe\Greece\GreeceIdValidator::class, + 'HR' => \Reducktion\Socrates\Core\Europe\Croatia\CroatiaIdValidator::class, + 'HU' => \Reducktion\Socrates\Core\Europe\Hungary\HungaryIdValidator::class, + 'IE' => \Reducktion\Socrates\Core\Europe\Ireland\IrelandIdValidator::class, + 'IS' => \Reducktion\Socrates\Core\Europe\Iceland\IcelandIdValidator::class, + 'IT' => \Reducktion\Socrates\Core\Europe\Italy\ItalyIdValidator::class, + 'LT' => \Reducktion\Socrates\Core\Europe\Lithuania\LithuaniaIdValidator::class, + 'LV' => \Reducktion\Socrates\Core\Europe\Latvia\LatviaIdValidator::class, + 'MD' => \Reducktion\Socrates\Core\Europe\Moldova\MoldovaIdValidator::class, + 'ME' => \Reducktion\Socrates\Core\Europe\Montenegro\MontenegroIdValidator::class, + 'MK' => \Reducktion\Socrates\Core\Europe\NorthMacedonia\NorthMacedoniaIdValidator::class, + 'NL' => \Reducktion\Socrates\Core\Europe\Netherlands\NetherlandsIdValidator::class, + 'NO' => \Reducktion\Socrates\Core\Europe\Norway\NorwayIdValidator::class, + 'PL' => \Reducktion\Socrates\Core\Europe\Poland\PolandIdValidator::class, + 'PT' => \Reducktion\Socrates\Core\Europe\Portugal\PortugalIdValidator::class, + 'RO' => \Reducktion\Socrates\Core\Europe\Romania\RomaniaIdValidator::class, + 'RS' => \Reducktion\Socrates\Core\Europe\Serbia\SerbiaIdValidator::class, + 'SE' => \Reducktion\Socrates\Core\Europe\Sweden\SwedenIdValidator::class, + 'SI' => \Reducktion\Socrates\Core\Europe\Slovenia\SloveniaIdValidator::class, + 'SK' => \Reducktion\Socrates\Core\Europe\Slovakia\SlovakiaIdValidator::class, + 'TR' => \Reducktion\Socrates\Core\Europe\Turkey\TurkeyIdValidator::class, + 'UA' => \Reducktion\Socrates\Core\Europe\Ukraine\UkraineIdValidator::class, + 'XK' => \Reducktion\Socrates\Core\Europe\Kosovo\KosovoIdValidator::class, + + /** + * Validators for north american countries. + */ + 'CA' => \Reducktion\Socrates\Core\NorthAmerica\Canada\CanadaIdValidator::class, + 'US' => \Reducktion\Socrates\Core\NorthAmerica\UnitedStates\UnitedStatesIdValidator::class, + 'MX' => \Reducktion\Socrates\Core\NorthAmerica\Mexico\MexicoIdValidator::class, + + /** + * Validators for south american countries. + */ + 'AR' => \Reducktion\Socrates\Core\SouthAmerica\Argentina\ArgentinaIdValidator::class, + 'BR' => \Reducktion\Socrates\Core\SouthAmerica\Brazil\BrazilIdValidator::class, + 'CL' => \Reducktion\Socrates\Core\SouthAmerica\Chile\ChileIdValidator::class, + 'EC' => \Reducktion\Socrates\Core\SouthAmerica\Ecuador\EcuadorIdValidator::class, + 'PE' => \Reducktion\Socrates\Core\SouthAmerica\Peru\PeruIdValidator::class, + 'UY' => \Reducktion\Socrates\Core\SouthAmerica\Uruguay\UruguayIdValidator::class, ]; public static $extractors = [ - 'AL' => \Reducktion\Socrates\Core\Albania\AlbaniaCitizenInformationExtractor::class, - 'BA' => \Reducktion\Socrates\Core\BosniaAndHerzegovina\BosniaAndHerzegovinaCitizenInformationExtractor::class, - 'BE' => \Reducktion\Socrates\Core\Belgium\BelgiumCitizenInformationExtractor::class, - 'BG' => \Reducktion\Socrates\Core\Bulgaria\BulgariaCitizenInformationExtractor::class, - 'DK' => \Reducktion\Socrates\Core\Denmark\DenmarkCitizenInformationExtractor::class, - 'CZ' => \Reducktion\Socrates\Core\CzechRepublic\CzechRepublicCitizenInformationExtractor::class, - 'EE' => \Reducktion\Socrates\Core\Estonia\EstoniaCitizenInformationExtractor::class, - 'FI' => \Reducktion\Socrates\Core\Finland\FinlandCitizenInformationExtractor::class, - 'FR' => \Reducktion\Socrates\Core\France\FranceCitizenInformationExtractor::class, - 'HR' => \Reducktion\Socrates\Core\Croatia\CroatiaCitizenInformationExtractor::class, - 'HU' => \Reducktion\Socrates\Core\Hungary\HungaryCitizenInformationExtractor::class, - 'IS' => \Reducktion\Socrates\Core\Iceland\IcelandCitizenInformationExtractor::class, - 'IT' => \Reducktion\Socrates\Core\Italy\ItalyCitizenInformationExtractor::class, - 'LT' => \Reducktion\Socrates\Core\Lithuania\LithuaniaCitizenInformationExtractor::class, - 'LU' => \Reducktion\Socrates\Core\Luxembourg\LuxembourgCitizenInformationExtractor::class, - 'LV' => \Reducktion\Socrates\Core\Latvia\LatviaCitizenInformationExtractor::class, - 'ME' => \Reducktion\Socrates\Core\Montenegro\MontenegroCitizenInformationExtractor::class, - 'MK' => \Reducktion\Socrates\Core\NorthMacedonia\NorthMacedoniaCitizenInformationExtractor::class, - 'NO' => \Reducktion\Socrates\Core\Norway\NorwayCitizenInformationExtractor::class, - 'PL' => \Reducktion\Socrates\Core\Poland\PolandCitizenInformationExtractor::class, - 'RO' => \Reducktion\Socrates\Core\Romania\RomaniaCitizenInformationExtractor::class, - 'RS' => \Reducktion\Socrates\Core\Serbia\SerbiaCitizenInformationExtractor::class, - 'SE' => \Reducktion\Socrates\Core\Sweden\SwedenCitizenInformationExtractor::class, - 'SI' => \Reducktion\Socrates\Core\Slovenia\SloveniaCitizenInformationExtractor::class, - 'SK' => \Reducktion\Socrates\Core\Slovakia\SlovakiaCitizenInformationExtractor::class, - 'UA' => \Reducktion\Socrates\Core\Ukraine\UkraineCitizenInformationExtractor::class, - 'XK' => \Reducktion\Socrates\Core\Kosovo\KosovoCitizenInformationExtractor::class, + /** + * Extractors for european countries. + */ + 'AL' => \Reducktion\Socrates\Core\Europe\Albania\AlbaniaCitizenInformationExtractor::class, + 'BA' => \Reducktion\Socrates\Core\Europe\BosniaAndHerzegovina\BosniaAndHerzegovinaCitizenInformationExtractor::class, + 'BE' => \Reducktion\Socrates\Core\Europe\Belgium\BelgiumCitizenInformationExtractor::class, + 'BG' => \Reducktion\Socrates\Core\Europe\Bulgaria\BulgariaCitizenInformationExtractor::class, + 'DK' => \Reducktion\Socrates\Core\Europe\Denmark\DenmarkCitizenInformationExtractor::class, + 'CZ' => \Reducktion\Socrates\Core\Europe\CzechRepublic\CzechRepublicCitizenInformationExtractor::class, + 'EE' => \Reducktion\Socrates\Core\Europe\Estonia\EstoniaCitizenInformationExtractor::class, + 'FI' => \Reducktion\Socrates\Core\Europe\Finland\FinlandCitizenInformationExtractor::class, + 'FR' => \Reducktion\Socrates\Core\Europe\France\FranceCitizenInformationExtractor::class, + 'HR' => \Reducktion\Socrates\Core\Europe\Croatia\CroatiaCitizenInformationExtractor::class, + 'HU' => \Reducktion\Socrates\Core\Europe\Hungary\HungaryCitizenInformationExtractor::class, + 'IS' => \Reducktion\Socrates\Core\Europe\Iceland\IcelandCitizenInformationExtractor::class, + 'IT' => \Reducktion\Socrates\Core\Europe\Italy\ItalyCitizenInformationExtractor::class, + 'LT' => \Reducktion\Socrates\Core\Europe\Lithuania\LithuaniaCitizenInformationExtractor::class, + 'LV' => \Reducktion\Socrates\Core\Europe\Latvia\LatviaCitizenInformationExtractor::class, + 'ME' => \Reducktion\Socrates\Core\Europe\Montenegro\MontenegroCitizenInformationExtractor::class, + 'MK' => \Reducktion\Socrates\Core\Europe\NorthMacedonia\NorthMacedoniaCitizenInformationExtractor::class, + 'NO' => \Reducktion\Socrates\Core\Europe\Norway\NorwayCitizenInformationExtractor::class, + 'PL' => \Reducktion\Socrates\Core\Europe\Poland\PolandCitizenInformationExtractor::class, + 'RO' => \Reducktion\Socrates\Core\Europe\Romania\RomaniaCitizenInformationExtractor::class, + 'RS' => \Reducktion\Socrates\Core\Europe\Serbia\SerbiaCitizenInformationExtractor::class, + 'SE' => \Reducktion\Socrates\Core\Europe\Sweden\SwedenCitizenInformationExtractor::class, + 'SI' => \Reducktion\Socrates\Core\Europe\Slovenia\SloveniaCitizenInformationExtractor::class, + 'SK' => \Reducktion\Socrates\Core\Europe\Slovakia\SlovakiaCitizenInformationExtractor::class, + 'UA' => \Reducktion\Socrates\Core\Europe\Ukraine\UkraineCitizenInformationExtractor::class, + 'XK' => \Reducktion\Socrates\Core\Europe\Kosovo\KosovoCitizenInformationExtractor::class, + + /** + * Extractors for north american countries. + */ + 'MX' => \Reducktion\Socrates\Core\NorthAmerica\Mexico\MexicoCitizenInformationExtractor::class, ]; } diff --git a/src/Constants/Country.php b/src/Constants/Country.php new file mode 100644 index 0000000..27b6d91 --- /dev/null +++ b/src/Constants/Country.php @@ -0,0 +1,70 @@ +getMonthFromDigits($monthDigits, $this->getGender($id)); - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } private function getYearFromCode(string $yearCode): int diff --git a/src/Core/Albania/AlbaniaIdValidator.php b/src/Core/Europe/Albania/AlbaniaIdValidator.php similarity index 86% rename from src/Core/Albania/AlbaniaIdValidator.php rename to src/Core/Europe/Albania/AlbaniaIdValidator.php index 9c643ec..ff00d24 100644 --- a/src/Core/Albania/AlbaniaIdValidator.php +++ b/src/Core/Europe/Albania/AlbaniaIdValidator.php @@ -1,6 +1,6 @@ 'A', @@ -48,11 +48,11 @@ public function validate(string $id): bool 0 => 'W', ]; - $firstLetter = $id[0]; - $checkLetter = $id[9]; - $firstLetterNumber = array_search($firstLetter, $verificationTable); + $firstLetter = $idArray[0]; + $checkLetter = $idArray[9]; + $firstLetterNumber = array_search($firstLetter, $verificationTable, true); - $eightMiddleDigits = array_slice($id, 1, 8); + $eightMiddleDigits = array_slice($idArray, 1, 8); $sum = array_sum( array_map( diff --git a/src/Core/Belgium/BelgiumCitizenInformationExtractor.php b/src/Core/Europe/Belgium/BelgiumCitizenInformationExtractor.php similarity index 71% rename from src/Core/Belgium/BelgiumCitizenInformationExtractor.php rename to src/Core/Europe/Belgium/BelgiumCitizenInformationExtractor.php index 802daab..927b55d 100644 --- a/src/Core/Belgium/BelgiumCitizenInformationExtractor.php +++ b/src/Core/Europe/Belgium/BelgiumCitizenInformationExtractor.php @@ -1,13 +1,20 @@ isAfter2000($id) ? $year + 2000 : $year + 1900; - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } private function isAfter2000($id): bool diff --git a/src/Core/Belgium/BelgiumIdValidator.php b/src/Core/Europe/Belgium/BelgiumIdValidator.php similarity index 65% rename from src/Core/Belgium/BelgiumIdValidator.php rename to src/Core/Europe/Belgium/BelgiumIdValidator.php index 9dea5a1..87461a0 100644 --- a/src/Core/Belgium/BelgiumIdValidator.php +++ b/src/Core/Europe/Belgium/BelgiumIdValidator.php @@ -1,17 +1,28 @@ sanitize($id); + if (! $this->validateSequenceNumber($id)) { + return false; + } + $checksumFromId = (int) substr($id, -2); $after2000 = false; $checksum = $this->calculateChecksum($id, $after2000); @@ -33,7 +44,7 @@ public function validate(string $id): bool private function sanitize(string $id): string { - $id = str_replace(['-', '.'], '', $id); + $id = str_replace(['-', ' ', '.'], '', $id); $idLength = strlen($id); @@ -44,6 +55,13 @@ private function sanitize(string $id): string return $id; } + private function validateSequenceNumber(string $id): bool + { + $sequenceNumber = (int) substr($id, 6, 3); + + return $sequenceNumber !== 0 && $sequenceNumber !== 999; + } + private function calculateChecksum(string $id, bool $after2000): int { if ($after2000) { @@ -60,18 +78,21 @@ private function validDateOfBirth(string $id, bool $after2000): bool $dateDigits = substr($id, 0, 6); [$year, $month, $day] = str_split($dateDigits, 2); + $year = (int) $year; + $month = (int) $month; + $day = (int) $day; + + $month = $month === 0 ? 1 : $month; + $day = $day === 0 ? 1 : $day; + if ($month < 1 || $month > 12 || $day < 1 || $day > 31) { return false; } $year = $after2000 ? $year + 2000 : $year + 1900; - $dob = Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); - - if ($dob->greaterThan($dob->subYears(12))) { - return false; - } + $dateOfBirth = new DateTime("$year-$month-$day"); - return true; + return (new DateTime())->diff($dateOfBirth)->y >= 12; } } diff --git a/src/Core/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php b/src/Core/Europe/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php similarity index 84% rename from src/Core/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php rename to src/Core/Europe/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php index fe03dca..3a5805c 100644 --- a/src/Core/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php +++ b/src/Core/Europe/BosniaAndHerzegovina/BosniaAndHerzegovinaCitizenInformationExtractor.php @@ -1,12 +1,12 @@ 12 ? $month - 50 : $month; - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } } diff --git a/src/Core/Czechoslovakia/CzechoslovakiaIdValidator.php b/src/Core/Europe/Czechoslovakia/CzechoslovakiaIdValidator.php similarity index 90% rename from src/Core/Czechoslovakia/CzechoslovakiaIdValidator.php rename to src/Core/Europe/Czechoslovakia/CzechoslovakiaIdValidator.php index e5af59b..3970551 100644 --- a/src/Core/Czechoslovakia/CzechoslovakiaIdValidator.php +++ b/src/Core/Europe/Czechoslovakia/CzechoslovakiaIdValidator.php @@ -1,6 +1,6 @@ format('Y') - : Carbon::createFromFormat('y', (string) $twoDigitYear)->format('Y'); + ? DateTime::createFromFormat('Y', "19$twoDigitYear")->format('Y') + : DateTime::createFromFormat('y', (string) $twoDigitYear)->format('Y'); if (($seventhDigit === 4 || $seventhDigit === 9) && $year <= 1936) { $year += 100; @@ -56,6 +56,6 @@ private function getDateOfBirth(string $cpr): Carbon $year > 1957 ? $year -= 100 : $year += 100; } - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } } diff --git a/src/Core/Denmark/DenmarkIdValidator.php b/src/Core/Europe/Denmark/DenmarkIdValidator.php similarity index 95% rename from src/Core/Denmark/DenmarkIdValidator.php rename to src/Core/Europe/Denmark/DenmarkIdValidator.php index 68d125e..48aa328 100644 --- a/src/Core/Denmark/DenmarkIdValidator.php +++ b/src/Core/Europe/Denmark/DenmarkIdValidator.php @@ -1,6 +1,6 @@ format('y'); + $currentYear = (int) (new DateTime())->format('y'); + $year = $year > $currentYear ? $year + 1900 : $year + 2000; if ($month > 0 && $month < 13) { - return Carbon::createFromFormat('Y-m', "$year-$month"); + return DateTime::createFromFormat('Y-m', "$year-$month"); } if ($month > 30 && $month < 43) { $month -= 30; - return Carbon::createFromFormat('Y-m', "$year-$month"); + return DateTime::createFromFormat('Y-m', "$year-$month"); } - return Carbon::createFromFormat('Y', $year); + return DateTime::createFromFormat('Y', $year); } private function getPlaceOfBirth(string $id): string diff --git a/src/Core/France/FranceIdValidator.php b/src/Core/Europe/France/FranceIdValidator.php similarity index 94% rename from src/Core/France/FranceIdValidator.php rename to src/Core/Europe/France/FranceIdValidator.php index 27b5f92..5298474 100644 --- a/src/Core/France/FranceIdValidator.php +++ b/src/Core/Europe/France/FranceIdValidator.php @@ -1,6 +1,6 @@ 31 ? Gender::FEMALE : Gender::MALE; } - private function getDateOfBirth(string $id): Carbon + private function getDateOfBirth(string $id): DateTime { $dayDigits = substr($id, 9, 2); $monthChar = $id[8]; $yearDigits = substr($id, 6, 2); $months = 'ABCDEHLMPRST'; - $currentYear = (int) now()->format('y'); + $currentYear = (int) (new DateTime())->format('y'); $day = (int) $dayDigits > 31 ? (int) $dayDigits - 40 : (int) $dayDigits; $month = strpos($months, $monthChar) + 1; $year = (int) $yearDigits > $currentYear ? (int) $yearDigits + 1900 : (int) $yearDigits + 2000; - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } private function getPlaceOfBirth(string $id): string diff --git a/src/Core/Italy/ItalyIdValidator.php b/src/Core/Europe/Italy/ItalyIdValidator.php similarity index 96% rename from src/Core/Italy/ItalyIdValidator.php rename to src/Core/Europe/Italy/ItalyIdValidator.php index 6e28a6a..4861503 100644 --- a/src/Core/Italy/ItalyIdValidator.php +++ b/src/Core/Europe/Italy/ItalyIdValidator.php @@ -1,6 +1,6 @@ 1) { $tenDigitId .= $id[$i]; } @@ -61,24 +62,24 @@ private function convertToTenDigitId(string $id): string private function getGender(string $id): string { - return $id[8] % 2 == 0 ? Gender::FEMALE : Gender::MALE; + return $id[8] % 2 === 0 ? Gender::FEMALE : Gender::MALE; } - private function getDateOfBirth(string $id, bool $isOverOneHundredYearsOld): Carbon + private function getDateOfBirth(string $id, bool $isOverOneHundredYearsOld): DateTime { $dateDigits = substr($id, 0, 6); [$twoDigitYear, $month, $day] = str_split($dateDigits, 2); if ($isOverOneHundredYearsOld) { - $year = Carbon::createFromFormat('Y', "19$twoDigitYear")->format('Y'); + $year = DateTime::createFromFormat('Y', "19$twoDigitYear")->format('Y'); } else { - $presentTwoDigitYear = (int) now()->format('y'); + $presentTwoDigitYear = (int) (new DateTime())->format('y'); $year = $twoDigitYear < $presentTwoDigitYear - ? Carbon::createFromFormat('y', (string) $twoDigitYear)->format('Y') - : Carbon::createFromFormat('Y', "19$twoDigitYear")->format('Y'); + ? DateTime::createFromFormat('y', (string) $twoDigitYear)->format('Y') + : DateTime::createFromFormat('Y', "19$twoDigitYear")->format('Y'); } - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } } diff --git a/src/Core/Sweden/SwedenIdValidator.php b/src/Core/Europe/Sweden/SwedenIdValidator.php similarity index 93% rename from src/Core/Sweden/SwedenIdValidator.php rename to src/Core/Europe/Sweden/SwedenIdValidator.php index 11c1b5a..df2df0a 100644 --- a/src/Core/Sweden/SwedenIdValidator.php +++ b/src/Core/Europe/Sweden/SwedenIdValidator.php @@ -1,6 +1,6 @@ 1) { $tenDigitId .= $id[$i]; } diff --git a/src/Core/Switzerland/SwitzerlandIdValidator.php b/src/Core/Europe/Switzerland/SwitzerlandIdValidator.php similarity index 95% rename from src/Core/Switzerland/SwitzerlandIdValidator.php rename to src/Core/Europe/Switzerland/SwitzerlandIdValidator.php index 25a208b..5a03c57 100644 --- a/src/Core/Switzerland/SwitzerlandIdValidator.php +++ b/src/Core/Europe/Switzerland/SwitzerlandIdValidator.php @@ -1,6 +1,6 @@ addDays($birthDateDigits); + $date = new DateTime('1900-01-01'); + $date->add(new DateInterval("P{$birthDateDigits}D")); + + return $date; } } diff --git a/src/Core/Ukraine/UkraineIdValidator.php b/src/Core/Europe/Ukraine/UkraineIdValidator.php similarity index 95% rename from src/Core/Ukraine/UkraineIdValidator.php rename to src/Core/Europe/Ukraine/UkraineIdValidator.php index 6229606..e2b3359 100644 --- a/src/Core/Ukraine/UkraineIdValidator.php +++ b/src/Core/Europe/Ukraine/UkraineIdValidator.php @@ -1,6 +1,6 @@ year; + $currentYear = (int) (new DateTime())->format('Y'); if ($year + 1000 < $currentYear && $year + 1000 > 1900) { $year += 1000; @@ -50,7 +47,7 @@ private static function getDateOfBirth(string $id): Carbon $year += 2000; } - return Carbon::createFromFormat('Y-m-d', "$year-$month-$day"); + return new DateTime("$year-$month-$day"); } private static function getPlaceOfBirth(string $id): string diff --git a/src/Core/Yugoslavia/YugoslaviaIdValidator.php b/src/Core/Europe/Yugoslavia/YugoslaviaIdValidator.php similarity index 93% rename from src/Core/Yugoslavia/YugoslaviaIdValidator.php rename to src/Core/Europe/Yugoslavia/YugoslaviaIdValidator.php index e6f5eaf..ec20cde 100644 --- a/src/Core/Yugoslavia/YugoslaviaIdValidator.php +++ b/src/Core/Europe/Yugoslavia/YugoslaviaIdValidator.php @@ -1,6 +1,6 @@ 'foreigner in Bosnia and Herzegovina', '02' => 'foreigners in Montenegro', '03' => 'foreigners in Croatia', - '04' => ' foreigners in North Macedonia', + '04' => 'foreigners in North Macedonia', '05' => 'foreigners in Slovenia', '06' => 'foreigners in Central Serbia', '07' => 'foreigners in Serbian province of Vojvodina', diff --git a/src/Core/NorthAmerica/Canada/CanadaIdValidator.php b/src/Core/NorthAmerica/Canada/CanadaIdValidator.php new file mode 100644 index 0000000..b040430 --- /dev/null +++ b/src/Core/NorthAmerica/Canada/CanadaIdValidator.php @@ -0,0 +1,47 @@ +sanitize($id); + + $idArray = str_split($id); + $parity = count($idArray) % 2; + $sum = 0; + foreach ($idArray as $key => $value) { + if ($key % 2 === $parity) { + $value *= 2; + } + + $sum += ($value >= 10 ? $value - 9 : $value); + } + + return $sum % 10 === 0; + } + + public function sanitize(string $id): string + { + $id = str_replace(' ', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 9) { + throw new InvalidLengthException('Canadian SIN', '9', $idLength); + } + + return $id; + } +} diff --git a/src/Core/NorthAmerica/Mexico/MexicoCitizenInformationExtractor.php b/src/Core/NorthAmerica/Mexico/MexicoCitizenInformationExtractor.php new file mode 100644 index 0000000..b0daca0 --- /dev/null +++ b/src/Core/NorthAmerica/Mexico/MexicoCitizenInformationExtractor.php @@ -0,0 +1,50 @@ +validate($id)) { + throw new InvalidIdException(); + } + + $gender = $this->getGender($id); + $dob = $this->getDateOfBirth($id); + + $citizen = new Citizen(); + $citizen->setGender($gender); + $citizen->setDateOfBirth($dob); + + return $citizen; + } + + private function getGender(string $id): string + { + $identifier = $id[10]; + + if ($identifier === 'H') { + return Gender::MALE; + } + + return Gender::FEMALE; + } + + private function getDateOfBirth(string $id): DateTime + { + $year = (int) substr($id, 4, 2); + $month = (int) substr($id, 6, 2); + $day = (int) substr($id, 8, 2); + + $year += is_numeric($id[16]) ? 1900 : 2000; + + return new DateTime("$year-$month-$day"); + } +} diff --git a/src/Core/NorthAmerica/Mexico/MexicoIdValidator.php b/src/Core/NorthAmerica/Mexico/MexicoIdValidator.php new file mode 100644 index 0000000..c09c032 --- /dev/null +++ b/src/Core/NorthAmerica/Mexico/MexicoIdValidator.php @@ -0,0 +1,158 @@ +sanitize($id); + + if (!$this->validateRegex($id)) { + return false; + } + + if (!$this->validateNames(substr($id, 0, 3))) { + return false; + } + + if (!$this->validateBirthdate(substr($id, 4, 6))) { + return false; + } + + if (!$this->validateGender($id[10])) { + return false; + } + + if (!$this->validateState(substr($id, 11, 2))) { + return false; + } + + if (!$this->validateConsonants(substr($id, 13, 3))) { + return false; + } + + return $this->validateChecksum($id); + } + + private function sanitize(string $id): string + { + $idLength = strlen($id); + + if ($idLength !== 18) { + throw new InvalidLengthException('Mexico CURP', 18, $idLength); + } + + return strtoupper($id); + } + + private function validateRegex(string $id): bool + { + return preg_match('/^[A-Z]{4}\d{6}[A-Z]{6}[0-9A-Z]\d$/', $id, $matches); + } + + private function validateNames(string $names): bool + { + $length = strlen($names); + for ($i = 0; $i < $length; $i++) { + if (!ctype_alpha($names[$i])) { + return false; + } + + if (!in_array($names[1], self::VOWELS)) { + return false; + } + } + + if (in_array($names, self::BLACKLISTED_NAMES)) { + return false; + } + + return true; + } + + private function validateBirthdate(string $birthdate): bool + { + $length = strlen($birthdate); + for ($i = 0; $i < $length; $i++) { + if (!is_numeric($birthdate[$i])) { + return false; + } + } + + if (!in_array((int)substr($birthdate, 2, 2), range(1, 12), true)) { + return false; + } + + if (!in_array((int)substr($birthdate, 4, 2), range(1, 31), true)) { + return false; + } + + return true; + } + + private function validateGender(string $gender): bool + { + return !(!ctype_alpha($gender) || !in_array($gender, self::GENDERS)); + } + + private function validateState(string $state): bool + { + return !(!array_key_exists($state, MexicoStatesList::$states) || !ctype_alpha($state)); + } + + private function validateConsonants(string $names): bool + { + if (!ctype_alpha($names)) { + return false; + } + + $length = strlen($names); + for ($i = 0; $i < $length; $i++) { + if (in_array($names[$i], self::VOWELS)) { + return false; + } + } + + return true; + } + + private function validateChecksum(string $id): bool + { + $alphabet = "0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ"; + + if (!is_numeric($id[17])) { + return false; + } + + $code = substr($id, 0, 17); + $check = 0; + + $length = strlen($code); + for ($i = 0; $i < $length; $i++) { + $check += array_search($code[$i], str_split($alphabet), true) * (18 - $i); + } + return (10 - $check % 10) % 10 === (int) $id[17]; + } +} diff --git a/src/Core/NorthAmerica/Mexico/MexicoStatesList.php b/src/Core/NorthAmerica/Mexico/MexicoStatesList.php new file mode 100644 index 0000000..fa75982 --- /dev/null +++ b/src/Core/NorthAmerica/Mexico/MexicoStatesList.php @@ -0,0 +1,49 @@ + "AGUASCALIENTES", + 'BS' => "BAJA CALIFORNIA SUR", + 'CL' => "COAHUILA", + 'CS' => "CHIAPAS", + 'DF' => "DISTRITO FEDERAL", + 'GT' => "GUANAJUATO", + 'HG' => "HIDALGO", + 'MC' => "Mร‰XICO", + 'MS' => "MORELOS", + 'NL' => "NUEVO LEร“N", + 'PL' => "PUEBLA", + 'QR' => "QUINTANA ROO", + 'SL' => "SINALOA", + 'TC' => "TABASCO", + 'TL' => "TLAXCALA", + 'YN' => "YUCATรN", + 'NE' => "NACIDO EN EL EXTRANJERO", + 'BC' => "BAJA CALIFORNIA", + 'CC' => "CAMPECHE", + 'CM' => "COLIMA", + 'CH' => "CHIHUAHUA", + 'DG' => "DURANGO", + 'GR' => "GUERRERO", + 'JC' => "JALISCO", + 'MN' => "MICHOACรN", + 'NT' => "NAYARIT", + 'OC' => "OAXACA", + 'QT' => "QUERร‰TARO", + 'SP' => "SAN LUIS POTOSร", + 'SR' => "SONORA", + 'TS' => "TAMAULIPAS", + 'VZ' => "VERACRUZ", + 'ZS' => "ZACATECAS" + ]; +} diff --git a/src/Core/NorthAmerica/UnitedStates/UnitedStatesIdValidator.php b/src/Core/NorthAmerica/UnitedStates/UnitedStatesIdValidator.php new file mode 100644 index 0000000..78309a4 --- /dev/null +++ b/src/Core/NorthAmerica/UnitedStates/UnitedStatesIdValidator.php @@ -0,0 +1,58 @@ +sanitize($id); + + if (in_array($id, $this->blacklist, true)) { + return false; + } + + $areaNumber = (int) substr($id, 0, 3); + if ($areaNumber === 0 || $areaNumber === 666 || $areaNumber > 899) { + return false; + } + + $groupNumber = (int) substr($id, 3, 2); + if ($groupNumber === 0) { + return false; + } + + $serialNumber = (int) substr($id, 5, 4); + + return !($serialNumber === 0); + } + + private function sanitize(string $id): string + { + $id = str_replace('-', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 9) { + throw new InvalidLengthException('American SSN', '9', $idLength); + } + + return $id; + } +} diff --git a/src/Core/SouthAmerica/Argentina/ArgentinaIdValidator.php b/src/Core/SouthAmerica/Argentina/ArgentinaIdValidator.php new file mode 100644 index 0000000..bad835b --- /dev/null +++ b/src/Core/SouthAmerica/Argentina/ArgentinaIdValidator.php @@ -0,0 +1,44 @@ +sanitize($id); + + $sum = 0; + for ($i = 0; $i <= 9; ++$i) { + $sum += $id[9 - $i] * (2 + ($i % 6)); + } + + $checksum = 11 - ($sum % 11); + $checksum = $checksum === 11 ? 0 : $checksum; + + return (string)$checksum === $id[-1]; + } + + private function sanitize(string $id): string + { + $id = preg_replace('/[\D]/', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 11) { + throw new InvalidLengthException('Argentina CUIL/CUIT', '11', $idLength); + } + + return $id; + } +} diff --git a/src/Core/Brazil/BrazilIdValidator.php b/src/Core/SouthAmerica/Brazil/BrazilIdValidator.php similarity index 77% rename from src/Core/Brazil/BrazilIdValidator.php rename to src/Core/SouthAmerica/Brazil/BrazilIdValidator.php index b68c81a..f746944 100644 --- a/src/Core/Brazil/BrazilIdValidator.php +++ b/src/Core/SouthAmerica/Brazil/BrazilIdValidator.php @@ -1,10 +1,17 @@ sanitize($id); + + $lastDigit = $id[-1]; + + $id = substr($id, 0, -1); + + $sum = 1; + for ($m = 0; $id != 0; $id /= 10) { + $sum = ($sum + $id % 10 * (9 - $m++ % 6)) % 11; + } + + $checksum = chr($sum ? $sum + 47 : 75); + + return $checksum === $lastDigit; + } + + private function sanitize(string $id): string + { + $lastDigitCharIsK = substr($id, -1) === 'K'; + $id = preg_replace('/[\D]/', '', $id); + + if (is_string($id)) { + $id .= $lastDigitCharIsK ? 'K' : ''; + } + + $idLength = strlen($id); + + //The RUT number's format is: 7 or 8 digits, one dash, 1 check digit (0-9, K) + if ($idLength < 8 || $idLength > 9) { + throw new InvalidLengthException('Chile RUT', '8', $idLength); + } + + return $id; + } +} diff --git a/src/Core/SouthAmerica/Ecuador/EcuadorIdValidator.php b/src/Core/SouthAmerica/Ecuador/EcuadorIdValidator.php new file mode 100644 index 0000000..d9715fb --- /dev/null +++ b/src/Core/SouthAmerica/Ecuador/EcuadorIdValidator.php @@ -0,0 +1,80 @@ +sanitize($id); + + $provinceCode = (int)substr($id, 0, 2); + $thirdDigit = (int)$id[2]; + $sequenceNumber = substr($id, 0, 9); + $lastDigit = (int)$id[-1]; + + if ($provinceCode < 0 || $provinceCode > 24) { + return false; + } + + if ($thirdDigit < 0 || $thirdDigit > 5) { + return false; + } + + return $this->validateCheckDigit($sequenceNumber, $lastDigit); + } + + private function sanitize(string $id): string + { + $id = preg_replace('/[\D]/', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 10) { + throw new InvalidLengthException('Ecuador CI', '10', $idLength); + } + + return $id; + } + + protected function validateCheckDigit(string $sequence, int $lastDigit): bool + { + $coefficients = [2, 1, 2, 1, 2, 1, 2, 1, 2]; + + $sequence = array_map( + static function ($digit) { + return (int)$digit; + }, + str_split($sequence) + ); + + $sum = 0; + foreach ($sequence as $key => $value) { + $posValue = $value * $coefficients[$key]; + + if ($posValue >= 10) { + $posValue = (int)array_sum(str_split($posValue)); + } + + $sum += $posValue; + } + + $remainder = $sum % 10; + $result = $remainder !== 0 ? 10 - $remainder : 0; + + return $result === $lastDigit; + } +} diff --git a/src/Core/SouthAmerica/Peru/PeruIdValidator.php b/src/Core/SouthAmerica/Peru/PeruIdValidator.php new file mode 100644 index 0000000..c80bdd7 --- /dev/null +++ b/src/Core/SouthAmerica/Peru/PeruIdValidator.php @@ -0,0 +1,70 @@ +sanitize($id); + + $sum = 0; + $factors = [3, 2, 7, 6, 5, 4, 3, 2]; + $numberKeys = [6, 7, 8, 9, 0, 1, 1, 2, 3, 4, 5]; + $charKeys = ['K', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']; + + $dniDigits = substr($id, 0, -1); + + if (preg_match('/[\D]/', $dniDigits)) { + return false; + } + + $dniDigits = array_map( + static function ($digit) { + return (int)$digit; + }, + str_split($dniDigits) + ); + + $lastDigit = substr($id, -1); + + $countDniDigits = count($dniDigits); + + for ($i = 0; $i < $countDniDigits; $i++) { + $sum += $dniDigits[$i] * $factors[$i]; + } + + $key = 11 - ($sum % 11); + $key = $key === 11 ? 0 : $key; + + return is_numeric($lastDigit) + ? $numberKeys[$key] === (int)$lastDigit + : $charKeys[$key] === strtoupper($lastDigit); + } + + private function sanitize(string $id): string + { + $id = preg_replace('/[\W]/', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 9) { + throw new InvalidLengthException('Peru CUI', '9', $idLength); + } + + return $id; + } +} diff --git a/src/Core/SouthAmerica/Uruguay/UruguayIdValidator.php b/src/Core/SouthAmerica/Uruguay/UruguayIdValidator.php new file mode 100644 index 0000000..47e673c --- /dev/null +++ b/src/Core/SouthAmerica/Uruguay/UruguayIdValidator.php @@ -0,0 +1,50 @@ +sanitize($id); + $lastDigit = (int)$id[-1]; + $id = str_pad($id, 7, '0', STR_PAD_LEFT); + + $a = 0; + + $baseNumber = "2987634"; + for ($i = 0; $i < 7; $i++) { + $baseDigit = (int)$baseNumber[$i]; + $ciDigit = (int)$id[$i]; + + $a += ($baseDigit * $ciDigit) % 10; + } + + $validationDigit = $a % 10 === 0 ? 0 : 10 - $a % 10; + + return $lastDigit === $validationDigit; + } + + private function sanitize(string $id): string + { + $id = preg_replace('/[\D]/', '', $id); + + $idLength = strlen($id); + + if ($idLength !== 8) { + throw new InvalidLengthException('Uruguay CI', '8', $idLength); + } + + return $id; + } +} diff --git a/src/Exceptions/InvalidLengthException.php b/src/Exceptions/InvalidLengthException.php index ae4e298..0bc9a50 100644 --- a/src/Exceptions/InvalidLengthException.php +++ b/src/Exceptions/InvalidLengthException.php @@ -4,13 +4,6 @@ class InvalidLengthException extends \LogicException { - /** - * The name of the National Identification Number. - * - * @var string - */ - private $designation; - /** * Description of the number of characters the National Identification Number should have. * @@ -28,15 +21,12 @@ class InvalidLengthException extends \LogicException /** * Create a new InvalidLengthException instance. * - * @param string $designation - * @param string $requiredCharacters - * @param string $givenCharacters - * @return void + * @param string $designation The National Identification Number designation + * @param string $requiredCharacters The correct number of characters as string + * @param string $givenCharacters The characters that the user has given us */ public function __construct(string $designation, string $requiredCharacters, string $givenCharacters) { - $this->designation = $designation; - $this->requiredCharacters = $requiredCharacters; $this->givenCharacters = $givenCharacters; diff --git a/src/Models/Citizen.php b/src/Models/Citizen.php index d7224ee..0b1ae29 100644 --- a/src/Models/Citizen.php +++ b/src/Models/Citizen.php @@ -2,6 +2,7 @@ namespace Reducktion\Socrates\Models; +use DateTime; use Carbon\Carbon; use Reducktion\Socrates\Exceptions\UnsupportedOperationException; @@ -15,9 +16,9 @@ class Citizen private $gender; /** - * The date of birth as a Carbon instance. + * The date of birth as a DateTime object. * - * @var Carbon|null + * @var DateTime|null */ private $dateOfBirth; @@ -29,7 +30,7 @@ class Citizen private $placeOfBirth; /** - * Get the gender. + * Get the citizen's gender as a string. * * @return string|null */ @@ -39,17 +40,29 @@ public function getGender(): ?string } /** - * Get the date of birth. + * Get the citizen's date of birth as a Carbon instance. * + * @deprecated v1.3.0 This method will be deprecated in the next release of Socrates. + * Please use getDateOfBirthNative() instead. * @return Carbon|null */ public function getDateOfBirth(): ?Carbon + { + return Carbon::instance($this->dateOfBirth); + } + + /** + * Get the citizen's date of birth as a DateTime object. + * + * @return DateTime|null + */ + public function getDateOfBirthNative(): ?DateTime { return $this->dateOfBirth; } /** - * Get the age. + * Get the citizen's age as a number or null. * * @return int|null */ @@ -59,11 +72,11 @@ public function getAge(): ?int throw new UnsupportedOperationException('Citizen date of birth is null.'); } - return $this->dateOfBirth->age; + return (new DateTime())->diff($this->dateOfBirth)->y; } /** - * Get the place of birth. + * Get the citizen's place of birth as a string or null. * * @return string|null */ @@ -73,7 +86,7 @@ public function getPlaceOfBirth(): ?string } /** - * Set the gender. + * Set the citizen's gender. * * @param string $gender * @return void @@ -84,18 +97,18 @@ public function setGender(string $gender): void } /** - * Set the date of birth. + * Set the citizen's date of birth. * - * @param Carbon $dateOfBirth + * @param DateTime $dateOfBirth * @return void */ - public function setDateOfBirth(Carbon $dateOfBirth): void + public function setDateOfBirth(DateTime $dateOfBirth): void { $this->dateOfBirth = $dateOfBirth; } /** - * Set the place of birth. + * Set the citizen's place of birth. * * @param string $placeOfBirth * @return void diff --git a/src/Socrates.php b/src/Socrates.php index 339c018..3a8d89e 100644 --- a/src/Socrates.php +++ b/src/Socrates.php @@ -69,16 +69,10 @@ public function validateId(string $id, string $countryCode = ''): bool */ private function formatCountryCode(string $countryCode): string { - $runningLaravel = class_exists(\Illuminate\Support\Facades\App::class); - - if (! $runningLaravel && $countryCode === '') { + if ($countryCode === '') { throw new InvalidCountryCodeException('No country code provided.'); } - if ($runningLaravel && $countryCode === '') { - $countryCode = \Illuminate\Support\Facades\App::getLocale(); - } - $countryCodeLength = strlen($countryCode); if ($countryCodeLength !== 2 && $countryCodeLength !== 5) { diff --git a/tests/CitizenInformationExtractorFactoryTest.php b/tests/CitizenInformationExtractorFactoryTest.php new file mode 100644 index 0000000..1df4cca --- /dev/null +++ b/tests/CitizenInformationExtractorFactoryTest.php @@ -0,0 +1,24 @@ +assertInstanceOf(CitizenInformationExtractor::class, $extractor); + } + + /** @test */ + public function it_throws_for_unknown_country(): void + { + $this->expectException(RuntimeException::class); + CitizenInformationExtractorFactory::getExtractor('XX'); + } +} diff --git a/tests/Feature/AlbaniaTest.php b/tests/Feature/Europe/AlbaniaTest.php similarity index 63% rename from tests/Feature/AlbaniaTest.php rename to tests/Feature/Europe/AlbaniaTest.php index ab3ed75..57ae9d3 100644 --- a/tests/Feature/AlbaniaTest.php +++ b/tests/Feature/Europe/AlbaniaTest.php @@ -1,11 +1,13 @@ [ 'nid' => 'I05101999I', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1980-01-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '1980-01-01')->age, + 'dob' => new DateTime('1980-01-01'), + 'age' => $this->calculateAge(new DateTime('1980-01-01')), ], 'shufti' => [ 'nid' => 'I90201535E', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1989-02-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '1989-02-01')->age, + 'dob' => new DateTime('1989-02-01'), + 'age' => $this->calculateAge(new DateTime('1989-02-01')), ], 'shyqe' => [ 'nid' => 'J45423004V', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1994-04-23'), - 'age' => Carbon::createFromFormat('Y-m-d', '1994-04-23')->age, + 'dob' => new DateTime('1994-04-23'), + 'age' => $this->calculateAge(new DateTime('1994-04-23')), ], 'elseid' => [ 'nid' => 'H71211672R', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1977-12-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1977-12-11')->age, + 'dob' => new DateTime('1977-12-11'), + 'age' => $this->calculateAge(new DateTime('1977-12-11')), ], 'hasna' => [ 'nid' => 'I85413200A', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1988-04-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '1988-04-13')->age, + 'dob' => new DateTime('1988-04-13'), + 'age' => $this->calculateAge(new DateTime('1988-04-13')), ], ]; @@ -62,10 +64,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['nid'], 'AL'); - - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +78,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['nid'], 'AL') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'AL') ); } diff --git a/tests/Feature/BelgiumTest.php b/tests/Feature/Europe/BelgiumTest.php similarity index 55% rename from tests/Feature/BelgiumTest.php rename to tests/Feature/Europe/BelgiumTest.php index e78bb14..2b8482e 100644 --- a/tests/Feature/BelgiumTest.php +++ b/tests/Feature/Europe/BelgiumTest.php @@ -1,16 +1,17 @@ [ 'id' => '93.05.18-223.61', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-05-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-05-18')->age, + 'dob' => new DateTime('1993-05-18'), + 'age' => $this->calculateAge(new DateTime('1993-05-18')), ], 'naoual' => [ 'id' => '730111-361-73', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1973-01-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1973-01-11')->age, + 'dob' => new DateTime('1973-01-11'), + 'age' => $this->calculateAge(new DateTime('1973-01-11')), ], 'xavi' => [ 'id' => '75.12.05-137.14', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1975-12-05'), - 'age' => Carbon::createFromFormat('Y-m-d', '1975-12-05')->age, - ], - 'ute' => [ - 'id' => '09.08.24-282.48', - 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2009-08-24'), - 'age' => Carbon::createFromFormat('Y-m-d', '2009-08-24')->age, + 'dob' => new DateTime('1975-12-05'), + 'age' => $this->calculateAge(new DateTime('1975-12-05')), ], 'kurt' => [ 'id' => '71.09.07-213.64', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1971-09-07'), - 'age' => Carbon::createFromFormat('Y-m-d', '1971-09-07')->age, + 'dob' => new DateTime('1971-09-07'), + 'age' => $this->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->invalidIds = [ @@ -55,7 +56,10 @@ public function setUp(): void '97.12.03-123.12', '01.06.18-468.99', '64.04.09-874.43', - '12.10.23-954.11' + '12.10.23-954.11', + '09.08.24-282.48', // invalid age + '01.11.16-000.06', // invalid sequence number + '01.11.16-999.74' // invalid sequence number ]; } @@ -63,9 +67,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['id'], 'BE'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +81,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['id'], 'BE') ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'BE') ); } diff --git a/tests/Feature/BosniaAndHerzegovinaTest.php b/tests/Feature/Europe/BosniaAndHerzegovinaTest.php similarity index 65% rename from tests/Feature/BosniaAndHerzegovinaTest.php rename to tests/Feature/Europe/BosniaAndHerzegovinaTest.php index 8338e1f..6342750 100644 --- a/tests/Feature/BosniaAndHerzegovinaTest.php +++ b/tests/Feature/Europe/BosniaAndHerzegovinaTest.php @@ -1,11 +1,13 @@ [ 'jmbg' => '1502957172694', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1957-02-15'), - 'age' => Carbon::createFromFormat('Y-m-d', '1957-02-15')->age, + 'dob' => new DateTime('1957-02-15'), + 'age' => $this->calculateAge(new DateTime('1957-02-15')), 'pob' => 'Sarajevo - Bosnia and Herzegovina' ], 'Imran' => [ 'jmbg' => '2508995191483', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1995-08-25'), - 'age' => Carbon::createFromFormat('Y-m-d', '1995-08-25')->age, + 'dob' => new DateTime('1995-08-25'), + 'age' => $this->calculateAge(new DateTime('1995-08-25')), 'pob' => 'Zenica - Bosnia and Herzegovina' ], 'Ajdin' => [ 'jmbg' => '1012980163603', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1980-12-10'), - 'age' => Carbon::createFromFormat('Y-m-d', '1980-12-10')->age, + 'dob' => new DateTime('1980-12-10'), + 'age' => $this->calculateAge(new DateTime('1980-12-10')), 'pob' => 'Prijedor - Bosnia and Herzegovina' ], 'Merjem' => [ 'jmbg' => '1310963145538', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1963-10-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '1963-10-13')->age, + 'dob' => new DateTime('1963-10-13'), + 'age' => $this->calculateAge(new DateTime('1963-10-13')), 'pob' => 'Livno - Bosnia and Herzegovina' ], 'Eman' => [ 'jmbg' => '1806998154160', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1998-06-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1998-06-18')->age, + 'dob' => new DateTime('1998-06-18'), + 'age' => $this->calculateAge(new DateTime('1998-06-18')), 'pob' => 'Mostar - Bosnia and Herzegovina' ] ]; @@ -68,10 +70,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'BA'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +85,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'BA') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'BA') ); } diff --git a/tests/Feature/BulgariaTest.php b/tests/Feature/Europe/BulgariaTest.php similarity index 61% rename from tests/Feature/BulgariaTest.php rename to tests/Feature/Europe/BulgariaTest.php index c0b611a..345a207 100644 --- a/tests/Feature/BulgariaTest.php +++ b/tests/Feature/Europe/BulgariaTest.php @@ -1,11 +1,13 @@ [ 'egn' => '7523169263', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1875-03-16'), - 'age' => Carbon::createFromFormat('Y-m-d', '1875-03-16')->age, + 'dob' => new DateTime('1875-03-16'), + 'age' => $this->calculateAge(new DateTime('1875-03-16')), ], 'Lyuben' => [ 'egn' => '8032056031', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1880-12-05'), - 'age' => Carbon::createFromFormat('Y-m-d', '1880-12-05')->age, + 'dob' => new DateTime('1880-12-05'), + 'age' => $this->calculateAge(new DateTime('1880-12-05')), ], 'Bilyana' => [ 'egn' => '8001010008', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1980-01-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '1980-01-01')->age, + 'dob' => new DateTime('1980-01-01'), + 'age' => $this->calculateAge(new DateTime('1980-01-01')), ], 'Kalina' => [ 'egn' => '7501020018', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1975-01-02'), - 'age' => Carbon::createFromFormat('Y-m-d', '1975-01-02')->age, + 'dob' => new DateTime('1975-01-02'), + 'age' => $this->calculateAge(new DateTime('1975-01-02')), ], 'Nedyalko' => [ 'egn' => '7552010005', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2075-12-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '2075-12-01')->age, + 'dob' => new DateTime('2075-12-01'), + 'age' => $this->calculateAge(new DateTime('2075-12-01')), ], 'Tsveta' => [ 'egn' => '7542011030', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2075-02-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '2075-02-01')->age, + 'dob' => new DateTime('2075-02-01'), + 'age' => $this->calculateAge(new DateTime('2075-02-01')), ] ]; @@ -68,9 +70,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['egn'], 'BG'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -81,13 +84,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['egn'], 'BG') ); } foreach ($this->invalidIds as $egn) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($egn, 'BG') ); } diff --git a/tests/Feature/CroatiaTest.php b/tests/Feature/Europe/CroatiaTest.php similarity index 69% rename from tests/Feature/CroatiaTest.php rename to tests/Feature/Europe/CroatiaTest.php index 53207bd..8a4c777 100644 --- a/tests/Feature/CroatiaTest.php +++ b/tests/Feature/Europe/CroatiaTest.php @@ -1,16 +1,18 @@ [ 'jmbg' => '1809988305313', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1988-09-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1988-09-18')->age, + 'dob' => new DateTime('1988-09-18'), + 'age' => $this->calculateAge(new DateTime('1988-09-18')), 'pob' => 'Osijek, Slavonia region - Croatia' ], 'Ana' => [ 'jmbg' => '0808928315425', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1928-08-08'), - 'age' => Carbon::createFromFormat('Y-m-d', '1928-08-08')->age, + 'dob' => new DateTime('1928-08-08'), + 'age' => $this->calculateAge(new DateTime('1928-08-08')), 'pob' => 'Bjelovar, Virovitica, Koprivnica, Pakrac, Podravina region - Croatia' ], 'Marija' => [ 'jmbg' => '1106961359224', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1961-06-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1961-06-11')->age, + 'dob' => new DateTime('1961-06-11'), + 'age' => $this->calculateAge(new DateTime('1961-06-11')), 'pob' => 'Gospiฤ‡, Lika region - Croatia' ], 'Stjepan' => [ 'jmbg' => '1105951323209', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1951-05-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1951-05-11')->age, + 'dob' => new DateTime('1951-05-11'), + 'age' => $this->calculateAge(new DateTime('1951-05-11')), 'pob' => 'Varaลพdin, Meฤ‘imurje region - Croatia' ], 'Ivan' => [ 'jmbg' => '2109971352638', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1971-09-21'), - 'age' => Carbon::createFromFormat('Y-m-d', '1971-09-21')->age, + 'dob' => new DateTime('1971-09-21'), + 'age' => $this->calculateAge(new DateTime('1971-09-21')), 'pob' => 'Gospiฤ‡, Lika region - Croatia' ], ]; @@ -77,10 +79,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'HR'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -95,19 +98,19 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->validIds as $oib) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($oib, 'HR') ); } foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'HR') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'HR') ); } diff --git a/tests/Feature/CzechRepublicTest.php b/tests/Feature/Europe/CzechRepublicTest.php similarity index 62% rename from tests/Feature/CzechRepublicTest.php rename to tests/Feature/Europe/CzechRepublicTest.php index 9de7c32..4ba2db5 100644 --- a/tests/Feature/CzechRepublicTest.php +++ b/tests/Feature/Europe/CzechRepublicTest.php @@ -1,11 +1,13 @@ [ 'rc' => '990224/9258', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1999-02-24'), - 'age' => Carbon::createFromFormat('Y-m-d', '1999-02-24')->age, + 'dob' => new DateTime('1999-02-24'), + 'age' => $this->calculateAge(new DateTime('1999-02-24')), ], 'Tereza' => [ 'rc' => '0157155328', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-07-15'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-07-15')->age, + 'dob' => new DateTime('2001-07-15'), + 'age' => $this->calculateAge(new DateTime('2001-07-15')), ], 'Adรฉla' => [ 'rc' => '975406/2494', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1997-04-06'), - 'age' => Carbon::createFromFormat('Y-m-d', '1997-04-06')->age, + 'dob' => new DateTime('1997-04-06'), + 'age' => $this->calculateAge(new DateTime('1997-04-06')), ], 'Lucie' => [ 'rc' => '956022/6027', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1995-10-22'), - 'age' => Carbon::createFromFormat('Y-m-d', '1995-10-22')->age, + 'dob' => new DateTime('1995-10-22'), + 'age' => $this->calculateAge(new DateTime('1995-10-22')), ], 'Petr' => [ 'rc' => '960326/2955', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1996-03-26'), - 'age' => Carbon::createFromFormat('Y-m-d', '1996-03-26')->age, + 'dob' => new DateTime('1996-03-26'), + 'age' => $this->calculateAge(new DateTime('1996-03-26')), ], ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['rc'], 'CZ'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['rc'], 'CZ') ); } foreach ($this->invalidIds as $rc) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($rc, 'CZ') ); } diff --git a/tests/Feature/DenmarkTest.php b/tests/Feature/Europe/DenmarkTest.php similarity index 63% rename from tests/Feature/DenmarkTest.php rename to tests/Feature/Europe/DenmarkTest.php index 1018666..25fea52 100644 --- a/tests/Feature/DenmarkTest.php +++ b/tests/Feature/Europe/DenmarkTest.php @@ -1,11 +1,13 @@ [ 'cpr' => '090792-1395', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1992-07-09'), - 'age' => Carbon::createFromFormat('Y-m-d', '1992-07-09')->age, + 'dob' => new DateTime('1992-07-09'), + 'age' => $this->calculateAge(new DateTime('1992-07-09')), ], 'naja' => [ 'cpr' => '070593-0600', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-05-07'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-05-07')->age, + 'dob' => new DateTime('1993-05-07'), + 'age' => $this->calculateAge(new DateTime('1993-05-07')), ], 'rolla' => [ 'cpr' => '150437-3068', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1937-04-15'), - 'age' => Carbon::createFromFormat('Y-m-d', '1937-04-15')->age, + 'dob' => new DateTime('1937-04-15'), + 'age' => $this->calculateAge(new DateTime('1937-04-15')), ], 'thomas' => [ 'cpr' => '160888-1995', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1988-08-16'), - 'age' => Carbon::createFromFormat('Y-m-d', '1988-08-16')->age, + 'dob' => new DateTime('1988-08-16'), + 'age' => $this->calculateAge(new DateTime('1988-08-16')), ], 'mia' => [ 'cpr' => '040404-7094', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2004-04-04'), - 'age' => Carbon::createFromFormat('Y-m-d', '2004-04-04')->age, + 'dob' => new DateTime('2004-04-04'), + 'age' => $this->calculateAge(new DateTime('2004-04-04')), ], ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['cpr'], 'DK'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['cpr'], 'DK') ); } foreach ($this->invalidIds as $cpr) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($cpr, 'DK') ); } diff --git a/tests/Feature/EstoniaTest.php b/tests/Feature/Europe/EstoniaTest.php similarity index 62% rename from tests/Feature/EstoniaTest.php rename to tests/Feature/Europe/EstoniaTest.php index 66c575b..6d608fc 100644 --- a/tests/Feature/EstoniaTest.php +++ b/tests/Feature/Europe/EstoniaTest.php @@ -1,11 +1,13 @@ [ 'ik' => '48004119745', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1980-04-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1980-04-11')->age, + 'dob' => new DateTime('1980-04-11'), + 'age' => $this->calculateAge(new DateTime('1980-04-11')), ], 'Kaarel' => [ 'ik' => '50108040021', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-08-04'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-08-04')->age, + 'dob' => new DateTime('2001-08-04'), + 'age' => $this->calculateAge(new DateTime('2001-08-04')), ], 'Seb' => [ 'ik' => '36910180118', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1969-10-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1969-10-18')->age, + 'dob' => new DateTime('1969-10-18'), + 'age' => $this->calculateAge(new DateTime('1969-10-18')), ], 'Jakob' => [ 'ik' => '38601230129', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1986-01-23'), - 'age' => Carbon::createFromFormat('Y-m-d', '1986-01-23')->age, + 'dob' => new DateTime('1986-01-23'), + 'age' => $this->calculateAge(new DateTime('1986-01-23')), ], 'Katarina' => [ 'ik' => '60310275631', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2003-10-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '2003-10-27')->age, + 'dob' => new DateTime('2003-10-27'), + 'age' => $this->calculateAge(new DateTime('2003-10-27')), ], ]; @@ -62,9 +64,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['ik'], 'EE'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -75,13 +78,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['ik'], 'EE') ); } foreach ($this->invalidIds as $ik) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($ik, 'EE') ); } diff --git a/tests/Feature/FinlandTest.php b/tests/Feature/Europe/FinlandTest.php similarity index 63% rename from tests/Feature/FinlandTest.php rename to tests/Feature/Europe/FinlandTest.php index 423921e..d5c42ac 100644 --- a/tests/Feature/FinlandTest.php +++ b/tests/Feature/Europe/FinlandTest.php @@ -1,11 +1,13 @@ [ 'hetu' => '040560-600E', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1960-05-04'), - 'age' => Carbon::createFromFormat('Y-m-d', '1960-05-04')->age + 'dob' => new DateTime('1960-05-04'), + 'age' => $this->calculateAge(new DateTime('1960-05-04')), ], 'elias' => [ 'hetu' => '121093-275N', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-10-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-10-12')->age + 'dob' => new DateTime('1993-10-12'), + 'age' => $this->calculateAge(new DateTime('1993-10-12')), ], 'ida' => [ 'hetu' => '260555-512H', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1955-05-26'), - 'age' => Carbon::createFromFormat('Y-m-d', '1955-05-26')->age + 'dob' => new DateTime('1955-05-26'), + 'age' => $this->calculateAge(new DateTime('1955-05-26')), ], 'iiro' => [ 'hetu' => '110416A479W', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2016-04-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '2016-04-11')->age + 'dob' => new DateTime('2016-04-11'), + 'age' => $this->calculateAge(new DateTime('2016-04-11')), ], 'stig' => [ 'hetu' => '040403A2676', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2003-04-04'), - 'age' => Carbon::createFromFormat('Y-m-d', '2003-04-04')->age + 'dob' => new DateTime('2003-04-04'), + 'age' => $this->calculateAge(new DateTime('2003-04-04')), ] ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['hetu'], 'FI'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['hetu'], 'FI') ); } foreach ($this->invalidIds as $hetu) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($hetu, 'FI') ); } diff --git a/tests/Feature/FranceTest.php b/tests/Feature/Europe/FranceTest.php similarity index 57% rename from tests/Feature/FranceTest.php rename to tests/Feature/Europe/FranceTest.php index c950624..af2c111 100644 --- a/tests/Feature/FranceTest.php +++ b/tests/Feature/Europe/FranceTest.php @@ -1,11 +1,13 @@ [ 'insee' => '2820819398814 09', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m', '1982-08'), - 'age' => Carbon::createFromFormat('Y-m', '1982-08')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1982-08'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1982-08')), 'pob' => 'Corrรจze' ], 'Lance' => [ 'insee' => '1350455179061 16', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '1935-04'), - 'age' => Carbon::createFromFormat('Y-m', '1935-04')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1935-04'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1935-04')), 'pob' => 'Meuse' ], 'Ancelote' => [ 'insee' => '2381080214568 11', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m', '1938-10'), - 'age' => Carbon::createFromFormat('Y-m', '1938-10')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1938-10'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1938-10')), 'pob' => 'Somme' ], 'Lothair' => [ 'insee' => '1880858704571 57', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '1988-08'), - 'age' => Carbon::createFromFormat('Y-m', '1988-08')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1988-08'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1988-08')), 'pob' => 'Niรจvre' ], 'Millard' => [ 'insee' => '1030307795669 72', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '2003-03'), - 'age' => Carbon::createFromFormat('Y-m', '2003-03')->age, + 'dob' => DateTime::createFromFormat('Y-m', '2003-03'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '2003-03')), 'pob' => 'Ardรจche' ], 'Geoffrey' => [ 'insee' => '1820897401154 75', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '1982-08'), - 'age' => Carbon::createFromFormat('Y-m', '1982-08')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1982-08'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1982-08')), 'pob' => 'Rรฉunion' ], 'Galatee' => [ 'insee' => '2041098718061 61', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m', '2004-10'), - 'age' => Carbon::createFromFormat('Y-m', '2004-10')->age, + 'dob' => DateTime::createFromFormat('Y-m', '2004-10'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '2004-10')), 'pob' => 'French Polynesia' ], 'Leal' => [ 'insee' => '1103442505781 11', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '2010-04'), - 'age' => Carbon::createFromFormat('Y-m', '2010-04')->age, + 'dob' => DateTime::createFromFormat('Y-m', '2010-04'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '2010-04')), 'pob' => 'Loire' ], 'Odelette' => [ 'insee' => '2115028242370 20', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y', '2011'), - 'age' => Carbon::createFromFormat('Y', '2011')->age, + 'dob' => DateTime::createFromFormat('Y', '2011'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y', '2011')), 'pob' => 'Eure-et-Loir' ], 'Roch' => [ 'insee' => '199072A228070 10', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m', '1999-07'), - 'age' => Carbon::createFromFormat('Y-m', '1999-07')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1999-07'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1999-07')), 'pob' => 'Corse-du-Sud' ], 'Nadine' => [ 'insee' => '257092B844458 87', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m', '1957-09'), - 'age' => Carbon::createFromFormat('Y-m', '1957-09')->age, + 'dob' => DateTime::createFromFormat('Y-m', '1957-09'), + 'age' => $this->calculateAge(DateTime::createFromFormat('Y-m', '1957-09')), 'pob' => 'Haute-Corse' ] ]; @@ -109,10 +111,11 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['insee'], 'FR'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -123,13 +126,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['insee'], 'FR') ); } foreach ($this->invalidIds as $insee) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($insee, 'FR') ); } diff --git a/tests/Feature/Europe/GermanyTest.php b/tests/Feature/Europe/GermanyTest.php new file mode 100644 index 0000000..54486d3 --- /dev/null +++ b/tests/Feature/Europe/GermanyTest.php @@ -0,0 +1,61 @@ +validIds = [ + '81872495633', + '48954371207', + '55492670836', + '12345678995', + '11234567890' + ]; + + $this->invalidIds = [ + '01234567812', + '81872495631', + '48954371206', + '55492670834', + '11234567899' + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('81872495633', 'DE'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'DE') + ); + } + + foreach ($this->invalidIds as $invalidId) { + self::assertFalse( + Socrates::validateId($invalidId, 'DE') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('0123456789', 'DE'); + } +} diff --git a/tests/Feature/GreeceTest.php b/tests/Feature/Europe/GreeceTest.php similarity index 89% rename from tests/Feature/GreeceTest.php rename to tests/Feature/Europe/GreeceTest.php index 2e8a871..e25a28c 100644 --- a/tests/Feature/GreeceTest.php +++ b/tests/Feature/Europe/GreeceTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'GR') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'GR') ); } diff --git a/tests/Feature/HungaryTest.php b/tests/Feature/Europe/HungaryTest.php similarity index 61% rename from tests/Feature/HungaryTest.php rename to tests/Feature/Europe/HungaryTest.php index c59f599..d352098 100644 --- a/tests/Feature/HungaryTest.php +++ b/tests/Feature/Europe/HungaryTest.php @@ -1,11 +1,13 @@ [ 'pin' => '2-720216-1673', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1972-02-16'), - 'age' => Carbon::createFromFormat('Y-m-d', '1972-02-16')->age + 'dob' => new DateTime('1972-02-16'), + 'age' => $this->calculateAge(new DateTime('1972-02-16')), ], 'Dora' => [ 'pin' => '2-690609-5528', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1969-06-09'), - 'age' => Carbon::createFromFormat('Y-m-d', '1969-06-09')->age + 'dob' => new DateTime('1969-06-09'), + 'age' => $this->calculateAge(new DateTime('1969-06-09')), ], 'Jolan' => [ 'pin' => '2-840320-0414', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1984-03-20'), - 'age' => Carbon::createFromFormat('Y-m-d', '1984-03-20')->age + 'dob' => new DateTime('1984-03-20'), + 'age' => $this->calculateAge(new DateTime('1984-03-20')), ], 'Kapolcs' => [ 'pin' => '3-101010-5646', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2010-10-10'), - 'age' => Carbon::createFromFormat('Y-m-d', '2010-10-10')->age + 'dob' => new DateTime('2010-10-10'), + 'age' => $this->calculateAge(new DateTime('2010-10-10')), ], 'Vincze' => [ 'pin' => '3-080321-8523', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2008-03-21'), - 'age' => Carbon::createFromFormat('Y-m-d', '2008-03-21')->age + 'dob' => new DateTime('2008-03-21'), + 'age' => $this->calculateAge(new DateTime('2008-03-21')), ], ]; @@ -56,9 +58,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['pin'], 'HU'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -69,13 +72,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['pin'], 'HU') ); } foreach ($this->invalidIds as $pin) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($pin, 'BG') ); } diff --git a/tests/Feature/IcelandTest.php b/tests/Feature/Europe/IcelandTest.php similarity index 60% rename from tests/Feature/IcelandTest.php rename to tests/Feature/Europe/IcelandTest.php index d881841..837a966 100644 --- a/tests/Feature/IcelandTest.php +++ b/tests/Feature/Europe/IcelandTest.php @@ -1,10 +1,12 @@ people = [ 'andi' => [ 'kt' => '0902862349', - 'dob' => Carbon::createFromFormat('Y-m-d', '1986-02-09'), - 'age' => Carbon::createFromFormat('Y-m-d', '1986-02-09')->age, + 'dob' => new DateTime('1986-02-09'), + 'age' => $this->calculateAge(new DateTime('1986-02-09')), ], 'freyja' => [ 'kt' => '120174-3399', - 'dob' => Carbon::createFromFormat('Y-m-d', '1974-01-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1974-01-12')->age, + 'dob' => new DateTime('1974-01-12'), + 'age' => $this->calculateAge(new DateTime('1974-01-12')), ], 'nair' => [ 'kt' => '1808905059', - 'dob' => Carbon::createFromFormat('Y-m-d', '1990-08-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1990-08-18')->age, + 'dob' => new DateTime('1990-08-18'), + 'age' => $this->calculateAge(new DateTime('1990-08-18')), ], 'eva' => [ 'kt' => '2008108569', - 'dob' => Carbon::createFromFormat('Y-m-d', '1910-08-20'), - 'age' => Carbon::createFromFormat('Y-m-d', '1910-08-20')->age, + 'dob' => new DateTime('1910-08-20'), + 'age' => $this->calculateAge(new DateTime('1910-08-20')), ], 'hrafn' => [ 'kt' => '100303-4930', - 'dob' => Carbon::createFromFormat('Y-m-d', '2003-03-10'), - 'age' => Carbon::createFromFormat('Y-m-d', '2003-03-10')->age, + 'dob' => new DateTime('2003-03-10'), + 'age' => $this->calculateAge(new DateTime('2003-03-10')), ], ]; @@ -57,8 +59,9 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['kt'], 'IS'); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -69,13 +72,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['kt'], 'IS') ); } foreach ($this->invalidIds as $kt) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($kt, 'IS') ); } diff --git a/tests/Feature/IrelandTest.php b/tests/Feature/Europe/IrelandTest.php similarity index 88% rename from tests/Feature/IrelandTest.php rename to tests/Feature/Europe/IrelandTest.php index 76bb332..2e79519 100644 --- a/tests/Feature/IrelandTest.php +++ b/tests/Feature/Europe/IrelandTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'IE') ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'IE') ); } diff --git a/tests/Feature/ItalyTest.php b/tests/Feature/Europe/ItalyTest.php similarity index 65% rename from tests/Feature/ItalyTest.php rename to tests/Feature/Europe/ItalyTest.php index b2b945c..bb82037 100644 --- a/tests/Feature/ItalyTest.php +++ b/tests/Feature/Europe/ItalyTest.php @@ -1,12 +1,14 @@ [ 'fc' => 'MRTMTT25D09F205Z', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1925-04-09'), - 'age' => Carbon::createFromFormat('Y-m-d', '1925-04-09')->age, + 'dob' => new DateTime('1925-04-09'), + 'age' => $this->calculateAge(new DateTime('1925-04-09')), 'pob' => 'MILANO (MI)' ], 'samantha miller' => [ 'fc' => 'MLLSNT82P65Z404U', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1982-09-25'), - 'age' => Carbon::createFromFormat('Y-m-d', '1982-09-25')->age, + 'dob' => new DateTime('1982-09-25'), + 'age' => $this->calculateAge(new DateTime('1982-09-25')), 'pob' => 'STATI UNITI D\'AMERICA' ], 'delmo castiglione' => [ 'fc' => 'DLMCTG75B07H227Y', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1975-02-07'), - 'age' => Carbon::createFromFormat('Y-m-d', '1975-02-07')->age, + 'dob' => new DateTime('1975-02-07'), + 'age' => $this->calculateAge(new DateTime('1975-02-07')), 'pob' => 'REINO (BN)' ], 'elsa barese' => [ 'fc' => 'BRSLSE08D50H987B', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2008-04-10'), - 'age' => Carbon::createFromFormat('Y-m-d', '2008-04-10')->age, + 'dob' => new DateTime('2008-04-10'), + 'age' => $this->calculateAge(new DateTime('2008-04-10')), 'pob' => 'SAN MARTINO ALFIERI (AT)' ], 'dario marcelo' => [ 'fc' => 'MRCDRA01A13A065E', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-01-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-01-13')->age, + 'dob' => new DateTime('2001-01-13'), + 'age' => $this->calculateAge(new DateTime('2001-01-13')), 'pob' => 'AFRICO (RC)' ], 'dario marchesani' => [ 'fc' => 'MRCDRALMAMPALSRE', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-01-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-01-13')->age, + 'dob' => new DateTime('2001-01-13'), + 'age' => $this->calculateAge(new DateTime('2001-01-13')), 'pob' => 'AFRICO (RC)' ] ]; @@ -76,10 +78,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['fc'], 'IT'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidIdException::class); @@ -90,13 +93,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['fc'], 'IT') ); } foreach ($this->invalidIds as $fc) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($fc, 'IT') ); } diff --git a/tests/Feature/KosovoTest.php b/tests/Feature/Europe/KosovoTest.php similarity index 63% rename from tests/Feature/KosovoTest.php rename to tests/Feature/Europe/KosovoTest.php index c9b9fce..05f4066 100644 --- a/tests/Feature/KosovoTest.php +++ b/tests/Feature/Europe/KosovoTest.php @@ -1,11 +1,13 @@ [ 'jmbg' => '1009950933098', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1950-09-10'), - 'age' => Carbon::createFromFormat('Y-m-d', '1950-09-10')->age, + 'dob' => new DateTime('1950-09-10'), + 'age' => $this->calculateAge(new DateTime('1950-09-10')), 'pob' => 'Peฤ‡ region (part of Peฤ‡ District) - Kosovo' ], 'Erblina' => [ 'jmbg' => '2601966955857', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1966-01-26'), - 'age' => Carbon::createFromFormat('Y-m-d', '1966-01-26')->age, + 'dob' => new DateTime('1966-01-26'), + 'age' => $this->calculateAge(new DateTime('1966-01-26')), 'pob' => 'Prizren region (Prizren District) - Kosovo' ], 'Ajkuna' => [ 'jmbg' => '2202962926257', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1962-02-22'), - 'age' => Carbon::createFromFormat('Y-m-d', '1962-02-22')->age, + 'dob' => new DateTime('1962-02-22'), + 'age' => $this->calculateAge(new DateTime('1962-02-22')), 'pob' => 'Kosovska Mitrovica region (Kosovska Mitrovica District) - Kosovo' ], 'Esad' => [ 'jmbg' => '1404924982109', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1924-04-14'), - 'age' => Carbon::createFromFormat('Y-m-d', '1924-04-14')->age, + 'dob' => new DateTime('1924-04-14'), + 'age' => $this->calculateAge(new DateTime('1924-04-14')), 'pob' => 'Kosovo' ], 'Guzim' => [ 'jmbg' => '2103921983019', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1921-03-21'), - 'age' => Carbon::createFromFormat('Y-m-d', '1921-03-21')->age, + 'dob' => new DateTime('1921-03-21'), + 'age' => $this->calculateAge(new DateTime('1921-03-21')), 'pob' => 'Kosovo' ], ]; @@ -62,10 +64,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'XK'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'XK') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'XK') ); } diff --git a/tests/Feature/LatviaTest.php b/tests/Feature/Europe/LatviaTest.php similarity index 70% rename from tests/Feature/LatviaTest.php rename to tests/Feature/Europe/LatviaTest.php index 5492673..8a6e3e0 100644 --- a/tests/Feature/LatviaTest.php +++ b/tests/Feature/Europe/LatviaTest.php @@ -1,11 +1,13 @@ supportedExtractionPeople = [ 'Agnese' => [ 'pk' => '120673-10053', - 'dob' => Carbon::createFromFormat('Y-m-d', '1973-06-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1973-06-12')->age + 'dob' => new DateTime('1973-06-12'), + 'age' => $this->calculateAge(new DateTime('1973-06-12')), ], 'Rainers' => [ 'pk' => '031098-10386', - 'dob' => Carbon::createFromFormat('Y-m-d', '1998-10-03'), - 'age' => Carbon::createFromFormat('Y-m-d', '1998-10-03')->age + 'dob' => new DateTime('1998-10-03'), + 'age' => $this->calculateAge(new DateTime('1998-10-03')), ], 'Kin' => [ 'pk' => '250302-20559', - 'dob' => Carbon::createFromFormat('Y-m-d', '2002-03-25'), - 'age' => Carbon::createFromFormat('Y-m-d', '2002-03-25')->age + 'dob' => new DateTime('2002-03-25'), + 'age' => $this->calculateAge(new DateTime('2002-03-25')), ], 'Anton' => [ 'pk' => '300863-10955', - 'dob' => Carbon::createFromFormat('Y-m-d', '1963-08-30'), - 'age' => Carbon::createFromFormat('Y-m-d', '1963-08-30')->age + 'dob' => new DateTime('1963-08-30'), + 'age' => $this->calculateAge(new DateTime('1963-08-30')), ], 'Karlis' => [ 'pk' => '171210-20739', - 'dob' => Carbon::createFromFormat('Y-m-d', '2010-12-17'), - 'age' => Carbon::createFromFormat('Y-m-d', '2010-12-17')->age + 'dob' => new DateTime('2010-12-17'), + 'age' => $this->calculateAge(new DateTime('2010-12-17')), ] ]; @@ -76,8 +78,9 @@ public function test_extract_behaviour(): void { foreach ($this->supportedExtractionPeople as $person) { $citizen = Socrates::getCitizenDataFromId($person['pk'], 'LV'); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(UnsupportedOperationException::class); @@ -93,13 +96,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->supportedExtractionPeople as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['pk'], 'LV') ); } foreach ($this->invalidIds as $pk) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($pk, 'LV') ); } diff --git a/tests/Feature/LithuaniaTest.php b/tests/Feature/Europe/LithuaniaTest.php similarity index 62% rename from tests/Feature/LithuaniaTest.php rename to tests/Feature/Europe/LithuaniaTest.php index 6ee4baf..2c83998 100644 --- a/tests/Feature/LithuaniaTest.php +++ b/tests/Feature/Europe/LithuaniaTest.php @@ -1,16 +1,17 @@ [ 'ak' => '38409152012', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1984-09-15'), - 'age' => Carbon::createFromFormat('Y-m-d', '1984-09-15')->age + 'dob' => new DateTime('1984-09-15'), + 'age' => $this->calculateAge(new DateTime('1984-09-15')), ], 'natas' => [ 'ak' => '31710058023', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1917-10-05'), - 'age' => Carbon::createFromFormat('Y-m-d', '1917-10-05')->age + 'dob' => new DateTime('1917-10-05'), + 'age' => $this->calculateAge(new DateTime('1917-10-05')), ], 'daiva' => [ 'ak' => '44804129713', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1948-04-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1948-04-12')->age + 'dob' => new DateTime('1948-04-12'), + 'age' => $this->calculateAge(new DateTime('1948-04-12')), ], 'geta' => [ 'ak' => '60607279626', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2006-07-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '2006-07-27')->age + 'dob' => new DateTime('2006-07-27'), + 'age' => $this->calculateAge(new DateTime('2006-07-27')), ], 'domynikas' => [ 'ak' => '50508199254', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2005-08-19'), - 'age' => Carbon::createFromFormat('Y-m-d', '2005-08-19')->age + 'dob' => new DateTime('2005-08-19'), + 'age' => $this->calculateAge(new DateTime('2005-08-19')), ] ]; @@ -63,9 +64,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['ak'], 'LT'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +78,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['ak'], 'LT') ); } foreach ($this->invalidIds as $ak) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($ak, 'LT') ); } diff --git a/tests/Feature/Europe/LuxembourgTest.php b/tests/Feature/Europe/LuxembourgTest.php new file mode 100644 index 0000000..e8e6018 --- /dev/null +++ b/tests/Feature/Europe/LuxembourgTest.php @@ -0,0 +1,30 @@ +expectException(RuntimeException::class); + + Socrates::validateId('1983046783', 'LU'); + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('1983046783', 'LU'); + } +} diff --git a/tests/Feature/MoldovaTest.php b/tests/Feature/Europe/MoldovaTest.php similarity index 88% rename from tests/Feature/MoldovaTest.php rename to tests/Feature/Europe/MoldovaTest.php index 7cb7d5c..4f06180 100644 --- a/tests/Feature/MoldovaTest.php +++ b/tests/Feature/Europe/MoldovaTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'MD') ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'MD') ); } diff --git a/tests/Feature/MontenegroTest.php b/tests/Feature/Europe/MontenegroTest.php similarity index 63% rename from tests/Feature/MontenegroTest.php rename to tests/Feature/Europe/MontenegroTest.php index 57df4fc..fda622d 100644 --- a/tests/Feature/MontenegroTest.php +++ b/tests/Feature/Europe/MontenegroTest.php @@ -1,11 +1,13 @@ [ 'jmbg' => '2106941231195', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1941-06-21'), - 'age' => Carbon::createFromFormat('Y-m-d', '1941-06-21')->age, - 'pob' => 'Budva, Kotor, Tivat - Montenegro' + 'dob' => new DateTime('1941-06-21'), + 'age' => $this->calculateAge(new DateTime('1941-06-21')), + 'pob' => 'Budva, Kotor, Tivat - Montenegro', ], 'Blaลพo' => [ 'jmbg' => '1502945264054', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1945-02-15'), - 'age' => Carbon::createFromFormat('Y-m-d', '1945-02-15')->age, - 'pob' => 'Nikลกiฤ‡, Pluลพine, ล avnik - Montenegro' + 'dob' => new DateTime('1945-02-15'), + 'age' => $this->calculateAge(new DateTime('1945-02-15')), + 'pob' => 'Nikลกiฤ‡, Pluลพine, ล avnik - Montenegro', ], 'Diko' => [ 'jmbg' => '2007950274591', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1950-07-20'), - 'age' => Carbon::createFromFormat('Y-m-d', '1950-07-20')->age, - 'pob' => 'Berane, Roลพaje, Plav, Andrijevica - Montenegro' + 'dob' => new DateTime('1950-07-20'), + 'age' => $this->calculateAge(new DateTime('1950-07-20')), + 'pob' => 'Berane, Roลพaje, Plav, Andrijevica - Montenegro', ], 'Ema' => [ 'jmbg' => '1302953216612', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1953-02-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '1953-02-13')->age, - 'pob' => 'Podgorica, Danilovgrad, Kolaลกin - Montenegro' + 'dob' => new DateTime('1953-02-13'), + 'age' => $this->calculateAge(new DateTime('1953-02-13')), + 'pob' => 'Podgorica, Danilovgrad, Kolaลกin - Montenegro', ], 'Draginja' => [ 'jmbg' => '0204942275271', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1942-04-02'), - 'age' => Carbon::createFromFormat('Y-m-d', '1942-04-02')->age, - 'pob' => 'Berane, Roลพaje, Plav, Andrijevica - Montenegro' + 'dob' => new DateTime('1942-04-02'), + 'age' => $this->calculateAge(new DateTime('1942-04-02')), + 'pob' => 'Berane, Roลพaje, Plav, Andrijevica - Montenegro', ], ]; @@ -68,10 +70,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'ME'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +85,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'ME') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'ME') ); } diff --git a/tests/Feature/NetherlandsTest.php b/tests/Feature/Europe/NetherlandsTest.php similarity index 88% rename from tests/Feature/NetherlandsTest.php rename to tests/Feature/Europe/NetherlandsTest.php index 083daa7..18bb100 100644 --- a/tests/Feature/NetherlandsTest.php +++ b/tests/Feature/Europe/NetherlandsTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'NL') ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'NL') ); } diff --git a/tests/Feature/NorthMacedoniaTest.php b/tests/Feature/Europe/NorthMacedoniaTest.php similarity index 57% rename from tests/Feature/NorthMacedoniaTest.php rename to tests/Feature/Europe/NorthMacedoniaTest.php index dddef91..8cae981 100644 --- a/tests/Feature/NorthMacedoniaTest.php +++ b/tests/Feature/Europe/NorthMacedoniaTest.php @@ -1,11 +1,13 @@ [ 'jmbg' => '2408944448442', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1944-08-24'), - 'age' => Carbon::createFromFormat('Y-m-d', '1944-08-24')->age, - 'pob' => 'Prilep - North Macedonia' + 'dob' => new DateTime('1944-08-24'), + 'age' => $this->calculateAge(new DateTime('1944-08-24')), + 'pob' => 'Prilep - North Macedonia', ], 'Stefan' => [ 'jmbg' => '0705957463421', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1957-05-07'), - 'age' => Carbon::createFromFormat('Y-m-d', '1957-05-07')->age, - 'pob' => 'Strumica - North Macedonia' + 'dob' => new DateTime('1957-05-07'), + 'age' => $this->calculateAge(new DateTime('1957-05-07')), + 'pob' => 'Strumica - North Macedonia', ], 'Amyntas' => [ 'jmbg' => '1610936414199', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1936-10-16'), - 'age' => Carbon::createFromFormat('Y-m-d', '1936-10-16')->age, - 'pob' => 'Bitola - North Macedonia' + 'dob' => new DateTime('1936-10-16'), + 'age' => $this->calculateAge(new DateTime('1936-10-16')), + 'pob' => 'Bitola - North Macedonia', ], 'Dimitrov' => [ 'jmbg' => '1207942491481', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1942-07-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1942-07-12')->age, - 'pob' => 'ล tip - North Macedonia' + 'dob' => new DateTime('1942-07-12'), + 'age' => $this->calculateAge(new DateTime('1942-07-12')), + 'pob' => 'ล tip - North Macedonia', ], 'Kleitus' => [ 'jmbg' => '2808928401264', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1928-08-28'), - 'age' => Carbon::createFromFormat('Y-m-d', '1928-08-28')->age, - 'pob' => 'North Macedonia' + 'dob' => new DateTime('1928-08-28'), + 'age' => $this->calculateAge(new DateTime('1928-08-28')), + 'pob' => 'North Macedonia', ] ]; @@ -68,10 +70,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'MK'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +85,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'MK') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'MK') ); } diff --git a/tests/Feature/NorwayTest.php b/tests/Feature/Europe/NorwayTest.php similarity index 62% rename from tests/Feature/NorwayTest.php rename to tests/Feature/Europe/NorwayTest.php index 10ed992..cac9fb4 100644 --- a/tests/Feature/NorwayTest.php +++ b/tests/Feature/Europe/NorwayTest.php @@ -1,11 +1,13 @@ [ 'fn' => '05080176785', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-08-05'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-08-05')->age, + 'dob' => new DateTime('2001-08-05'), + 'age' => $this->calculateAge(new DateTime('2001-08-05')), ], 'astrid' => [ 'fn' => '20050761232', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2007-05-20'), - 'age' => Carbon::createFromFormat('Y-m-d', '2007-05-20')->age, + 'dob' => new DateTime('2007-05-20'), + 'age' => $this->calculateAge(new DateTime('2007-05-20')), ], 'linn' => [ 'fn' => '28094949248', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1949-09-28'), - 'age' => Carbon::createFromFormat('Y-m-d', '1949-09-28')->age, + 'dob' => new DateTime('1949-09-28'), + 'age' => $this->calculateAge(new DateTime('1949-09-28')), ], 'terje' => [ 'fn' => '14019513913', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1995-01-14'), - 'age' => Carbon::createFromFormat('Y-m-d', '1995-01-14')->age, + 'dob' => new DateTime('1995-01-14'), + 'age' => $this->calculateAge(new DateTime('1995-01-14')), ], 'heidi' => [ 'fn' => '01090749036', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1907-09-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '1907-09-01')->age, + 'dob' => new DateTime('1907-09-01'), + 'age' => $this->calculateAge(new DateTime('1907-09-01')), ], ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['fn'], 'NO'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['fn'], 'NO') ); } foreach ($this->invalidIds as $fn) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($fn, 'NO') ); } diff --git a/tests/Feature/PolandTest.php b/tests/Feature/Europe/PolandTest.php similarity index 63% rename from tests/Feature/PolandTest.php rename to tests/Feature/Europe/PolandTest.php index 350ab33..f529ca6 100644 --- a/tests/Feature/PolandTest.php +++ b/tests/Feature/Europe/PolandTest.php @@ -1,11 +1,13 @@ [ 'pesel' => '91072592137', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1991-07-25'), - 'age' => Carbon::createFromFormat('Y-m-d', '1991-07-25')->age, + 'dob' => new DateTime('1991-07-25'), + 'age' => $this->calculateAge(new DateTime('1991-07-25')), ], 'Adelajda' => [ 'pesel' => '02220826789', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2002-02-08'), - 'age' => Carbon::createFromFormat('Y-m-d', '2002-02-08')->age, + 'dob' => new DateTime('2002-02-08'), + 'age' => $this->calculateAge(new DateTime('2002-02-08')), ], 'Izolda' => [ 'pesel' => '87050832348', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1987-05-08'), - 'age' => Carbon::createFromFormat('Y-m-d', '1987-05-08')->age, + 'dob' => new DateTime('1987-05-08'), + 'age' => $this->calculateAge(new DateTime('1987-05-08')), ], 'Klaudiusz' => [ 'pesel' => '87012962775', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1987-01-29'), - 'age' => Carbon::createFromFormat('Y-m-d', '1987-01-29')->age, + 'dob' => new DateTime('1987-01-29'), + 'age' => $this->calculateAge(new DateTime('1987-01-29')), ], 'Fryderyk' => [ 'pesel' => '64032906019', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1964-03-29'), - 'age' => Carbon::createFromFormat('Y-m-d', '1964-03-29')->age, + 'dob' => new DateTime('1964-03-29'), + 'age' => $this->calculateAge(new DateTime('1964-03-29')), ], ]; @@ -62,9 +64,10 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['pesel'], 'PL'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -75,13 +78,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['pesel'], 'PL') ); } foreach ($this->invalidIds as $pesel) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($pesel, 'PL') ); } diff --git a/tests/Feature/PortugalTest.php b/tests/Feature/Europe/PortugalTest.php similarity index 89% rename from tests/Feature/PortugalTest.php rename to tests/Feature/Europe/PortugalTest.php index bc35ab2..a3ac17e 100644 --- a/tests/Feature/PortugalTest.php +++ b/tests/Feature/Europe/PortugalTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'PT') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'PT') ); } diff --git a/tests/Feature/RomaniaTest.php b/tests/Feature/Europe/RomaniaTest.php similarity index 64% rename from tests/Feature/RomaniaTest.php rename to tests/Feature/Europe/RomaniaTest.php index fe692ca..301bfea 100644 --- a/tests/Feature/RomaniaTest.php +++ b/tests/Feature/Europe/RomaniaTest.php @@ -1,16 +1,17 @@ [ 'cnp' => '2931213173842', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-12-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-12-13')->age, + 'dob' => new DateTime('1993-12-13'), + 'age' => $this->calculateAge(new DateTime('1993-12-13')), 'pob' => 'Galati' ], 'andrei' => [ 'cnp' => '1941003395747', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1994-10-03'), - 'age' => Carbon::createFromFormat('Y-m-d', '1994-10-03')->age, + 'dob' => new DateTime('1994-10-03'), + 'age' => $this->calculateAge(new DateTime('1994-10-03')), 'pob' => 'Vrancea' ], 'elena' => [ 'cnp' => '2870917211577', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1987-09-17'), - 'age' => Carbon::createFromFormat('Y-m-d', '1987-09-17')->age, + 'dob' => new DateTime('1987-09-17'), + 'age' => $this->calculateAge(new DateTime('1987-09-17')), 'pob' => 'Ialomita' ], 'florin' => [ 'cnp' => '1850327466200', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1985-03-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '1985-03-27')->age, + 'dob' => new DateTime('1985-03-27'), + 'age' => $this->calculateAge(new DateTime('1985-03-27')), 'pob' => 'Bucuresti Sectorul 6' ], 'mihai' => [ 'cnp' => '5010318045469', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-03-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-03-18')->age, + 'dob' => new DateTime('2001-03-18'), + 'age' => $this->calculateAge(new DateTime('2001-03-18')), 'pob' => 'Bacau' ] ]; @@ -68,10 +69,11 @@ public function test_extract_behaviour(): void { foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['cnp'], 'RO'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +84,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['cnp'], 'RO') ); } foreach ($this->invalidIds as $cnp) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($cnp, 'RO') ); } diff --git a/tests/Feature/SerbiaTest.php b/tests/Feature/Europe/SerbiaTest.php similarity index 63% rename from tests/Feature/SerbiaTest.php rename to tests/Feature/Europe/SerbiaTest.php index b1cac48..1bc3537 100644 --- a/tests/Feature/SerbiaTest.php +++ b/tests/Feature/Europe/SerbiaTest.php @@ -1,11 +1,13 @@ [ 'jmbg' => '0101100710006', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2100-01-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '2100-01-01')->age, - 'pob' => 'Belgrade region (City of Belgrade) - Central Serbia' + 'dob' => new DateTime('2100-01-01'), + 'age' => $this->calculateAge(new DateTime('2100-01-01')), + 'pob' => 'Belgrade region (City of Belgrade) - Central Serbia', ], 'Miloje' => [ 'jmbg' => '0110951074616', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1951-10-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '1951-10-01')->age, - 'pob' => 'foreigners in Serbian province of Vojvodina' + 'dob' => new DateTime('1951-10-01'), + 'age' => $this->calculateAge(new DateTime('1951-10-01')), + 'pob' => 'foreigners in Serbian province of Vojvodina', ], 'Teodora' => [ 'jmbg' => '2702937737434', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1937-02-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '1937-02-27')->age, - 'pob' => 'Niลก region (Niลกava District, Pirot District and Toplica District) - Central Serbia' + 'dob' => new DateTime('1937-02-27'), + 'age' => $this->calculateAge(new DateTime('1937-02-27')), + 'pob' => 'Niลก region (Niลกava District, Pirot District and Toplica District) - Central Serbia', ], 'Jana' => [ 'jmbg' => '2606936778324', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1936-06-26'), - 'age' => Carbon::createFromFormat('Y-m-d', '1936-06-26')->age, - 'pob' => 'Podrinje and Kolubara regions (Maฤva District and Kolubara District) - Central Serbia' + 'dob' => new DateTime('1936-06-26'), + 'age' => $this->calculateAge(new DateTime('1936-06-26')), + 'pob' => 'Podrinje and Kolubara regions (Maฤva District and Kolubara District) - Central Serbia', ], 'Petra' => [ 'jmbg' => '1209992745266', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1992-09-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1992-09-12')->age, - 'pob' => 'Southern Morava region (Jablanica District and Pฤinja District) - Central Serbia' + 'dob' => new DateTime('1992-09-12'), + 'age' => $this->calculateAge(new DateTime('1992-09-12')), + 'pob' => 'Southern Morava region (Jablanica District and Pฤinja District) - Central Serbia', ] ]; @@ -68,10 +70,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['jmbg'], 'RS'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals($person['dob'], $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +85,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['jmbg'], 'RS') ); } foreach ($this->invalidIds as $jmbg) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($jmbg, 'RS') ); } diff --git a/tests/Feature/SlovakiaTest.php b/tests/Feature/Europe/SlovakiaTest.php similarity index 61% rename from tests/Feature/SlovakiaTest.php rename to tests/Feature/Europe/SlovakiaTest.php index 161970b..a37dba1 100644 --- a/tests/Feature/SlovakiaTest.php +++ b/tests/Feature/Europe/SlovakiaTest.php @@ -1,11 +1,13 @@ [ 'rc' => '931027/3951', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-10-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-10-27')->age, + 'dob' => new DateTime('1993-10-27'), + 'age' => $this->calculateAge(new DateTime('1993-10-27')), ], 'Miroslav' => [ 'rc' => '000816/9733', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2000-08-16'), - 'age' => Carbon::createFromFormat('Y-m-d', '2000-08-16')->age, + 'dob' => new DateTime('2000-08-16'), + 'age' => $this->calculateAge(new DateTime('2000-08-16')), ], 'Natalia' => [ 'rc' => '015612/5552', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-06-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-06-12')->age, + 'dob' => new DateTime('2001-06-12'), + 'age' => $this->calculateAge(new DateTime('2001-06-12')), ], 'Victoria' => [ 'rc' => '935103/6189', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1993-01-03'), - 'age' => Carbon::createFromFormat('Y-m-d', '1993-01-03')->age, + 'dob' => new DateTime('1993-01-03'), + 'age' => $this->calculateAge(new DateTime('1993-01-03')), ], 'Joลพko' => [ 'rc' => '010722/4634', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2001-07-22'), - 'age' => Carbon::createFromFormat('Y-m-d', '2001-07-22')->age, + 'dob' => new DateTime('2001-07-22'), + 'age' => $this->calculateAge(new DateTime('2001-07-22')), ], ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['rc'], 'SK'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,19 +79,19 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['rc'], 'SK') ); } foreach ($this->invalidIds as $rc) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($rc, 'SK') ); } $this->expectException(InvalidLengthException::class); - Socrates::validateId('88606/875', 'CZ'); + Socrates::validateId('88606/875', 'SK'); } } diff --git a/tests/Feature/SloveniaTest.php b/tests/Feature/Europe/SloveniaTest.php similarity index 58% rename from tests/Feature/SloveniaTest.php rename to tests/Feature/Europe/SloveniaTest.php index 5b96971..576bdd8 100644 --- a/tests/Feature/SloveniaTest.php +++ b/tests/Feature/Europe/SloveniaTest.php @@ -1,11 +1,13 @@ [ 'emso' => '0101006500006', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2006-01-01'), - 'age' => Carbon::createFromFormat('Y-m-d', '2006-01-01')->age, - 'pob' => 'Slovenia' + 'dob' => new DateTime('2006-01-01'), + 'age' => $this->calculateAge(new DateTime('2006-01-01')), + 'pob' => 'Slovenia', ], 'Zoja' => [ 'emso' => '0310933507830', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1933-10-03'), - 'age' => Carbon::createFromFormat('Y-m-d', '1933-10-03')->age, - 'pob' => 'Slovenia' + 'dob' => new DateTime('1933-10-03'), + 'age' => $this->calculateAge(new DateTime('1933-10-03')), + 'pob' => 'Slovenia', ], 'Jaka' => [ 'emso' => '1408984500257', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1984-08-14'), - 'age' => Carbon::createFromFormat('Y-m-d', '1984-08-14')->age, - 'pob' => 'Slovenia' + 'dob' => new DateTime('1984-08-14'), + 'age' => $this->calculateAge(new DateTime('1984-08-14')), + 'pob' => 'Slovenia', ], 'Lana' => [ 'emso' => '0205962509348', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1962-05-02'), - 'age' => Carbon::createFromFormat('Y-m-d', '1962-05-02')->age, - 'pob' => 'Slovenia' + 'dob' => new DateTime('1962-05-02'), + 'age' => $this->calculateAge(new DateTime('1962-05-02')), + 'pob' => 'Slovenia', ], 'Mia' => [ 'emso' => '1201962509788', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1962-01-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1962-01-12')->age, - 'pob' => 'Slovenia' + 'dob' => new DateTime('1962-01-12'), + 'age' => $this->calculateAge(new DateTime('1962-01-12')), + 'pob' => 'Slovenia', ], ]; @@ -68,10 +70,11 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['emso'], 'SI'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - $this->assertEquals($person['pob'], $citizen->getPlaceOfBirth()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['pob'], $citizen->getPlaceOfBirth()); } $this->expectException(InvalidLengthException::class); @@ -82,13 +85,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['emso'], 'SI') ); } foreach ($this->invalidIds as $emso) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($emso, 'SI') ); } diff --git a/tests/Feature/SpainTest.php b/tests/Feature/Europe/SpainTest.php similarity index 88% rename from tests/Feature/SpainTest.php rename to tests/Feature/Europe/SpainTest.php index 5985efd..2c7d394 100644 --- a/tests/Feature/SpainTest.php +++ b/tests/Feature/Europe/SpainTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'ES') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'ES') ); } diff --git a/tests/Feature/SwedenTest.php b/tests/Feature/Europe/SwedenTest.php similarity index 63% rename from tests/Feature/SwedenTest.php rename to tests/Feature/Europe/SwedenTest.php index ef7b0e0..53c592b 100644 --- a/tests/Feature/SwedenTest.php +++ b/tests/Feature/Europe/SwedenTest.php @@ -1,11 +1,13 @@ [ 'psn' => '550309-6447', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1955-03-09'), - 'age' => Carbon::createFromFormat('Y-m-d', '1955-03-09')->age, + 'dob' => new DateTime('1955-03-09'), + 'age' => $this->calculateAge(new DateTime('1955-03-09')), ], 'otto' => [ 'psn' => '001020-1895', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2000-10-20'), - 'age' => Carbon::createFromFormat('Y-m-d', '2000-10-20')->age, + 'dob' => new DateTime('2000-10-20'), + 'age' => $this->calculateAge(new DateTime('2000-10-20')), ], 'lowa' => [ 'psn' => '751208-0222', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1975-12-08'), - 'age' => Carbon::createFromFormat('Y-m-d', '1975-12-08')->age, + 'dob' => new DateTime('1975-12-08'), + 'age' => $this->calculateAge(new DateTime('1975-12-08')), ], 'edward' => [ 'psn' => '19771211-2775', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1977-12-11'), - 'age' => Carbon::createFromFormat('Y-m-d', '1977-12-11')->age, + 'dob' => new DateTime('1977-12-11'), + 'age' => $this->calculateAge(new DateTime('1977-12-11')), ], 'maia' => [ 'psn' => '380519-7807', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1938-05-19'), - 'age' => Carbon::createFromFormat('Y-m-d', '1938-05-19')->age, + 'dob' => new DateTime('1938-05-19'), + 'age' => $this->calculateAge(new DateTime('1938-05-19')), ], ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['psn'], 'SE'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['psn'], 'SE') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'SE') ); } diff --git a/tests/Feature/SwitzerlandTest.php b/tests/Feature/Europe/SwitzerlandTest.php similarity index 90% rename from tests/Feature/SwitzerlandTest.php rename to tests/Feature/Europe/SwitzerlandTest.php index 163e381..70dea64 100644 --- a/tests/Feature/SwitzerlandTest.php +++ b/tests/Feature/Europe/SwitzerlandTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'CH') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'CH') ); } diff --git a/tests/Feature/TurkeyTest.php b/tests/Feature/Europe/TurkeyTest.php similarity index 89% rename from tests/Feature/TurkeyTest.php rename to tests/Feature/Europe/TurkeyTest.php index d7b57d7..4d541f4 100644 --- a/tests/Feature/TurkeyTest.php +++ b/tests/Feature/Europe/TurkeyTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'TR') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'TR') ); } diff --git a/tests/Feature/UkraineTest.php b/tests/Feature/Europe/UkraineTest.php similarity index 62% rename from tests/Feature/UkraineTest.php rename to tests/Feature/Europe/UkraineTest.php index 26c2433..cd5f59a 100644 --- a/tests/Feature/UkraineTest.php +++ b/tests/Feature/Europe/UkraineTest.php @@ -1,11 +1,13 @@ [ 'id' => '4031090675', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2010-05-13'), - 'age' => Carbon::createFromFormat('Y-m-d', '2010-05-13')->age + 'dob' => new DateTime('2010-05-13'), + 'age' => $this->calculateAge(new DateTime('2010-05-13')), ], 'vadym' => [ 'id' => '3292197434', 'gender' => Gender::MALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1990-02-18'), - 'age' => Carbon::createFromFormat('Y-m-d', '1990-02-18')->age + 'dob' => new DateTime('1990-02-18'), + 'age' => $this->calculateAge(new DateTime('1990-02-18')), ], 'veronika' => [ 'id' => '2023599602', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '1955-05-27'), - 'age' => Carbon::createFromFormat('Y-m-d', '1955-05-27')->age + 'dob' => new DateTime('1955-05-27'), + 'age' => $this->calculateAge(new DateTime('1955-05-27')), ], 'ruslana' => [ 'id' => '4247134484', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2016-04-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '2016-04-12')->age + 'dob' => new DateTime('2016-04-12'), + 'age' => $this->calculateAge(new DateTime('2016-04-12')), ], 'zoya' => [ 'id' => '3771509002', 'gender' => Gender::FEMALE, - 'dob' => Carbon::createFromFormat('Y-m-d', '2003-04-05'), - 'age' => Carbon::createFromFormat('Y-m-d', '2003-04-05')->age + 'dob' => new DateTime('2003-04-05'), + 'age' => $this->calculateAge(new DateTime('2003-04-05')), ] ]; @@ -63,9 +65,10 @@ public function test_extract_behaviour(): void foreach ($this->people as $person) { $citizen = Socrates::getCitizenDataFromId($person['id'], 'UA'); - $this->assertEquals($person['gender'], $citizen->getGender()); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); } $this->expectException(InvalidLengthException::class); @@ -76,13 +79,13 @@ public function test_extract_behaviour(): void public function test_validation_behaviour(): void { foreach ($this->people as $person) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($person['id'], 'UA') ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'UA') ); } diff --git a/tests/Feature/UnitedKingdomTest.php b/tests/Feature/Europe/UnitedKingdomTest.php similarity index 90% rename from tests/Feature/UnitedKingdomTest.php rename to tests/Feature/Europe/UnitedKingdomTest.php index c71ff95..eb9cb27 100644 --- a/tests/Feature/UnitedKingdomTest.php +++ b/tests/Feature/Europe/UnitedKingdomTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'GB') ); } foreach ($this->invalidIds as $invalidId) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($invalidId, 'GB') ); } diff --git a/tests/Feature/FeatureTest.php b/tests/Feature/FeatureTest.php index 2d30d6b..1298408 100644 --- a/tests/Feature/FeatureTest.php +++ b/tests/Feature/FeatureTest.php @@ -2,6 +2,7 @@ namespace Reducktion\Socrates\Tests\Feature; +use DateTime; use Reducktion\Socrates\Tests\TestCase; abstract class FeatureTest extends TestCase @@ -9,4 +10,9 @@ abstract class FeatureTest extends TestCase abstract public function test_extract_behaviour(): void; abstract public function test_validation_behaviour(): void; + + public function calculateAge(DateTime $dateOfBirth): int + { + return (new DateTime())->diff($dateOfBirth)->y; + } } diff --git a/tests/Feature/LuxembourgTest.php b/tests/Feature/LuxembourgTest.php deleted file mode 100644 index 3133b8a..0000000 --- a/tests/Feature/LuxembourgTest.php +++ /dev/null @@ -1,86 +0,0 @@ -people = [ - 'Gabriel' => [ - 'nin' => '1983081246783', - 'dob' => Carbon::createFromFormat('Y-m-d', '1983-08-12'), - 'age' => Carbon::createFromFormat('Y-m-d', '1983-08-12')->age, - ], - 'Emma' => [ - 'nin' => '2003042581931', - 'dob' => Carbon::createFromFormat('Y-m-d', '2003-04-25'), - 'age' => Carbon::createFromFormat('Y-m-d', '2003-04-25')->age, - ], - 'Leo' => [ - 'nin' => '1971110258746', - 'dob' => Carbon::createFromFormat('Y-m-d', '1971-11-02'), - 'age' => Carbon::createFromFormat('Y-m-d', '1971-11-02')->age, - ], - 'Lara' => [ - 'nin' => '2012051469336', - 'dob' => Carbon::createFromFormat('Y-m-d', '2012-05-14'), - 'age' => Carbon::createFromFormat('Y-m-d', '2012-05-14')->age, - ], - 'Noah' => [ - 'nin' => '1994092874551', - 'dob' => Carbon::createFromFormat('Y-m-d', '1994-09-28'), - 'age' => Carbon::createFromFormat('Y-m-d', '1994-09-28')->age, - ], - ]; - - $this->invalidIds = [ - '1994789587182', - '5971654782313', - '2055101054879', - '1997053045687', - '2001111123654', - ]; - } - - public function test_extract_behaviour(): void - { - foreach ($this->people as $person) { - $citizen = Socrates::getCitizenDataFromId($person['nin'], 'LU'); - $this->assertEquals($person['dob'], $citizen->getDateOfBirth()); - $this->assertEquals($person['age'], $citizen->getAge()); - } - - $this->expectException(InvalidLengthException::class); - - Socrates::getCitizenDataFromId('1983046783', 'LU'); - } - - public function test_validation_behaviour(): void - { - foreach ($this->people as $person) { - $this->assertTrue( - Socrates::validateId($person['nin'], 'LU') - ); - } - - foreach ($this->invalidIds as $nin) { - $this->assertFalse( - Socrates::validateId($nin, 'LU') - ); - } - - $this->expectException(InvalidLengthException::class); - - Socrates::validateId('1983046783', 'LU'); - } -} diff --git a/tests/Feature/NorthAmerica/CanadaTest.php b/tests/Feature/NorthAmerica/CanadaTest.php new file mode 100644 index 0000000..ddc0bf9 --- /dev/null +++ b/tests/Feature/NorthAmerica/CanadaTest.php @@ -0,0 +1,61 @@ +validIds = [ + '046 454 286', + '671 143 899', + '002 371 920', + '501 343 719', + '912 046 737', + ]; + + $this->invalidIds = [ + '512 917 638', + '322 710 094', + '761 999 512', + '061 003 528', + '654 789 093', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('85 712 123', 'CA'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'CA') + ); + } + + foreach ($this->invalidIds as $invalidId) { + self::assertFalse( + Socrates::validateId($invalidId, 'CA') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('781 211 2231', 'CA'); + } +} diff --git a/tests/Feature/NorthAmerica/MexicoTest.php b/tests/Feature/NorthAmerica/MexicoTest.php new file mode 100644 index 0000000..f63d30e --- /dev/null +++ b/tests/Feature/NorthAmerica/MexicoTest.php @@ -0,0 +1,115 @@ +people = [ + 'juan' => [ + 'curp' => 'MAAR790213HMNRLF03', + 'gender' => Gender::MALE, + 'dob' => new DateTime('1979-2-13'), + 'age' => $this->calculateAge(new DateTime('1979-2-13')), + ], + 'letitia' => [ + 'curp' => 'HEGG560427MVZRRL04', + 'gender' => Gender::FEMALE, + 'dob' => new DateTime('1956-4-27'), + 'age' => $this->calculateAge(new DateTime('1956-4-27')), + ], + 'augustin' => [ + 'curp' => 'BOXW010820HNERXNA1', + 'gender' => Gender::MALE, + 'dob' => new DateTime('2001-8-20'), + 'age' => $this->calculateAge(new DateTime('2001-8-20')), + ], + 'diego' => [ + 'curp' => 'TUAZ080213HMNRLFA3', + 'gender' => Gender::MALE, + 'dob' => new DateTime('2008-2-13'), + 'age' => $this->calculateAge(new DateTime('2008-2-13')), + ], + ]; + + $this->validIds = [ + 'MAAR790213HMNRLF03', + 'HEGG560427MVZRRL04', + 'BOXW310820HNERXN09', + 'TUAZ790213HMNRLF02', + 'TUAZ040213MCLRLFA7', + 'JIAZ040213MCLRLFA6', + 'XOAZ980927MCLRLFA6', + ]; + + $this->invalidIds = [ + '1AAR790213HMNRLF03', + 'MRAR790213HMNRLF03', + 'MAARA90213HMNRLF03', + 'MAAR7A0213HMNRLF03', + 'MAAR79A213HMNRLF03', + 'MAAR790A13HMNRLF03', + 'MAAR7902A3HMNRLF03', + 'MAAR79021AHMNRLF03', + 'MRAR791313HMNRLF03', + 'MRAR791332HMNRLF03', + 'MRAR7913321MNRLF03', + 'MRAR791332AMNRLF03', + 'MRAR7902131MNRLF03', + 'MRAR790213ZMNRLF03', + 'MAAR790213HZORLF03', + 'MAAR790213HZ1RLF03', + 'MAAR790213HMNRLF04', + 'MAAR790213HMNRLF0A', + ]; + } + + public function test_extract_behaviour(): void + { + foreach ($this->people as $person) { + $citizen = Socrates::getCitizenDataFromId($person['curp'], 'MX'); + + self::assertEquals($person['gender'], $citizen->getGender()); + self::assertEquals(Carbon::instance($person['dob']), $citizen->getDateOfBirth()); + self::assertEquals($person['dob'], $citizen->getDateOfBirthNative()); + self::assertEquals($person['age'], $citizen->getAge()); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::getCitizenDataFromId('69218938062', 'MX'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'MX') + ); + } + + foreach ($this->invalidIds as $invalidId) { + self::assertFalse( + Socrates::validateId($invalidId, 'MX') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('1621543419643', 'MX'); + } +} diff --git a/tests/Feature/NorthAmerica/UnitedStatesTest.php b/tests/Feature/NorthAmerica/UnitedStatesTest.php new file mode 100644 index 0000000..9649951 --- /dev/null +++ b/tests/Feature/NorthAmerica/UnitedStatesTest.php @@ -0,0 +1,64 @@ +validIds = [ + '167-38-1265', + '536-22-8726', + '536-22-5232', + '574-22-7664', + '671-26-9121' + ]; + + $this->invalidIds = [ + '078-05-1120', + '219-09-9999', + '457-55-5462', + '666-91-8271', + '000-12-7652', + '167-00-6321', + '167-11-0000', + '981-76-1521', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('145565258ZZY', 'US'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'US') + ); + } + + foreach ($this->invalidIds as $invalidId) { + self::assertFalse( + Socrates::validateId($invalidId, 'US') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('11084129 8 ZX', 'US'); + } +} diff --git a/tests/Feature/SouthAmerica/ArgentinaTest.php b/tests/Feature/SouthAmerica/ArgentinaTest.php new file mode 100644 index 0000000..a8894a8 --- /dev/null +++ b/tests/Feature/SouthAmerica/ArgentinaTest.php @@ -0,0 +1,68 @@ +validIds = [ + '20319731467', + '23129006544', + '20385823631', + '20123456786', + '33711146259', + '30716762145', + '30629357552', + '27061822238', + '20028314788', + '23010852064', + '27083496970', + ]; + + $this->invalidIds = [ + '42319731467', + '20999999997', + '20349735981', + '20123456785', + '30010852064', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('', 'AR'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'AR'), + $id + ); + } + + foreach ($this->invalidIds as $id) { + self::assertFalse( + Socrates::validateId($id, 'AR') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('123456', 'AR'); + } +} diff --git a/tests/Feature/BrazilTest.php b/tests/Feature/SouthAmerica/BrazilTest.php similarity index 91% rename from tests/Feature/BrazilTest.php rename to tests/Feature/SouthAmerica/BrazilTest.php index ef066de..c7164b6 100644 --- a/tests/Feature/BrazilTest.php +++ b/tests/Feature/SouthAmerica/BrazilTest.php @@ -1,10 +1,11 @@ validIds as $id) { - $this->assertTrue( + self::assertTrue( Socrates::validateId($id, 'BR'), $id ); } foreach ($this->invalidIds as $id) { - $this->assertFalse( + self::assertFalse( Socrates::validateId($id, 'BR') ); } diff --git a/tests/Feature/SouthAmerica/ChileTest.php b/tests/Feature/SouthAmerica/ChileTest.php new file mode 100644 index 0000000..f2d2d07 --- /dev/null +++ b/tests/Feature/SouthAmerica/ChileTest.php @@ -0,0 +1,69 @@ +validIds = [ + '19132031-K', + '5587600-2', + '22269631-3', + '11881570-K', + '12067530-3', + '14674646-2', + '14928530-K', + '22931750-4', + '5258230-K', + '11077954-2', + '30.686.957-4', + ]; + + $this->invalidIds = [ + '19132031-k', //number valid but lower "k" + '11111112-9', + '55185352-8', + '19947727-K', + '12345689-2', + '11111111-L', + '22931750-K', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('', 'CL'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'CL'), + $id + ); + } + + foreach ($this->invalidIds as $id) { + self::assertFalse( + Socrates::validateId($id, 'CL') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('1234567', 'CL'); + } +} diff --git a/tests/Feature/SouthAmerica/EcuadorTest.php b/tests/Feature/SouthAmerica/EcuadorTest.php new file mode 100644 index 0000000..d608e1b --- /dev/null +++ b/tests/Feature/SouthAmerica/EcuadorTest.php @@ -0,0 +1,63 @@ +validIds = [ + '0926687856', + '1159944279', + '0350442026', + '1930773021', + '2010123061', + '1710034065', + ]; + + $this->invalidIds = [ + '1234567890', + '2510034065', + '1770034065', + '1570111029', + '0126987368', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('', 'EC'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'EC'), + $id + ); + } + + foreach ($this->invalidIds as $id) { + self::assertFalse( + Socrates::validateId($id, 'EC') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('123456789', 'EC'); + } +} diff --git a/tests/Feature/SouthAmerica/PeruTest.php b/tests/Feature/SouthAmerica/PeruTest.php new file mode 100644 index 0000000..9387d63 --- /dev/null +++ b/tests/Feature/SouthAmerica/PeruTest.php @@ -0,0 +1,72 @@ +validIds = [ + '447690450', + '858845624', + '09189667B', + '739184148', + '83015889H', + '178011460', + '101174102', + '43451826-7', + '10117410-G', + '06460698K', + ]; + + $this->invalidIds = [ + '101174103', + '10117410H', + '178A11460', + '83015889B', + '09189667V', + '85884562D', + '55833222D', + '64708232D', + '64015292J', + '73918414W', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('', 'PE'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'PE'), + $id + ); + } + + foreach ($this->invalidIds as $id) { + self::assertFalse( + Socrates::validateId($id, 'PE') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('1234567', 'PE'); + } +} diff --git a/tests/Feature/SouthAmerica/UruguayTest.php b/tests/Feature/SouthAmerica/UruguayTest.php new file mode 100644 index 0000000..48edc46 --- /dev/null +++ b/tests/Feature/SouthAmerica/UruguayTest.php @@ -0,0 +1,75 @@ +validIds = [ + '9.814.898-7', + '99609297', + '7.019.519.6', + '2.797.689 6', + '24895354', + '40008026', + '60125711', + '11111111', + '22222222', + '52574582', + '96072455', + '70505244', + ]; + + $this->invalidIds = [ + '46057422', + '90224632', + '52631437', + '62634608', + '23801966', + '27452675', + '32311266', + '94448560', + '59672227', + '28441574', + '11111112', + ]; + } + + public function test_extract_behaviour(): void + { + $this->expectException(UnsupportedOperationException::class); + + Socrates::getCitizenDataFromId('', 'UY'); + } + + public function test_validation_behaviour(): void + { + foreach ($this->validIds as $id) { + self::assertTrue( + Socrates::validateId($id, 'UY'), + $id + ); + } + + foreach ($this->invalidIds as $id) { + self::assertFalse( + Socrates::validateId($id, 'UY') + ); + } + + $this->expectException(InvalidLengthException::class); + + Socrates::validateId('1234567', 'UY'); + } +} diff --git a/tests/IdValidatorFactoryTest.php b/tests/IdValidatorFactoryTest.php new file mode 100644 index 0000000..24f289f --- /dev/null +++ b/tests/IdValidatorFactoryTest.php @@ -0,0 +1,24 @@ +assertInstanceOf(IdValidator::class, $validator); + } + + /** @test */ + public function it_throws_for_unknown_country(): void + { + $this->expectException(RuntimeException::class); + IdValidatorFactory::getValidator('XX'); + } +} diff --git a/tests/SocratesTest.php b/tests/SocratesTest.php index 26c4a2e..2ef6c33 100644 --- a/tests/SocratesTest.php +++ b/tests/SocratesTest.php @@ -25,18 +25,4 @@ public function it_throws_an_exception_if_a_country_code_is_in_the_wrong_format( Socrates::validateId('123123123', 'ZZZ'); } - - /** @test */ - public function it_uses_the_application_current_locale_if_none_is_provided(): void - { - App::setLocale('PT'); - - $this->assertTrue( - Socrates::validateId('11084129 8 ZX8') - ); - - $this->expectException(UnsupportedOperationException::class); - - Socrates::getCitizenDataFromId('11084129 8 ZX8'); - } }