From 9118a2d9ab683499ff70c8be0ecdf74c92eb81a4 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Mon, 11 Aug 2025 16:05:55 +0300 Subject: [PATCH] refactor(orders): streamline order creation logic and enhance test setup - Removed redundant variable assignments in the createOrder method for cleaner code. - Updated test setup in orders.test.js to use global mocks for user and service retrieval, improving test clarity and maintainability. - Added checks for required fields in order creation to ensure data integrity. --- packages/graphql/api/customers.ts | 8 +- packages/graphql/api/orders.test.js | 137 ++++++++-------------------- packages/graphql/api/orders.ts | 10 +- 3 files changed, 49 insertions(+), 106 deletions(-) diff --git a/packages/graphql/api/customers.ts b/packages/graphql/api/customers.ts index 6fc1dce..ab47e94 100644 --- a/packages/graphql/api/customers.ts +++ b/packages/graphql/api/customers.ts @@ -38,9 +38,7 @@ export class CustomersService extends BaseService { const result = await query({ query: GQL.GetClientsDocument, - variables: { - telegramId: variables?.telegramId || this._user.telegramId, - }, + variables, }); const customer = result.data.customers.at(0); @@ -66,9 +64,7 @@ export class CustomersService extends BaseService { const result = await query({ query: GQL.GetMastersDocument, - variables: { - telegramId: variables?.telegramId || this._user.telegramId, - }, + variables, }); const customer = result.data.customers.at(0); diff --git a/packages/graphql/api/orders.test.js b/packages/graphql/api/orders.test.js index c08ea58..0487789 100644 --- a/packages/graphql/api/orders.test.js +++ b/packages/graphql/api/orders.test.js @@ -91,6 +91,33 @@ describe('OrdersService', () => { beforeEach(() => { ordersService = new OrdersService(mockUser); vi.clearAllMocks(); + + // Глобальный мок для _getUser + vi.spyOn(ordersService, '_getUser').mockResolvedValue({ + customer: mockCustomer, + }); + + // Глобальные моки для сервисов + mockServicesService.mockImplementation(() => ({ + getService: vi.fn().mockResolvedValue({ + service: mockService, + }), + })); + + mockSlotsService.mockImplementation(() => ({ + getSlot: vi.fn().mockResolvedValue({ + slot: mockSlot, + }), + })); + + mockCustomersService.mockImplementation(() => ({ + getCustomer: vi.fn().mockResolvedValue({ + customer: mockCustomer, + }), + getMasters: vi.fn().mockResolvedValue({ + masters: [mockMaster], + }), + })); }); afterEach(() => { @@ -101,7 +128,6 @@ describe('OrdersService', () => { const mockVariables = { input: { client: 'customer-123', - datetime_end: now.add(1, 'hour').toISOString(), datetime_start: now.toISOString(), services: ['service-123'], slot: 'slot-123', @@ -134,33 +160,6 @@ describe('OrdersService', () => { query: mockQuery, }); - // Мокаем ServicesService.getService - const mockGetService = vi.fn().mockResolvedValue({ - service: mockService, - }); - mockServicesService.mockImplementation(() => ({ - getService: mockGetService, - })); - - // Мокаем SlotsService.getSlot - const mockGetSlot = vi.fn().mockResolvedValue({ - slot: mockSlot, - }); - mockSlotsService.mockImplementation(() => ({ - getSlot: mockGetSlot, - })); - - // Мокаем CustomersService.getCustomer - const mockGetCustomer = vi.fn().mockResolvedValue({ - customer: mockCustomer, - }); - mockCustomersService.mockImplementation(() => ({ - getCustomer: mockGetCustomer, - getMasters: vi.fn().mockResolvedValue({ - masters: [mockMaster], - }), - })); - const result = ordersService.createOrder(mockVariables); await expect(result).resolves.toBe(mockMutationResult.data); @@ -172,6 +171,11 @@ describe('OrdersService', () => { role: GQL.Enum_Customer_Role.Master, }; + // Переопределяем мок для мастера + vi.spyOn(ordersService, '_getUser').mockResolvedValue({ + customer: masterCustomer, + }); + const masterSlot = { ...mockSlot, master: masterCustomer, @@ -197,25 +201,17 @@ describe('OrdersService', () => { query: mockQuery, }); - const mockGetService = vi.fn().mockResolvedValue({ - service: mockService, - }); - mockServicesService.mockImplementation(() => ({ - getService: mockGetService, - })); - - const mockGetSlot = vi.fn().mockResolvedValue({ - slot: masterSlot, - }); + // Переопределяем моки для мастера mockSlotsService.mockImplementation(() => ({ - getSlot: mockGetSlot, + getSlot: vi.fn().mockResolvedValue({ + slot: masterSlot, + }), })); - const mockGetCustomer = vi.fn().mockResolvedValue({ - customer: masterCustomer, - }); mockCustomersService.mockImplementation(() => ({ - getCustomer: mockGetCustomer, + getCustomer: vi.fn().mockResolvedValue({ + customer: masterCustomer, + }), getMasters: vi.fn().mockResolvedValue({ masters: [masterCustomer], }), @@ -274,21 +270,6 @@ describe('OrdersService', () => { await expect(result).rejects.toThrow(ERRORS.MISSING_START_TIME); }); - it('should throw error when datetime_end is missing', async () => { - const variablesWithoutEnd = { - input: { - client: 'customer-123', - datetime_start: now.toISOString(), - services: ['service-123'], - slot: 'slot-123', - }, - }; - - const result = ordersService.createOrder(variablesWithoutEnd); - - await expect(result).rejects.toThrow(ERRORS.MISSING_END_TIME); - }); - it('should throw error when client is missing', async () => { const variablesWithoutClient = { input: { @@ -320,22 +301,6 @@ describe('OrdersService', () => { await expect(result).rejects.toThrow(ERRORS.NO_ORDER_IN_PAST); }); - it('should throw error when order time is invalid', async () => { - const variablesWithInvalidTime = { - input: { - client: 'customer-123', - datetime_end: now.toISOString(), // равно datetime_start - datetime_start: now.toISOString(), - services: ['service-123'], - slot: 'slot-123', - }, - }; - - const result = ordersService.createOrder(variablesWithInvalidTime); - - await expect(result).rejects.toThrow(ERRORS.INVALID_TIME); - }); - it('should throw error when slot is not found', async () => { const mockQuery = vi.fn().mockImplementation(({ query }) => { if (query === GQL.GetCustomerDocument) { @@ -769,30 +734,6 @@ describe('OrdersService', () => { query: mockQuery, }); - const mockGetService = vi.fn().mockResolvedValue({ - service: mockService, - }); - mockServicesService.mockImplementation(() => ({ - getService: mockGetService, - })); - - const mockGetSlot = vi.fn().mockResolvedValue({ - slot: mockSlot, - }); - mockSlotsService.mockImplementation(() => ({ - getSlot: mockGetSlot, - })); - - const mockGetCustomer = vi.fn().mockResolvedValue({ - customer: mockCustomer, - }); - mockCustomersService.mockImplementation(() => ({ - getCustomer: mockGetCustomer, - getMasters: vi.fn().mockResolvedValue({ - masters: [mockMaster], - }), - })); - await ordersService.createOrder(mockVariables); expect(mockMutate).toHaveBeenCalledWith({ diff --git a/packages/graphql/api/orders.ts b/packages/graphql/api/orders.ts index 5ea36f1..626f4d2 100644 --- a/packages/graphql/api/orders.ts +++ b/packages/graphql/api/orders.ts @@ -43,8 +43,6 @@ const DEFAULT_ORDERS_SORT = ['slot.datetime_start:desc', 'datetime_start:asc']; export class OrdersService extends BaseService { async createOrder(variables: VariablesOf) { - await this.checkBeforeCreate(variables); - const { customer } = await this._getUser(); // Проверки на существование обязательных полей для предотвращения ошибок типов @@ -65,6 +63,14 @@ export class OrdersService extends BaseService { .add(getMinutes(service.duration), 'minute') .toISOString(); + await this.checkBeforeCreate({ + ...variables, + input: { + ...variables.input, + datetime_end: datetimeEnd, + }, + }); + const { mutate } = await getClientWithToken(); const mutationResult = await mutate({