Skip to content

Commit e5af4e5

Browse files
authored
Feature/expiry helpers (#408)
* adding expiry helpers for cache invalidation * dont forget to write tests * adding unit test for getExpiryDateTimeFromNow * adding unit test for has expired
1 parent 014aeb8 commit e5af4e5

File tree

6 files changed

+162
-0
lines changed

6 files changed

+162
-0
lines changed

client/constants.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ export const NOTIFICATION_TYPE_SUCCESS = 'success';
7676
export const NOTIFICATION_TYPE_WARNING = 'warning';
7777
export const NOTIFICATION_TIMEOUT = 5000;
7878

79+
export const ONE_HOUR_IN_MILLISECONDS = 60 * 60 * 1000;
80+
7981
export const TIME_FORMAT_12 = 'TIME_FORMAT_12';
8082
export const TIME_FORMAT_24 = 'TIME_FORMAT_24';
8183
export const TIME_FORMAT_OPTIONS = [
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) 2021 Uber Technologies Inc.
2+
//
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
import moment from 'moment';
23+
import { ONE_HOUR_IN_MILLISECONDS } from '../constants';
24+
25+
const getExpiryDateTimeFromNow = (time = ONE_HOUR_IN_MILLISECONDS) =>
26+
moment()
27+
.add(ONE_HOUR_IN_MILLISECONDS)
28+
.toISOString();
29+
30+
export default getExpiryDateTimeFromNow;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright (c) 2021 Uber Technologies Inc.
2+
//
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
import MockDate from 'mockdate';
23+
import getExpiryDateTimeFromNow from './get-expiry-date-time-from-now';
24+
25+
describe('getExpiryDateTimeFromNow', () => {
26+
beforeEach(() => {
27+
MockDate.set(new Date('2020-01-01T00:00:00.000Z'));
28+
});
29+
30+
afterEach(() => {
31+
MockDate.reset();
32+
});
33+
34+
it('should return a date 1 hour in the future', () => {
35+
const output = getExpiryDateTimeFromNow();
36+
37+
expect(output).toEqual('2020-01-01T01:00:00.000Z');
38+
});
39+
});

client/helpers/has-expired.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) 2021 Uber Technologies Inc.
2+
//
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
import moment from 'moment';
23+
24+
const hasExpired = expiryDateTime => {
25+
if (!expiryDateTime) {
26+
return true;
27+
}
28+
29+
return moment().isAfter(expiryDateTime);
30+
};
31+
32+
export default hasExpired;

client/helpers/has-expired.spec.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright (c) 2021 Uber Technologies Inc.
2+
//
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
import MockDate from 'mockdate';
23+
import hasExpired from './has-expired';
24+
25+
describe('hasExpired', () => {
26+
beforeEach(() => {
27+
MockDate.set(new Date('2020-01-01T00:00:00.000Z'));
28+
});
29+
30+
afterEach(() => {
31+
MockDate.reset();
32+
});
33+
34+
describe('when expiryDateTime is not passed', () => {
35+
it('should return true.', () => {
36+
const output = hasExpired();
37+
38+
expect(output).toEqual(true);
39+
});
40+
});
41+
42+
describe('when expiryDateTime is in the past', () => {
43+
it('should return true.', () => {
44+
const output = hasExpired(new Date('2019-12-30T00:00:00.000Z'));
45+
46+
expect(output).toEqual(true);
47+
});
48+
});
49+
50+
describe('when expiryDateTime is in the future', () => {
51+
it('should return false.', () => {
52+
const output = hasExpired(new Date('2020-01-01T01:00:00.000Z'));
53+
54+
expect(output).toEqual(false);
55+
});
56+
});
57+
});

client/helpers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ export { default as getEnvironment } from './get-environment';
2727
export { default as getEnvironmentList } from './get-environment-list';
2828
export { default as getEnvironmentLocation } from './get-environment-location';
2929
export { default as getErrorMessage } from './get-error-message';
30+
export { default as getExpiryDateTimeFromNow } from './get-expiry-date-time-from-now';
3031
export { default as getJsonStringObject } from './get-json-string-object';
3132
export { default as getKeyValuePairs } from './get-key-value-pairs';
3233
export { default as getLatestNewsItems } from './get-latest-news-items';
3334
export { default as getQueryStringFromObject } from './get-query-string-from-object';
3435
export { default as getStartTimeIsoString } from './get-start-time-iso-string';
3536
export { default as getStringElipsis } from './get-string-elipsis';
37+
export { default as hasExpired } from './has-expired';
3638
export { default as injectMomentDurationFormat } from './inject-moment-duration-format';
3739
export { default as jsonTryParse } from './json-try-parse';
3840
export { default as mapDomainDescription } from './map-domain-description';

0 commit comments

Comments
 (0)