Skip to content

Commit 1f8644c

Browse files
chore: wip
1 parent 97a7080 commit 1f8644c

File tree

1 file changed

+264
-0
lines changed

1 file changed

+264
-0
lines changed
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
import { beforeEach, describe, expect, it } from 'bun:test'
2+
import { refreshDatabase } from '@stacksjs/testing'
3+
import { destroy, bulkDestroy, softDelete, bulkSoftDelete } from '../orders/destroy'
4+
import { fetchById, fetchAll } from '../orders/fetch'
5+
6+
// Create a request-like object for testing
7+
class TestRequest {
8+
private data: Record<string, any> = {}
9+
10+
constructor(data: Record<string, any>) {
11+
this.data = data
12+
}
13+
14+
validate() {
15+
return Promise.resolve()
16+
}
17+
18+
get<T = any>(key: string, defaultValue?: T): T {
19+
return key in this.data ? this.data[key] as T : (defaultValue as T)
20+
}
21+
}
22+
23+
beforeEach(async () => {
24+
await refreshDatabase()
25+
})
26+
27+
describe('Order Module', () => {
28+
// Since the store.ts file doesn't have actual order creation functions,
29+
// we'll use the ORM's create method for creating test orders
30+
31+
async function createTestOrder(orderData: Record<string, any> = {}) {
32+
// Default order data
33+
const defaultData = {
34+
status: 'PENDING',
35+
total_amount: 100.50,
36+
tax_amount: 8.50,
37+
discount_amount: 0,
38+
delivery_fee: 5.00,
39+
tip_amount: 10.00,
40+
order_type: 'DELIVERY',
41+
delivery_address: '123 Test Street',
42+
special_instructions: 'Please knock',
43+
estimated_delivery_time: '2023-03-16T18:30:00.000Z',
44+
customer_id: 1,
45+
coupon_id: 0 // Adding coupon_id as required field with default value
46+
}
47+
48+
// Merge default data with provided data
49+
const finalData = { ...defaultData, ...orderData }
50+
51+
// Insert the order directly using database
52+
const { db } = await import('@stacksjs/database')
53+
const result = await db
54+
.insertInto('orders')
55+
.values(finalData)
56+
.executeTakeFirst()
57+
58+
const orderId = Number(result.insertId)
59+
60+
// Fetch the created order
61+
return await fetchById(orderId)
62+
}
63+
64+
describe('fetchById', () => {
65+
it('should fetch an order by ID', async () => {
66+
// Create a test order
67+
const uniqueAddress = `Test Address ${Date.now()}`
68+
const order = await createTestOrder({
69+
delivery_address: uniqueAddress
70+
})
71+
72+
// Make sure we have a valid order ID before proceeding
73+
expect(order).toBeDefined()
74+
const orderId = order?.id !== undefined ? Number(order.id) : undefined
75+
76+
expect(orderId).toBeDefined()
77+
if (!orderId) {
78+
throw new Error('Failed to create test order')
79+
}
80+
81+
// Now fetch the order
82+
const fetchedOrder = await fetchById(orderId)
83+
84+
expect(fetchedOrder).toBeDefined()
85+
expect(fetchedOrder?.id).toBe(orderId)
86+
expect(fetchedOrder?.delivery_address).toBe(uniqueAddress)
87+
expect(fetchedOrder?.status).toBe('PENDING')
88+
})
89+
90+
it('should return undefined when trying to fetch a non-existent order', async () => {
91+
// Use a very large ID that is unlikely to exist
92+
const nonExistentId = 99999999
93+
94+
// Attempt to fetch and expect undefined
95+
const fetchedOrder = await fetchById(nonExistentId)
96+
expect(fetchedOrder).toBeUndefined()
97+
})
98+
})
99+
100+
describe('fetchAll', () => {
101+
it('should fetch all orders with their items', async () => {
102+
// Create multiple test orders
103+
await createTestOrder({ delivery_address: 'Address 1' })
104+
await createTestOrder({ delivery_address: 'Address 2' })
105+
await createTestOrder({ delivery_address: 'Address 3' })
106+
107+
// Fetch all orders
108+
const orders = await fetchAll()
109+
110+
// Check that we have at least the 3 orders we created
111+
expect(orders.length).toBeGreaterThanOrEqual(3)
112+
113+
// Check that orders have expected properties
114+
orders.forEach(order => {
115+
expect(order).toHaveProperty('id')
116+
expect(order).toHaveProperty('status')
117+
expect(order).toHaveProperty('total_amount')
118+
expect(order).toHaveProperty('items')
119+
expect(Array.isArray(order.items)).toBe(true)
120+
})
121+
})
122+
})
123+
124+
describe('destroy', () => {
125+
it('should delete an order from the database', async () => {
126+
// Create a test order
127+
const order = await createTestOrder()
128+
const orderId = order?.id !== undefined ? Number(order.id) : undefined
129+
130+
// Make sure we have a valid order ID before proceeding
131+
expect(orderId).toBeDefined()
132+
if (!orderId) {
133+
throw new Error('Failed to create test order')
134+
}
135+
136+
// Verify the order exists
137+
let fetchedOrder = await fetchById(orderId)
138+
expect(fetchedOrder).toBeDefined()
139+
140+
// Delete the order
141+
const result = await destroy(orderId)
142+
expect(result).toBe(true)
143+
144+
// Verify the order no longer exists
145+
fetchedOrder = await fetchById(orderId)
146+
expect(fetchedOrder).toBeUndefined()
147+
})
148+
149+
it('should return false when trying to delete a non-existent order', async () => {
150+
// Use a very large ID that is unlikely to exist
151+
const nonExistentId = 99999999
152+
153+
// Attempt to delete
154+
const result = await destroy(nonExistentId)
155+
expect(result).toBe(false)
156+
})
157+
})
158+
159+
describe('softDelete', () => {
160+
it('should soft delete an order by updating status to CANCELED', async () => {
161+
// Create a test order
162+
const order = await createTestOrder({ status: 'PENDING' })
163+
const orderId = order?.id !== undefined ? Number(order.id) : undefined
164+
165+
// Make sure we have a valid order ID before proceeding
166+
expect(orderId).toBeDefined()
167+
if (!orderId) {
168+
throw new Error('Failed to create test order')
169+
}
170+
171+
// Verify the order exists and status is PENDING
172+
let fetchedOrder = await fetchById(orderId)
173+
expect(fetchedOrder).toBeDefined()
174+
expect(fetchedOrder?.status).toBe('PENDING')
175+
176+
// Soft delete the order
177+
const result = await softDelete(orderId)
178+
expect(result).toBe(true)
179+
180+
// Verify the order still exists but status is now CANCELED
181+
fetchedOrder = await fetchById(orderId)
182+
expect(fetchedOrder).toBeDefined()
183+
expect(fetchedOrder?.status).toBe('CANCELED')
184+
})
185+
186+
it('should return false when trying to soft delete a non-existent order', async () => {
187+
// Use a very large ID that is unlikely to exist
188+
const nonExistentId = 99999999
189+
190+
// Attempt to soft delete
191+
const result = await softDelete(nonExistentId)
192+
expect(result).toBe(false)
193+
})
194+
})
195+
196+
describe('bulkDestroy', () => {
197+
it('should delete multiple orders from the database', async () => {
198+
// Create multiple test orders
199+
const order1 = await createTestOrder()
200+
const order2 = await createTestOrder()
201+
const order3 = await createTestOrder()
202+
203+
const orderIds = [
204+
order1?.id !== undefined ? Number(order1.id) : 0,
205+
order2?.id !== undefined ? Number(order2.id) : 0,
206+
order3?.id !== undefined ? Number(order3.id) : 0,
207+
].filter(id => id !== 0)
208+
209+
// Ensure we have created the orders
210+
expect(orderIds.length).toBe(3)
211+
212+
// Delete the orders
213+
const deletedCount = await bulkDestroy(orderIds)
214+
expect(deletedCount).toBe(3)
215+
216+
// Verify the orders no longer exist
217+
for (const id of orderIds) {
218+
const fetchedOrder = await fetchById(id)
219+
expect(fetchedOrder).toBeUndefined()
220+
}
221+
})
222+
223+
it('should return 0 when trying to delete an empty array of orders', async () => {
224+
// Try to delete with an empty array
225+
const deletedCount = await bulkDestroy([])
226+
expect(deletedCount).toBe(0)
227+
})
228+
})
229+
230+
describe('bulkSoftDelete', () => {
231+
it('should soft delete multiple orders by updating status to CANCELED', async () => {
232+
// Create multiple test orders
233+
const order1 = await createTestOrder({ status: 'PENDING' })
234+
const order2 = await createTestOrder({ status: 'PROCESSING' })
235+
const order3 = await createTestOrder({ status: 'SHIPPED' })
236+
237+
const orderIds = [
238+
order1?.id !== undefined ? Number(order1.id) : 0,
239+
order2?.id !== undefined ? Number(order2.id) : 0,
240+
order3?.id !== undefined ? Number(order3.id) : 0,
241+
].filter(id => id !== 0)
242+
243+
// Ensure we have created the orders
244+
expect(orderIds.length).toBe(3)
245+
246+
// Soft delete the orders
247+
const updatedCount = await bulkSoftDelete(orderIds)
248+
expect(updatedCount).toBe(3)
249+
250+
// Verify the orders still exist but status is now CANCELED
251+
for (const id of orderIds) {
252+
const fetchedOrder = await fetchById(id)
253+
expect(fetchedOrder).toBeDefined()
254+
expect(fetchedOrder?.status).toBe('CANCELED')
255+
}
256+
})
257+
258+
it('should return 0 when trying to soft delete an empty array of orders', async () => {
259+
// Try to soft delete with an empty array
260+
const updatedCount = await bulkSoftDelete([])
261+
expect(updatedCount).toBe(0)
262+
})
263+
})
264+
})

0 commit comments

Comments
 (0)