idCardParser.test.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * 身份证解析工具函数单元测试
  3. */
  4. import { describe, it, expect } from 'vitest';
  5. import { parseIdCard, isValidIdCardFormat } from '../../src/utils/idCardParser';
  6. describe('idCardParser', () => {
  7. describe('parseIdCard - 18位身份证号', () => {
  8. it('应该正确解析男性身份证号', () => {
  9. const result = parseIdCard('110101199001011234');
  10. expect(result.gender).toBe('男');
  11. expect(result.birthDate).toBe('1990-01-01');
  12. expect(result.isValid).toBe(true);
  13. });
  14. it('应该正确解析女性身份证号', () => {
  15. // 17位是2,偶数=女
  16. const result = parseIdCard('110101199002022244');
  17. expect(result.gender).toBe('女');
  18. expect(result.birthDate).toBe('1990-02-02');
  19. expect(result.isValid).toBe(true);
  20. });
  21. it('应该处理带有X校验码的身份证号', () => {
  22. const result = parseIdCard('11010119900101123X');
  23. expect(result.isValid).toBe(true);
  24. expect(result.gender).toBe('男');
  25. });
  26. it('应该拒绝无效的出生日期', () => {
  27. const result = parseIdCard('110101199013011234'); // 月份13无效
  28. expect(result.birthDate).toBeNull();
  29. expect(result.isValid).toBe(false);
  30. });
  31. it('应该拒绝非数字字符(除X校验码外)', () => {
  32. const result = parseIdCard('110101A99001011234');
  33. expect(result.isValid).toBe(false);
  34. });
  35. });
  36. describe('parseIdCard - 15位身份证号', () => {
  37. it('应该正确解析15位男性身份证号', () => {
  38. const result = parseIdCard('110101900101123');
  39. expect(result.gender).toBe('男'); // 第15位是3,奇数
  40. expect(result.birthDate).toBe('1990-01-01');
  41. expect(result.isValid).toBe(true);
  42. });
  43. it('应该正确解析15位女性身份证号', () => {
  44. const result = parseIdCard('110101900101224');
  45. expect(result.gender).toBe('女'); // 第15位是4,偶数
  46. expect(result.birthDate).toBe('1990-01-01');
  47. expect(result.isValid).toBe(true);
  48. });
  49. });
  50. describe('parseIdCard - 边界情况', () => {
  51. it('应该处理空字符串', () => {
  52. const result = parseIdCard('');
  53. expect(result.gender).toBeNull();
  54. expect(result.birthDate).toBeNull();
  55. expect(result.isValid).toBe(false);
  56. });
  57. it('应该处理16位(无效长度)', () => {
  58. const result = parseIdCard('11010119900101123');
  59. expect(result.isValid).toBe(false);
  60. });
  61. it('应该处理19位(无效长度)', () => {
  62. const result = parseIdCard('1101011990010112345');
  63. expect(result.isValid).toBe(false);
  64. });
  65. it('应该处理带空格的身份证号', () => {
  66. const result = parseIdCard('110101 1990 0101 1234');
  67. expect(result.isValid).toBe(true);
  68. expect(result.gender).toBe('男');
  69. });
  70. it('应该处理小写x校验码', () => {
  71. const result = parseIdCard('11010119900101123x');
  72. expect(result.isValid).toBe(true);
  73. expect(result.gender).toBe('男');
  74. });
  75. });
  76. describe('isValidIdCardFormat', () => {
  77. it('应该验证有效的18位身份证号', () => {
  78. expect(isValidIdCardFormat('110101199001011234')).toBe(true);
  79. });
  80. it('应该验证有效的15位身份证号', () => {
  81. expect(isValidIdCardFormat('110101900101123')).toBe(true);
  82. });
  83. it('应该拒绝无效长度的身份证号', () => {
  84. expect(isValidIdCardFormat('11010119900101123')).toBe(false);
  85. expect(isValidIdCardFormat('1101011990010112345')).toBe(false);
  86. });
  87. it('应该拒绝包含非法字符的身份证号', () => {
  88. expect(isValidIdCardFormat('110101A99001011234')).toBe(false);
  89. });
  90. it('应该接受带X校验码的18位身份证号', () => {
  91. expect(isValidIdCardFormat('11010119900101123X')).toBe(true);
  92. });
  93. });
  94. describe('出生日期边界值测试', () => {
  95. it('应该拒绝年份小于1900的日期', () => {
  96. const result = parseIdCard('110101180001011234');
  97. expect(result.birthDate).toBeNull();
  98. expect(result.isValid).toBe(false);
  99. });
  100. it('应该接受当前年份的日期', () => {
  101. const currentYear = new Date().getFullYear();
  102. const idCard = `110101${currentYear}01011234`;
  103. const result = parseIdCard(idCard);
  104. expect(result.isValid).toBe(true);
  105. });
  106. it('应该拒绝大于当前年份的日期', () => {
  107. const nextYear = new Date().getFullYear() + 1;
  108. const idCard = `110101${nextYear}01011234`;
  109. const result = parseIdCard(idCard);
  110. expect(result.birthDate).toBeNull();
  111. expect(result.isValid).toBe(false);
  112. });
  113. });
  114. });