Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
sort beacons util
Browse files Browse the repository at this point in the history
Signed-off-by: Kerry Archibald <[email protected]>
  • Loading branch information
Kerry Archibald committed Mar 21, 2022
1 parent 112e33b commit ce06c27
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
11 changes: 11 additions & 0 deletions src/utils/beacon/duration.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { Beacon } from "matrix-js-sdk/src/matrix";

/**
* Get ms until expiry
* Returns 0 when expiry is already passed
Expand All @@ -7,3 +9,12 @@
*/
export const msUntilExpiry = (startTimestamp: number, durationMs: number): number =>
Math.max(0, (startTimestamp + durationMs) - Date.now());

export const getBeaconMsUntilExpiry = (beacon: Beacon): number =>
msUntilExpiry(beacon.beaconInfo.timestamp, beacon.beaconInfo.timeout);

export const getBeaconExpiryTimestamp = (beacon: Beacon): number =>
beacon.beaconInfo.timestamp + beacon.beaconInfo.timeout;

export const sortBeaconsByLatestExpiry = (left: Beacon, right: Beacon): number =>
getBeaconExpiryTimestamp(right) - getBeaconExpiryTimestamp(left);
4 changes: 3 additions & 1 deletion test/test-utils/beacon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type InfoContentProps = {
isLive?: boolean;
assetType?: LocationAssetType;
description?: string;
timestamp?: number;
};
const DEFAULT_INFO_CONTENT_PROPS: InfoContentProps = {
timeout: 3600000,
Expand All @@ -45,6 +46,7 @@ export const makeBeaconInfoEvent = (
): MatrixEvent => {
const {
timeout, isLive, description, assetType,
timestamp,
} = {
...DEFAULT_INFO_CONTENT_PROPS,
...contentProps,
Expand All @@ -53,7 +55,7 @@ export const makeBeaconInfoEvent = (
type: `${M_BEACON_INFO.name}.${sender}.${eventTypeSuffix || ++count}`,
room_id: roomId,
state_key: sender,
content: makeBeaconInfoContent(timeout, isLive, description, assetType),
content: makeBeaconInfoContent(timeout, isLive, description, assetType, timestamp),
});

// live beacons use the beacon_info event id
Expand Down
60 changes: 48 additions & 12 deletions test/utils/beacon/duration-test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { msUntilExpiry } from "../../../src/utils/beacon";
import { Beacon } from "matrix-js-sdk/src/matrix";

describe('msUntilExpiry', () => {
import { msUntilExpiry, sortBeaconsByLatestExpiry } from "../../../src/utils/beacon";
import { makeBeaconInfoEvent } from "../../test-utils";

describe('beacon utils', () => {
// 14.03.2022 16:15
const now = 1647270879403;
const HOUR_MS = 3600000;
Expand All @@ -13,19 +16,52 @@ describe('msUntilExpiry', () => {
jest.spyOn(global.Date, 'now').mockRestore();
});

it('returns remaining duration', () => {
const start = now - HOUR_MS;
const durationMs = HOUR_MS * 3;
describe('msUntilExpiry', () => {
it('returns remaining duration', () => {
const start = now - HOUR_MS;
const durationMs = HOUR_MS * 3;

expect(msUntilExpiry(start, durationMs)).toEqual(HOUR_MS * 2);
});

it('returns 0 when expiry has already passed', () => {
// created 3h ago
const start = now - HOUR_MS * 3;
// 1h durations
const durationMs = HOUR_MS;

expect(msUntilExpiry(start, durationMs)).toEqual(HOUR_MS * 2);
expect(msUntilExpiry(start, durationMs)).toEqual(0);
});
});

it('returns 0 when expiry has already passed', () => {
// created 3h ago
const start = now - HOUR_MS * 3;
// 1h durations
const durationMs = HOUR_MS;
describe('sortBeaconsByLatestExpiry()', () => {
const roomId = '!room:server';
const aliceId = '@alive:server';

// 12h old, 12h left
const beacon1 = new Beacon(makeBeaconInfoEvent(aliceId,
roomId,
{ timeout: HOUR_MS * 24, timestamp: now - 12 * HOUR_MS },
'$1',
));
// 10h left
const beacon2 = new Beacon(makeBeaconInfoEvent(aliceId,
roomId,
{ timeout: HOUR_MS * 10, timestamp: now },
'$2',
));

// 1ms left
const beacon3 = new Beacon(makeBeaconInfoEvent(aliceId,
roomId,
{ timeout: HOUR_MS + 1, timestamp: now - HOUR_MS },
'$3',
));

expect(msUntilExpiry(start, durationMs)).toEqual(0);
it('sorts beacons by descending expiry time', () => {
expect([beacon2, beacon3, beacon1].sort(sortBeaconsByLatestExpiry)).toEqual([
beacon1, beacon2, beacon3,
]);
});
});
});

0 comments on commit ce06c27

Please sign in to comment.