Skip to content

Commit 69f350f

Browse files
authored
fix: preserve product image on edit when no new image is uploaded (#240)
1 parent 2123f36 commit 69f350f

3 files changed

Lines changed: 37 additions & 3 deletions

File tree

app/routes/staff/products/-helpers/parseProductRegistrationFormData.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export type ParsedProductRegistrationFormData = {
55
price: number
66
stock: number
77
tags: string[]
8-
image: { data: string; mimeType: string } | null
8+
image: { data: string; mimeType: string } | null | undefined
99
}
1010

1111
export const parseProductRegistrationFormData = async (
@@ -56,7 +56,7 @@ const parseCreateImage = async (
5656
if (value instanceof File && value.size > 0) {
5757
return await convertFileToImageData(value)
5858
}
59-
return null
59+
return undefined
6060
}
6161

6262
const parseTags = (value: unknown): string[] => {

app/usecases/registerProduct.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ const resolveTagNamesToIds = async ({
4848
return tagIds
4949
}
5050

51-
type ProductImageInput = Pick<ProductImage, "data" | "mimeType"> | null
51+
type ProductImageInput =
52+
| Pick<ProductImage, "data" | "mimeType">
53+
| null
54+
| undefined
5255

5356
export type CreateProductPayload = Omit<Product, "tagIds" | "id"> & {
5457
tags: string[]

tests/integration/staff-products-edit.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,37 @@ describe("商品編集", () => {
3737
)
3838
})
3939

40+
test("画像をアップロードせずに商品を編集すると既存の画像が保持される", async () => {
41+
const beforeEditRes = await app.request("/images/products/1")
42+
expect(beforeEditRes.status).toBe(200)
43+
const beforeImageBuffer = await beforeEditRes.arrayBuffer()
44+
const beforeImageSize = beforeImageBuffer.byteLength
45+
expect(beforeImageSize).toBeGreaterThan(0)
46+
47+
const form = new URLSearchParams()
48+
form.append("name", generateUniqueName("画像なし編集"))
49+
form.append("price", "3000")
50+
form.append("stock", "8")
51+
form.append("tags", "タグA")
52+
const editRes = await app.request(endpoint, {
53+
method: "POST",
54+
body: form,
55+
headers: { "content-type": "application/x-www-form-urlencoded" },
56+
})
57+
expect(editRes.status).toBe(302)
58+
expect(editRes.headers.get("set-cookie")).toMatch(/success/)
59+
expect(editRes.headers.get("set-cookie")).toMatch(
60+
encodeURIComponent("商品を更新しました"),
61+
)
62+
63+
const afterEditRes = await app.request("/images/products/1")
64+
expect(afterEditRes.status).toBe(200)
65+
const afterImageBuffer = await afterEditRes.arrayBuffer()
66+
const afterImageSize = afterImageBuffer.byteLength
67+
68+
expect(afterImageSize).toBe(beforeImageSize)
69+
})
70+
4071
test("商品名が空の場合はエラーを返す", async () => {
4172
const form = new URLSearchParams()
4273
form.append("price", "1000")

0 commit comments

Comments
 (0)