72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import {
|
|
BASE_QUICK_ACTIONS,
|
|
buildQuickActions,
|
|
cloneProfileDraft,
|
|
normalizeName,
|
|
normalizeProfileForApply
|
|
} from './ChatControl';
|
|
|
|
vi.mock('../lib/supabaseClient', () => ({
|
|
supabase: {
|
|
auth: {
|
|
getSession: vi.fn(async () => ({ data: { session: null } }))
|
|
}
|
|
}
|
|
}));
|
|
|
|
describe('ChatControl helpers', () => {
|
|
it('normalizes names for fuzzy profile matching', () => {
|
|
expect(normalizeName('High Risk Scalper ⚡')).toBe('highriskscalper');
|
|
expect(normalizeName('Conservative-Bag 01')).toBe('conservativebag01');
|
|
});
|
|
|
|
it('builds quick actions with profile-specific tune actions first', () => {
|
|
const quick = buildQuickActions([
|
|
{ name: 'High Risk Scalper ⚡' },
|
|
{ name: 'Conservative Bag' }
|
|
]);
|
|
|
|
expect(quick[0].label).toContain('Tune High Risk Scalper ⚡');
|
|
expect(quick[1].label).toContain('Tune Conservative Bag');
|
|
expect(quick.length).toBe(BASE_QUICK_ACTIONS.length + 2);
|
|
});
|
|
|
|
it('falls back to base quick actions when profile names do not match', () => {
|
|
const quick = buildQuickActions([{ name: 'Balanced Trend Rider' }]);
|
|
expect(quick).toEqual(BASE_QUICK_ACTIONS);
|
|
});
|
|
|
|
it('clones draft profile strategy config deeply', () => {
|
|
const original = {
|
|
name: 'AI Profile',
|
|
strategy_config: {
|
|
execution: { entryMode: 'both' },
|
|
rules: [{ ruleId: 'TrendBiasRule', enabled: true }]
|
|
}
|
|
};
|
|
|
|
const clone = cloneProfileDraft(original);
|
|
clone.strategy_config.rules[0].enabled = false;
|
|
|
|
expect(original.strategy_config.rules[0].enabled).toBe(true);
|
|
expect(clone.strategy_config.rules[0].enabled).toBe(false);
|
|
});
|
|
|
|
it('normalizes profile payload fields before apply', () => {
|
|
const normalized = normalizeProfileForApply({
|
|
name: ' Test Profile ',
|
|
allocated_capital: '2500',
|
|
risk_per_trade_percent: '1.5',
|
|
symbols: ' BTC/USDT ',
|
|
is_active: true
|
|
});
|
|
|
|
expect(normalized.name).toBe('Test Profile');
|
|
expect(normalized.allocated_capital).toBe(2500);
|
|
expect(normalized.risk_per_trade_percent).toBe(1.5);
|
|
expect(normalized.symbols).toBe('BTC/USDT');
|
|
expect(normalized.is_active).toBe(true);
|
|
});
|
|
});
|