basic RouteCompleter
This commit is contained in:
parent
a277a9547f
commit
067854b697
|
@ -20,6 +20,7 @@ export abstract class Algorithm {
|
|||
for (const processor of this.processors) {
|
||||
this.candidates = await processor.execute(this.candidates);
|
||||
}
|
||||
// console.log(JSON.stringify(this.candidates, null, 2));
|
||||
return this.candidates.map((candidate: CandidateEntity) =>
|
||||
MatchEntity.create({ adId: candidate.id }),
|
||||
);
|
||||
|
@ -43,9 +44,6 @@ export abstract class Selector {
|
|||
* A processor processes candidates information
|
||||
*/
|
||||
export abstract class Processor {
|
||||
protected readonly query: MatchQuery;
|
||||
constructor(query: MatchQuery) {
|
||||
this.query = query;
|
||||
}
|
||||
constructor(protected readonly query: MatchQuery) {}
|
||||
abstract execute(candidates: CandidateEntity[]): Promise<CandidateEntity[]>;
|
||||
}
|
||||
|
|
|
@ -49,7 +49,6 @@ export class PassengerOrientedCarpoolPathCompleter extends Completer {
|
|||
),
|
||||
);
|
||||
candidate.setCarpoolPath(carpoolPathCreator.carpoolPath());
|
||||
// console.log(JSON.stringify(candidate, null, 2));
|
||||
});
|
||||
return candidates;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
import { CandidateEntity } from '@modules/ad/core/domain/candidate.entity';
|
||||
import { Completer } from './completer.abstract';
|
||||
import { MatchQuery } from '../match.query';
|
||||
import { WayStep } from '@modules/ad/core/domain/value-objects/waystep.value-object';
|
||||
|
||||
export class RouteCompleter extends Completer {
|
||||
protected readonly type: RouteCompleterType;
|
||||
constructor(query: MatchQuery, type: RouteCompleterType) {
|
||||
super(query);
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
complete = async (
|
||||
candidates: CandidateEntity[],
|
||||
): Promise<CandidateEntity[]> => {
|
||||
await Promise.all(
|
||||
candidates.map(async (candidate: CandidateEntity) => {
|
||||
const candidateRoute = await this.query.routeProvider.getBasic(
|
||||
(candidate.getProps().carpoolSteps as WayStep[]).map(
|
||||
(wayStep: WayStep) => wayStep.point,
|
||||
),
|
||||
);
|
||||
candidate.setMetrics(candidateRoute.distance, candidateRoute.duration);
|
||||
return candidate;
|
||||
}),
|
||||
);
|
||||
return candidates;
|
||||
};
|
||||
}
|
||||
|
||||
export enum RouteCompleterType {
|
||||
BASIC = 'basic',
|
||||
DETAILED = 'detailed',
|
||||
}
|
|
@ -7,7 +7,6 @@ import { Inject } from '@nestjs/common';
|
|||
import { AdRepositoryPort } from '@modules/ad/core/application/ports/ad.repository.port';
|
||||
import {
|
||||
AD_REPOSITORY,
|
||||
AD_ROUTE_PROVIDER,
|
||||
INPUT_DATETIME_TRANSFORMER,
|
||||
PARAMS_PROVIDER,
|
||||
} from '@modules/ad/ad.di-tokens';
|
||||
|
@ -15,7 +14,6 @@ import { MatchEntity } from '@modules/ad/core/domain/match.entity';
|
|||
import { DefaultParamsProviderPort } from '../../ports/default-params-provider.port';
|
||||
import { DefaultParams } from '../../ports/default-params.type';
|
||||
import { DateTimeTransformerPort } from '../../ports/datetime-transformer.port';
|
||||
import { RouteProviderPort } from '../../ports/route-provider.port';
|
||||
|
||||
@QueryHandler(MatchQuery)
|
||||
export class MatchQueryHandler implements IQueryHandler {
|
||||
|
@ -27,8 +25,6 @@ export class MatchQueryHandler implements IQueryHandler {
|
|||
@Inject(AD_REPOSITORY) private readonly repository: AdRepositoryPort,
|
||||
@Inject(INPUT_DATETIME_TRANSFORMER)
|
||||
private readonly datetimeTransformer: DateTimeTransformerPort,
|
||||
@Inject(AD_ROUTE_PROVIDER)
|
||||
private readonly routeProvider: RouteProviderPort,
|
||||
) {
|
||||
this._defaultParams = defaultParamsProvider.getParams();
|
||||
}
|
||||
|
@ -54,7 +50,7 @@ export class MatchQueryHandler implements IQueryHandler {
|
|||
maxDetourDurationRatio: this._defaultParams.MAX_DETOUR_DURATION_RATIO,
|
||||
})
|
||||
.setDatesAndSchedule(this.datetimeTransformer);
|
||||
await query.setRoutes(this.routeProvider);
|
||||
await query.setRoutes();
|
||||
|
||||
let algorithm: Algorithm;
|
||||
switch (query.algorithmType) {
|
||||
|
|
|
@ -39,8 +39,9 @@ export class MatchQuery extends QueryBase {
|
|||
passengerRoute?: Route;
|
||||
backAzimuth?: number;
|
||||
private readonly originWaypoint: Waypoint;
|
||||
routeProvider: RouteProviderPort;
|
||||
|
||||
constructor(props: MatchRequestDto) {
|
||||
constructor(props: MatchRequestDto, routeProvider: RouteProviderPort) {
|
||||
super();
|
||||
this.driver = props.driver;
|
||||
this.passenger = props.passenger;
|
||||
|
@ -65,6 +66,7 @@ export class MatchQuery extends QueryBase {
|
|||
this.originWaypoint = this.waypoints.filter(
|
||||
(waypoint: Waypoint) => waypoint.position == 0,
|
||||
)[0];
|
||||
this.routeProvider = routeProvider;
|
||||
}
|
||||
|
||||
setMissingMarginDurations = (defaultMarginDuration: number): MatchQuery => {
|
||||
|
@ -178,7 +180,7 @@ export class MatchQuery extends QueryBase {
|
|||
return this;
|
||||
};
|
||||
|
||||
setRoutes = async (routeProvider: RouteProviderPort): Promise<MatchQuery> => {
|
||||
setRoutes = async (): Promise<MatchQuery> => {
|
||||
const roles: Role[] = [];
|
||||
if (this.driver) roles.push(Role.DRIVER);
|
||||
if (this.passenger) roles.push(Role.PASSENGER);
|
||||
|
@ -197,7 +199,7 @@ export class MatchQuery extends QueryBase {
|
|||
await Promise.all(
|
||||
pathCreator.getBasePaths().map(async (path: Path) => ({
|
||||
type: path.type,
|
||||
route: await routeProvider.getBasic(path.waypoints),
|
||||
route: await this.routeProvider.getBasic(path.waypoints),
|
||||
})),
|
||||
)
|
||||
).forEach((typedRoute: TypedRoute) => {
|
||||
|
|
|
@ -4,6 +4,10 @@ import { PassengerOrientedCarpoolPathCompleter } from './completer/passenger-ori
|
|||
import { PassengerOrientedGeoFilter } from './filter/passenger-oriented-geo.filter';
|
||||
import { AdRepositoryPort } from '../../ports/ad.repository.port';
|
||||
import { PassengerOrientedSelector } from './selector/passenger-oriented.selector';
|
||||
import {
|
||||
RouteCompleter,
|
||||
RouteCompleterType,
|
||||
} from './completer/route.completer';
|
||||
|
||||
export class PassengerOrientedAlgorithm extends Algorithm {
|
||||
constructor(
|
||||
|
@ -14,6 +18,7 @@ export class PassengerOrientedAlgorithm extends Algorithm {
|
|||
this.selector = new PassengerOrientedSelector(query, repository);
|
||||
this.processors = [
|
||||
new PassengerOrientedCarpoolPathCompleter(query),
|
||||
new RouteCompleter(query, RouteCompleterType.BASIC),
|
||||
new PassengerOrientedGeoFilter(query),
|
||||
];
|
||||
}
|
||||
|
|
|
@ -14,6 +14,11 @@ export class CandidateEntity extends AggregateRoot<CandidateProps> {
|
|||
this.props.carpoolSteps = waySteps;
|
||||
};
|
||||
|
||||
setMetrics = (distance: number, duration: number): void => {
|
||||
this.props.distance = distance;
|
||||
this.props.duration = duration;
|
||||
};
|
||||
|
||||
validate(): void {
|
||||
// entity business rules validation to protect it's invariant before saving entity to a database
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ export interface CandidateProps {
|
|||
driverDistance: number;
|
||||
driverDuration: number;
|
||||
carpoolSteps?: WayStepProps[]; // carpool path for the crew (driver + passenger)
|
||||
distance?: number;
|
||||
duration?: number;
|
||||
}
|
||||
|
||||
// Properties that are needed for a Candidate creation
|
||||
|
@ -22,11 +24,6 @@ export interface CreateCandidateProps {
|
|||
passengerWaypoints: PointProps[];
|
||||
}
|
||||
|
||||
export type Spacetime = {
|
||||
duration: number;
|
||||
distance?: number;
|
||||
};
|
||||
|
||||
export enum Target {
|
||||
START = 'START',
|
||||
INTERMEDIATE = 'INTERMEDIATE',
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Controller, UsePipes } from '@nestjs/common';
|
||||
import { Controller, Inject, UsePipes } from '@nestjs/common';
|
||||
import { GrpcMethod, RpcException } from '@nestjs/microservices';
|
||||
import { ResponseBase, RpcValidationPipe } from '@mobicoop/ddd-library';
|
||||
import { RpcExceptionCode } from '@mobicoop/ddd-library';
|
||||
|
@ -7,6 +7,8 @@ import { QueryBus } from '@nestjs/cqrs';
|
|||
import { MatchRequestDto } from './dtos/match.request.dto';
|
||||
import { MatchQuery } from '@modules/ad/core/application/queries/match/match.query';
|
||||
import { MatchEntity } from '@modules/ad/core/domain/match.entity';
|
||||
import { AD_ROUTE_PROVIDER } from '@modules/ad/ad.di-tokens';
|
||||
import { RouteProviderPort } from '@modules/ad/core/application/ports/route-provider.port';
|
||||
|
||||
@UsePipes(
|
||||
new RpcValidationPipe({
|
||||
|
@ -16,13 +18,17 @@ import { MatchEntity } from '@modules/ad/core/domain/match.entity';
|
|||
)
|
||||
@Controller()
|
||||
export class MatchGrpcController {
|
||||
constructor(private readonly queryBus: QueryBus) {}
|
||||
constructor(
|
||||
private readonly queryBus: QueryBus,
|
||||
@Inject(AD_ROUTE_PROVIDER)
|
||||
private readonly routeProvider: RouteProviderPort,
|
||||
) {}
|
||||
|
||||
@GrpcMethod('MatcherService', 'Match')
|
||||
async match(data: MatchRequestDto): Promise<MatchPaginatedResponseDto> {
|
||||
try {
|
||||
const matches: MatchEntity[] = await this.queryBus.execute(
|
||||
new MatchQuery(data),
|
||||
new MatchQuery(data, this.routeProvider),
|
||||
);
|
||||
return new MatchPaginatedResponseDto({
|
||||
data: matches.map((match: MatchEntity) => ({
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import {
|
||||
AD_REPOSITORY,
|
||||
AD_ROUTE_PROVIDER,
|
||||
INPUT_DATETIME_TRANSFORMER,
|
||||
PARAMS_PROVIDER,
|
||||
} from '@modules/ad/ad.di-tokens';
|
||||
|
@ -114,10 +113,6 @@ describe('Match Query Handler', () => {
|
|||
provide: INPUT_DATETIME_TRANSFORMER,
|
||||
useValue: mockInputDateTimeTransformer,
|
||||
},
|
||||
{
|
||||
provide: AD_ROUTE_PROVIDER,
|
||||
useValue: mockRouteProvider,
|
||||
},
|
||||
],
|
||||
}).compile();
|
||||
|
||||
|
@ -129,23 +124,26 @@ describe('Match Query Handler', () => {
|
|||
});
|
||||
|
||||
it('should return a Match entity', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
day: 1,
|
||||
margin: 900,
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
day: 1,
|
||||
margin: 900,
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
const matches: MatchEntity[] = await matchQueryHandler.execute(matchQuery);
|
||||
expect(matches.length).toBeGreaterThanOrEqual(0);
|
||||
});
|
||||
|
|
|
@ -108,17 +108,20 @@ const mockRouteProvider: RouteProviderPort = {
|
|||
|
||||
describe('Match Query', () => {
|
||||
it('should set default values', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
matchQuery
|
||||
.setMissingMarginDurations(defaultParams.DEPARTURE_TIME_MARGIN)
|
||||
.setMissingStrict(defaultParams.STRICT)
|
||||
|
@ -159,19 +162,22 @@ describe('Match Query', () => {
|
|||
});
|
||||
|
||||
it('should set good values for seats', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
seatsProposed: -1,
|
||||
seatsRequested: -1,
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
seatsProposed: -1,
|
||||
seatsRequested: -1,
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
matchQuery.setDefaultDriverAndPassengerParameters({
|
||||
driver: defaultParams.DRIVER,
|
||||
passenger: defaultParams.PASSENGER,
|
||||
|
@ -183,101 +189,114 @@ describe('Match Query', () => {
|
|||
});
|
||||
|
||||
it('should set route for a driver only', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
driver: true,
|
||||
passenger: false,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
await matchQuery.setRoutes(mockRouteProvider);
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
driver: true,
|
||||
passenger: false,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
await matchQuery.setRoutes();
|
||||
expect(matchQuery.driverRoute?.distance).toBe(350101);
|
||||
expect(matchQuery.passengerRoute).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should set route for a passenger only', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
await matchQuery.setRoutes(mockRouteProvider);
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
await matchQuery.setRoutes();
|
||||
expect(matchQuery.passengerRoute?.distance).toBe(340102);
|
||||
expect(matchQuery.driverRoute).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should set route for a driver and passenger', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
await matchQuery.setRoutes(mockRouteProvider);
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
await matchQuery.setRoutes();
|
||||
expect(matchQuery.driverRoute?.distance).toBe(350101);
|
||||
expect(matchQuery.passengerRoute?.distance).toBe(350101);
|
||||
});
|
||||
|
||||
it('should set route for a driver and passenger with 3 waypoints', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [
|
||||
originWaypoint,
|
||||
intermediateWaypoint,
|
||||
{ ...destinationWaypoint, position: 2 },
|
||||
],
|
||||
});
|
||||
await matchQuery.setRoutes(mockRouteProvider);
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [
|
||||
originWaypoint,
|
||||
intermediateWaypoint,
|
||||
{ ...destinationWaypoint, position: 2 },
|
||||
],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
await matchQuery.setRoutes();
|
||||
expect(matchQuery.driverRoute?.distance).toBe(350101);
|
||||
expect(matchQuery.passengerRoute?.distance).toBe(340102);
|
||||
});
|
||||
|
||||
it('should throw an exception if route is not found', async () => {
|
||||
const matchQuery = new MatchQuery({
|
||||
driver: true,
|
||||
passenger: false,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
await expect(
|
||||
matchQuery.setRoutes(mockRouteProvider),
|
||||
).rejects.toBeInstanceOf(Error);
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
driver: true,
|
||||
passenger: false,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '01:05',
|
||||
},
|
||||
],
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
mockRouteProvider,
|
||||
);
|
||||
await expect(matchQuery.setRoutes()).rejects.toBeInstanceOf(Error);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -25,21 +25,29 @@ const destinationWaypoint: Waypoint = {
|
|||
country: 'France',
|
||||
};
|
||||
|
||||
const matchQuery = new MatchQuery({
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: false,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
{
|
||||
getBasic: jest.fn().mockImplementation(() => ({
|
||||
duration: 6500,
|
||||
distance: 89745,
|
||||
})),
|
||||
},
|
||||
);
|
||||
|
||||
const mockMatcherRepository: AdRepositoryPort = {
|
||||
insertExtra: jest.fn(),
|
||||
|
|
|
@ -24,21 +24,26 @@ const destinationWaypoint: Waypoint = {
|
|||
country: 'France',
|
||||
};
|
||||
|
||||
const matchQuery = new MatchQuery({
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
{
|
||||
getBasic: jest.fn(),
|
||||
},
|
||||
);
|
||||
|
||||
const candidates: CandidateEntity[] = [
|
||||
CandidateEntity.create({
|
||||
|
|
|
@ -24,21 +24,26 @@ const destinationWaypoint: Waypoint = {
|
|||
country: 'France',
|
||||
};
|
||||
|
||||
const matchQuery = new MatchQuery({
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-08-28',
|
||||
toDate: '2023-08-28',
|
||||
schedule: [
|
||||
{
|
||||
time: '07:05',
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
{
|
||||
getBasic: jest.fn(),
|
||||
},
|
||||
);
|
||||
|
||||
const candidates: CandidateEntity[] = [
|
||||
CandidateEntity.create({
|
||||
|
|
|
@ -25,27 +25,32 @@ const destinationWaypoint: Waypoint = {
|
|||
country: 'France',
|
||||
};
|
||||
|
||||
const matchQuery = new MatchQuery({
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-06-21',
|
||||
toDate: '2023-06-21',
|
||||
useAzimuth: true,
|
||||
azimuthMargin: 10,
|
||||
useProportion: true,
|
||||
proportion: 0.3,
|
||||
schedule: [
|
||||
{
|
||||
day: 3,
|
||||
time: '07:05',
|
||||
margin: 900,
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
});
|
||||
const matchQuery = new MatchQuery(
|
||||
{
|
||||
algorithmType: AlgorithmType.PASSENGER_ORIENTED,
|
||||
driver: true,
|
||||
passenger: true,
|
||||
frequency: Frequency.PUNCTUAL,
|
||||
fromDate: '2023-06-21',
|
||||
toDate: '2023-06-21',
|
||||
useAzimuth: true,
|
||||
azimuthMargin: 10,
|
||||
useProportion: true,
|
||||
proportion: 0.3,
|
||||
schedule: [
|
||||
{
|
||||
day: 3,
|
||||
time: '07:05',
|
||||
margin: 900,
|
||||
},
|
||||
],
|
||||
strict: false,
|
||||
waypoints: [originWaypoint, destinationWaypoint],
|
||||
},
|
||||
{
|
||||
getBasic: jest.fn(),
|
||||
},
|
||||
);
|
||||
matchQuery.driverRoute = {
|
||||
distance: 150120,
|
||||
duration: 6540,
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import { RpcExceptionCode } from '@mobicoop/ddd-library';
|
||||
import { AD_ROUTE_PROVIDER } from '@modules/ad/ad.di-tokens';
|
||||
import { RouteProviderPort } from '@modules/ad/core/application/ports/route-provider.port';
|
||||
import { AlgorithmType } from '@modules/ad/core/application/types/algorithm.types';
|
||||
import { Frequency } from '@modules/ad/core/domain/ad.types';
|
||||
import { MatchEntity } from '@modules/ad/core/domain/match.entity';
|
||||
|
@ -62,6 +64,10 @@ const mockQueryBus = {
|
|||
}),
|
||||
};
|
||||
|
||||
const mockRouteProvider: RouteProviderPort = {
|
||||
getBasic: jest.fn(),
|
||||
};
|
||||
|
||||
describe('Match Grpc Controller', () => {
|
||||
let matchGrpcController: MatchGrpcController;
|
||||
|
||||
|
@ -73,6 +79,10 @@ describe('Match Grpc Controller', () => {
|
|||
provide: QueryBus,
|
||||
useValue: mockQueryBus,
|
||||
},
|
||||
{
|
||||
provide: AD_ROUTE_PROVIDER,
|
||||
useValue: mockRouteProvider,
|
||||
},
|
||||
],
|
||||
}).compile();
|
||||
|
||||
|
|
Loading…
Reference in New Issue