Add ISBN-10 to ISBN-13 validation and conversion

Enhance NormalizeISBN to validate and convert ISBNs:
- Validate length (10 or 13 digits), return error if invalid
- Convert ISBN-10 to ISBN-13 by prefixing '978' and recalculating checksum
- Add NormalizeISBNSafe for backward compatibility in scanners

This ensures all ISBNs stored in database are valid ISBN-13 format.
This commit is contained in:
2026-02-11 09:42:18 -05:00
parent 0eee34ad01
commit 0f8db2ab07
6 changed files with 226 additions and 20 deletions
+6 -6
View File
@@ -66,7 +66,7 @@ func TestNormalizeISBN_ValidISBNs(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := NormalizeISBN(tt.input)
result := NormalizeISBNSafe(tt.input)
assert.Equal(t, tt.expected, result)
})
}
@@ -117,7 +117,7 @@ func TestNormalizeISBN_EdgeCases(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := NormalizeISBN(tt.input)
result := NormalizeISBNSafe(tt.input)
assert.Equal(t, tt.expected, result)
})
}
@@ -148,7 +148,7 @@ func TestNormalizeISBN_SpecialCharacters(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := NormalizeISBN(tt.input)
result := NormalizeISBNSafe(tt.input)
assert.Equal(t, tt.expected, result)
})
}
@@ -189,7 +189,7 @@ func TestNormalizeISBN_RealWorldExamples(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := NormalizeISBN(tt.input)
result := NormalizeISBNSafe(tt.input)
assert.Equal(t, tt.expected, result)
})
}
@@ -205,7 +205,7 @@ func TestNormalizeISBN_DoesNotModifyValidISBNs(t *testing.T) {
for _, isbn := range validISBNs {
t.Run(isbn, func(t *testing.T) {
result := NormalizeISBN(isbn)
result := NormalizeISBNSafe(isbn)
assert.Equal(t, isbn, result, "Valid ISBN should not be modified")
})
}
@@ -236,7 +236,7 @@ func TestNormalizeISBN_PreservesX(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := NormalizeISBN(tt.input)
result := NormalizeISBNSafe(tt.input)
assert.Equal(t, tt.expected, result)
})
}