| import { describe, expect, it, vi } from 'vitest' |
| import { mount } from '@vue/test-utils' |
| import AccountStatusIndicator from '../AccountStatusIndicator.vue' |
| import type { Account } from '@/types' |
|
|
| vi.mock('vue-i18n', async () => { |
| const actual = await vi.importActual<typeof import('vue-i18n')>('vue-i18n') |
| return { |
| ...actual, |
| useI18n: () => ({ |
| t: (key: string) => key |
| }) |
| } |
| }) |
|
|
| function makeAccount(overrides: Partial<Account>): Account { |
| return { |
| id: 1, |
| name: 'account', |
| platform: 'antigravity', |
| type: 'oauth', |
| proxy_id: null, |
| concurrency: 1, |
| priority: 1, |
| status: 'active', |
| error_message: null, |
| last_used_at: null, |
| expires_at: null, |
| auto_pause_on_expired: true, |
| created_at: '2026-03-15T00:00:00Z', |
| updated_at: '2026-03-15T00:00:00Z', |
| schedulable: true, |
| rate_limited_at: null, |
| rate_limit_reset_at: null, |
| overload_until: null, |
| temp_unschedulable_until: null, |
| temp_unschedulable_reason: null, |
| session_window_start: null, |
| session_window_end: null, |
| session_window_status: null, |
| ...overrides, |
| } |
| } |
|
|
| describe('AccountStatusIndicator', () => { |
| it('模型限流 + overages 启用 + 无 AICredits key → 显示 ⚡ (credits_active)', () => { |
| const wrapper = mount(AccountStatusIndicator, { |
| props: { |
| account: makeAccount({ |
| id: 1, |
| name: 'ag-1', |
| extra: { |
| allow_overages: true, |
| model_rate_limits: { |
| 'claude-sonnet-4-5': { |
| rate_limited_at: '2026-03-15T00:00:00Z', |
| rate_limit_reset_at: '2099-03-15T00:00:00Z' |
| } |
| } |
| } |
| }) |
| }, |
| global: { |
| stubs: { |
| Icon: true |
| } |
| } |
| }) |
|
|
| expect(wrapper.text()).toContain('⚡') |
| expect(wrapper.text()).toContain('CSon45') |
| }) |
|
|
| it('模型限流 + overages 未启用 → 普通限流样式(无 ⚡)', () => { |
| const wrapper = mount(AccountStatusIndicator, { |
| props: { |
| account: makeAccount({ |
| id: 2, |
| name: 'ag-2', |
| extra: { |
| model_rate_limits: { |
| 'claude-sonnet-4-5': { |
| rate_limited_at: '2026-03-15T00:00:00Z', |
| rate_limit_reset_at: '2099-03-15T00:00:00Z' |
| } |
| } |
| } |
| }) |
| }, |
| global: { |
| stubs: { |
| Icon: true |
| } |
| } |
| }) |
|
|
| expect(wrapper.text()).toContain('CSon45') |
| expect(wrapper.text()).not.toContain('⚡') |
| }) |
|
|
| it('AICredits key 生效 → 显示积分已用尽 (credits_exhausted)', () => { |
| const wrapper = mount(AccountStatusIndicator, { |
| props: { |
| account: makeAccount({ |
| id: 3, |
| name: 'ag-3', |
| extra: { |
| allow_overages: true, |
| model_rate_limits: { |
| 'AICredits': { |
| rate_limited_at: '2026-03-15T00:00:00Z', |
| rate_limit_reset_at: '2099-03-15T00:00:00Z' |
| } |
| } |
| } |
| }) |
| }, |
| global: { |
| stubs: { |
| Icon: true |
| } |
| } |
| }) |
|
|
| expect(wrapper.text()).toContain('account.creditsExhausted') |
| }) |
|
|
| it('模型限流 + overages 启用 + AICredits key 生效 → 普通限流样式(积分耗尽,无 ⚡)', () => { |
| const wrapper = mount(AccountStatusIndicator, { |
| props: { |
| account: makeAccount({ |
| id: 4, |
| name: 'ag-4', |
| extra: { |
| allow_overages: true, |
| model_rate_limits: { |
| 'claude-sonnet-4-5': { |
| rate_limited_at: '2026-03-15T00:00:00Z', |
| rate_limit_reset_at: '2099-03-15T00:00:00Z' |
| }, |
| 'AICredits': { |
| rate_limited_at: '2026-03-15T00:00:00Z', |
| rate_limit_reset_at: '2099-03-15T00:00:00Z' |
| } |
| } |
| } |
| }) |
| }, |
| global: { |
| stubs: { |
| Icon: true |
| } |
| } |
| }) |
|
|
| |
| expect(wrapper.text()).toContain('CSon45') |
| expect(wrapper.text()).not.toContain('⚡') |
| |
| expect(wrapper.text()).toContain('account.creditsExhausted') |
| }) |
| }) |
|
|