Untitled
unknown
plain_text
a year ago
49 kB
5
Indexable
import { expect } from 'chai'; import { after, afterEach, before, describe, it } from 'mocha'; import sinon from 'sinon'; import app from '../src/app.js'; import { AmenityController } from '../src/controllers/amenity.controller.js'; import { AccommodationRepository } from '../src/repositories/accommodation.repository.js'; import { AccommodationServicesRepository } from '../src/repositories/accommodationServices.repository.js'; import { AmenityRepository } from '../src/repositories/amenity.repository.js'; import { DestinationRepository } from '../src/repositories/destination.repository.js'; import { FacilityRepository } from '../src/repositories/facility.repository.js'; // import { AccommodationService } from '../src/services/accommodation.service.js'; import { AccommodationService } from '../src/services/accommodation.service.js'; import { AccommodationServicesService } from '../src/services/accommodationService.service.js'; import { AmenityService } from '../src/services/amenity.service.js'; import { DestinationService } from '../src/services/destination.service.js'; import { FacilityService } from '../src/services/facility.service.js'; const providedAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiU0FrM3F1eEVnMU9xYyt2ejUwVnVBbWF1VXpQa3pDbXd4emg0VStNd0t6WnpkakFGemVvTW15NllwQ2JYd2llN1RDdHRJdzBPRlltdmdxREhxTjR2OUJrVUpkSVgwK0hYZ2ZROWFXUllhNkFkT1BGNTF0WXZUZjAzMW1US2djaGNJcno3TDJoZHgzVG9oWFlLYlZzdFpTNm03NnFZRm9oMUo3ZmJUMjdhS3RaSnJXL2oyZWFIOFZ6bVppam8wUW9lWXNuQUpUZm1RR09MTkFDNFp3UGRIMmY2YVp1R0VuUy9veWR2R1FrNStWNFBlVXYrYVdETmd2ZUpJdUN3OVJMdnBWYXkwVWJTWDh0RHlDb28vZ29ZNWs3dTZacHg2NEY1MU0rQkxaYVI4UWpuOWRTS0dMZXBOa0NZcFppaEMvRzJzVUZEdVY4MUtyMHdNOGt6RUpwOXhBPT0iLCJpYXQiOjE3MjA2ODQ0MTMsImV4cCI6MTcyMDY4NTAxM30.zg2zVuMACza0WY8AJ5JEXqFC1iQYJmAP41lll8c2hM8'; const mockUser = { _id: '6659f65f9cde6a32b9d3c8fe', email: 'mariem.nacib@esprit.tn', // verificationToken: providedAccessToken, type: 'USER', status: 'ONLINE', accessToken: providedAccessToken, }; // Custom middleware to mock authentication const authMiddleware = (req, res, next) => { req.userId = mockUser._id; req.user = mockUser; return next(); }; const mockAmenity = { title: 'TEST_AMENITY', category: 'WELLNESS', alternatives: [], }; const mockFacility = { title: 'TEST_FACILITY', category: 'BEDROOM', alternatives: [], }; const mockAccommodationService = { name: 'TEST ACCOMMODATION SERVICE', description: ['dscription1', 'description2'], image: { url: 'test', blur: 'test', alt: 'test' }, }; const mockAccommodationServiceUpdate = { description: ['dscription1', 'description2', 'descriprion3 updated'], }; const mockDestination = { country: 'country', city: 'city', description: ['description1', 'description2'], hasChalets: true, hasVillas: false, hasApartments: false, image: { url: 'test', blur: 'test', alt: 'test' }, activities: [ { title: 'activity1', season: 'SUMMER', description: 'description', image: { url: 'test', blur: 'test', alt: 'test' }, }, ], hotels: [ { name: 'hotel1', description: 'description', gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], }, ], restaurants: [ { name: 'restaurant1', webSite: 'web site', description: 'description', address: 'address test', typeOfCuisine: 'VEGAN', gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], }, ], }; // const mockWishList = { // accommodations: ['', ''], // }; const mockAccommodation = { description: 'description', isActive: false, isPrivate: true, name: 'test', type: 'VILLA', location: '666ad06319cd2589bfd20134', detailedLocation: 'Near Eiffel Tower', geoLocation: { longitude: 2.2943506, latitude: 48.8588443, country: 'aaa', city: 'eeee', address: 'aaaa', label: 'aaaa', }, guestsCount: 8, childrenCount: 6, bedroomsCount: 4, bathroomsCount: 4, surfaceArea: { value: 700, unit: '', }, policies: ['No pets allowed', 'No smoking'], amenities: ['662f70969d66016ca19a811e'], agency: '66472b56998506e08993abe2', prices: [ { price: 500, currency: { label: 'aaaaa', code: 'EUR', }, priceUnit: 'WEEK', priceType: 'NET_PRICE', from: '2024-02-04T00:00:00.000Z', to: '2024-02-06T00:00:00.000Z', isAvailable: true, }, ], layouts: [ { title: 'Ground Floor', order: 1, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: ['661d1d862b4207d7a43af662'], }, { title: 'First Floor', order: 2, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: ['662b6bbec6f1500452e30520'], }, ], nearbyLocations: ['Eiffel Tower', 'Louvre Museum'], categories: ['MOUNTAIN_VIEW', 'PET_FRIENDLY'], seasons: ['SUMMER'], services: ['SELF_CATERED', 'BED_AND_BREAKFAST'], gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], image: { url: 'test', blur: 'test', alt: 'test' }, }; // Custom middleware to mock authentication app.use(authMiddleware); describe('Amenity Service', () => { let amenityRepository; let amenityService; let amenityController; before(async () => { amenityRepository = new AmenityRepository(); amenityService = new AmenityService(); amenityController = new AmenityController(); await amenityRepository.deleteMany({ filter: {} }); }); describe('addAmenity', () => { it('should add amenity successfully', async () => { const req = { body: mockAmenity, userId: mockUser._id, user: mockUser, get: () => providedAccessToken, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), send: sinon.stub().returnsThis(), }; // await amenityService.addAmenity(req.body, req, res); await amenityController.addAmenity(mockAmenity, req, res); expect(res.status.calledWith(201)).to.be.true; }); it('should return error if amenity already exists', async () => { sinon.stub(amenityRepository, 'findOne').resolves(mockAmenity.title); const req = { body: mockAmenity, userId: mockUser._id, user: mockUser }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await amenityService.addAmenity(mockAmenity, req, res); console.log(res.status); console.log(res.error); await amenityController.addAmenity(req.body, req, res); expect(res.status, 400); expect(res.error, 'Amenity title already exists'); // sinon.restore(); // sinon.stub(amenityRepository, 'findOne').resolves(null); }); }); describe('displayAllAmenities', () => { it('should display all amenities', async () => { const req = {}; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await amenityController.displayAmenities(req, res); expect(res.status.calledWith(200)).to.be.true; }); it('should return internal server error', async () => { const errorMessage = 'Internal Server Error'; sinon.stub(amenityRepository, 'findAll').throws(new Error(errorMessage)); const req = {}; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await amenityService.displayAllAmenities(req, res); await amenityController.displayAmenities(req, res); expect(res.status, 500); expect(res.json, { error: errorMessage }); }); }); }); describe('Facility Service', () => { let facilityRepository; let facilityService; before(async () => { facilityRepository = new FacilityRepository(); facilityService = new FacilityService(); await facilityRepository.deleteMany({ filter: {} }); // sinon.stub(facilityRepository, 'findOne').resolves(null); // sinon.stub(facilityRepository, 'create').resolves(mockFacility); // sinon.stub(facilityRepository, 'findAll').resolves([mockFacility]); // sinon.stub(facilityRepository, 'insertMany').resolves([{ acknowledged: true }]); // sinon.stub(fs, 'readFile').callsFake((path, encoding, callback) => { // if (path === './seed/facilities.json') { // callback(null, JSON.stringify([mockFacility])); // } else { // callback(new Error('File not found')); // } // }); }); after(() => { sinon.restore(); }); describe('addFacility', () => { it('should add facility successfully', async () => { const req = { body: mockFacility, userId: mockUser._id }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await facilityService.addFacility(req.body, req, res); expect(res.status.calledWith(201)).to.be.true; }); it('should return error if facility already exists', async () => { sinon.restore(); // sinon.stub(facilityRepository, 'findOne').resolves(mockFacility); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, body: mockFacility, userId: mockUser._id, get: () => providedAccessToken, }; // const req = { body: mockFacility, userId: mockUser._id }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await facilityService.addFacility(req.body, req, res); expect(res.status.calledWith(400)).to.be.true; sinon.restore(); // sinon.stub(facilityRepository, 'findOne').resolves(null); }); }); describe('displayAllFacilities', () => { it('should display all facilities', async () => { const req = {}; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await facilityService.displayAllFacilities(req, res); expect(res.status.calledWith(200)).to.be.true; }); }); // describe('addFacilitiesFromSeed', () => { // it('should add facilities from seed file successfully', async () => { // const req = {}; // const res = { // status: sinon.stub().returnsThis(), // json: sinon.stub().returnsThis(), // }; // await facilityService.addFacilitiesFromSeed(req, res); // expect(res.status.calledWith(200)).to.be.true; // }); // it('should return error if file read fails', async () => { // sinon.restore(); // sinon.stub(fs, 'readFile').callsFake((path, encoding, callback) => { // callback(new Error('File not found')); // }); // const req = {}; // const res = { // status: sinon.stub().returnsThis(), // json: sinon.stub().returnsThis(), // }; // await facilityService.addFacilitiesFromSeed(req, res); // expect(res.status.calledWith(500)).to.be.true; // sinon.restore(); // sinon.stub(fs, 'readFile').callsFake((path, encoding, callback) => { // callback(null, JSON.stringify([mockFacility])); // }); // }); // it('should return error if JSON parsing fails', async () => { // sinon.restore(); // sinon.stub(fs, 'readFile').callsFake((path, encoding, callback) => { // callback(null, 'invalid JSON'); // }); // const req = {}; // const res = { // status: sinon.stub().returnsThis(), // json: sinon.stub().returnsThis(), // }; // await facilityService.addFacilitiesFromSeed(req, res); // expect(res.status.calledWith(500)).to.be.true; // sinon.restore(); // sinon.stub(fs, 'readFile').callsFake((path, encoding, callback) => { // callback(null, JSON.stringify([mockFacility])); // }); // }); // }); }); describe('AccommodationService Service', () => { let accommodationServicesRepository; let accommodationServicesService; // let fileServiceStub; before(async () => { accommodationServicesRepository = new AccommodationServicesRepository(); accommodationServicesService = new AccommodationServicesService(); // fileServiceStub = sinon.stub(FileService.prototype, 'addImage'); await accommodationServicesRepository.deleteMany({ filter: {} }); }); afterEach(() => { sinon.restore(); }); describe('POST /v1/services', () => { it('should add a new service with a slugified name', async () => { // sinon.stub(accommodationServicesRepository, 'findOne').resolves(); // sinon.stub(accommodationServicesRepository, 'create').resolves(mockAccommodationService); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, // body: { mockAccommodationService }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.addServices(mockAccommodationService, req, res); expect(res.status, 201); expect(res.data, mockAccommodationService.slug); }); it('should return error if service slug already exists', async () => { // await accommodationServicesRepository.create({ ...mockAccommodationService, slug: 'test-accommodation-service' }); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, body: mockAccommodationService, get: () => providedAccessToken, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.addServices(mockAccommodationService, req, res); expect(res.status, 400); expect(res.error, 'Services slug already exists'); }); }); describe('GET /v1/services', () => { it('should get all services', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, query: { search: 'test' }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.displayAllServices(req, res); expect(res.status, 200); expect(Array.isArray(res.data), true); }); }); describe('GET /v1/services/:slug', () => { it('should get a service by slug', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'test-accommodation-service', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.getServiceBySlug(req.params.slug, req, res); expect(res.status, 200); expect(res.data, 'test-accommodation-service'); }); it('should return error if service not found', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'non-existent-slug', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.getServiceBySlug(req.params.slug, req, res); expect(res.status, 404); expect(res.error, 'Service not found'); }); }); describe('PUT /v1/services/:slug', () => { it('should update a service by slug', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'test-accommodation-service', }, body: { mockAccommodationServiceUpdate }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.updateServiceBySlug(req.params.slug, req.body, req, res); expect(res.status.calledWith(200)).to.be.true; expect(res.message, 'Service updated successfully'); }); it('should return error if service not found', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'non-existent-slug', }, body: { name: 'NEW NAME' }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.updateServiceBySlug(req.params.slug, req.body, req, res); expect(res.status, 404); expect(res.error, 'Service not found'); }); }); describe('DELETE /v1/services/:slug', () => { it('should delete a service by slug', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'test-accommodation-service', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.deleteServiceBySlug(req.params.slug, req, res); expect(res.status.calledWith(200)).to.be.true; expect(res.message, 'Service deleted successfully'); }); it('should return error if service not found', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'non-existent-slug', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationServicesService.deleteServiceBySlug(req.params.slug, req, res); expect(res.status, 404); expect(res.error, 'Services not found'); }); }); }); describe('Destination Service', () => { let destinationRepository; let destinationService; before(async () => { destinationRepository = new DestinationRepository(); destinationService = new DestinationService(); await destinationRepository.deleteMany({ filter: {} }); }); afterEach(() => { sinon.restore(); }); describe('POST /v1/destinations', () => { it('should add a new destination', async () => { // sinon.stub(destinationRepository, 'exists').resolves(false); // sinon.stub(destinationRepository, 'create').resolves(mockDestination); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.addDestination(mockDestination, req, res); expect(res.status, 201); expect(res.data, mockDestination.slug); expect(res.message, 'Destination created successfully'); }); it('should return error if destination slug already exists', async () => { // sinon.stub(destinationRepository, 'exists').resolves(true); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, get: () => providedAccessToken, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.addDestination(mockDestination, req, res); // expect(result).to.have.property('status').that.equals(400); // expect(result).to.have.property('error').that.equals('Destination slug already exists'); expect(res.status, 400); expect(res.error, 'Destination slug already exists'); }); it('should handle internal server error during add destination', async () => { // sinon.stub(destinationRepository, 'exists').rejects(new Error('Database connection error')); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, get: () => providedAccessToken, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.addDestination(mockDestination, req, res); // expect(result).to.have.property('status').that.equals(500); // expect(result).to.have.property('error').that.equals('Database connection error'); expect(res.status, 500); expect(res.error, 'Database connection error'); }); }); describe('GET /v1/destinations', () => { it('should get all destinations with filters', async () => { // const query = new URLSearchParams(filters).toString(); // sinon.stub(destinationRepository, 'findAllWithPagination').resolves([mockDestination]); // sinon.stub(destinationRepository, '').resolves(query); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, query: { search: 'france', country: 'france', hasChalets: 'true', hasVillas: 'true', hasApartments: 'true', season: 'summer', hotelName: 'hotel1', restaurantName: 'restaurant1', activityTitle: 'activity1', cuisineType: 'VEGAN', page: '1', itemsPerPage: '1', }, }; // const res = await request(app).get(`/v1/destinations?${query}`); // expect(res.status).to.equal(200); // expect(res.body.message).to.include( // 'Filter applied successfully. Requests filtered based on the provided criteria.', // ); const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.displayDestinations(req, res); // expect(result).to.have.property('status').that.equals(200); // expect(result).to.have.property('data').that.has.property('count').that.equals(1); // expect(result).to.have.property('data').that.has.property('data').that.deep.equals([mockDestination]); expect(res.status, 200); // expect(res.data).that.has.property('count').that.equals(1); expect(res.message, mockDestination); }); }); describe('PUT /v1/destinations/:slug', () => { it('should update a destination', async () => { const mockUpdatedDestination = { ...mockDestination, city: 'Updated City' }; // sinon.stub(destinationRepository, 'findOne').resolves(mockDestination); // sinon.stub(destinationRepository, 'updateById').resolves(mockUpdatedDestination); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.editDestination(mockDestination.slug, mockUpdatedDestination, req, res); // expect(result).to.have.property('status').that.equals(200); // expect(result) // .to.have.property('data') // .that.deep.equals({ data: mockUpdatedDestination, message: 'Destination updated successfully' }); expect(res.status, 200); expect(res.data, mockUpdatedDestination); expect(res.message, 'Destination updated successfully'); }); it('should return error if destination not found', async () => { // sinon.stub(destinationRepository, 'findOne').resolves(null); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.editDestination('non-existent-slug', mockDestination, req, res); // expect(result).to.have.property('status').that.equals(404); // expect(result).to.have.property('error').that.equals('Destination not found'); expect(res.status, 404); expect(res.error, 'Destination not found'); }); // Add more tests for handling errors, validation, etc. }); describe('GET /v1/destinations/filters', () => { it('should fetch filters for destinations', async () => { // sinon.stub(destinationRepository, 'getDistinctValues').resolves(['Country1', 'Country2']); sinon.stub(destinationRepository, 'aggregate').resolves({ hotels: [{ title: 'Hotel1', value: 'Hotel1' }], restaurants: [{ title: 'Restaurant1', value: 'Restaurant1' }], activities: [{ title: 'Activity1', value: 'Activity1' }], cuisineTypesInRestaurants: [{ title: 'Vegan', value: 'Vegan' }], }); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.getFilters(req, res); // expect(result).to.have.property('status').that.equals(200); expect(res.status, 200); }); }); describe('GET /v1/destinations/:slug', () => { it('should get a destination by slug', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'city', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.getDestinationBySlug(req.params.slug, req, res); expect(res.status, 200); expect(res.data, 'city'); }); it('should return error if destination not found', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'non-existent-slug', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await destinationService.getDestinationBySlug(req.params.slug, req, res); expect(res.status, 404); expect(res.error, 'Destination not found'); }); }); }); describe('Accommodation Service', () => { let accommodationRepository; let destinationRepository; let amenityRepository; let facilityRepository; let accommodationService; let createdDestination; let createdAmenity; let createdFacility; let createdService; let accommodationServicesRepository; before(async () => { accommodationRepository = new AccommodationRepository(); accommodationService = new AccommodationService(); destinationRepository = new DestinationRepository(); amenityRepository = new AmenityRepository(); facilityRepository = new FacilityRepository(); accommodationServicesRepository = new AccommodationServicesRepository(); // Clean up existing data await accommodationRepository.deleteMany({}); await destinationRepository.deleteMany({}); await amenityRepository.deleteMany({}); await facilityRepository.deleteMany({}); await accommodationServicesRepository.deleteMany({}); // Create necessary dependencies createdDestination = await destinationRepository.create(mockDestination); createdAmenity = await amenityRepository.create(mockAmenity); createdFacility = await facilityRepository.create(mockFacility); createdService = await accommodationServicesRepository.create(mockAccommodationService); // // Update mockAccommodation with created dependencies // mockAccommodation.location = createdDestination._id; // mockAccommodation.amenities = [createdAmenity._id]; // mockAccommodation.layouts[0].facilities = [createdFacility._id]; }); describe('POST /v1/accommodations', () => { it('should create a new accommodation', async () => { const mockAccommodation = { description: 'description', isActive: false, isPrivate: true, name: 'test', type: 'VILLA', location: createdDestination._id, detailedLocation: 'Near Eiffel Tower', geoLocation: { longitude: 2.2943506, latitude: 48.8588443, country: 'aaa', city: 'eeee', address: 'aaaa', label: 'aaaa', }, guestsCount: 8, childrenCount: 6, bedroomsCount: 4, bathroomsCount: 4, surfaceArea: { value: 700, unit: '', }, policies: ['No pets allowed', 'No smoking'], amenities: [createdAmenity._id], agency: '66472b56998506e08993abe2', prices: [ { price: 500, currency: { label: 'aaaaa', code: 'EUR', }, priceUnit: 'WEEK', priceType: 'NET_PRICE', from: '2024-02-04T00:00:00.000Z', to: '2024-02-06T00:00:00.000Z', isAvailable: true, }, ], layouts: [ { title: 'Ground Floor', order: 1, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, { title: 'First Floor', order: 2, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, ], nearbyLocations: ['Eiffel Tower', 'Louvre Museum'], categories: ['MOUNTAIN_VIEW', 'PET_FRIENDLY'], seasons: ['SUMMER'], services: [createdService._id], gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], image: { url: 'test', blur: 'test', alt: 'test' }, }; // sinon.stub(accommodationRepository, 'exists').resolves(); // sinon.stub(accommodationRepository, 'create').resolves(mockAccommodation); // sinon.stub(destinationRepository, 'findById').resolves(); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.addAccommodation(mockAccommodation, req, res); expect(res.status, 201); expect(res.data, mockAccommodation); }); it('should return error if accommodation slug already exists', async () => { const mockAccommodation = { description: 'description', isActive: false, isPrivate: true, name: 'test', type: 'VILLA', location: createdDestination._id, detailedLocation: 'Near Eiffel Tower', geoLocation: { longitude: 2.2943506, latitude: 48.8588443, country: 'aaa', city: 'eeee', address: 'aaaa', label: 'aaaa', }, guestsCount: 8, childrenCount: 6, bedroomsCount: 4, bathroomsCount: 4, surfaceArea: { value: 700, unit: '', }, policies: ['No pets allowed', 'No smoking'], amenities: [createdAmenity._id], agency: '66472b56998506e08993abe2', prices: [ { price: 500, currency: { label: 'aaaaa', code: 'EUR', }, priceUnit: 'WEEK', priceType: 'NET_PRICE', from: '2024-02-04T00:00:00.000Z', to: '2024-02-06T00:00:00.000Z', isAvailable: true, }, ], layouts: [ { title: 'Ground Floor', order: 1, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, { title: 'First Floor', order: 2, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, ], nearbyLocations: ['Eiffel Tower', 'Louvre Museum'], categories: ['MOUNTAIN_VIEW', 'PET_FRIENDLY'], seasons: ['SUMMER'], services: [createdService._id], gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], image: { url: 'test', blur: 'test', alt: 'test' }, }; const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, body: mockAccommodation, get: () => providedAccessToken, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.addAccommodation(mockAccommodation, req, res); expect(res.status, 400); expect(res.error, 'Accommodation already exists'); }); }); describe('GET /v1/accommodations', () => { it('should get all accommodations', async () => { // sinon.stub(accommodationRepository, 'findAllWithPagination').resolves([mockAccommodation]); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, query: { search: 'test', locations: 'city', countries: 'country', minPrice: 1, maxPrice: 2, minNbGuests: 1, maxNbGuests: 2, minNbChildren: 1, maxNbChildren: 2, minNbBedrooms: 1, maxNbBedrooms: 2, guestsCountMin: 1, guestsCountMax: 2, childrenCountMin: 1, childrenCountMax: 2, bedroomsCountMin: 1, bedroomsCountMax: 2, bathroomsCountMin: 1, bathroomsCountMax: 2, priceMin: 1, priceMax: 2, country: 'country', location: 'country', amenities: 'test', facilities: 'string', isActive: true, isPrivate: true, category: 'category', season: 'summer', type: 'chalet', services: 'bed and breakfast', from: '2024-01-01', to: '2024-02-02', page: '1', itemsPerPage: '1', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.displayAllAccommodations(req, res); expect(res.status, 200); expect(Array.isArray(res.data), true); }); it('should get all available accommodation', async () => { // sinon.stub(accommodationRepository, 'findAllWithPagination').resolves([mockAccommodation]); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, query: { search: 'test', locations: 'city', countries: 'country', minPrice: 1, maxPrice: 2, minNbGuests: 1, maxNbGuests: 2, minNbChildren: 1, maxNbChildren: 2, minNbBedrooms: 1, maxNbBedrooms: 2, guestsCountMin: 1, guestsCountMax: 2, childrenCountMin: 1, childrenCountMax: 2, bedroomsCountMin: 1, bedroomsCountMax: 2, bathroomsCountMin: 1, bathroomsCountMax: 2, priceMin: 1, priceMax: 2, country: 'country', location: 'country', amenities: 'test', facilities: 'string', isActive: true, isPrivate: true, category: 'category', season: 'summer', type: 'chalet', services: 'bed and breakfast', from: '2024-01-01', to: '2024-02-02', page: '1', itemsPerPage: '1', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.getAllAccommodationsByAvailability(req, res); expect(res.status, 200); expect(Array.isArray(res.data), true); }); it('should get list of accommodation by Ids', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, query: { search: 'test', locations: 'city', countries: 'country', id: 'test', maxPrice: 2, minNbGuests: 1, maxNbGuests: 2, minNbChildren: 1, maxNbChildren: 2, minNbBedrooms: 1, maxNbBedrooms: 2, guestsCountMin: 1, guestsCountMax: 2, childrenCountMin: 1, childrenCountMax: 2, bedroomsCountMin: 1, bedroomsCountMax: 2, bathroomsCountMin: 1, bathroomsCountMax: 2, priceMin: 1, priceMax: 2, country: 'country', location: 'country', amenities: 'test', facilities: 'string', isActive: true, isPrivate: true, category: 'category', season: 'summer', type: 'chalet', services: 'bed and breakfast', from: '2024-01-01', to: '2024-02-02', page: '1', itemsPerPage: '1', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.getListOfAccommodationById(req, res); expect(res.status, 200); expect(Array.isArray(res.data), true); }); it('should get accommodation with specific filters', async () => { const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, query: { search: 'test', locations: 'city', countries: 'country', id: 'test', maxPrice: 2, minNbGuests: 1, maxNbGuests: 2, minNbChildren: 1, maxNbChildren: 2, minNbBedrooms: 1, maxNbBedrooms: 2, guestsCountMin: 1, guestsCountMax: 2, childrenCountMin: 1, childrenCountMax: 2, bedroomsCountMin: 1, bedroomsCountMax: 2, bathroomsCountMin: 1, bathroomsCountMax: 2, priceMin: 1, priceMax: 2, country: 'country', location: 'country', amenities: 'test', facilities: 'string', isActive: true, isPrivate: true, category: 'category', season: 'summer', type: 'chalet', services: 'bed and breakfast', from: '2024-01-01', to: '2024-02-02', page: '1', itemsPerPage: '1', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.displayAllAccommodationsWithSpecification(req, res); expect(res.status, 200); expect(Array.isArray(res.data), true); }); it('should get accommodation by slug ', async () => { // sinon.stub(accommodationRepository, 'findOne').resolves(mockAccommodation.slug); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'villa-new1-city', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.getAccommodationBySlug(req.params.slug, req, res); expect(res.status, 200); expect(res.data, 'city'); }); it('should get accommodation features by accommodation slug ', async () => { // sinon.stub(accommodationRepository, 'findOne').resolves(mockAccommodation.slug); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { slug: 'villa-new1-city', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.getAccommodationFeaturesBySlug(req.params.slug, req, res); expect(res.status, 200); expect(res.data, 'city'); }); it('should get accommodation features by accommodation Id ', async () => { // sinon.stub(accommodationRepository, 'findOne').resolves(mockAccommodation.slug); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, params: { id: 'test', }, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.getAccommodationById(req.params.id, req, res); expect(res.status, 200); expect(res.data, mockAccommodation); }); }); describe('PUT /v1/accommodations/:slug', () => { it('should update an existing accommodation', async () => { const mockUpdateAccommodation = { description: 'updated Accommodation TDD', }; const mockAccommodation = { description: 'description', isActive: false, isPrivate: true, name: 'test', type: 'VILLA', location: createdDestination._id, detailedLocation: 'Near Eiffel Tower', geoLocation: { longitude: 2.2943506, latitude: 48.8588443, country: 'aaa', city: 'eeee', address: 'aaaa', label: 'aaaa', }, guestsCount: 8, childrenCount: 6, bedroomsCount: 4, bathroomsCount: 4, surfaceArea: { value: 700, unit: '', }, policies: ['No pets allowed', 'No smoking'], amenities: [createdAmenity._id], agency: '66472b56998506e08993abe2', prices: [ { price: 500, currency: { label: 'aaaaa', code: 'EUR', }, priceUnit: 'WEEK', priceType: 'NET_PRICE', from: '2024-02-04T00:00:00.000Z', to: '2024-02-06T00:00:00.000Z', isAvailable: true, }, ], layouts: [ { title: 'Ground Floor', order: 1, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, { title: 'First Floor', order: 2, image: { url: 'test', blur: 'test', alt: 'test' }, facilities: [createdFacility._id], }, ], nearbyLocations: ['Eiffel Tower', 'Louvre Museum'], categories: ['MOUNTAIN_VIEW', 'PET_FRIENDLY'], seasons: ['SUMMER'], services: [createdService._id], gallery: [ { url: 'test', blur: 'test', alt: 'test' }, { url: 'test1', blur: 'test1', alt: 'test1' }, ], image: { url: 'test', blur: 'test', alt: 'test' }, }; // sinon.stub(accommodationRepository, 'findOne').resolves(mockAccommodation); // sinon.stub(accommodationRepository, 'findOneAndUpdate').resolves(mockUpdateAccommodation); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.editAccommodation(mockAccommodation.slug, mockUpdateAccommodation, req, res); expect(res.status, 200); expect(res.data, mockUpdateAccommodation); }); it('should approve the accommodation edit', async () => { // const existingAccommodation = { // ...mockAccommodation, // approvalRequests: { // 12345: { // new: { name: 'Updated Accommodation' }, // old: { name: 'Old Accommodation' }, // }, // }, // }; // sinon.stub(accommodationRepository, 'findOne').resolves(existingAccommodation); // sinon.stub(accommodationRepository, 'findOneAndUpdate').resolves(); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.approveOrRejectEdit('test-accommodation', '12345', true, req, res); expect(res.status, 200); }); it('should reject the accommodation edit', async () => { // const existingAccommodation = { // ...mockAccommodation, // approvalRequests: { // 12345: { // new: { name: 'Updated Accommodation' }, // old: { name: 'Old Accommodation' }, // }, // }, // }; // sinon.stub(accommodationRepository, 'findOne').resolves(existingAccommodation); // sinon.stub(accommodationRepository, 'findOneAndUpdate').resolves(); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.approveOrRejectEdit('test-accommodation', '12345', false, req, res); expect(res.status, 200); }); it('should return not found if accommodation does not exist', async () => { // sinon.stub(accommodationRepository, 'findOne').resolves(null); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.approveOrRejectEdit('non-existing-accommodation', '12345', true, req, res); expect(res.status, 404); }); it('should return error if approval request does not exist', async () => { // const existingAccommodation = { // ...mockAccommodation, // approvalRequests: {}, // }; // sinon.stub(accommodationRepository, 'findOne').resolves(existingAccommodation); const req = { headers: { authorization: `Bearer ${providedAccessToken}`, }, userId: mockUser._id, }; const res = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis(), }; await accommodationService.approveOrRejectEdit('test-accommodation', 'non-existing-request', true, req, res); expect(res.status, 400); }); }); });
Editor is loading...
Leave a Comment