- Implemented OpeningBalanceResultStep component to display results of the import process, including success messages and error handling. - Created OpeningBalanceUploadStep component for file upload with drag-and-drop support, including validation for accepted file types. - Developed column detection logic in column-detector.ts to identify account number, name, debit, credit, and balance columns based on headers and data. - Added parser functionality in parser.ts to handle parsing of opening balance files, including validation and BAS account matching. - Created tests for column detection and parsing logic to ensure accuracy and reliability. - Defined types for detected columns and parsed rows in types.ts to improve type safety and clarity in the codebase.
100 lines
2.9 KiB
TypeScript
100 lines
2.9 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { detectColumns } from '../column-detector'
|
|
|
|
describe('detectColumns', () => {
|
|
it('detects Swedish debit/credit headers', () => {
|
|
const headers = ['Kontonr', 'Kontonamn', 'Debet', 'Kredit']
|
|
const dataRows = [
|
|
['1930', 'Företagskonto', '50000', '0'],
|
|
['2440', 'Leverantörsskulder', '0', '15000'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.account_number_col).toBe(0)
|
|
expect(result.account_name_col).toBe(1)
|
|
expect(result.layout).toBe('debit_credit')
|
|
expect(result.debit_col).toBe(2)
|
|
expect(result.credit_col).toBe(3)
|
|
expect(result.confidence).toBeGreaterThanOrEqual(0.8)
|
|
})
|
|
|
|
it('detects net balance layout', () => {
|
|
const headers = ['Konto', 'Namn', 'Saldo']
|
|
const dataRows = [
|
|
['1930', 'Företagskonto', '50000'],
|
|
['2440', 'Leverantörsskulder', '-15000'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.account_number_col).toBe(0)
|
|
expect(result.layout).toBe('net')
|
|
expect(result.balance_col).toBe(2)
|
|
expect(result.confidence).toBeGreaterThanOrEqual(0.8)
|
|
})
|
|
|
|
it('detects English headers', () => {
|
|
const headers = ['Account Number', 'Account Name', 'Debit', 'Credit']
|
|
const dataRows = [
|
|
['1930', 'Business account', '50000', '0'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.account_number_col).toBe(0)
|
|
expect(result.account_name_col).toBe(1)
|
|
expect(result.layout).toBe('debit_credit')
|
|
})
|
|
|
|
it('falls back to data analysis when no headers match', () => {
|
|
const headers = ['Col A', 'Col B', 'Col C']
|
|
const dataRows = [
|
|
['1930', 'Something', '50000'],
|
|
['2440', 'Other', '15000'],
|
|
['1510', 'Third', '8000'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
// Should detect column 0 as account numbers (4-digit pattern)
|
|
expect(result.account_number_col).toBe(0)
|
|
// Column 2 should be detected as numeric
|
|
expect(result.balance_col).not.toBeNull()
|
|
})
|
|
|
|
it('returns low confidence when nothing is detected', () => {
|
|
const headers = ['X', 'Y', 'Z']
|
|
const dataRows = [
|
|
['abc', 'def', 'ghi'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.confidence).toBeLessThan(0.5)
|
|
})
|
|
|
|
it('detects IB keyword as balance column', () => {
|
|
const headers = ['Konto', 'IB', 'UB']
|
|
const dataRows = [
|
|
['1930', '50000', '55000'],
|
|
]
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.account_number_col).toBe(0)
|
|
expect(result.layout).toBe('net')
|
|
expect(result.balance_col).toBe(1)
|
|
})
|
|
|
|
it('handles empty data rows', () => {
|
|
const headers = ['Kontonr', 'Debet', 'Kredit']
|
|
const dataRows: string[][] = []
|
|
|
|
const result = detectColumns(headers, dataRows)
|
|
|
|
expect(result.account_number_col).toBe(0)
|
|
expect(result.layout).toBe('debit_credit')
|
|
})
|
|
})
|