GitBucket
4.20.0
Toggle navigation
Sign in
Files
Branches
1
Tags
Issues
Pull requests
Labels
Priorities
Milestones
Wiki
Forks
frozendragon
/
IBAN-Validator-Test
Browse code
implemented the mod97 test.
master
1 parent
bca65fb
commit
aedea5b1dc0c07511ebd8f94dbda505058f325c0
frozendragon
authored
on 15 Jan 2017
Patch
Showing
3 changed files
pom.xml
src/main/java/se/ssns/iban/validator/test/IbanValidator.java
src/test/java/IbanValidatorUnitTest.java
Ignore Space
Show notes
View
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>IBAN-Validator-Test</groupId> <artifactId>se.ssns</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <!-- Jetty --> <jetty.port>8080</jetty.port> <jetty.stopPort>9998</jetty.stopPort> <jetty.stopKey>foo</jetty.stopKey> <jetty.daemon>false</jetty.daemon> <!-- Versions --> <spring.version>4.2.3.RELEASE</spring.version> <jackson.version>2.8.6</jackson.version> <jetty.version>8.1.16.v20140903</jetty.version> </properties> <dependencies> <!--This lib could be used instead but i'm assuming that i'm suppose to write the code and not use a lib --> <!--<dependency>--> <!--<groupId>org.iban4j</groupId>--> <!--<artifactId>iban4j</artifactId>--> <!--<version>3.2.1</version>--> <!--</dependency>--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> <configuration> <stopKey>${jetty.stopKey}</stopKey> <stopPort>${jetty.stopPort}</stopPort> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>${jetty.port}</port> </connector> </connectors> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>assembly</id> <phase>package</phase> <goals> <goal>war</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>IBAN-Validator-Test</groupId> <artifactId>se.ssns</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <!-- Jetty --> <jetty.port>8080</jetty.port> <jetty.stopPort>9998</jetty.stopPort> <jetty.stopKey>foo</jetty.stopKey> <jetty.daemon>false</jetty.daemon> <!-- Versions --> <spring.version>4.2.3.RELEASE</spring.version> <jackson.version>2.8.6</jackson.version> <jetty.version>8.1.16.v20140903</jetty.version> </properties> <dependencies> <!--This lib could be used instead but i'm assuming that i'm suppose to write the code and not use a lib --> <!--<dependency>--> <!--<groupId>org.iban4j</groupId>--> <!--<artifactId>iban4j</artifactId>--> <!--<version>3.2.1</version>--> <!--</dependency>--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>src/main/webapp</directory> </testResource> </testResources> <plugins> <!--<plugin>--> <!--<groupId>org.apache.maven.plugins</groupId>--> <!--<artifactId>maven-surefire-plugin</artifactId>--> <!--<configuration>--> <!--<skipTests>true</skipTests>--> <!--</configuration>--> <!--</plugin>--> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> <configuration> <stopKey>${jetty.stopKey}</stopKey> <stopPort>${jetty.stopPort}</stopPort> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>${jetty.port}</port> </connector> </connectors> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>assembly</id> <phase>package</phase> <goals> <goal>war</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
Ignore Space
Show notes
View
src/main/java/se/ssns/iban/validator/test/IbanValidator.java
package se.ssns.iban.validator.test; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.core.io.Resource; import java.io.IOException; import java.math.BigDecimal; /** * @author Simon Lindgren * @since 2017-01-14. */ public class IbanValidator { private CountryRule[] rules; public IbanValidator(final Resource ruleSource) throws IOException { ObjectMapper mapper = new ObjectMapper(); rules = mapper.readValue(ruleSource.getFile(), CountryRule[].class); } public boolean validator(String iban) { CountryRule ruleApplyingToIban = findRuleApplyingToIban(iban); boolean validLength = isValidLengthForCountry(iban, ruleApplyingToIban); boolean checkBBANFormat = checkBBANFormat(iban, ruleApplyingToIban); boolean checkForFixedDigits = checkForFixedDigits(iban, ruleApplyingToIban); boolean mod97Check = mod97Check(iban); boolean result = validLength && checkBBANFormat && checkForFixedDigits && mod97Check; if(result == false) { System.out.println(String.format("%s failed with rule %s", iban, ruleApplyingToIban)); } return result; } private boolean mod97Check(String iban) { String rearranged = iban.substring(4) + iban.substring(0, 4); rearranged = rearranged.toUpperCase(); String convert = new String(rearranged); //Makes it easier to debug for (int i = 0; i < rearranged.length(); i++) { int numericValue = Character.getNumericValue(rearranged.charAt(i)); if(numericValue >= 10) { convert = convert.replace(String.valueOf(rearranged.charAt(i)), Integer.toString(numericValue)); } } convert = convert.replace(" ", ""); if(convert.matches("^[0-9]+")) { BigDecimal number = new BigDecimal(convert); //To large number for double to handle if (number.remainder(BigDecimal.valueOf(97)).toString().equals("1")) { return true; } } return false; } private boolean checkForFixedDigits(String iban, CountryRule countryRule) { if(countryRule.getCheckDigits() != null) { if(!iban.substring(2, 4).equals(countryRule.getCheckDigits())) { return false; } } return true; } private CountryRule findRuleApplyingToIban(String iban) { for (CountryRule countryRule : rules) { if(countryRule.getIBANFormat().substring(0, 2).equals(iban.substring(0, 2))) { return countryRule; } } throw new IllegalArgumentException(String.format("Not a valid country code on iban, iban: %s", iban)); } private boolean checkBBANFormat(String iban, CountryRule countryRule) { int startIndex = 4; for (String ruleSequence : countryRule.getBBANFormat().split(",")) { int numberOfChar = Integer.valueOf(ruleSequence.substring(0 , ruleSequence.length() - 1).trim()); String ibanSequence = iban.replace(" ", "").substring(startIndex, startIndex + numberOfChar); String regex = ""; switch (ruleSequence.charAt(ruleSequence.length() - 1)) { case 'a' : { regex = "^[A-Z[ ]]+"; break; } case 'n' : { regex = "^[0-9[ ]]+"; break; } case 'c' : { regex = "^[a-zA-Z0-9[ ]]+"; break; } default: { throw new RuntimeException("Broken rule"); } } if(!ibanSequence.matches(regex)) { return false; } startIndex += numberOfChar; } return true; } private boolean isValidLengthForCountry(String iban, CountryRule countryRule) { if(countryRule.getIBANFormat().replace(" ", "").length() == iban.replace(" ", "").length()) { return true; } return false; } }
package se.ssns.iban.validator.test; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.core.io.Resource; import java.io.IOException; /** * @author Simon Lindgren * @since 2017-01-14. */ public class IbanValidator { private CountryRule[] rules; public IbanValidator(final Resource ruleSource) throws IOException { ObjectMapper mapper = new ObjectMapper(); // new File("K:\\Projects\\Programmering\\Projects\\IBAN-Validator-Test\\src\\main\\resources\\iban_countries.json") rules = mapper.readValue(ruleSource.getFile(), CountryRule[].class); } public boolean validator(String iban) { CountryRule ruleApplyingToIban = findRuleApplyingToIban(iban); boolean validLength = isValidLengthForCountry(iban, ruleApplyingToIban); boolean checkBBANFormat = checkBBANFormat(iban, ruleApplyingToIban); boolean checkForFixedDigits = checkForFixedDigits(iban, ruleApplyingToIban); boolean result = validLength && checkBBANFormat && checkForFixedDigits; if(result == false) { System.out.println(String.format("%s failed with rule %s", iban, ruleApplyingToIban)); } return result; } private boolean mod97() { return false; } private boolean checkForFixedDigits(String iban, CountryRule countryRule) { if(countryRule.getCheckDigits() != null) { if(!iban.substring(2, 4).equals(countryRule.getCheckDigits())) { return false; } } return true; } private CountryRule findRuleApplyingToIban(String iban) { for (CountryRule countryRule : rules) { if(countryRule.getIBANFormat().substring(0, 2).equals(iban.substring(0, 2))) { return countryRule; } } throw new IllegalArgumentException(String.format("Not a valid country code on iban, iban: %s", iban)); } private boolean checkBBANFormat(String iban, CountryRule countryRule) { int startIndex = 4; for (String ruleSequence : countryRule.getBBANFormat().split(",")) { int numberOfChar = Integer.valueOf(ruleSequence.substring(0 , ruleSequence.length() - 1).trim()); String ibanSequence = iban.replace(" ", "").substring(startIndex, startIndex + numberOfChar); String regex = ""; switch (ruleSequence.charAt(ruleSequence.length() - 1)) { case 'a' : { regex = "^[A-Z[ ]]+"; break; } case 'n' : { regex = "^[0-9[ ]]+"; break; } case 'c' : { regex = "^[a-zA-Z0-9[ ]]+"; break; } default: { throw new RuntimeException("Broken rule"); } } if(!ibanSequence.matches(regex)) { return false; } startIndex += numberOfChar; } return true; } private boolean isValidLengthForCountry(String iban, CountryRule countryRule) { if(countryRule.getIBANFormat().replace(" ", "").length() == iban.replace(" ", "").length()) { return true; } return false; } }
Ignore Space
Show notes
View
src/test/java/IbanValidatorUnitTest.java
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import se.ssns.iban.validator.test.IbanValidator; import javax.inject.Inject; import java.io.IOException; import java.util.HashSet; import java.util.Set; /** * @author Simon Lindgren * @since 2017-01-14. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:**/iban-validator-test.xml"}) public class IbanValidatorUnitTest { @Inject public IbanValidator ibanValidator; @Test public void testValidator() throws IOException { Set<String> validIbans = new HashSet<>(); validIbans.add("DE44 5001 0517 5407 3249 31"); //German validIbans.add("GR16 0110 1250 0000 0001 2300 695"); //Greece validIbans.add("GB29 NWBK 6016 1331 9268 19"); //United Kingdom validIbans.add("SA03 8000 0000 6080 1016 7519"); //Saudi Arabia validIbans.add("CH93 0076 2011 6238 5295 7"); //Switzerland validIbans.add("TR33 0006 1005 1978 6457 8413 26"); //Turkey for (String validIban : validIbans) { Assert.assertTrue(String.format("Failed to validate valid iban, %s", validIban), ibanValidator.validator(validIban)); } Set<String> invalidIbans = new HashSet<>(); invalidIbans.add("DE44 Z001 0517 5407 3249 31"); //Only Number allowed invalidIbans.add("GR16 0110 1250 0000 0001 2300 695 654"); //To long invalidIbans.add("GB29 N&BK 6016 1331 9268 19"); //special char invalidIbans.add("BG20 bBBB 6016 1331 9268 19"); //Has to be uppercase invalidIbans.add("BR64 0110 1250 0000 0001 2300 695A c"); //Check digits has to be 39 for (String invalidIban : invalidIbans) { Assert.assertFalse(String.format("Failed to catch invalid iban, %s", invalidIban), ibanValidator.validator(invalidIban)); } } }
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import se.ssns.iban.validator.test.IbanValidator; import javax.inject.Inject; import java.io.IOException; import java.util.HashSet; import java.util.Set; /** * @author Simon Lindgren * @since 2017-01-14. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:**/iban-validator-test.xml"}) public class IbanValidatorUnitTest { @Inject public IbanValidator ibanValidator; @Test public void testValidator() throws IOException { Set<String> validIbans = new HashSet<>(); validIbans.add("DE44 5001 0517 5407 3249 31"); //German validIbans.add("GR16 0110 1250 0000 0001 2300 695"); //Greece validIbans.add("GB29 NWBK 6016 1331 9268 19"); //United Kingdom validIbans.add("SA03 8000 0000 6080 1016 7519"); //Saudi Arabia validIbans.add("CH93 0076 2011 6238 5295 7"); //Switzerland validIbans.add("TR33 0006 1005 1978 6457 8413 26"); //Turkey validIbans.add("BR39 0110 1250 0000 0001 2300 695A c"); //Brazil for (String validIban : validIbans) { Assert.assertTrue(String.format("Failed to validate valid iban, %s", validIban), ibanValidator.validator(validIban)); } Set<String> invalidIbans = new HashSet<>(); invalidIbans.add("DE44 Z001 0517 5407 3249 31"); //Only Number allowed invalidIbans.add("GR16 0110 1250 0000 0001 2300 695 654"); //To long invalidIbans.add("GB29 N&BK 6016 1331 9268 19"); //special char invalidIbans.add("BG20 bBBB 6016 1331 9268 19"); //Has to be uppercase invalidIbans.add("BR64 0110 1250 0000 0001 2300 695A c"); //Check digits has to be 39 for (String invalidIban : invalidIbans) { Assert.assertFalse(String.format("Failed to catch invalid iban, %s", invalidIban), ibanValidator.validator(invalidIban)); } } }
Show line notes below