From 8c87b1a394c48d3a6d96fb2f931882c864305317 Mon Sep 17 00:00:00 2001 From: Ivan Ivashov Date: Sun, 21 Jun 2026 22:02:51 +0300 Subject: [PATCH 1/4] YH-2127: add mock endpoint for collection edit --- src/app/msw/handlers.ts | 2 ++ .../api/__mocks__/editCollectionMock.ts | 27 +++++++++++++++++++ .../editCollection/api/__mocks__/index.ts | 3 +++ .../collections/editCollection/index.ts | 1 + 4 files changed, 33 insertions(+) create mode 100644 src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts create mode 100644 src/features/collections/editCollection/api/__mocks__/index.ts diff --git a/src/app/msw/handlers.ts b/src/app/msw/handlers.ts index 76574203b..a4388d5fc 100644 --- a/src/app/msw/handlers.ts +++ b/src/app/msw/handlers.ts @@ -23,6 +23,7 @@ import { userHandlers } from '@/entities/user'; import { usersRatingHandlers } from '@/entities/user'; import { createCollectionHandlers } from '@/features/collections/createCollection'; +import { collectionEditHandlers } from '@/features/collections/editCollection'; import { createCompanyHandlers } from '@/features/company/createCompany'; import { createFeatureFlagHandlers } from '@/features/featureFlag/createFeatureFlag'; import { featureFlagDeleteHandlers } from '@/features/featureFlag/deleteFeatureFlag'; @@ -51,6 +52,7 @@ export const handlers = [ ...interviewHandlers, ...questionHandlers, ...collectionHandlers, + ...collectionEditHandlers, ...specializationHandlers, ...featureFlagHandlers, ...questionCreateHandlers, diff --git a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts new file mode 100644 index 000000000..63003d8f0 --- /dev/null +++ b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts @@ -0,0 +1,27 @@ +import { http } from 'msw'; + +import { collectionsMock } from '@/entities/collection'; + +import { editCollectionApiUrls } from '../../model/constants/editCollectionConstants'; + +export const editCollectionMock = http.patch( + process.env.API_URL + editCollectionApiUrls.editCollection, + async ({ params, request }) => { + const collectionId = Number(params.collectionId); + + const index = collectionsMock.data.findIndex((collection) => collection.id === collectionId); + + if (index === -1) { + return new Response(null, { status: 404 }); + } + + const body = (await request.json()) as Record; + + collectionsMock.data[index] = { + ...collectionsMock.data[index], + ...body, + }; + + return new Response(JSON.stringify(collectionsMock.data[index])); + }, +); diff --git a/src/features/collections/editCollection/api/__mocks__/index.ts b/src/features/collections/editCollection/api/__mocks__/index.ts new file mode 100644 index 000000000..be6dfb328 --- /dev/null +++ b/src/features/collections/editCollection/api/__mocks__/index.ts @@ -0,0 +1,3 @@ +import { editCollectionMock } from './editCollectionMock'; + +export const collectionEditHandlers = [editCollectionMock]; diff --git a/src/features/collections/editCollection/index.ts b/src/features/collections/editCollection/index.ts index 825247b24..62ce2c7e7 100644 --- a/src/features/collections/editCollection/index.ts +++ b/src/features/collections/editCollection/index.ts @@ -1 +1,2 @@ export { CollectionEditForm } from './ui/CollectionEditForm/CollectionEditForm'; +export { collectionEditHandlers } from './api/__mocks__/index'; From 6789d4f699ed472b0c7cc3f14b98a8641f971bbe Mon Sep 17 00:00:00 2001 From: Ivan Ivashov Date: Sun, 28 Jun 2026 16:35:51 +0300 Subject: [PATCH 2/4] YH-2127: fix editCollectionMock --- .../api/__mocks__/editCollectionMock.ts | 69 ++++++++++++------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts index 63003d8f0..8ed457a3d 100644 --- a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts +++ b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts @@ -1,27 +1,50 @@ -import { http } from 'msw'; +import { http, HttpResponse } from 'msw'; import { collectionsMock } from '@/entities/collection'; +import { companiesMock } from '@/entities/company'; +import { Question } from '@/entities/question'; +import { specializationsMock } from '@/entities/specialization'; import { editCollectionApiUrls } from '../../model/constants/editCollectionConstants'; - -export const editCollectionMock = http.patch( - process.env.API_URL + editCollectionApiUrls.editCollection, - async ({ params, request }) => { - const collectionId = Number(params.collectionId); - - const index = collectionsMock.data.findIndex((collection) => collection.id === collectionId); - - if (index === -1) { - return new Response(null, { status: 404 }); - } - - const body = (await request.json()) as Record; - - collectionsMock.data[index] = { - ...collectionsMock.data[index], - ...body, - }; - - return new Response(JSON.stringify(collectionsMock.data[index])); - }, -); +import { + EditCollectionBodyRequest, + EditCollectionResponse, +} from '../../model/types/collectionEditTypes'; + +export const editCollectionMock = http.patch< + { collectionId: string }, + EditCollectionBodyRequest, + EditCollectionResponse +>(process.env.API_URL + editCollectionApiUrls.editCollection, async ({ params, request }) => { + const collectionId = Number(params.collectionId); + + const index = collectionsMock.data.findIndex((collection) => collection.id === collectionId); + + if (index === -1) { + return HttpResponse.json(null, { status: 404 }); + } + + const body = (await request.json()) as EditCollectionBodyRequest; + const company = body.companyId + ? companiesMock.data.find((c) => String(c.id) === body.companyId) + : collectionsMock.data[index].company; + + if (body.companyId && !company) { + return new HttpResponse(null, { status: 404 }); + } + + collectionsMock.data[index] = { + ...collectionsMock.data[index], + ...body, + company: company || collectionsMock.data[index].company, + specializations: body.specializations + ? body.specializations.map((id) => specializationsMock.find((spec) => spec.id === id)!) + : collectionsMock.data[index].specializations, + questions: body.questions + ? body.questions.map((id) => ({ id }) as Question) + : collectionsMock.data[index].questions, + updatedAt: new Date().toISOString(), + }; + + return HttpResponse.json(collectionsMock.data[index]); +}); From 7b90dc4c193c7e33cce06c51717732a53e89a7f1 Mon Sep 17 00:00:00 2001 From: Ivan Ivashov Date: Sun, 28 Jun 2026 18:53:45 +0300 Subject: [PATCH 3/4] YH-2127: fix editCollectionMock --- .../api/__mocks__/editCollectionMock.ts | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts index 8ed457a3d..1993def87 100644 --- a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts +++ b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts @@ -4,6 +4,7 @@ import { collectionsMock } from '@/entities/collection'; import { companiesMock } from '@/entities/company'; import { Question } from '@/entities/question'; import { specializationsMock } from '@/entities/specialization'; +import { Task } from '@/entities/task'; import { editCollectionApiUrls } from '../../model/constants/editCollectionConstants'; import { @@ -33,18 +34,32 @@ export const editCollectionMock = http.patch< return new HttpResponse(null, { status: 404 }); } - collectionsMock.data[index] = { - ...collectionsMock.data[index], - ...body, - company: company || collectionsMock.data[index].company, + const currentCollection = collectionsMock.data[index]; + + const updatedCollection: EditCollectionResponse = { + id: currentCollection.id, + title: body.title ?? currentCollection.title, + description: body.description ?? currentCollection.description, + isFree: body.isFree ?? currentCollection.isFree, + imageSrc: body.collectionImage ?? currentCollection.imageSrc ?? null, + tariff: (body.isFree ?? currentCollection.isFree) ? 'free' : 'premium', + createdAt: currentCollection.createdAt, + updatedAt: new Date().toISOString(), + questionsCount: body.questions?.length ?? currentCollection.questions?.length ?? 0, + tasksCount: body.taskIds?.length ?? currentCollection.tasks?.length ?? 0, specializations: body.specializations ? body.specializations.map((id) => specializationsMock.find((spec) => spec.id === id)!) - : collectionsMock.data[index].specializations, + : currentCollection.specializations, + keywords: body.keywords ?? currentCollection.keywords ?? [], + company: company ?? currentCollection.company, + createdBy: currentCollection.createdBy, questions: body.questions ? body.questions.map((id) => ({ id }) as Question) - : collectionsMock.data[index].questions, - updatedAt: new Date().toISOString(), + : currentCollection.questions, + tasks: body.taskIds ? body.taskIds.map((id) => ({ id }) as Task) : currentCollection.tasks, }; - return HttpResponse.json(collectionsMock.data[index]); + collectionsMock.data[index] = updatedCollection; + + return HttpResponse.json(updatedCollection); }); From 92bc321f4d8845a161fbe81ef4005998c5f6e8c4 Mon Sep 17 00:00:00 2001 From: Ivan Ivashov Date: Mon, 29 Jun 2026 22:52:51 +0300 Subject: [PATCH 4/4] YH-2127: fix editCollectionMock --- .../api/__mocks__/editCollectionMock.ts | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts index 1993def87..a2970840f 100644 --- a/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts +++ b/src/features/collections/editCollection/api/__mocks__/editCollectionMock.ts @@ -2,9 +2,7 @@ import { http, HttpResponse } from 'msw'; import { collectionsMock } from '@/entities/collection'; import { companiesMock } from '@/entities/company'; -import { Question } from '@/entities/question'; import { specializationsMock } from '@/entities/specialization'; -import { Task } from '@/entities/task'; import { editCollectionApiUrls } from '../../model/constants/editCollectionConstants'; import { @@ -25,38 +23,25 @@ export const editCollectionMock = http.patch< return HttpResponse.json(null, { status: 404 }); } - const body = (await request.json()) as EditCollectionBodyRequest; - const company = body.companyId - ? companiesMock.data.find((c) => String(c.id) === body.companyId) - : collectionsMock.data[index].company; - - if (body.companyId && !company) { - return new HttpResponse(null, { status: 404 }); - } + const body = await request.json(); const currentCollection = collectionsMock.data[index]; + const companyIndex = companiesMock.data.findIndex((c) => String(c.id) === body.companyId); const updatedCollection: EditCollectionResponse = { - id: currentCollection.id, + ...currentCollection, title: body.title ?? currentCollection.title, description: body.description ?? currentCollection.description, - isFree: body.isFree ?? currentCollection.isFree, imageSrc: body.collectionImage ?? currentCollection.imageSrc ?? null, tariff: (body.isFree ?? currentCollection.isFree) ? 'free' : 'premium', - createdAt: currentCollection.createdAt, - updatedAt: new Date().toISOString(), questionsCount: body.questions?.length ?? currentCollection.questions?.length ?? 0, tasksCount: body.taskIds?.length ?? currentCollection.tasks?.length ?? 0, specializations: body.specializations ? body.specializations.map((id) => specializationsMock.find((spec) => spec.id === id)!) : currentCollection.specializations, keywords: body.keywords ?? currentCollection.keywords ?? [], - company: company ?? currentCollection.company, + company: companiesMock.data[companyIndex], createdBy: currentCollection.createdBy, - questions: body.questions - ? body.questions.map((id) => ({ id }) as Question) - : currentCollection.questions, - tasks: body.taskIds ? body.taskIds.map((id) => ({ id }) as Task) : currentCollection.tasks, }; collectionsMock.data[index] = updatedCollection;