mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-13 16:37:13 +08:00
Merge pull request #7972 from ouchihao/codex/bug-group-rate-edit-validation
fix(groups): reject nonpositive rate multiplier edits
This commit is contained in:
@@ -426,7 +426,7 @@ const updateLocalRate = (userId: number, value: string) => {
|
||||
return
|
||||
}
|
||||
const num = parseFloat(value)
|
||||
if (isNaN(num)) return
|
||||
if (!Number.isFinite(num) || num <= 0) return
|
||||
entry.rate_multiplier = num
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
|
||||
import type { AdminGroup } from '@/types'
|
||||
import GroupRateMultipliersModal from '../GroupRateMultipliersModal.vue'
|
||||
|
||||
const mocks = vi.hoisted(() => ({ getGroupRateMultipliers: vi.fn(), batchSetGroupRateMultipliers: vi.fn() }))
|
||||
vi.mock('@/api/admin', () => ({ adminAPI: { groups: mocks } }))
|
||||
vi.mock('@/stores/app', () => ({ useAppStore: () => ({ showSuccess: vi.fn(), showError: vi.fn() }) }))
|
||||
vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => key }) }))
|
||||
enableAutoUnmount(afterEach)
|
||||
beforeEach(() => {
|
||||
vi.resetAllMocks()
|
||||
mocks.getGroupRateMultipliers.mockResolvedValue([
|
||||
{ user_id: 7, user_email: 'user@example.com', user_name: '', user_status: 'active', rate_multiplier: 2, rpm_override: null }
|
||||
])
|
||||
})
|
||||
|
||||
async function openEditor() {
|
||||
const wrapper = mount(GroupRateMultipliersModal, {
|
||||
props: { show: false, group: { id: 1, name: 'Group', platform: 'openai', rate_multiplier: 1 } as AdminGroup },
|
||||
global: { stubs: {
|
||||
BaseDialog: { props: ['show'], template: '<div v-if="show"><slot /></div>' },
|
||||
Icon: true, PlatformIcon: true, Pagination: true
|
||||
} }
|
||||
})
|
||||
await wrapper.setProps({ show: true })
|
||||
await flushPromises()
|
||||
return wrapper
|
||||
}
|
||||
|
||||
describe('group rate multiplier edits', () => {
|
||||
it.each(['0', '-1'])('does not stage invalid custom rate %s', async (value) => {
|
||||
const wrapper = await openEditor()
|
||||
await wrapper.get('tbody input[type="number"]').setValue(value)
|
||||
expect(wrapper.findAll('button').some(button => button.text() === 'common.save')).toBe(false)
|
||||
expect(mocks.batchSetGroupRateMultipliers).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it.each([['0.5', 0.5], ['1e-3', 0.001]])('saves positive rate %s', async (value, expected) => {
|
||||
const wrapper = await openEditor()
|
||||
await wrapper.get('tbody input[type="number"]').setValue(value)
|
||||
await wrapper.findAll('button').find(button => button.text() === 'common.save')!.trigger('click')
|
||||
expect(mocks.batchSetGroupRateMultipliers).toHaveBeenCalledWith(1, [{ user_id: 7, rate_multiplier: expected }])
|
||||
})
|
||||
|
||||
it('still removes an override when its input is cleared', async () => {
|
||||
const wrapper = await openEditor()
|
||||
await wrapper.get('tbody input[type="number"]').setValue('')
|
||||
await wrapper.findAll('button').find(button => button.text() === 'common.save')!.trigger('click')
|
||||
expect(mocks.batchSetGroupRateMultipliers).toHaveBeenCalledWith(1, [])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user