From 8877c04d72be0b6f2162e44c615dfb19cc6d9817 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:56:07 +0100 Subject: [PATCH 01/21] Added missing packages --- apps/backend/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/backend/package.json b/apps/backend/package.json index a916cf7..1b74623 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -31,12 +31,16 @@ "@nestjs/config": "^4.0.0", "@nestjs/core": "^11.0.1", "@nestjs/graphql": "^13.0.2", + "@nestjs/jwt": "^11.0.0", "@nestjs/mapped-types": "*", + "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.7", "@prisma/client": "^6.3.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "graphql": "^16.10.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "slugify": "^1.6.6" From 22234290d68ef25a1ccead7efd689be324008cdb Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:56:32 +0100 Subject: [PATCH 02/21] Added model for order and orderStatus --- apps/backend/prisma/schema.prisma | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/backend/prisma/schema.prisma b/apps/backend/prisma/schema.prisma index b0745bb..a2bcdc9 100644 --- a/apps/backend/prisma/schema.prisma +++ b/apps/backend/prisma/schema.prisma @@ -29,7 +29,7 @@ model Product { slug String @unique images ProductImage[] category Category @relation(fields: [categoryId], references: [id]) - + orders Order[] @@map("products") } @@ -74,7 +74,23 @@ model Message { @@map("messages") } +enum OrderStatus { + PENDING + ON_DISPUTE + FOR_REVIEW + APPROVED +} + model Order { - id String @id @default(uuid()) + id String @id @default(uuid()) + product_id String + buyer_address String + seller_address String + escrow_id String + status OrderStatus @default(PENDING) + created_at DateTime @default(now()) + updated_at DateTime @updatedAt messages Message[] -} + + product Product @relation(fields: [product_id], references: [id]) +} \ No newline at end of file From 5f5693bf414f568d309accbfb45f488a46588a47 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:57:22 +0100 Subject: [PATCH 03/21] Added the order module in core modules --- apps/backend/src/core/core.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/backend/src/core/core.module.ts b/apps/backend/src/core/core.module.ts index 917de9f..1fe790d 100644 --- a/apps/backend/src/core/core.module.ts +++ b/apps/backend/src/core/core.module.ts @@ -12,6 +12,7 @@ import { getGraphQLConfig } from "./config/graphql.config"; import { PrismaModule } from "./prisma/prisma.module"; import { AuthModule } from "src/auth/auth.module"; +import { OrderModule } from "src/modules/order/order.module"; @Module({ imports: [ AuthModule, @@ -30,6 +31,7 @@ import { AuthModule } from "src/auth/auth.module"; ProductModule, ProductImageModule, UsersModule, + OrderModule ], controllers: [], providers: [], From 2184b05ee25d322ea46c6881e19473cc620b76c8 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:58:03 +0100 Subject: [PATCH 04/21] Generate graphql schema --- apps/backend/src/core/graphql/schema.gql | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/apps/backend/src/core/graphql/schema.gql b/apps/backend/src/core/graphql/schema.gql index 3248a1f..db7bf24 100644 --- a/apps/backend/src/core/graphql/schema.gql +++ b/apps/backend/src/core/graphql/schema.gql @@ -14,6 +14,14 @@ input CreateCategoryInput { name: String! } +input CreateOrderInput { + buyerAddress: String! + escrowId: String! + productId: String! + sellerAddress: String! + status: OrderStatus! = PENDING +} + input CreateProductInput { categoryId: String! description: String @@ -39,12 +47,32 @@ scalar DateTime type Mutation { createCategory(data: CreateCategoryInput!): Category! + createOrder(data: CreateOrderInput!): Order! createProduct(data: CreateProductInput!): ProductDTO! createProductImage(createProductImage: ProductImageDTO!): ProductImage! createUser(data: CreateUserInput!): User! + updateOrderStatus(data: UpdateOrderStatusInput!): Order! updateUser(data: UpdateUserInput!, walletAddress: String!): User! } +type Order { + buyer_address: String! + created_at: DateTime! + escrow_id: String! + id: String! + product_id: String! + seller_address: String! + status: OrderStatus! + updated_at: DateTime! +} + +enum OrderStatus { + APPROVED + FOR_REVIEW + ON_DISPUTE + PENDING +} + type ProductDTO { categoryId: String! createdAt: DateTime! @@ -72,6 +100,9 @@ input ProductImageDTO { type Query { categories: [Category!]! category(id: String!): Category + getOrder(orderId: String!): Order! + getOrdersByBuyer(buyerAddress: String!): [Order!]! + getOrdersBySeller(sellerAddress: String!): [Order!]! product(id: String!): ProductDTO productImage(id: String!): ProductImage productImages: [ProductImage!]! @@ -80,6 +111,11 @@ type Query { users: [User!]! } +input UpdateOrderStatusInput { + orderId: String! + status: OrderStatus! +} + input UpdateUserInput { country: String email: String From 1610000519487a5404dc122c26cee22c5e542a7a Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:58:23 +0100 Subject: [PATCH 05/21] minor changes due to package installation --- package-lock.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package-lock.json b/package-lock.json index cb773ab..cb99cb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,12 +37,16 @@ "@nestjs/config": "^4.0.0", "@nestjs/core": "^11.0.1", "@nestjs/graphql": "^13.0.2", + "@nestjs/jwt": "^11.0.0", "@nestjs/mapped-types": "*", + "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.7", "@prisma/client": "^6.3.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "graphql": "^16.10.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "slugify": "^1.6.6" From bf96ae1a16bcaaf44d08a1bbdfb15274224c1b37 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 07:58:53 +0100 Subject: [PATCH 06/21] Succesful generation of migrations new_order --- .../20250426051812_add_orders/migration.sql | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 apps/backend/prisma/migrations/20250426051812_add_orders/migration.sql diff --git a/apps/backend/prisma/migrations/20250426051812_add_orders/migration.sql b/apps/backend/prisma/migrations/20250426051812_add_orders/migration.sql new file mode 100644 index 0000000..458ec20 --- /dev/null +++ b/apps/backend/prisma/migrations/20250426051812_add_orders/migration.sql @@ -0,0 +1,24 @@ +/* + Warnings: + + - Added the required column `buyer_address` to the `Order` table without a default value. This is not possible if the table is not empty. + - Added the required column `escrow_id` to the `Order` table without a default value. This is not possible if the table is not empty. + - Added the required column `product_id` to the `Order` table without a default value. This is not possible if the table is not empty. + - Added the required column `seller_address` to the `Order` table without a default value. This is not possible if the table is not empty. + - Added the required column `updated_at` to the `Order` table without a default value. This is not possible if the table is not empty. + +*/ +-- CreateEnum +CREATE TYPE "OrderStatus" AS ENUM ('PENDING', 'ON_DISPUTE', 'FOR_REVIEW', 'APPROVED'); + +-- AlterTable +ALTER TABLE "Order" ADD COLUMN "buyer_address" TEXT NOT NULL, +ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "escrow_id" TEXT NOT NULL, +ADD COLUMN "product_id" TEXT NOT NULL, +ADD COLUMN "seller_address" TEXT NOT NULL, +ADD COLUMN "status" "OrderStatus" NOT NULL DEFAULT 'PENDING', +ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL; + +-- AddForeignKey +ALTER TABLE "Order" ADD CONSTRAINT "Order_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE; From 44b1b86b928c6bb09e74f687d7684f4851a7b552 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:00:29 +0100 Subject: [PATCH 07/21] Created the create order, update order and update order status dtos --- .../modules/order/dto/create-order.input.ts | 20 +++++++++++++++++++ .../order/dto/update-order-status.input.ts | 11 ++++++++++ .../modules/order/dto/update-order.input.ts | 8 ++++++++ 3 files changed, 39 insertions(+) create mode 100644 apps/backend/src/modules/order/dto/create-order.input.ts create mode 100644 apps/backend/src/modules/order/dto/update-order-status.input.ts create mode 100644 apps/backend/src/modules/order/dto/update-order.input.ts diff --git a/apps/backend/src/modules/order/dto/create-order.input.ts b/apps/backend/src/modules/order/dto/create-order.input.ts new file mode 100644 index 0000000..66425ee --- /dev/null +++ b/apps/backend/src/modules/order/dto/create-order.input.ts @@ -0,0 +1,20 @@ +import { InputType, Field } from '@nestjs/graphql'; +import { OrderStatus } from '../entities/order.entity'; + +@InputType() +export class CreateOrderInput { + @Field() + productId: string; + + @Field() + buyerAddress: string; + + @Field() + sellerAddress: string; + + @Field() + escrowId: string; + + @Field(() => OrderStatus, { defaultValue: OrderStatus.PENDING }) + status: OrderStatus; +} diff --git a/apps/backend/src/modules/order/dto/update-order-status.input.ts b/apps/backend/src/modules/order/dto/update-order-status.input.ts new file mode 100644 index 0000000..95ce0b5 --- /dev/null +++ b/apps/backend/src/modules/order/dto/update-order-status.input.ts @@ -0,0 +1,11 @@ +import { InputType, Field } from '@nestjs/graphql'; +import { OrderStatus } from '../entities/order.entity'; + +@InputType() +export class UpdateOrderStatusInput { + @Field() + orderId: string; + + @Field(() => OrderStatus) + status: OrderStatus; +} \ No newline at end of file diff --git a/apps/backend/src/modules/order/dto/update-order.input.ts b/apps/backend/src/modules/order/dto/update-order.input.ts new file mode 100644 index 0000000..10f31a1 --- /dev/null +++ b/apps/backend/src/modules/order/dto/update-order.input.ts @@ -0,0 +1,8 @@ +import { CreateOrderInput } from './create-order.input'; +import { InputType, Field, Int, PartialType } from '@nestjs/graphql'; + +@InputType() +export class UpdateOrderInput extends PartialType(CreateOrderInput) { + @Field(() => Int) + id: number; +} From 2aec2dc02cf4e718d694814a29bba12d0f15b8a1 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:00:50 +0100 Subject: [PATCH 08/21] Created the order entity --- .../modules/order/entities/order.entity.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 apps/backend/src/modules/order/entities/order.entity.ts diff --git a/apps/backend/src/modules/order/entities/order.entity.ts b/apps/backend/src/modules/order/entities/order.entity.ts new file mode 100644 index 0000000..b6abae4 --- /dev/null +++ b/apps/backend/src/modules/order/entities/order.entity.ts @@ -0,0 +1,39 @@ +import { ObjectType, Field, registerEnumType } from '@nestjs/graphql'; + +export enum OrderStatus { + PENDING = 'PENDING', + ON_DISPUTE = 'ON_DISPUTE', + FOR_REVIEW = 'FOR_REVIEW', + APPROVED = 'APPROVED', +} + +registerEnumType(OrderStatus, { + name: 'OrderStatus', +}); + +@ObjectType() +export class Order { + @Field() + id: string; + + @Field() + product_id: string; + + @Field() + buyer_address: string; + + @Field() + seller_address: string; + + @Field() + escrow_id: string; + + @Field(() => OrderStatus) + status: OrderStatus; + + @Field() + created_at: Date; + + @Field() + updated_at: Date; +} From 7971121b7d7451b94966489f2dda11b31011c80f Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:01:18 +0100 Subject: [PATCH 09/21] Created the order service --- .../src/modules/order/order.service.ts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 apps/backend/src/modules/order/order.service.ts diff --git a/apps/backend/src/modules/order/order.service.ts b/apps/backend/src/modules/order/order.service.ts new file mode 100644 index 0000000..6be261a --- /dev/null +++ b/apps/backend/src/modules/order/order.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from 'src/core/prisma/prisma.service'; +import { CreateOrderInput } from './dto/create-order.input'; +import { UpdateOrderStatusInput } from './dto/update-order-status.input'; +import { OrderStatus } from './entities/order.entity'; +import { Args } from '@nestjs/graphql'; + +@Injectable() +export class OrderService { + constructor(private prisma: PrismaService) {} + + create(data: CreateOrderInput) { + return this.prisma.order.create({ + data: { + product_id: data.productId, + buyer_address: data.buyerAddress, + seller_address: data.sellerAddress, + escrow_id: data.escrowId, + status: data.status, + }, + }); + } + + findAllByBuyer(buyerAddress: string) { + return this.prisma.order.findMany({ + where: { buyer_address: buyerAddress }, + }); + } + + findAllBySeller(sellerAddress: string) { + return this.prisma.order.findMany({ + where: { seller_address: sellerAddress }, + }); + } + + findOne(id: string) { + return this.prisma.order.findUnique({ where: { id } }); + } + + updateStatus(orderId: string, status: OrderStatus) { + return this.prisma.order.update({ + where: { id: orderId }, + data: { status }, + }); + } +} From 3133796e62c039da1e73d6f3d90ba375e0af3da8 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:01:37 +0100 Subject: [PATCH 10/21] Created the order resolver --- .../src/modules/order/order.resolver.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 apps/backend/src/modules/order/order.resolver.ts diff --git a/apps/backend/src/modules/order/order.resolver.ts b/apps/backend/src/modules/order/order.resolver.ts new file mode 100644 index 0000000..648d928 --- /dev/null +++ b/apps/backend/src/modules/order/order.resolver.ts @@ -0,0 +1,35 @@ +import { Resolver, Query, Mutation, Args } from '@nestjs/graphql'; +import { OrderService } from './order.service'; +import { Order, OrderStatus } from './entities/order.entity'; +import { CreateOrderInput } from './dto/create-order.input'; +import { UpdateOrderStatusInput } from './dto/update-order-status.input'; + +@Resolver(() => Order) +export class OrderResolver { + constructor(private readonly ordersService: OrderService) {} + + @Query(() => [Order], { name: 'getOrdersByBuyer' }) + getOrdersByBuyer(@Args('buyerAddress') buyerAddress: string) { + return this.ordersService.findAllByBuyer(buyerAddress); + } + + @Query(() => [Order], { name: 'getOrdersBySeller' }) + getOrdersBySeller(@Args('sellerAddress') sellerAddress: string) { + return this.ordersService.findAllBySeller(sellerAddress); + } + + @Query(() => Order, { name: 'getOrder' }) + getOrder(@Args('orderId') orderId: string) { + return this.ordersService.findOne(orderId); + } + + @Mutation(() => Order) + createOrder(@Args('data') data: CreateOrderInput) { + return this.ordersService.create(data); + } + + @Mutation(() => Order) + updateOrderStatus(@Args('data') data: UpdateOrderStatusInput) { + return this.ordersService.updateStatus(data.orderId, data.status); + } +} From 437e3a92d5b5940672f336ccbc389edf89397927 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:01:56 +0100 Subject: [PATCH 11/21] Created the order module --- apps/backend/src/modules/order/order.module.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 apps/backend/src/modules/order/order.module.ts diff --git a/apps/backend/src/modules/order/order.module.ts b/apps/backend/src/modules/order/order.module.ts new file mode 100644 index 0000000..cd9da24 --- /dev/null +++ b/apps/backend/src/modules/order/order.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; +import { OrderService } from './order.service'; +import { OrderResolver } from './order.resolver'; + +@Module({ + providers: [OrderResolver, OrderService], +}) +export class OrderModule {} From 19264227903853b9d85fb10518ddeced0e88c2e4 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:06:30 +0100 Subject: [PATCH 12/21] Wrote explicit and complete test coverage for order resolver --- .../src/modules/order/order.resolver.spec.ts | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 apps/backend/src/modules/order/order.resolver.spec.ts diff --git a/apps/backend/src/modules/order/order.resolver.spec.ts b/apps/backend/src/modules/order/order.resolver.spec.ts new file mode 100644 index 0000000..b063981 --- /dev/null +++ b/apps/backend/src/modules/order/order.resolver.spec.ts @@ -0,0 +1,175 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { OrderResolver } from './order.resolver'; +import { OrderService } from './order.service'; +import { OrderStatus } from './entities/order.entity'; +import { CreateOrderInput } from './dto/create-order.input'; +import { UpdateOrderStatusInput } from './dto/update-order-status.input'; + +describe('OrderResolver', () => { + let resolver: OrderResolver; + let orderService: OrderService; + + const mockOrderService = { + create: jest.fn(), + findAllByBuyer: jest.fn(), + findAllBySeller: jest.fn(), + findOne: jest.fn(), + updateStatus: jest.fn(), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + OrderResolver, + { + provide: OrderService, + useValue: mockOrderService, + }, + ], + }).compile(); + + resolver = module.get(OrderResolver); + orderService = module.get(OrderService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(resolver).toBeDefined(); + }); + + describe('getOrdersByBuyer', () => { + it('should return orders for a specific buyer', async () => { + const buyerAddress = 'buyer-address-123'; + const mockOrders = [ + { + id: 'order-123', + product_id: 'product-123', + buyer_address: buyerAddress, + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + mockOrderService.findAllByBuyer.mockResolvedValue(mockOrders); + + const result = await resolver.getOrdersByBuyer(buyerAddress); + + expect(mockOrderService.findAllByBuyer).toHaveBeenCalledWith(buyerAddress); + expect(result).toEqual(mockOrders); + }); + }); + + describe('getOrdersBySeller', () => { + it('should return orders for a specific seller', async () => { + const sellerAddress = 'seller-address-123'; + const mockOrders = [ + { + id: 'order-123', + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: sellerAddress, + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + mockOrderService.findAllBySeller.mockResolvedValue(mockOrders); + + const result = await resolver.getOrdersBySeller(sellerAddress); + + expect(mockOrderService.findAllBySeller).toHaveBeenCalledWith(sellerAddress); + expect(result).toEqual(mockOrders); + }); + }); + + describe('getOrder', () => { + it('should return a single order by ID', async () => { + const orderId = 'order-123'; + const mockOrder = { + id: orderId, + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }; + + mockOrderService.findOne.mockResolvedValue(mockOrder); + + const result = await resolver.getOrder(orderId); + + expect(mockOrderService.findOne).toHaveBeenCalledWith(orderId); + expect(result).toEqual(mockOrder); + }); + }); + + describe('createOrder', () => { + it('should create a new order', async () => { + const orderData: CreateOrderInput = { + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + }; + + const mockOrder = { + id: 'order-123', + product_id: orderData.productId, + buyer_address: orderData.buyerAddress, + seller_address: orderData.sellerAddress, + escrow_id: orderData.escrowId, + status: orderData.status, + created_at: new Date(), + updated_at: new Date(), + }; + + mockOrderService.create.mockResolvedValue(mockOrder); + + const result = await resolver.createOrder(orderData); + + expect(mockOrderService.create).toHaveBeenCalledWith(orderData); + expect(result).toEqual(mockOrder); + }); + }); + + describe('updateOrderStatus', () => { + it('should update an order status', async () => { + const orderId = 'order-123'; + const newStatus = OrderStatus.APPROVED; + + const updateData: UpdateOrderStatusInput = { + orderId: orderId, + status: newStatus, + }; + + const mockOrder = { + id: orderId, + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: newStatus, + created_at: new Date(), + updated_at: new Date(), + }; + + mockOrderService.updateStatus.mockResolvedValue(mockOrder); + + const result = await resolver.updateOrderStatus(updateData); + + expect(mockOrderService.updateStatus).toHaveBeenCalledWith(orderId, newStatus); + expect(result).toEqual(mockOrder); + }); + }); +}); \ No newline at end of file From 3a25beed10ab4b034ea6c156649173c5c5b9380a Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sat, 26 Apr 2025 08:06:53 +0100 Subject: [PATCH 13/21] Wrote explicit and complete test coverage for order service --- .../src/modules/order/order.service.spec.ts | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 apps/backend/src/modules/order/order.service.spec.ts diff --git a/apps/backend/src/modules/order/order.service.spec.ts b/apps/backend/src/modules/order/order.service.spec.ts new file mode 100644 index 0000000..c4d3c57 --- /dev/null +++ b/apps/backend/src/modules/order/order.service.spec.ts @@ -0,0 +1,185 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { OrderService } from './order.service'; +import { PrismaService } from 'src/core/prisma/prisma.service'; +import { OrderStatus } from './entities/order.entity'; + +describe('OrderService', () => { + let service: OrderService; + let prismaService: PrismaService; + + const mockPrismaService = { + order: { + create: jest.fn(), + findMany: jest.fn(), + findUnique: jest.fn(), + update: jest.fn(), + }, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + OrderService, + { + provide: PrismaService, + useValue: mockPrismaService, + }, + ], + }).compile(); + + service = module.get(OrderService); + prismaService = module.get(PrismaService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('create', () => { + it('should create a new order', async () => { + const orderData = { + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + }; + + const expectedOrder = { + id: 'order-123', + product_id: orderData.productId, + buyer_address: orderData.buyerAddress, + seller_address: orderData.sellerAddress, + escrow_id: orderData.escrowId, + status: orderData.status, + created_at: new Date(), + updated_at: new Date(), + }; + + mockPrismaService.order.create.mockResolvedValue(expectedOrder); + + const result = await service.create(orderData); + + expect(mockPrismaService.order.create).toHaveBeenCalledWith({ + data: { + product_id: orderData.productId, + buyer_address: orderData.buyerAddress, + seller_address: orderData.sellerAddress, + escrow_id: orderData.escrowId, + status: orderData.status, + }, + }); + expect(result).toEqual(expectedOrder); + }); + }); + + describe('findAllByBuyer', () => { + it('should return orders for a specific buyer', async () => { + const buyerAddress = 'buyer-address-123'; + const mockOrders = [ + { + id: 'order-123', + product_id: 'product-123', + buyer_address: buyerAddress, + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + mockPrismaService.order.findMany.mockResolvedValue(mockOrders); + + const result = await service.findAllByBuyer(buyerAddress); + + expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ + where: { buyer_address: buyerAddress }, + }); + expect(result).toEqual(mockOrders); + }); + }); + + describe('findAllBySeller', () => { + it('should return orders for a specific seller', async () => { + const sellerAddress = 'seller-address-123'; + const mockOrders = [ + { + id: 'order-123', + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: sellerAddress, + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + mockPrismaService.order.findMany.mockResolvedValue(mockOrders); + + const result = await service.findAllBySeller(sellerAddress); + + expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ + where: { seller_address: sellerAddress }, + }); + expect(result).toEqual(mockOrders); + }); + }); + + describe('findOne', () => { + it('should return a single order by ID', async () => { + const orderId = 'order-123'; + const mockOrder = { + id: orderId, + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: OrderStatus.PENDING, + created_at: new Date(), + updated_at: new Date(), + }; + + mockPrismaService.order.findUnique.mockResolvedValue(mockOrder); + + const result = await service.findOne(orderId); + + expect(mockPrismaService.order.findUnique).toHaveBeenCalledWith({ + where: { id: orderId }, + }); + expect(result).toEqual(mockOrder); + }); + }); + + describe('updateStatus', () => { + it('should update an order status', async () => { + const orderId = 'order-123'; + const newStatus = OrderStatus.APPROVED; + const mockOrder = { + id: orderId, + product_id: 'product-123', + buyer_address: 'buyer-address-123', + seller_address: 'seller-address-123', + escrow_id: 'escrow-123', + status: newStatus, + created_at: new Date(), + updated_at: new Date(), + }; + + mockPrismaService.order.update.mockResolvedValue(mockOrder); + + const result = await service.updateStatus(orderId, newStatus); + + expect(mockPrismaService.order.update).toHaveBeenCalledWith({ + where: { id: orderId }, + data: { status: newStatus }, + }); + expect(result).toEqual(mockOrder); + }); + }); +}); \ No newline at end of file From d329cb6ff994291aa817a490b36f000799e25c07 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sun, 27 Apr 2025 03:00:28 +0100 Subject: [PATCH 14/21] updated Order model to map camelCase named fields to snake_case named fields --- apps/backend/prisma/schema.prisma | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/apps/backend/prisma/schema.prisma b/apps/backend/prisma/schema.prisma index a2bcdc9..88d0b7c 100644 --- a/apps/backend/prisma/schema.prisma +++ b/apps/backend/prisma/schema.prisma @@ -82,15 +82,17 @@ enum OrderStatus { } model Order { - id String @id @default(uuid()) - product_id String - buyer_address String - seller_address String - escrow_id String - status OrderStatus @default(PENDING) - created_at DateTime @default(now()) - updated_at DateTime @updatedAt - messages Message[] - - product Product @relation(fields: [product_id], references: [id]) + id String @id @default(uuid()) + productId String @map("product_id") + buyerAddress String @map("buyer_address") + sellerAddress String @map("seller_address") + escrowId String @map("escrow_id") + status OrderStatus @default(PENDING) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + messages Message[] + + product Product @relation(fields: [productId], references: [id]) + + @@map("orders") } \ No newline at end of file From 2f45f43e6ef2ee6062386af087f8b5f8b6cd866a Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sun, 27 Apr 2025 03:01:19 +0100 Subject: [PATCH 15/21] Created an updated migration --- .../migration.sql | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/backend/prisma/migrations/20250427015007_update_order_field_name_convention/migration.sql diff --git a/apps/backend/prisma/migrations/20250427015007_update_order_field_name_convention/migration.sql b/apps/backend/prisma/migrations/20250427015007_update_order_field_name_convention/migration.sql new file mode 100644 index 0000000..f95a3fe --- /dev/null +++ b/apps/backend/prisma/migrations/20250427015007_update_order_field_name_convention/migration.sql @@ -0,0 +1,34 @@ +/* + Warnings: + + - You are about to drop the `Order` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Order" DROP CONSTRAINT "Order_product_id_fkey"; + +-- DropForeignKey +ALTER TABLE "messages" DROP CONSTRAINT "messages_order_id_fkey"; + +-- DropTable +DROP TABLE "Order"; + +-- CreateTable +CREATE TABLE "orders" ( + "id" TEXT NOT NULL, + "product_id" TEXT NOT NULL, + "buyer_address" TEXT NOT NULL, + "seller_address" TEXT NOT NULL, + "escrow_id" TEXT NOT NULL, + "status" "OrderStatus" NOT NULL DEFAULT 'PENDING', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "orders_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "messages" ADD CONSTRAINT "messages_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "orders" ADD CONSTRAINT "orders_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE; From 45dd07c895f7137d251c55354333b0a055dbe8da Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sun, 27 Apr 2025 03:01:57 +0100 Subject: [PATCH 16/21] Automatic update on graphql schema --- apps/backend/src/core/graphql/schema.gql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/backend/src/core/graphql/schema.gql b/apps/backend/src/core/graphql/schema.gql index db7bf24..bf57b89 100644 --- a/apps/backend/src/core/graphql/schema.gql +++ b/apps/backend/src/core/graphql/schema.gql @@ -56,14 +56,14 @@ type Mutation { } type Order { - buyer_address: String! - created_at: DateTime! - escrow_id: String! + buyerAddress: String! + createdAt: DateTime! + escrowId: String! id: String! - product_id: String! - seller_address: String! + productId: String! + sellerAddress: String! status: OrderStatus! - updated_at: DateTime! + updatedAt: DateTime! } enum OrderStatus { From 9e04425ab9c18219977f31f1ba1de5ba35faff51 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sun, 27 Apr 2025 03:02:46 +0100 Subject: [PATCH 17/21] Changed entity field names to reflect schema in camelCase --- .../src/modules/order/entities/order.entity.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/backend/src/modules/order/entities/order.entity.ts b/apps/backend/src/modules/order/entities/order.entity.ts index b6abae4..9ca5c9f 100644 --- a/apps/backend/src/modules/order/entities/order.entity.ts +++ b/apps/backend/src/modules/order/entities/order.entity.ts @@ -17,23 +17,23 @@ export class Order { id: string; @Field() - product_id: string; + productId: string; @Field() - buyer_address: string; + buyerAddress: string; @Field() - seller_address: string; + sellerAddress: string; @Field() - escrow_id: string; + escrowId: string; @Field(() => OrderStatus) status: OrderStatus; @Field() - created_at: Date; + createdAt: Date; @Field() - updated_at: Date; + updatedAt: Date; } From ae9d4ffeffdaec6e107a1212596eeacf398cca1c Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Sun, 27 Apr 2025 03:03:24 +0100 Subject: [PATCH 18/21] Adjust as neccssary to avoid errorss, due to change in orders schema --- apps/backend/src/modules/order/order.service.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/backend/src/modules/order/order.service.ts b/apps/backend/src/modules/order/order.service.ts index 6be261a..8217722 100644 --- a/apps/backend/src/modules/order/order.service.ts +++ b/apps/backend/src/modules/order/order.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from 'src/core/prisma/prisma.service'; import { CreateOrderInput } from './dto/create-order.input'; -import { UpdateOrderStatusInput } from './dto/update-order-status.input'; import { OrderStatus } from './entities/order.entity'; -import { Args } from '@nestjs/graphql'; @Injectable() export class OrderService { @@ -12,10 +10,10 @@ export class OrderService { create(data: CreateOrderInput) { return this.prisma.order.create({ data: { - product_id: data.productId, - buyer_address: data.buyerAddress, - seller_address: data.sellerAddress, - escrow_id: data.escrowId, + productId: data.productId, + buyerAddress: data.buyerAddress, + sellerAddress: data.sellerAddress, + escrowId: data.escrowId, status: data.status, }, }); @@ -23,13 +21,13 @@ export class OrderService { findAllByBuyer(buyerAddress: string) { return this.prisma.order.findMany({ - where: { buyer_address: buyerAddress }, + where: { buyerAddress }, }); } findAllBySeller(sellerAddress: string) { return this.prisma.order.findMany({ - where: { seller_address: sellerAddress }, + where: { sellerAddress }, }); } From 1f10502388930b984f45bda14defcf904cf23030 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Mon, 28 Apr 2025 14:44:10 +0100 Subject: [PATCH 19/21] Fixed wrong array element placement --- apps/backend/src/core/core.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/backend/src/core/core.module.ts b/apps/backend/src/core/core.module.ts index a810ca7..9036738 100644 --- a/apps/backend/src/core/core.module.ts +++ b/apps/backend/src/core/core.module.ts @@ -32,7 +32,7 @@ import { OrderModule } from "src/modules/order/order.module"; ProductModule, ProductImageModule, UsersModule, - OrderModule + OrderModule, MessageModule, ], controllers: [], From bad1d41552b93a45e5ed7f707bcd28b779c5f249 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Mon, 28 Apr 2025 14:45:59 +0100 Subject: [PATCH 20/21] Fixed wrong prima field names in test case --- .../src/modules/order/order.service.spec.ts | 358 +++++++++--------- 1 file changed, 179 insertions(+), 179 deletions(-) diff --git a/apps/backend/src/modules/order/order.service.spec.ts b/apps/backend/src/modules/order/order.service.spec.ts index c4d3c57..ebfc6bb 100644 --- a/apps/backend/src/modules/order/order.service.spec.ts +++ b/apps/backend/src/modules/order/order.service.spec.ts @@ -4,182 +4,182 @@ import { PrismaService } from 'src/core/prisma/prisma.service'; import { OrderStatus } from './entities/order.entity'; describe('OrderService', () => { - let service: OrderService; - let prismaService: PrismaService; - - const mockPrismaService = { - order: { - create: jest.fn(), - findMany: jest.fn(), - findUnique: jest.fn(), - update: jest.fn(), - }, - }; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - OrderService, - { - provide: PrismaService, - useValue: mockPrismaService, - }, - ], - }).compile(); - - service = module.get(OrderService); - prismaService = module.get(PrismaService); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); - - describe('create', () => { - it('should create a new order', async () => { - const orderData = { - productId: 'product-123', - buyerAddress: 'buyer-address-123', - sellerAddress: 'seller-address-123', - escrowId: 'escrow-123', - status: OrderStatus.PENDING, - }; - - const expectedOrder = { - id: 'order-123', - product_id: orderData.productId, - buyer_address: orderData.buyerAddress, - seller_address: orderData.sellerAddress, - escrow_id: orderData.escrowId, - status: orderData.status, - created_at: new Date(), - updated_at: new Date(), - }; - - mockPrismaService.order.create.mockResolvedValue(expectedOrder); - - const result = await service.create(orderData); - - expect(mockPrismaService.order.create).toHaveBeenCalledWith({ - data: { - product_id: orderData.productId, - buyer_address: orderData.buyerAddress, - seller_address: orderData.sellerAddress, - escrow_id: orderData.escrowId, - status: orderData.status, - }, - }); - expect(result).toEqual(expectedOrder); - }); - }); - - describe('findAllByBuyer', () => { - it('should return orders for a specific buyer', async () => { - const buyerAddress = 'buyer-address-123'; - const mockOrders = [ - { - id: 'order-123', - product_id: 'product-123', - buyer_address: buyerAddress, - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', - status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - mockPrismaService.order.findMany.mockResolvedValue(mockOrders); - - const result = await service.findAllByBuyer(buyerAddress); - - expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ - where: { buyer_address: buyerAddress }, - }); - expect(result).toEqual(mockOrders); - }); - }); - - describe('findAllBySeller', () => { - it('should return orders for a specific seller', async () => { - const sellerAddress = 'seller-address-123'; - const mockOrders = [ - { - id: 'order-123', - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: sellerAddress, - escrow_id: 'escrow-123', - status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - mockPrismaService.order.findMany.mockResolvedValue(mockOrders); - - const result = await service.findAllBySeller(sellerAddress); - - expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ - where: { seller_address: sellerAddress }, - }); - expect(result).toEqual(mockOrders); - }); - }); - - describe('findOne', () => { - it('should return a single order by ID', async () => { - const orderId = 'order-123'; - const mockOrder = { - id: orderId, - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', - status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), - }; - - mockPrismaService.order.findUnique.mockResolvedValue(mockOrder); - - const result = await service.findOne(orderId); - - expect(mockPrismaService.order.findUnique).toHaveBeenCalledWith({ - where: { id: orderId }, - }); - expect(result).toEqual(mockOrder); - }); - }); - - describe('updateStatus', () => { - it('should update an order status', async () => { - const orderId = 'order-123'; - const newStatus = OrderStatus.APPROVED; - const mockOrder = { - id: orderId, - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', - status: newStatus, - created_at: new Date(), - updated_at: new Date(), - }; - - mockPrismaService.order.update.mockResolvedValue(mockOrder); - - const result = await service.updateStatus(orderId, newStatus); - - expect(mockPrismaService.order.update).toHaveBeenCalledWith({ - where: { id: orderId }, - data: { status: newStatus }, - }); - expect(result).toEqual(mockOrder); - }); - }); -}); \ No newline at end of file + let service: OrderService; + let prismaService: PrismaService; + + const mockPrismaService = { + order: { + create: jest.fn(), + findMany: jest.fn(), + findUnique: jest.fn(), + update: jest.fn(), + }, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + OrderService, + { + provide: PrismaService, + useValue: mockPrismaService, + }, + ], + }).compile(); + + service = module.get(OrderService); + prismaService = module.get(PrismaService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('create', () => { + it('should create a new order', async () => { + const orderData = { + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + }; + + const expectedOrder = { + id: 'order-123', + productId: orderData.productId, + buyerAddress: orderData.buyerAddress, + sellerAddress: orderData.sellerAddress, + escrowId: orderData.escrowId, + status: orderData.status, + createdAt: new Date(), + updatedAt: new Date(), + }; + + mockPrismaService.order.create.mockResolvedValue(expectedOrder); + + const result = await service.create(orderData); + + expect(mockPrismaService.order.create).toHaveBeenCalledWith({ + data: { + productId: orderData.productId, + buyerAddress: orderData.buyerAddress, + sellerAddress: orderData.sellerAddress, + escrowId: orderData.escrowId, + status: orderData.status, + }, + }); + expect(result).toEqual(expectedOrder); + }); + }); + + describe('findAllByBuyer', () => { + it('should return orders for a specific buyer', async () => { + const buyerAddress = 'buyer-address-123'; + const mockOrders = [ + { + id: 'order-123', + productId: 'product-123', + buyerAddress: buyerAddress, + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + createdAt: new Date(), + updatedAt: new Date(), + }, + ]; + + mockPrismaService.order.findMany.mockResolvedValue(mockOrders); + + const result = await service.findAllByBuyer(buyerAddress); + + expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ + where: { buyerAddress: buyerAddress }, + }); + expect(result).toEqual(mockOrders); + }); + }); + + describe('findAllBySeller', () => { + it('should return orders for a specific seller', async () => { + const sellerAddress = 'seller-address-123'; + const mockOrders = [ + { + id: 'order-123', + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: sellerAddress, + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + createdAt: new Date(), + updatedAt: new Date(), + }, + ]; + + mockPrismaService.order.findMany.mockResolvedValue(mockOrders); + + const result = await service.findAllBySeller(sellerAddress); + + expect(mockPrismaService.order.findMany).toHaveBeenCalledWith({ + where: { sellerAddress: sellerAddress }, + }); + expect(result).toEqual(mockOrders); + }); + }); + + describe('findOne', () => { + it('should return a single order by ID', async () => { + const orderId = 'order-123'; + const mockOrder = { + id: orderId, + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: OrderStatus.PENDING, + createdAt: new Date(), + updatedAt: new Date(), + }; + + mockPrismaService.order.findUnique.mockResolvedValue(mockOrder); + + const result = await service.findOne(orderId); + + expect(mockPrismaService.order.findUnique).toHaveBeenCalledWith({ + where: { id: orderId }, + }); + expect(result).toEqual(mockOrder); + }); + }); + + describe('updateStatus', () => { + it('should update an order status', async () => { + const orderId = 'order-123'; + const newStatus = OrderStatus.APPROVED; + const mockOrder = { + id: orderId, + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', + status: newStatus, + createdAt: new Date(), + updatedAt: new Date(), + }; + + mockPrismaService.order.update.mockResolvedValue(mockOrder); + + const result = await service.updateStatus(orderId, newStatus); + + expect(mockPrismaService.order.update).toHaveBeenCalledWith({ + where: { id: orderId }, + data: { status: newStatus }, + }); + expect(result).toEqual(mockOrder); + }); + }); +}); From fd4677e53861217c52861c73f9dfc66a938dafe0 Mon Sep 17 00:00:00 2001 From: clintjeff2 Date: Mon, 28 Apr 2025 14:46:17 +0100 Subject: [PATCH 21/21] Fixed wrong prima field names in test case --- .../src/modules/order/order.resolver.spec.ts | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/backend/src/modules/order/order.resolver.spec.ts b/apps/backend/src/modules/order/order.resolver.spec.ts index b063981..a3523fd 100644 --- a/apps/backend/src/modules/order/order.resolver.spec.ts +++ b/apps/backend/src/modules/order/order.resolver.spec.ts @@ -46,13 +46,13 @@ describe('OrderResolver', () => { const mockOrders = [ { id: 'order-123', - product_id: 'product-123', - buyer_address: buyerAddress, - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', + productId: 'product-123', + buyerAddress: buyerAddress, + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), + createdAt: new Date(), + updatedAt: new Date(), }, ]; @@ -71,13 +71,13 @@ describe('OrderResolver', () => { const mockOrders = [ { id: 'order-123', - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: sellerAddress, - escrow_id: 'escrow-123', + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: sellerAddress, + escrowId: 'escrow-123', status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), + createdAt: new Date(), + updatedAt: new Date(), }, ]; @@ -95,13 +95,13 @@ describe('OrderResolver', () => { const orderId = 'order-123'; const mockOrder = { id: orderId, - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', status: OrderStatus.PENDING, - created_at: new Date(), - updated_at: new Date(), + createdAt: new Date(), + updatedAt: new Date(), }; mockOrderService.findOne.mockResolvedValue(mockOrder); @@ -125,13 +125,13 @@ describe('OrderResolver', () => { const mockOrder = { id: 'order-123', - product_id: orderData.productId, - buyer_address: orderData.buyerAddress, - seller_address: orderData.sellerAddress, - escrow_id: orderData.escrowId, + productId: orderData.productId, + buyerAddress: orderData.buyerAddress, + sellerAddress: orderData.sellerAddress, + escrowId: orderData.escrowId, status: orderData.status, - created_at: new Date(), - updated_at: new Date(), + createdAt: new Date(), + updatedAt: new Date(), }; mockOrderService.create.mockResolvedValue(mockOrder); @@ -155,13 +155,13 @@ describe('OrderResolver', () => { const mockOrder = { id: orderId, - product_id: 'product-123', - buyer_address: 'buyer-address-123', - seller_address: 'seller-address-123', - escrow_id: 'escrow-123', + productId: 'product-123', + buyerAddress: 'buyer-address-123', + sellerAddress: 'seller-address-123', + escrowId: 'escrow-123', status: newStatus, - created_at: new Date(), - updated_at: new Date(), + createdAt: new Date(), + updatedAt: new Date(), }; mockOrderService.updateStatus.mockResolvedValue(mockOrder);