Skip to content

Commit ce9c878

Browse files
fix: CSV unloading policy (#211)
1 parent 46bb8bf commit ce9c878

File tree

5 files changed

+97
-5
lines changed

5 files changed

+97
-5
lines changed

application/frontend/src/app/core/services/csv.service.spec.ts

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { provideMockStore } from '@ngrx/store/testing';
2020
import { selectMapApiKey } from '../selectors/config.selectors';
2121
import { CsvService } from './csv.service';
2222
import { parse, unparse } from 'papaparse';
23-
import { EXPERIMENTAL_API_FIELDS_VEHICLES } from '../models';
23+
import { EXPERIMENTAL_API_FIELDS_VEHICLES, UnloadingPolicy } from '../models';
2424
import { GeocodingService } from './geocoding.service';
2525

2626
describe('CsvService', () => {
@@ -263,6 +263,74 @@ describe('CsvService', () => {
263263
expect(result[0].errors.length).toBe(0);
264264
expect(result[1].errors.length).toBe(1);
265265
});
266+
267+
it('should parse unloading policies provided by name', () => {
268+
const vehicles = [
269+
{
270+
label: 'test vehicle 1',
271+
unloadingPolicy: 'UNLOADING_POLICY_UNSPECIFIED',
272+
},
273+
{
274+
label: 'test vehicle 2',
275+
unloadingPolicy: 'FIRST_IN_FIRST_OUT',
276+
},
277+
{
278+
label: 'test vehicle 3',
279+
unloadingPolicy: 'LAST_IN_FIRST_OUT',
280+
},
281+
{
282+
label: 'test vehicle 4',
283+
},
284+
];
285+
const testVehicleMapping = {
286+
Label: 'label',
287+
UnloadingPolicy: 'unloadingPolicy',
288+
};
289+
const result = service.csvToVehicles(vehicles, testVehicleMapping);
290+
expect(result.length).toBe(4);
291+
expect(result[0].errors.length).toBe(0);
292+
expect(result[1].errors.length).toBe(0);
293+
expect(result[2].errors.length).toBe(0);
294+
expect(result[3].errors.length).toBe(0);
295+
expect(result[0].vehicle.unloadingPolicy).toBe(UnloadingPolicy.UNLOADING_POLICY_UNSPECIFIED);
296+
expect(result[1].vehicle.unloadingPolicy).toBe(UnloadingPolicy.FIRST_IN_FIRST_OUT);
297+
expect(result[2].vehicle.unloadingPolicy).toBe(UnloadingPolicy.LAST_IN_FIRST_OUT);
298+
expect(result[3].vehicle.unloadingPolicy).toBeUndefined();
299+
});
300+
301+
it('should parse unloading policies provided by value', () => {
302+
const vehicles = [
303+
{
304+
label: 'test vehicle 1',
305+
unloadingPolicy: '0',
306+
},
307+
{
308+
label: 'test vehicle 2',
309+
unloadingPolicy: '1',
310+
},
311+
{
312+
label: 'test vehicle 3',
313+
unloadingPolicy: '2',
314+
},
315+
{
316+
label: 'test vehicle 4',
317+
},
318+
];
319+
const testVehicleMapping = {
320+
Label: 'label',
321+
UnloadingPolicy: 'unloadingPolicy',
322+
};
323+
const result = service.csvToVehicles(vehicles, testVehicleMapping);
324+
expect(result.length).toBe(4);
325+
expect(result[0].errors.length).toBe(0);
326+
expect(result[1].errors.length).toBe(0);
327+
expect(result[2].errors.length).toBe(0);
328+
expect(result[3].errors.length).toBe(0);
329+
expect(result[0].vehicle.unloadingPolicy).toBe(UnloadingPolicy.UNLOADING_POLICY_UNSPECIFIED);
330+
expect(result[1].vehicle.unloadingPolicy).toBe(UnloadingPolicy.LAST_IN_FIRST_OUT);
331+
expect(result[2].vehicle.unloadingPolicy).toBe(UnloadingPolicy.FIRST_IN_FIRST_OUT);
332+
expect(result[3].vehicle.unloadingPolicy).toBeUndefined();
333+
});
266334
});
267335

268336
describe('Validate geocoding', () => {

application/frontend/src/app/core/services/csv.service.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
IShipment,
2929
IVehicle,
3030
TravelMode,
31+
UnloadingPolicy,
3132
ValidationErrorResponse,
3233
} from '../models';
3334
import { FileService } from './file.service';
@@ -272,7 +273,13 @@ export class CsvService {
272273
mapping,
273274
this.parseTravelMode
274275
),
275-
...this.mapKeyToModelValue('unloadingPolicy', 'UnloadingPolicy', vehicle, mapping),
276+
...this.mapKeyToModelValue(
277+
'unloadingPolicy',
278+
'UnloadingPolicy',
279+
vehicle,
280+
mapping,
281+
this.parseUnloadingPolicy
282+
),
276283
...this.mapKeyToModelValue('startWaypoint', 'StartWaypoint', vehicle, mapping),
277284
...this.mapKeyToModelValue('endWaypoint', 'EndWaypoint', vehicle, mapping),
278285
...this.mapKeyToModelValue('costPerHour', 'CostPerHour', vehicle, mapping, parseFloat),
@@ -648,6 +655,18 @@ export class CsvService {
648655
return { seconds: value };
649656
}
650657

658+
private parseUnloadingPolicy(value: any): UnloadingPolicy {
659+
let finalValue = UnloadingPolicy.UNLOADING_POLICY_UNSPECIFIED;
660+
661+
Object.keys(UnloadingPolicy).forEach((key) => {
662+
if (key === value || UnloadingPolicy[key] === parseInt(value)) {
663+
finalValue = UnloadingPolicy[key];
664+
}
665+
});
666+
667+
return finalValue;
668+
}
669+
651670
private commaSeparatedStringToIntArray(value: string): number[] {
652671
return value.split(',').map((entry) => parseInt(entry, 10));
653672
}

application/frontend/src/app/routes-chart/components/base-routes-row/base-routes-row.component.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
ShipmentRoute,
3030
Timeline,
3131
Vehicle,
32-
PointOfInterestClick,
3332
ChangedVisits,
3433
} from 'src/app/core/models';
3534
import { formatLongTime } from 'src/app/util';

application/frontend/src/app/routes-chart/containers/routes-row/routes-row.component.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { provideMockStore } from '@ngrx/store/testing';
2222
import Long from 'long';
2323
import {
2424
PointOfInterest,
25-
PointOfInterestClick,
2625
ShipmentRoute,
2726
Timeline,
2827
ChangedVisits,
@@ -51,6 +50,7 @@ class MockBaseRoutesRowComponent {
5150
@Input() route: ShipmentRoute;
5251
@Input() vehicle: Vehicle;
5352
@Input() shipmentCount: number;
53+
@Input() selected = false;
5454
@Input() timeline: Timeline;
5555
@Input() duration: [Long, Long];
5656
@Input() availability: [Long, Long];

application/frontend/src/app/shared/components/load-demands-metrics/load-demands-metrics.component.spec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { LoadDemandsMetricsComponent } from './load-demands-metrics.component';
44
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
5+
import { MaterialModule } from 'src/app/material';
6+
import { MatIconRegistry } from '@angular/material/icon';
7+
import { FakeMatIconRegistry } from 'src/test/material-fakes';
58

69
describe('LoadDemandsMetricsComponent', () => {
710
let component: LoadDemandsMetricsComponent;
811
let fixture: ComponentFixture<LoadDemandsMetricsComponent>;
912

1013
beforeEach(async () => {
1114
await TestBed.configureTestingModule({
15+
imports: [MaterialModule],
1216
declarations: [LoadDemandsMetricsComponent],
1317
providers: [
1418
{ provide: MatDialogRef, useValue: {} },
@@ -55,7 +59,9 @@ describe('LoadDemandsMetricsComponent', () => {
5559
},
5660
},
5761
],
58-
}).compileComponents();
62+
})
63+
.overrideProvider(MatIconRegistry, { useFactory: () => new FakeMatIconRegistry() })
64+
.compileComponents();
5965

6066
fixture = TestBed.createComponent(LoadDemandsMetricsComponent);
6167
component = fixture.componentInstance;

0 commit comments

Comments
 (0)