Itin parser and validator added
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
defmodule UkraineTaxidEx.EdrpouTest do
|
||||
use ExUnit.Case
|
||||
doctest UkraineTaxidEx.Edrpou.Validator
|
||||
doctest UkraineTaxidEx.Itin.Validator
|
||||
end
|
||||
|
||||
95
test/ukraine_taxid_ex/itin/check_sum_test.exs
Normal file
95
test/ukraine_taxid_ex/itin/check_sum_test.exs
Normal file
@@ -0,0 +1,95 @@
|
||||
defmodule UkraineTaxidEx.Itin.CheckSumTest do
|
||||
use ExUnit.Case, async: true
|
||||
alias UkraineTaxidEx.Itin.CheckSum
|
||||
|
||||
describe "weights/0" do
|
||||
test "returns the correct list of weights" do
|
||||
expected_weights = [-1, 5, 7, 9, 4, 6, 10, 5, 7]
|
||||
assert CheckSum.weights() == expected_weights
|
||||
end
|
||||
|
||||
test "returns a list of 9 weights" do
|
||||
assert length(CheckSum.weights()) == 9
|
||||
end
|
||||
end
|
||||
|
||||
describe "check_sum/2" do
|
||||
test "calculates correct checksum for valid ITIN (3334513284)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [3, 3, 3, 4, 5, 1, 3, 2, 8, 4]
|
||||
assert CheckSum.check_sum(digits) == 4
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (2038817850)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [2, 0, 3, 8, 8, 1, 7, 8, 5, 0]
|
||||
assert CheckSum.check_sum(digits) == 0
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (3486110380)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [3, 4, 8, 6, 1, 1, 0, 3, 8, 0]
|
||||
assert CheckSum.check_sum(digits) == 0
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (3402109517)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [3, 4, 0, 2, 1, 0, 9, 5, 1, 7]
|
||||
assert CheckSum.check_sum(digits) == 7
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (2598917292)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [2, 5, 9, 8, 9, 1, 7, 2, 9, 2]
|
||||
assert CheckSum.check_sum(digits) == 2
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (3505804094)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [3, 5, 0, 5, 8, 0, 4, 0, 9, 4]
|
||||
assert CheckSum.check_sum(digits) == 4
|
||||
end
|
||||
|
||||
test "calculates correct checksum for valid ITIN (2971306745)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [2, 9, 7, 1, 3, 0, 6, 7, 4, 5]
|
||||
assert CheckSum.check_sum(digits) == 5
|
||||
end
|
||||
|
||||
test "calculates correct checksum for ITIN with invalid check digit (2598917291)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [2, 5, 9, 8, 9, 1, 7, 2, 9, 1]
|
||||
assert CheckSum.check_sum(digits) == 2
|
||||
end
|
||||
|
||||
test "calculates correct checksum for ITIN with invalid check digit (3505804099)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [3, 5, 0, 5, 8, 0, 4, 0, 9, 9]
|
||||
assert CheckSum.check_sum(digits) == 4
|
||||
end
|
||||
|
||||
test "calculates correct checksum for ITIN with invalid check digit (2971306747)" do
|
||||
# Test case with known ITIN and its checksum
|
||||
digits = [2, 9, 7, 1, 3, 0, 6, 7, 4, 7]
|
||||
assert CheckSum.check_sum(digits) == 5
|
||||
end
|
||||
|
||||
test "calculates checksum with custom weights" do
|
||||
digits = [1, 2, 3]
|
||||
weights = [1, 2, 3]
|
||||
assert CheckSum.check_sum(digits, weights) == 5
|
||||
end
|
||||
|
||||
test "handles zero digits" do
|
||||
digits = [0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
assert CheckSum.check_sum(digits) == 0
|
||||
end
|
||||
|
||||
test "handles single digit input" do
|
||||
digits = [5]
|
||||
weights = [2]
|
||||
# (5*2) = 10 % 11 % 10 = 0
|
||||
assert CheckSum.check_sum(digits, weights) == 0
|
||||
end
|
||||
end
|
||||
end
|
||||
87
test/ukraine_taxid_ex/itin/parser_test.exs
Normal file
87
test/ukraine_taxid_ex/itin/parser_test.exs
Normal file
@@ -0,0 +1,87 @@
|
||||
defmodule UkraineTaxidEx.Itin.ParserTest do
|
||||
use ExUnit.Case, async: true
|
||||
alias UkraineTaxidEx.Itin
|
||||
alias UkraineTaxidEx.Itin.Parser
|
||||
|
||||
describe "parse/1" do
|
||||
test "successfully parses valid ITIN" do
|
||||
assert {:ok, %Itin{} = itin} = Parser.parse("2847211760")
|
||||
assert itin.code == "2847211760"
|
||||
assert itin.birth_date == ~D[1977-12-14]
|
||||
assert itin.number == 1176
|
||||
assert itin.gender == 0
|
||||
assert itin.check_sum == 0
|
||||
assert itin.check_digit == 0
|
||||
|
||||
assert {:ok, %Itin{} = itin} = Parser.parse("3176422893")
|
||||
assert itin.code == "3176422893"
|
||||
assert itin.birth_date == ~D[1986-12-19]
|
||||
assert itin.number == 2289
|
||||
assert itin.gender == 1
|
||||
assert itin.check_sum == 3
|
||||
assert itin.check_digit == 3
|
||||
end
|
||||
|
||||
test "returns error for string shorter than required length" do
|
||||
assert {:error, :length_too_short} = Parser.parse("123456")
|
||||
end
|
||||
|
||||
test "returns error for string longer than required length" do
|
||||
assert {:error, :length_too_long} = Parser.parse("12345678901")
|
||||
end
|
||||
|
||||
test "returns error for invalid checksum" do
|
||||
assert {:error, :invalid_checksum} = Parser.parse("1234567890")
|
||||
end
|
||||
end
|
||||
|
||||
describe "birth_date/1" do
|
||||
test "calculates correct birth date from digits" do
|
||||
digits = [3, 7, 5, 8, 0, 0, 5, 3, 6, 4]
|
||||
assert Parser.birth_date(digits) == ~D[2002-11-21]
|
||||
|
||||
digits = [3, 0, 4, 3, 2, 1, 6, 8, 2, 4]
|
||||
assert Parser.birth_date(digits) == ~D[1983-04-27]
|
||||
|
||||
digits = [2, 8, 8, 1, 2, 2, 0, 4, 5, 2]
|
||||
assert Parser.birth_date(digits) == ~D[1978-11-19]
|
||||
end
|
||||
end
|
||||
|
||||
describe "number/1" do
|
||||
test "extracts correct number from digits" do
|
||||
digits = [2, 8, 8, 1, 2, 2, 0, 4, 5, 2]
|
||||
assert Parser.number(digits) == 2045
|
||||
|
||||
digits = [3, 5, 8, 9, 4, 1, 2, 3, 7, 1]
|
||||
assert Parser.number(digits) == 1237
|
||||
|
||||
digits = [3, 2, 1, 5, 6, 0, 5, 0, 5, 3]
|
||||
assert Parser.number(digits) == 505
|
||||
end
|
||||
end
|
||||
|
||||
describe "gender/1" do
|
||||
test "determines correct gender from digits" do
|
||||
# Even number in the second-to-last position (gender 1)
|
||||
digits = [2, 5, 8, 5, 1, 1, 9, 1, 1, 5]
|
||||
assert Parser.gender(digits) == 1
|
||||
|
||||
digits = [2, 6, 0, 3, 8, 2, 1, 5, 3, 1]
|
||||
assert Parser.gender(digits) == 1
|
||||
|
||||
# Odd number in the second-to-last position (gender 0)
|
||||
digits = [2, 2, 0, 7, 3, 1, 5, 4, 2, 8]
|
||||
assert Parser.gender(digits) == 0
|
||||
|
||||
digits = [3, 1, 2, 6, 7, 0, 7, 0, 2, 6]
|
||||
assert Parser.gender(digits) == 0
|
||||
end
|
||||
end
|
||||
|
||||
describe "base_date/0" do
|
||||
test "returns the correct base date" do
|
||||
assert Parser.base_date() == ~D[1899-12-31]
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user