Skip to content

Commit

Permalink
fix: Generate valid BIC/SWIFT numbers (#902)
Browse files Browse the repository at this point in the history
- swiftBicNumber now accepts an optional $countryCode argument to localize the generated value
- using Symfony Validator in tests
  • Loading branch information
vjandrea committed Dec 7, 2024
1 parent e0ee18e commit ec1dbeb
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 5 deletions.
4 changes: 3 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
"bamarni/composer-bin-plugin": "^1.4.1",
"doctrine/persistence": "^1.3 || ^2.0",
"phpunit/phpunit": "^9.5.26",
"symfony/phpunit-bridge": "^5.4.16"
"symfony/intl": "^7.2",
"symfony/phpunit-bridge": "^5.4.16",
"symfony/validator": "^7.2"
},
"autoload": {
"psr-4": {
Expand Down
2 changes: 1 addition & 1 deletion src/Faker/Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@
*
* @property string $swiftBicNumber
*
* @method string swiftBicNumber()
* @method string swiftBicNumber($countryCode = null)
*
* @property string $name
*
Expand Down
12 changes: 9 additions & 3 deletions src/Faker/Provider/Payment.php
Original file line number Diff line number Diff line change
Expand Up @@ -297,16 +297,22 @@ public static function iban($countryCode = null, $prefix = '', $length = null)
}

/**
* Return the String of a SWIFT/BIC number
* Return the String of a SWIFT/BIC number.
*
* @example 'RZTIAT22263'
*
* @see http://en.wikipedia.org/wiki/ISO_9362
*
* @param null|string $countryCode ISO 3166-1 alpha-2 country code
*
* @return string Swift/Bic number
*/
public static function swiftBicNumber()
public static function swiftBicNumber($countryCode = null)
{
return self::regexify('^([A-Z]){4}([A-Z]){2}([0-9A-Z]){2}([0-9A-Z]{3})?$');
if (!is_null($countryCode) && 1 !== preg_match('/^[A-Z]{2}$/', $countryCode)) {
throw new \InvalidArgumentException('Invalid country code.');
}

return self::regexify('^([A-Z]){4}' . ($countryCode ?? Miscellaneous::countryCode()) . '([0-9A-Z]){2}([0-9A-Z]{3})?$');
}
}
24 changes: 24 additions & 0 deletions test/Faker/Provider/PaymentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
use Faker\Provider\Payment as PaymentProvider;
use Faker\Provider\Person as PersonProvider;
use Faker\Test\TestCase;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validation;

/**
* @group legacy
Expand Down Expand Up @@ -197,4 +199,26 @@ protected function getProviders(): iterable

yield new PaymentProvider($this->faker);
}

public function testSwiftBicNumber(): void
{
for ($i = 0; $i < 32; $i++) {
$violations = Validation::createValidator()->validate($this->faker->swiftBicNumber(), [
new Assert\Bic(),
]);

self::assertSame(0, $violations->count());
}
}

public function testLocalizedSwiftBicNumber(): void
{
$localizedBic = $this->faker->swiftBicNumber('DE');
$violations = Validation::createValidator()->validate($localizedBic, [
new Assert\Bic(),
]);

self::assertSame(0, $violations->count());
self::assertMatchesRegularExpression('/^([A-Z]){4}DE([0-9A-Z]){2}([0-9A-Z]{3})?$/', $localizedBic);
}
}

0 comments on commit ec1dbeb

Please sign in to comment.