Merge pull request #7900 from ouchihao/codex/bug-rpm-edit-number

fix(groups): preserve numeric values when editing RPM overrides
This commit is contained in:
Wesley Liddick
2026-10-08 11:35:27 +08:00
committed by GitHub
2 changed files with 50 additions and 2 deletions
@@ -356,8 +356,9 @@ const handleAddLocal = () => {
}
const updateLocalRpm = (userId: number, value: string) => {
const num = parseInt(value, 10)
if (isNaN(num) || num < 0) return
if (!value.trim()) return
const num = Number(value)
if (!Number.isInteger(num) || num < 0) return
const entry = localEntries.value.find(e => e.user_id === userId)
if (entry) entry.rpm_override = num
}
@@ -0,0 +1,47 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
import type { AdminGroup } from '@/types'
import GroupRPMOverridesModal from '../GroupRPMOverridesModal.vue'
const mocks = vi.hoisted(() => ({ getGroupRPMOverrides: vi.fn(), batchSetGroupRPMOverrides: 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.getGroupRPMOverrides.mockResolvedValue([
{ user_id: 7, user_email: 'user@example.com', user_name: '', user_status: 'active', rpm_override: 100 }
])
})
async function openEditor() {
const wrapper = mount(GroupRPMOverridesModal, {
props: { show: false, group: { id: 1, name: 'Group', platform: 'openai' } 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('existing RPM override edits', () => {
it.each(['', '1.5', '-1'])('does not save invalid RPM %j', 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.batchSetGroupRPMOverrides).not.toHaveBeenCalled()
})
it.each([['0', 0], ['200', 200], ['1e3', 1000]])('saves %s as %i', async (input, expected) => {
const wrapper = await openEditor()
await wrapper.get('tbody input[type="number"]').setValue(input)
await wrapper.findAll('button').find(button => button.text() === 'common.save')!.trigger('click')
await flushPromises()
expect(mocks.batchSetGroupRPMOverrides).toHaveBeenCalledWith(1, [{ user_id: 7, rpm_override: expected }])
})
})