Skip to content

Commit

Permalink
fix: ensure subs plans are sorted alphabetically, when appropriate (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
adamstankiewicz authored Feb 1, 2024
1 parent 8e75c47 commit d457357
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 26 deletions.
47 changes: 31 additions & 16 deletions src/components/subscriptions/data/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,39 @@ export const getSubscriptionStatus = (subscription) => {
return ACTIVE;
};

// Sort plans by statuses, active -> scheduled -> ended.
export const sortSubscriptionsByStatus = (subscriptions) => subscriptions.slice().sort(
(sub1, sub2) => {
const orderByStatus = {
[ACTIVE]: 0,
[SCHEDULED]: 1,
[ENDED]: 2,
};
const sub1Status = getSubscriptionStatus(sub1);
const sub2Status = getSubscriptionStatus(sub2);
/**
* Sort subscription plans by:
* - Statuses (active -> scheduled -> ended)
* - Plans within same status, sorted by expiration date (ascending)
* - Plans within same status and expiration date, sorted by title (ascending)
*
* @param {Array} subscriptions - List of subscription plans.
*
* @returns Ordered list of subscription plans.
*/
export const sortSubscriptionsByStatus = (subscriptions) => {
const statusOrder = {
[ACTIVE]: 0,
[SCHEDULED]: 1,
[ENDED]: 2,
};
return subscriptions.slice().sort(
(sub1, sub2) => {
const sub1Status = getSubscriptionStatus(sub1);
const sub2Status = getSubscriptionStatus(sub2);

if (statusOrder[sub1Status] !== statusOrder[sub2Status]) {
return statusOrder[sub1Status] - statusOrder[sub2Status];
}

if (sub1Status === sub2Status) {
return dayjs(sub1.startDate) - dayjs(sub2.startDate);
}
if (sub1.expirationDate !== sub2.expirationDate) {
return sub1.expirationDate.localeCompare(sub2.expirationDate);
}

return orderByStatus[sub1Status] - orderByStatus[sub2Status];
},
);
return sub1.title.localeCompare(sub2.title);
},
);
};

export const transformFiltersForRequest = (filters) => {
const nameMappings = {
Expand Down
31 changes: 21 additions & 10 deletions src/components/subscriptions/tests/data/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@ import { sortSubscriptionsByStatus, getSubscriptionStatus } from '../../data/uti

describe('utils', () => {
const scheduledSub = {
startDate: dayjs().add(1, 'days'),
expirationDate: dayjs().add(10, 'days'),
startDate: dayjs().add(1, 'days').toISOString(),
expirationDate: dayjs().add(10, 'days').toISOString(),
title: 'Test Scheduled Plan',
};
const activeSub = {
startDate: dayjs().subtract(1, 'days'),
expirationDate: dayjs().add(10, 'days'),
startDate: dayjs().subtract(1, 'days').toISOString(),
expirationDate: dayjs().add(10, 'days').toISOString(),
title: 'Test Active Plan',
};
const expiredSub = {
startDate: dayjs().subtract(10, 'days'),
expirationDate: dayjs().subtract(1, 'days'),
startDate: dayjs().subtract(10, 'days').toISOString(),
expirationDate: dayjs().subtract(1, 'days').toISOString(),
title: 'Test Expired Plan',
};

describe('getSubscriptionStatus', () => {
Expand All @@ -28,18 +31,26 @@ describe('utils', () => {
it('should sort subscriptions by status', () => {
const initialOrder = [expiredSub, activeSub, scheduledSub];
const expectedOrder = [activeSub, scheduledSub, expiredSub];

expect(sortSubscriptionsByStatus(initialOrder)).toEqual(expectedOrder);
});

it('should sort subscriptions by start date after status', () => {
it('should sort subscriptions by expiration date after status', () => {
const activeSub2 = {
startDate: dayjs().subtract(2, 'days'),
expirationDate: dayjs().add(10, 'days'),
...activeSub,
expirationDate: dayjs().add(1, 'days').toISOString(), // expires sooner than other active subs plan
};
const initialOrder = [expiredSub, activeSub, scheduledSub, activeSub2];
const expectedOrder = [activeSub2, activeSub, scheduledSub, expiredSub];
expect(sortSubscriptionsByStatus(initialOrder)).toEqual(expectedOrder);
});

it('should sort subscriptions by plan title after status and date', () => {
const activeSub2 = {
...activeSub,
title: 'Another Active Plan', // title alphabetically comes before other active subs plan title
};
const initialOrder = [expiredSub, activeSub, scheduledSub, activeSub2];
const expectedOrder = [activeSub2, activeSub, scheduledSub, expiredSub];
expect(sortSubscriptionsByStatus(initialOrder)).toEqual(expectedOrder);
});
});
Expand Down

0 comments on commit d457357

Please sign in to comment.