Files
BIPMaterialManager/tests/unit/schemas.test.ts
Misaka a05c8a9037 feat: add TypeORM, logger, schemas, hooks and stores
- Add TypeORM integration with data-source, entities and repositories
- Add logger service for structured logging
- Add Zod validation schemas for auth, cleaner and extractor
- Add custom React hooks (useAuth, useCleaner, useExtractor, useValidation)
- Add Zustand stores (useAppStore, useUserStore)
- Add UI components (Button, Modal, Toast)
- Add error types and ErpBrowserManager
- Refactor IPC handlers and services
- Add unit tests for new modules

Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
2026-03-02 23:10:15 +08:00

228 lines
5.3 KiB
TypeScript

/**
* Zod Schemas Unit Tests
*/
import { describe, it, expect } from 'vitest'
import {
ExtractorInputSchema,
validateExtractorInput
} from '../../src/main/schemas/extractor.schema'
import { CleanerInputSchema, validateCleanerInput } from '../../src/main/schemas/cleaner.schema'
import { LoginRequestSchema, validateLoginRequest } from '../../src/main/schemas/auth.schema'
describe('Extractor Schema', () => {
describe('ExtractorInputSchema', () => {
it('should validate valid input', () => {
const input = {
orderNumbers: ['SC12345678901234', 'SC98765432109876'],
batchSize: 10
}
const result = ExtractorInputSchema.safeParse(input)
expect(result.success).toBe(true)
})
it('should apply default batchSize', () => {
const input = {
orderNumbers: ['SC12345678901234']
}
const result = ExtractorInputSchema.safeParse(input)
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.batchSize).toBe(10)
}
})
it('should reject empty orderNumbers array', () => {
const input = {
orderNumbers: []
}
const result = ExtractorInputSchema.safeParse(input)
expect(result.success).toBe(false)
})
it('should reject missing orderNumbers', () => {
const input = {}
const result = ExtractorInputSchema.safeParse(input)
expect(result.success).toBe(false)
})
it('should reject empty string in orderNumbers', () => {
const input = {
orderNumbers: ['', 'SC12345678901234']
}
const result = ExtractorInputSchema.safeParse(input)
expect(result.success).toBe(false)
})
})
describe('validateExtractorInput', () => {
it('should return success for valid input', () => {
const input = {
orderNumbers: ['SC12345678901234']
}
const result = validateExtractorInput(input)
expect(result.success).toBe(true)
expect(result.data).toBeDefined()
})
it('should return error message for invalid input', () => {
const input = {
orderNumbers: []
}
const result = validateExtractorInput(input)
expect(result.success).toBe(false)
expect(result.error).toBeDefined()
})
})
})
describe('Cleaner Schema', () => {
describe('CleanerInputSchema', () => {
it('should validate valid input', () => {
const input = {
orderNumbers: ['SC12345678901234'],
materialCodes: ['MAT001', 'MAT002'],
dryRun: true
}
const result = CleanerInputSchema.safeParse(input)
expect(result.success).toBe(true)
})
it('should validate with empty materialCodes', () => {
const input = {
orderNumbers: ['SC12345678901234'],
materialCodes: [],
dryRun: false
}
const result = CleanerInputSchema.safeParse(input)
expect(result.success).toBe(true)
})
it('should reject missing dryRun', () => {
const input = {
orderNumbers: ['SC12345678901234'],
materialCodes: ['MAT001']
}
const result = CleanerInputSchema.safeParse(input)
expect(result.success).toBe(false)
})
it('should reject non-boolean dryRun', () => {
const input = {
orderNumbers: ['SC12345678901234'],
materialCodes: [],
dryRun: 'yes'
}
const result = CleanerInputSchema.safeParse(input)
expect(result.success).toBe(false)
})
})
describe('validateCleanerInput', () => {
it('should return success for valid input', () => {
const input = {
orderNumbers: ['SC12345678901234'],
materialCodes: ['MAT001'],
dryRun: false
}
const result = validateCleanerInput(input)
expect(result.success).toBe(true)
})
})
})
describe('Auth Schema', () => {
describe('LoginRequestSchema', () => {
it('should validate valid input', () => {
const input = {
username: 'testuser',
password: 'testpass'
}
const result = LoginRequestSchema.safeParse(input)
expect(result.success).toBe(true)
})
it('should reject empty username', () => {
const input = {
username: '',
password: 'testpass'
}
const result = LoginRequestSchema.safeParse(input)
expect(result.success).toBe(false)
})
it('should reject empty password', () => {
const input = {
username: 'testuser',
password: ''
}
const result = LoginRequestSchema.safeParse(input)
expect(result.success).toBe(false)
})
it('should reject missing fields', () => {
const input = {}
const result = LoginRequestSchema.safeParse(input)
expect(result.success).toBe(false)
})
})
describe('validateLoginRequest', () => {
it('should return success for valid input', () => {
const input = {
username: 'admin',
password: 'password123'
}
const result = validateLoginRequest(input)
expect(result.success).toBe(true)
expect(result.data).toBeDefined()
expect(result.data?.username).toBe('admin')
})
it('should return error for invalid input', () => {
const input = {
username: ''
}
const result = validateLoginRequest(input)
expect(result.success).toBe(false)
expect(result.error).toBeDefined()
})
})
})