From a0e054ee09edce8e8877a75335817a1f3866c81e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:35:59 +0000 Subject: [PATCH 1/3] Initial plan From 66b74894bbc6b9a76cad3dbfa35220d59987a7cc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:40:32 +0000 Subject: [PATCH 2/3] test(clipboard): cover extractItems payload handling Co-authored-by: marcuscastelo <27441558+marcuscastelo@users.noreply.github.com> Agent-Logs-Url: https://github.com/marcuscastelo/macroflows/sessions/c8e8e26f-0883-4b65-9528-8780066ef999 --- .../domain/tests/clipboardPayloadExt.test.ts | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts diff --git a/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts b/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts new file mode 100644 index 000000000..cad492685 --- /dev/null +++ b/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts @@ -0,0 +1,115 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { ClipboardPayloadExt } from '~/modules/clipboard/domain/clipboardPayloadExt' +import { createItem, type Item } from '~/modules/diet/item/schema/itemSchema' +import { createMacroNutrients } from '~/modules/diet/macro-nutrients/domain/macroNutrients' +import { createNewMeal, promoteMeal } from '~/modules/diet/meal/domain/meal' +import { + createNewRecipe, + promoteRecipe, +} from '~/modules/diet/recipe/domain/recipe' + +const createFoodItem = (id: number, name: string, quantity: number): Item => + createItem({ + id, + name, + quantity, + reference: { + type: 'food', + id: id * 10, + macros: createMacroNutrients({ + proteinInGrams: 10, + carbsInGrams: 20, + fatInGrams: 5, + }), + }, + }) + +const expectRegeneratedId = (actualId: number, expectedId: number): void => { + expect(actualId).toBe(expectedId) + expect(Number.isInteger(actualId)).toBe(true) + expect(actualId).toBeGreaterThanOrEqual(0) + expect(actualId).toBeLessThanOrEqual(1000000) +} + +describe('ClipboardPayloadExt', () => { + afterEach(() => { + vi.restoreAllMocks() + }) + + describe('extractItems', () => { + it('extracts a single item and regenerates its id while preserving content', () => { + const payload = createFoodItem(10, 'Banana', 150) + + vi.spyOn(Math, 'random').mockReturnValueOnce(0.123456) + + const extractedItems = ClipboardPayloadExt.extractItems(payload) + + expect(extractedItems).toHaveLength(1) + expectRegeneratedId(extractedItems[0]!.id, 123456) + expect(extractedItems[0]).toEqual({ + ...payload, + id: 123456, + }) + expect(payload.id).toBe(10) + }) + + it('extracts meal items and regenerates unique ids for every item', () => { + const items = [ + createFoodItem(10, 'Rice', 100), + createFoodItem(20, 'Beans', 80), + ] + const payload = promoteMeal(createNewMeal({ name: 'Lunch', items }), { + id: 1, + }) + + vi.spyOn(Math, 'random') + .mockReturnValueOnce(0.111111) + .mockReturnValueOnce(0.222222) + + const extractedItems = ClipboardPayloadExt.extractItems(payload) + + expect(extractedItems).toHaveLength(2) + expectRegeneratedId(extractedItems[0]!.id, 111111) + expectRegeneratedId(extractedItems[1]!.id, 222222) + expect(new Set(extractedItems.map((item) => item.id)).size).toBe(2) + expect(extractedItems).toEqual([ + { ...items[0], id: 111111 }, + { ...items[1], id: 222222 }, + ]) + expect(payload.items).toEqual(items) + }) + + it('extracts recipe items and regenerates unique ids for every item', () => { + const items = [ + createFoodItem(30, 'Tomato', 120), + createFoodItem(40, 'Cheese', 50), + ] + const payload = promoteRecipe( + createNewRecipe({ + name: 'Salad', + user_id: 'user-1', + items, + prepared_multiplier: 1.5, + }), + { id: 2 }, + ) + + vi.spyOn(Math, 'random') + .mockReturnValueOnce(0.333333) + .mockReturnValueOnce(0.444444) + + const extractedItems = ClipboardPayloadExt.extractItems(payload) + + expect(extractedItems).toHaveLength(2) + expectRegeneratedId(extractedItems[0]!.id, 333333) + expectRegeneratedId(extractedItems[1]!.id, 444444) + expect(new Set(extractedItems.map((item) => item.id)).size).toBe(2) + expect(extractedItems).toEqual([ + { ...items[0], id: 333333 }, + { ...items[1], id: 444444 }, + ]) + expect(payload.items).toEqual(items) + }) + }) +}) From de8c6976536fe73f62710f93a7bf33078851423e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:42:59 +0000 Subject: [PATCH 3/3] chore: finalize extractItems test coverage Co-authored-by: marcuscastelo <27441558+marcuscastelo@users.noreply.github.com> Agent-Logs-Url: https://github.com/marcuscastelo/macroflows/sessions/c8e8e26f-0883-4b65-9528-8780066ef999 --- .../domain/tests/clipboardPayloadExt.test.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts b/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts index cad492685..1d1be466f 100644 --- a/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts +++ b/src/modules/clipboard/domain/tests/clipboardPayloadExt.test.ts @@ -25,11 +25,14 @@ const createFoodItem = (id: number, name: string, quantity: number): Item => }, }) -const expectRegeneratedId = (actualId: number, expectedId: number): void => { - expect(actualId).toBe(expectedId) +const expectRegeneratedId = ( + actualId: number, + originalId: number, + randomValue: number, +): void => { + expect(actualId).toBe(Math.round(randomValue * 1000000)) + expect(actualId).not.toBe(originalId) expect(Number.isInteger(actualId)).toBe(true) - expect(actualId).toBeGreaterThanOrEqual(0) - expect(actualId).toBeLessThanOrEqual(1000000) } describe('ClipboardPayloadExt', () => { @@ -46,7 +49,7 @@ describe('ClipboardPayloadExt', () => { const extractedItems = ClipboardPayloadExt.extractItems(payload) expect(extractedItems).toHaveLength(1) - expectRegeneratedId(extractedItems[0]!.id, 123456) + expectRegeneratedId(extractedItems[0]!.id, payload.id, 0.123456) expect(extractedItems[0]).toEqual({ ...payload, id: 123456, @@ -70,9 +73,8 @@ describe('ClipboardPayloadExt', () => { const extractedItems = ClipboardPayloadExt.extractItems(payload) expect(extractedItems).toHaveLength(2) - expectRegeneratedId(extractedItems[0]!.id, 111111) - expectRegeneratedId(extractedItems[1]!.id, 222222) - expect(new Set(extractedItems.map((item) => item.id)).size).toBe(2) + expectRegeneratedId(extractedItems[0]!.id, items[0]!.id, 0.111111) + expectRegeneratedId(extractedItems[1]!.id, items[1]!.id, 0.222222) expect(extractedItems).toEqual([ { ...items[0], id: 111111 }, { ...items[1], id: 222222 }, @@ -102,9 +104,8 @@ describe('ClipboardPayloadExt', () => { const extractedItems = ClipboardPayloadExt.extractItems(payload) expect(extractedItems).toHaveLength(2) - expectRegeneratedId(extractedItems[0]!.id, 333333) - expectRegeneratedId(extractedItems[1]!.id, 444444) - expect(new Set(extractedItems.map((item) => item.id)).size).toBe(2) + expectRegeneratedId(extractedItems[0]!.id, items[0]!.id, 0.333333) + expectRegeneratedId(extractedItems[1]!.id, items[1]!.id, 0.444444) expect(extractedItems).toEqual([ { ...items[0], id: 333333 }, { ...items[1], id: 444444 },