feat: implement ERP authentication service

Implement ErpAuthService with TDD approach:
- Add login(), close(), getSession(), isActive() methods
- Use Playwright chromium with headless:false for debugging
- Manage browser lifecycle and session state
- Handle authentication flow with ERP_LOCATORS
- Add integration tests for login scenarios
- Add unit tests for session management
- Fix dotenv config path in test setup

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-03-01 12:34:54 +08:00
parent 87f6229d49
commit f045d66b65
4 changed files with 195 additions and 2 deletions

View File

@@ -0,0 +1,59 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { ErpAuthService } from '../../src/main/services/erp/erp-auth';
import type { ErpConfig } from '../../src/main/types/erp.types';
describe('ERP Authentication Service (Unit)', () => {
describe('Session Management', () => {
it('should create service instance with config', () => {
const config: ErpConfig = {
url: 'https://test.example.com',
username: 'testuser',
password: 'testpass',
};
const service = new ErpAuthService(config);
expect(service).toBeDefined();
expect(service.isActive()).toBe(false);
});
it('should throw error when getting session before login', () => {
const config: ErpConfig = {
url: 'https://test.example.com',
username: 'testuser',
password: 'testpass',
};
const service = new ErpAuthService(config);
expect(() => service.getSession()).toThrow('Not logged in. Call login() first.');
});
it('should report inactive status before login', () => {
const config: ErpConfig = {
url: 'https://test.example.com',
username: 'testuser',
password: 'testpass',
};
const service = new ErpAuthService(config);
expect(service.isActive()).toBe(false);
});
});
describe('Close Method', () => {
it('should handle close when no session exists', async () => {
const config: ErpConfig = {
url: 'https://test.example.com',
username: 'testuser',
password: 'testpass',
};
const service = new ErpAuthService(config);
// Should not throw when closing without session
await expect(service.close()).resolves.toBeUndefined();
});
});
});