-
Notifications
You must be signed in to change notification settings - Fork 4
fix: adjust payload to customized managed sponsor forms #958
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| import sponsorCustomizedFormReducer from "../sponsor-customized-form-reducer"; | ||
| import { | ||
| RECEIVE_SPONSOR_CUSTOMIZED_FORM, | ||
| RESET_SPONSOR_CUSTOMIZED_FORM | ||
| } from "../../../actions/sponsor-forms-actions"; | ||
|
|
||
| const DEFAULT_ENTITY = { | ||
| id: 0, | ||
| code: "", | ||
| name: "", | ||
| allowed_add_ons: [], | ||
| opens_at: "", | ||
| expires_at: "", | ||
| instructions: "", | ||
| meta_fields: [], | ||
| items: [] | ||
| }; | ||
|
|
||
| const DEFAULT_STATE = { entity: DEFAULT_ENTITY }; | ||
|
|
||
| describe("sponsorCustomizedFormReducer", () => { | ||
| describe("RECEIVE_SPONSOR_CUSTOMIZED_FORM", () => { | ||
| it("maps file_url to file_path for images on each item", () => { | ||
| const result = sponsorCustomizedFormReducer(DEFAULT_STATE, { | ||
| type: RECEIVE_SPONSOR_CUSTOMIZED_FORM, | ||
| payload: { | ||
| response: { | ||
| id: 1, | ||
| code: "FORM1", | ||
| items: [ | ||
| { | ||
| id: 10, | ||
| name: "Item A", | ||
| images: [ | ||
| { id: 100, file_url: "https://example.com/img1.png" }, | ||
| { id: 101, file_url: "https://example.com/img2.png" } | ||
| ] | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| }); | ||
|
|
||
| expect(result.entity.items[0].images).toEqual([ | ||
| { | ||
| id: 100, | ||
| file_url: "https://example.com/img1.png", | ||
| file_path: "https://example.com/img1.png" | ||
| }, | ||
| { | ||
| id: 101, | ||
| file_url: "https://example.com/img2.png", | ||
| file_path: "https://example.com/img2.png" | ||
| } | ||
| ]); | ||
| }); | ||
|
|
||
| it("handles items with no images", () => { | ||
| const result = sponsorCustomizedFormReducer(DEFAULT_STATE, { | ||
| type: RECEIVE_SPONSOR_CUSTOMIZED_FORM, | ||
| payload: { | ||
| response: { | ||
| id: 1, | ||
| code: "FORM1", | ||
| items: [{ id: 10, name: "Item A", images: [] }] | ||
| } | ||
| } | ||
| }); | ||
|
|
||
| expect(result.entity.items[0].images).toEqual([]); | ||
| }); | ||
|
|
||
| it("handles empty items array", () => { | ||
| const result = sponsorCustomizedFormReducer(DEFAULT_STATE, { | ||
| type: RECEIVE_SPONSOR_CUSTOMIZED_FORM, | ||
| payload: { | ||
| response: { id: 1, code: "FORM1", items: [] } | ||
| } | ||
| }); | ||
|
|
||
| expect(result.entity.items).toEqual([]); | ||
| }); | ||
|
|
||
| it("handles missing items field", () => { | ||
| const result = sponsorCustomizedFormReducer(DEFAULT_STATE, { | ||
| type: RECEIVE_SPONSOR_CUSTOMIZED_FORM, | ||
| payload: { | ||
| response: { id: 1, code: "FORM1" } | ||
| } | ||
| }); | ||
|
|
||
| expect(result.entity.items).toEqual([]); | ||
| }); | ||
| }); | ||
|
|
||
| describe("RESET_SPONSOR_CUSTOMIZED_FORM", () => { | ||
| it("resets to default state", () => { | ||
| const dirty = { entity: { id: 99, items: [{ id: 1 }] } }; | ||
| const result = sponsorCustomizedFormReducer(dirty, { | ||
| type: RESET_SPONSOR_CUSTOMIZED_FORM | ||
| }); | ||
| expect(result).toEqual(DEFAULT_STATE); | ||
| }); | ||
| }); | ||
| }); | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -110,6 +110,10 @@ const sponsorCustomizedFormItemsListReducer = ( | |||||||||||||||||||||
|
|
||||||||||||||||||||||
| const currentItem = { | ||||||||||||||||||||||
| ...item, | ||||||||||||||||||||||
| images: (item.images || []).map((img) => ({ | ||||||||||||||||||||||
| ...img, | ||||||||||||||||||||||
| file_path: img.file_url | ||||||||||||||||||||||
| })), | ||||||||||||||||||||||
| meta_fields: item.meta_fields.length > 0 ? item.meta_fields : [] | ||||||||||||||||||||||
|
Comment on lines
+113
to
117
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Guard
Suggested fix const currentItem = {
...item,
images: (item.images || []).map((img) => ({
...img,
file_path: img.file_url
})),
- meta_fields: item.meta_fields.length > 0 ? item.meta_fields : []
+ meta_fields: Array.isArray(item.meta_fields) ? item.meta_fields : []
};📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||
| }; | ||||||||||||||||||||||
| return { ...state, currentItem }; | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,7 +26,8 @@ const DEFAULT_ENTITY = { | |
| opens_at: "", | ||
| expires_at: "", | ||
| instructions: "", | ||
| meta_fields: [] | ||
| meta_fields: [], | ||
| items: [] | ||
| }; | ||
|
|
||
| const DEFAULT_STATE = { | ||
|
|
@@ -43,10 +44,17 @@ const sponsorCustomizedFormReducer = (state = DEFAULT_STATE, action) => { | |
| return DEFAULT_STATE; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @tomrndom |
||
| } | ||
| case RECEIVE_SPONSOR_CUSTOMIZED_FORM: { | ||
| return { | ||
| ...state, | ||
| entity: payload.response | ||
| const entity = { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @tomrndom |
||
| ...payload.response, | ||
| items: (payload.response.items || []).map((it) => ({ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @tomrndom |
||
| ...it, | ||
| images: (it.images || []).map((img) => ({ | ||
| ...img, | ||
| file_path: img.file_url | ||
| })) | ||
| })) | ||
| }; | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| return { ...state, entity }; | ||
| } | ||
| default: | ||
| return state; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a test for items where
imagesis missing (not just empty).You already validate
images: [], but the reducer also handlesimagesbeing absent. A direct test for that case will lock the intended fallback contract.Suggested test case
it("handles items with no images", () => { @@ expect(result.entity.items[0].images).toEqual([]); }); + it("handles items with missing images field", () => { + const result = sponsorCustomizedFormReducer(DEFAULT_STATE, { + type: RECEIVE_SPONSOR_CUSTOMIZED_FORM, + payload: { + response: { + id: 1, + code: "FORM1", + items: [{ id: 10, name: "Item A" }] + } + } + }); + + expect(result.entity.items[0].images).toEqual([]); + });📝 Committable suggestion
🤖 Prompt for AI Agents