Skip to content

Commit

Permalink
fix: sort delivery moments by time
Browse files Browse the repository at this point in the history
  • Loading branch information
EdieLemoine committed Mar 14, 2024
1 parent be362d3 commit 521ec94
Show file tree
Hide file tree
Showing 10 changed files with 113 additions and 11 deletions.
2 changes: 1 addition & 1 deletion apps/delivery-options/src/__snapshots__/index.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ exports[`exports > exports from index.ts 1`] = `
"getResolvedDeliveryType",
"getResolvedValue",
"hasSlotContent",
"padStart",
"padTime",
"parseJson",
"showDeveloperInfo",
"stringToDate",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import {addHours} from 'date-fns';
import {type DateLike, normalizeDate} from '@vueuse/core';
import {createDeliveryTimeframe} from '@myparcel-do/shared/testing';
import {type DeliveryOption} from '@myparcel/sdk';
import {DeliveryTypeName, PackageTypeName} from '@myparcel/constants';

export const createDeliveryPossibility = (
date: DateLike,
options: Partial<DeliveryOption['possibilities'][number]> = {},
): DeliveryOption['possibilities'][number] => {
const normalizedDate = normalizeDate(date);

return {
type: DeliveryTypeName.Standard,
package_type: PackageTypeName.Package,
shipment_options: [],
delivery_time_frames: [
createDeliveryTimeframe(normalizedDate, 'start'),
createDeliveryTimeframe(addHours(normalizedDate, 1), 'end'),
],
...options,
};
};
1 change: 1 addition & 0 deletions apps/delivery-options/src/__tests__/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './createDeliveryPossibility';
export * from './createDiv';
export * from './dispatchEvent';
export * from './getFakePickupLocation';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export const mockDeliveryOptionsConfig = <I extends RecursivePartial<DeliveryOpt
[KEY_CARRIER_SETTINGS]: {
[CarrierName.PostNl]: {
[CarrierSetting.AllowDeliveryOptions]: true,
[CarrierSetting.AllowStandardDelivery]: true,
},
},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {flushPromises} from '@vue/test-utils';
import {waitFor} from '@testing-library/vue';
import {waitForRequestData, useDeliveryOptionsRequest, type SupportedPlatformName} from '@myparcel-do/shared';
import {type DeliveryOption} from '@myparcel/sdk';
Expand All @@ -15,8 +16,10 @@ export const waitForDeliveryOptions = async (

const [data] = await Promise.all([
waitForRequestData(useDeliveryOptionsRequest, [createGetDeliveryOptionsParameters(resolvedCarrier)]),
waitFor(() => options.value.length > 0, {timeout: 1000}),
waitFor(() => !options.loading.value, {timeout: 1000}),
]);

await flushPromises();

return data;
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {computed, type ComputedRef} from 'vue';
import {resolveTranslatable} from '@myparcel-do/shared';
import {type ResolvedDeliveryOptions} from '../types';
import {useSelectedDeliveryDate} from './useSelectedDeliveryDate';
import {useResolvedDeliveryOptions} from './useResolvedDeliveryOptions';
Expand All @@ -13,10 +12,6 @@ export const useResolvedDeliveryMoments = (): ComputedRef<ResolvedDeliveryOption
return [];
}

return deliveryOptions.value
.filter((option) => option.date === deliveryDate.value)
.sort((optionA, optionB) => {
return resolveTranslatable(optionA.time).localeCompare(resolveTranslatable(optionB.time));
});
return deliveryOptions.value.filter((option) => option.date === deliveryDate.value);
});
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import {describe, it, expect, beforeEach} from 'vitest';
import {setActivePinia, createPinia} from 'pinia';
import {normalizeDate} from '@vueuse/core';
import {mockGetDeliveryOptions} from '@myparcel-do/shared/testing';
import {KEY_CONFIG, CarrierSetting, KEY_CARRIER_SETTINGS, createTimestamp} from '@myparcel-do/shared';
import {DeliveryTypeName, CarrierName} from '@myparcel/constants';
import {
waitForDeliveryOptions,
mockDeliveryOptionsConfig,
getMockDeliveryOptionsConfiguration,
createDeliveryPossibility,
} from '../__tests__';
import {useResolvedDeliveryOptions} from './useResolvedDeliveryOptions';

const mockSetup = async (): Promise<void> => {
mockDeliveryOptionsConfig(
getMockDeliveryOptionsConfiguration({
[KEY_CONFIG]: {
[KEY_CARRIER_SETTINGS]: {
[CarrierName.PostNl]: {
[CarrierSetting.AllowDeliveryOptions]: true,
[CarrierSetting.AllowMondayDelivery]: true,
[CarrierSetting.AllowSameDayDelivery]: true,
[CarrierSetting.AllowEveningDelivery]: true,
[CarrierSetting.AllowMorningDelivery]: true,
[CarrierSetting.AllowStandardDelivery]: true,
},
},
},
}),
);

await waitForDeliveryOptions();
};

describe('useResolvedDeliveryOptions', () => {
beforeEach(() => {
setActivePinia(createPinia());
});

it('sorts options by time', async () => {
const morning = normalizeDate('2022-01-01T09:00:00');
const standard = normalizeDate('2022-01-01T15:00:00');
const evening = normalizeDate('2022-01-01T20:00:00');

mockGetDeliveryOptions.mockReturnValueOnce(
Promise.resolve([
{
date: createTimestamp(standard),
possibilities: [
createDeliveryPossibility(evening, {type: DeliveryTypeName.Evening}),
createDeliveryPossibility(standard),
createDeliveryPossibility(morning, {type: DeliveryTypeName.Morning}),
],
},
]),
);

await mockSetup();

const options = useResolvedDeliveryOptions();

expect(options.value.map((option) => option.deliveryType)).toEqual([
DeliveryTypeName.Morning,
DeliveryTypeName.Standard,
DeliveryTypeName.Evening,
]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,17 @@ export const useResolvedDeliveryOptions = useMemoize(() => {

return resolvedDates.reduce((acc: SelectedDeliveryMoment[], {carrier, dates}) => {
dates.forEach((dateOption) => {
dateOption.possibilities.forEach((datePossibility) => {
/**
* Sort the possibilities by start date.
*/
const possibilities = [...dateOption.possibilities].sort((optionA, optionB) => {
const startA = optionA.delivery_time_frames[0]?.date_time.date;
const startB = optionB.delivery_time_frames[0]?.date_time.date;

return startA.localeCompare(startB);
});

possibilities.forEach((datePossibility) => {
const [start, end] = datePossibility.delivery_time_frames;

const timeString: AnyTranslatable =
Expand Down
2 changes: 1 addition & 1 deletion libs/shared/src/data/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const NBSP = '\u00A0';

export const CARRIER_IDENTIFIER_SEPARATOR = ':';

export const API_DATE_FORMAT = 'y-MM-d kk:mm:ss';
export const API_DATE_FORMAT = 'y-MM-dd kk:mm:ss';

export const DEFAULT_TIMEZONE_TYPE = 3;

Expand Down
2 changes: 1 addition & 1 deletion libs/shared/src/utils/createTimestamp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {type DateLike, normalizeDate} from '@vueuse/core';
import {type Timestamp} from '@myparcel/sdk';
import {DEFAULT_TIMEZONE, DEFAULT_TIMEZONE_TYPE, API_DATE_FORMAT} from '../data';

export const createTimestamp = (date: DateLike): Timestamp => {
export const createTimestamp = (date: DateLike = new Date()): Timestamp => {
return {
date: format(normalizeDate(date), API_DATE_FORMAT),
timezone: DEFAULT_TIMEZONE,
Expand Down

0 comments on commit 521ec94

Please sign in to comment.