Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions src/api/admin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,13 +293,36 @@ describe('P2 admin write APIs', () => {
vi.mocked(api.put).mockReset();
});

it('patchDriverStatus', async () => {
// mock 用的是 2026-07-28 對帳從真後端抓下來的形狀:**混合大小寫**,
// 且不含 rating_avg/rating_count。舊版直接回 data.driver(沒正規化),
// 車輛三欄會是 undefined——當時的 mock 只有 PascalCase,所以測不出來。
it('patchDriverStatus 回正規化後的 driver(後端是混合大小寫)', async () => {
vi.mocked(api.patch).mockResolvedValue({
data: { driver: { ID: 1, Name: 'A', Phone: '', LineUserID: 'U1', Status: 3 } },
data: {
driver: {
ID: 1,
LineUserID: 'U1',
Name: 'A',
Phone: '',
Status: 3,
vehicle_type: 'sedan',
plate_number: 'LI-3748',
vehicle_review_status: 'approved',
vehicle_review_note: '',
CreatedAt: '2026-07-28T12:42:29+08:00',
UpdatedAt: '2026-07-28T12:42:35+08:00',
},
},
});
const driver = await patchDriverStatus(1, false);
expect(api.patch).toHaveBeenCalledWith('/admin/drivers/1/status', { enabled: false });
expect(driver.Status).toBe(3);
expect(driver.VehicleType).toBe('sedan');
expect(driver.PlateNumber).toBe('LI-3748');
expect(driver.VehicleReviewStatus).toBe('approved');
// 後端這支不回評價 → 正規化補 0,而不是 undefined(表格排序會直接壞掉)
expect(driver.RatingAvg).toBe(0);
expect(driver.RatingCount).toBe(0);
});

it('reviewDriverVehicle 核准', async () => {
Expand Down
16 changes: 14 additions & 2 deletions src/api/admin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -503,9 +503,21 @@ export interface DispatchSettings {
rate_limit_per_min: number;
}

/**
* 啟停司機。回傳**正規化後**的 driver。
*
* 後端這支回的是混合大小寫(`ID`/`Name`/`Status` 走 Go 欄位名,
* `vehicle_type`/`plate_number`/`vehicle_review_status` 走 json tag,
* 且**不含** `rating_avg`/`rating_count`)。直接當 `Driver` 用,
* 車輛三欄與評價會是 undefined——目前呼叫端只 `invalidateQueries`、不看回傳值所以沒出事,
* 但型別在說謊:哪天有人拿它去 `setQueryData`,那一列的車種車牌就會憑空消失。
*/
export async function patchDriverStatus(id: number, enabled: boolean): Promise<Driver> {
const { data } = await api.patch<{ driver: Driver }>(`/admin/drivers/${id}/status`, { enabled });
return data.driver;
const { data } = await api.patch<{ driver: Record<string, unknown> }>(
`/admin/drivers/${id}/status`,
{ enabled },
);
return normalizeDriver(data.driver);
}

// 車輛審核(O5):approve=false 時 note 必填(退回原因)。回傳正規化前的 raw driver。
Expand Down
Loading