Skip payment process if item is free to borrow
This commit is contained in:
@@ -323,7 +323,7 @@ describe('Rentals Routes', () => {
|
||||
expect(response.body).toEqual({ error: 'Item is already booked for these dates' });
|
||||
});
|
||||
|
||||
it('should return 400 when payment method is missing', async () => {
|
||||
it('should return 400 when payment method is missing for paid rentals', async () => {
|
||||
const dataWithoutPayment = { ...rentalData };
|
||||
delete dataWithoutPayment.stripePaymentMethodId;
|
||||
|
||||
@@ -332,7 +332,49 @@ describe('Rentals Routes', () => {
|
||||
.send(dataWithoutPayment);
|
||||
|
||||
expect(response.status).toBe(400);
|
||||
expect(response.body).toEqual({ error: 'Payment method is required' });
|
||||
expect(response.body).toEqual({ error: 'Payment method is required for paid rentals' });
|
||||
});
|
||||
|
||||
it('should create a free rental without payment method', async () => {
|
||||
// Set up a free item (both prices are 0)
|
||||
Item.findByPk.mockResolvedValue({
|
||||
id: 1,
|
||||
ownerId: 2,
|
||||
availability: true,
|
||||
pricePerHour: 0,
|
||||
pricePerDay: 0
|
||||
});
|
||||
|
||||
const freeRentalData = { ...rentalData };
|
||||
delete freeRentalData.stripePaymentMethodId;
|
||||
|
||||
const createdRental = {
|
||||
id: 1,
|
||||
...freeRentalData,
|
||||
renterId: 1,
|
||||
ownerId: 2,
|
||||
totalAmount: 0,
|
||||
platformFee: 0,
|
||||
payoutAmount: 0,
|
||||
paymentStatus: 'not_required',
|
||||
status: 'pending'
|
||||
};
|
||||
|
||||
Rental.create.mockResolvedValue(createdRental);
|
||||
Rental.findByPk.mockResolvedValue({
|
||||
...createdRental,
|
||||
item: { id: 1, name: 'Free Item' },
|
||||
owner: { id: 2, username: 'owner1', firstName: 'John', lastName: 'Doe' },
|
||||
renter: { id: 1, username: 'renter1', firstName: 'Jane', lastName: 'Smith' }
|
||||
});
|
||||
|
||||
const response = await request(app)
|
||||
.post('/rentals')
|
||||
.send(freeRentalData);
|
||||
|
||||
expect(response.status).toBe(201);
|
||||
expect(response.body.paymentStatus).toBe('not_required');
|
||||
expect(response.body.totalAmount).toBe(0);
|
||||
});
|
||||
|
||||
it('should handle database errors during creation', async () => {
|
||||
@@ -422,6 +464,34 @@ describe('Rentals Routes', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should approve free rental without payment processing', async () => {
|
||||
const freeRental = {
|
||||
...mockRental,
|
||||
totalAmount: 0,
|
||||
paymentStatus: 'not_required',
|
||||
stripePaymentMethodId: null,
|
||||
update: jest.fn().mockResolvedValue(true)
|
||||
};
|
||||
|
||||
mockRentalFindByPk.mockResolvedValueOnce(freeRental);
|
||||
|
||||
const updatedFreeRental = {
|
||||
...freeRental,
|
||||
status: 'confirmed'
|
||||
};
|
||||
mockRentalFindByPk.mockResolvedValueOnce(updatedFreeRental);
|
||||
|
||||
const response = await request(app)
|
||||
.put('/rentals/1/status')
|
||||
.send({ status: 'confirmed' });
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
expect(StripeService.chargePaymentMethod).not.toHaveBeenCalled();
|
||||
expect(freeRental.update).toHaveBeenCalledWith({
|
||||
status: 'confirmed'
|
||||
});
|
||||
});
|
||||
|
||||
it('should return 400 when renter has no Stripe customer ID', async () => {
|
||||
const rentalWithoutStripeCustomer = {
|
||||
...mockRental,
|
||||
|
||||
Reference in New Issue
Block a user