Skip to content

Commit e75731e

Browse files
authored
Merge pull request #74 from rafaelramalho19/master
Added support for fetching information about a certain launch
2 parents 21c8425 + 1d4be2c commit e75731e

File tree

5 files changed

+132
-16
lines changed

5 files changed

+132
-16
lines changed

src/helpers/launch-database.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const launch = require('../builders/launch-query');
2+
const sort = require('../builders/launch-sort');
3+
4+
module.exports.fetchLaunch = async (collection, req) => {
5+
return global.db
6+
.collection(collection)
7+
.find(launch.launchQuery(req))
8+
.project({ _id: 0 })
9+
.sort(sort.launchSort(req))
10+
.toArray();
11+
};

src/v2-routes/v2-launches.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
const express = require('express');
44
const asyncHandle = require('express-async-handler');
5-
const launch = require('../builders/launch-query');
6-
const sort = require('../builders/launch-sort');
5+
const { fetchLaunch } = require('../helpers/launch-database');
76

87
const v2 = express.Router();
98

@@ -21,12 +20,15 @@ v2.get('/latest', asyncHandle(async (req, res) => {
2120

2221
// Return all past launches filtered by querystrings
2322
v2.get('/', asyncHandle(async (req, res) => {
24-
const data = await global.db
25-
.collection('launch_v2')
26-
.find(launch.launchQuery(req))
27-
.project({ _id: 0 })
28-
.sort(sort.launchSort(req))
29-
.toArray();
23+
const data = await fetchLaunch('launch_v2', req);
24+
res.json(data);
25+
}));
26+
27+
v2.get('/all', asyncHandle(async (req, res) => {
28+
const pastData = await fetchLaunch('launch_v2', req);
29+
const upcomingData = await fetchLaunch('upcoming_v2', req);
30+
const data = pastData.concat(upcomingData);
31+
3032
res.json(data);
3133
}));
3234

src/v2-routes/v2-upcoming.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,13 @@
22

33
const express = require('express');
44
const asyncHandle = require('express-async-handler');
5-
const launch = require('../builders/launch-query');
6-
const sort = require('../builders/launch-sort');
5+
const { fetchLaunch } = require('../helpers/launch-database');
76

87
const v2 = express.Router();
98

109
// Return upcoming launches filtered by querystrings
1110
v2.get('/', asyncHandle(async (req, res) => {
12-
const data = await global.db
13-
.collection('upcoming_v2')
14-
.find(launch.launchQuery(req))
15-
.project({ _id: 0 })
16-
.sort(sort.launchSort(req))
17-
.toArray();
11+
const data = await fetchLaunch('upcoming_v2', req);
1812
res.json(data);
1913
}));
2014

test/helpers/launch-database.test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const { fetchLaunch } = require('../../src/helpers/launch-database');
2+
const app = require('../../src/app');
3+
const queryBuilder = require('../../src/builders/launch-query');
4+
const sortBuilder = require('../../src/builders/launch-sort');
5+
6+
describe('Helpers - Launch database', () => {
7+
beforeAll((done) => {
8+
app.on('ready', () => {
9+
done();
10+
});
11+
});
12+
13+
it('Should call the launchQuery and launchSort functions', async (done) => {
14+
const querySpy = jest.spyOn(queryBuilder, 'launchQuery');
15+
const sortSpy = jest.spyOn(sortBuilder, 'launchSort');
16+
17+
await fetchLaunch('launches_v2', { query: [] });
18+
19+
expect(querySpy).toHaveBeenCalled();
20+
expect(sortSpy).toHaveBeenCalled();
21+
22+
done();
23+
});
24+
25+
it('Should work for the launches collections', async (done) => {
26+
const launches = await fetchLaunch('launches_v2', { query: [] });
27+
28+
expect(launches).not.toBeUndefined();
29+
expect(Array.isArray(launches)).toBe(true);
30+
31+
done();
32+
});
33+
34+
it('Should work for the upcoming collections', async (done) => {
35+
const launches = await fetchLaunch('upcoming_v2', { query: [] });
36+
37+
expect(launches).toBeDefined();
38+
expect(Array.isArray(launches)).toBe(true);
39+
40+
done();
41+
});
42+
});

test/routes/v2-launches.test.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,70 @@ test('It should return the latest launch', () => {
8383
expect(response.statusCode).toBe(200);
8484
});
8585
});
86+
87+
88+
//------------------------------------------------------------
89+
// Launch Info Test
90+
//------------------------------------------------------------
91+
92+
test('It should return a specific Launch info', () => {
93+
return request(app.listen()).get('/v2/launches/all?flight_number=40').then((response) => {
94+
expect(response.statusCode).toBe(200);
95+
response.body.forEach((item) => {
96+
expect(item).toHaveProperty('flight_number', expect.anything());
97+
expect(item).toHaveProperty('launch_year', expect.stringMatching(/^[0-9]{4}$/));
98+
expect(item).toHaveProperty('launch_date_unix');
99+
expect(item).toHaveProperty('launch_date_utc', expect.anything());
100+
expect(item).toHaveProperty('launch_date_local', expect.anything());
101+
expect(item).toHaveProperty('rocket.rocket_id');
102+
expect(item).toHaveProperty('rocket.rocket_name');
103+
expect(item).toHaveProperty('rocket.rocket_type');
104+
expect(item.rocket.first_stage.cores.length).toBeGreaterThan(0);
105+
item.rocket.first_stage.cores.forEach((core) => {
106+
expect(core).toHaveProperty('core_serial');
107+
expect(core).toHaveProperty('flight', expect.any(Number));
108+
expect(core).toHaveProperty('reused');
109+
expect(core).toHaveProperty('land_success');
110+
expect(core).toHaveProperty('landing_type');
111+
expect(core).toHaveProperty('landing_vehicle');
112+
});
113+
expect(item.rocket.second_stage.payloads.length).toBeGreaterThan(0);
114+
if (item.hasOwnProperty.call('cap_serial')) {
115+
item.rocket.second_stage.payloads.forEach((payload) => {
116+
expect(payload).toHaveProperty('payload_id');
117+
expect(payload).toHaveProperty('reused');
118+
expect(payload).toHaveProperty('cap_serial');
119+
expect(payload.customers.length).toBeGreaterThan(0);
120+
expect(payload).toHaveProperty('payload_mass_kg');
121+
expect(payload).toHaveProperty('payload_mass_lbs');
122+
expect(payload).toHaveProperty('orbit');
123+
expect(payload).toHaveProperty('mass_returned_kg');
124+
expect(payload).toHaveProperty('mass_returned_lbs');
125+
expect(payload).toHaveProperty('flight_time_sec');
126+
expect(payload).toHaveProperty('cargo_manifest');
127+
});
128+
} else {
129+
item.rocket.second_stage.payloads.forEach((payload) => {
130+
expect(payload).toHaveProperty('payload_id');
131+
expect(payload).toHaveProperty('reused');
132+
expect(payload.customers.length).toBeGreaterThan(0);
133+
expect(payload).toHaveProperty('payload_mass_kg');
134+
expect(payload).toHaveProperty('payload_mass_lbs');
135+
expect(payload).toHaveProperty('orbit');
136+
});
137+
}
138+
expect(item).toHaveProperty('telemetry.flight_club');
139+
expect(item).toHaveProperty('reuse.core');
140+
expect(item).toHaveProperty('reuse.side_core1');
141+
expect(item).toHaveProperty('reuse.side_core2');
142+
expect(item).toHaveProperty('reuse.fairings');
143+
expect(item).toHaveProperty('reuse.capsule');
144+
expect(item).toHaveProperty('launch_site.site_id');
145+
expect(item).toHaveProperty('launch_site.site_name');
146+
expect(item).toHaveProperty('launch_site.site_name_long');
147+
expect(item).toHaveProperty('launch_success');
148+
expect(item).toHaveProperty('links');
149+
expect(item).toHaveProperty('details');
150+
});
151+
});
152+
});

0 commit comments

Comments
 (0)