Skip to content

Commit

Permalink
#2 wrote new set of unit tests and using UTC where needed
Browse files Browse the repository at this point in the history
  • Loading branch information
seveves committed Dec 26, 2020
1 parent 33eb03a commit 50e5d95
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 141 deletions.
4 changes: 2 additions & 2 deletions components/PostListItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import prettyms from 'pretty-ms';

import LikeDisplay from './LikeDisplay';

import { ttlGrayscale } from '../utils/ttl';
import { ttlGrayscale, UTCDate } from '../utils/ttl';

import styles from '../styles/post-list-item.module.css';

const PostListItem = ({ post, owner, userId, dagligId }) => {
const prettycreated = (t) => prettyms(Date.now() - t, { compact: true });
const prettycreated = (t) => prettyms(UTCDate(new Date()).getTime() - t, { compact: true });
return (
<li className={styles.postlistitem}>
{post.user != null && (
Expand Down
4 changes: 2 additions & 2 deletions components/ProfileHead.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Image from 'next/image';
import { useState } from 'react';
import styles from '../styles/profile-head.module.css';
import prettyms from 'pretty-ms';
import { ONE_DAY_IN_MS, ttlGrayscale } from '../utils/ttl';
import { ttlGrayscale, UTCDate } from '../utils/ttl';

import Visitor from './Visitor';

Expand All @@ -19,7 +19,7 @@ const ProfileHead = ({ daglig, ttl, sessionDaglig }) => {
};

const prettyttl = prettyms(ttl);
const prettycreated = prettyms(Date.now() - daglig.createdAt, {
const prettycreated = prettyms(UTCDate(new Date()).getTime() - daglig.createdAt, {
compact: true,
});

Expand Down
2 changes: 1 addition & 1 deletion pages/[id].js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export async function getServerSideProps(context) {
const daglig = await Daglig.findOne({ username: { $eq: name } });
if (!daglig) return redirect;

const { expired, ttl } = ttlExpired(new Date(), daglig);
const { expired, ttl } = ttlExpired(daglig);
if (expired) {
await Daglig.findByIdAndDelete(daglig._id);
return redirect;
Expand Down
2 changes: 1 addition & 1 deletion pages/api/remove-expired.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default async (req, res) => {
const dagligs = await Daglig.find({});
const toDelete = dagligs
.filter((daglig) => {
const { expired } = ttlExpired(new Date(), daglig);
const { expired } = ttlExpired(daglig);
return expired;
})
.map((d) => d._id);
Expand Down
5 changes: 2 additions & 3 deletions pages/browse.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,14 @@ export async function getServerSideProps(context) {
permament: false,
},
};
const now = new Date();

await dbConnect();

const dagligs = await Daglig.find({});
if (!dagligs) return redirect;

const posts = dagligs
.map((d) => ({ ...dagligProps(d), ttlExpired: ttlExpired(now, d) }))
.map((d) => ({ ...dagligProps(d), ttlExpired: ttlExpired(d) }))
.map(
(d) =>
d.posts.map((p) => ({
Expand All @@ -99,7 +98,7 @@ export async function getServerSideProps(context) {
let sessionTtl = 0;
if (session) {
const sDaglig = await Daglig.findOne({ userid: { $eq: session.user.id } });
const { expired, ttl } = ttlExpired(now, sDaglig);
const { expired, ttl } = ttlExpired(sDaglig);
if (expired) {
await Daglig.findByIdAndDelete(sDaglig._id);
return redirect;
Expand Down
2 changes: 1 addition & 1 deletion pages/favorites.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export async function getServerSideProps(context) {
const daglig = await Daglig.findOne({ userid: { $eq: userid } });
if (!daglig) return redirect;

const { expired, ttl } = ttlExpired(new Date(), daglig);
const { expired, ttl } = ttlExpired(daglig);
if (expired) {
await Daglig.findByIdAndDelete(daglig._id);
return redirect;
Expand Down
2 changes: 1 addition & 1 deletion pages/write-post.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export async function getServerSideProps(context) {
const daglig = await Daglig.findOne({ userid: { $eq: userid } });
if (!daglig) return redirect;

const { expired, ttl } = ttlExpired(new Date(), daglig);
const { expired, ttl } = ttlExpired(daglig);
if (expired) {
await Daglig.findByIdAndDelete(daglig._id);
return redirect;
Expand Down
39 changes: 25 additions & 14 deletions utils/ttl.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,22 @@
export const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000;

export function ttlExpired(now, daglig) {
let startOfCreated = new Date(daglig.createdAt);
export function ttlExpired(daglig, now) {
now = now != null ? UTCDate(now) : UTCDate(new Date());

const c = daglig.createdAt;
let startOfCreated = UTCDate(c);
let extraMs = 0;
if (daglig.posts?.length > 0) {
const latestPost = daglig.posts[daglig.posts.length - 1];
startOfCreated = new Date(latestPost.createdAt);
if (
now.getFullYear() === startOfCreated.getFullYear() &&
now.getMonth() === startOfCreated.getMonth() &&
now.getDate() === startOfCreated.getDate()
) {
startOfCreated.setDate(startOfCreated.getDate() + 1);
const likesAmount = latestPost.likes?.length;
if (likesAmount > 0) {
extraMs = likesAmount * 60 * 1000;
}
startOfCreated = UTCDate(latestPost.createdAt);
startOfCreated.setDate(startOfCreated.getDate() + 1);
const likesAmount = latestPost.likes?.length;
if (likesAmount > 0) {
extraMs = likesAmount * 60 * 1000;
}
}
startOfCreated.setHours(0, 0, 0, 0);
const startOfNextDay = new Date(startOfCreated);
const startOfNextDay = UTCDate(startOfCreated);
startOfNextDay.setDate(startOfNextDay.getDate() + 1);
const ttl = startOfNextDay.getTime() + extraMs - now.getTime();
const expired = ttl <= 0;
Expand All @@ -35,3 +32,17 @@ export function ttlGrayscale(ttl) {
};
return grayscale;
}

export function UTCDate(c) {
return new Date(
Date.UTC(
c.getUTCFullYear(),
c.getUTCMonth(),
c.getUTCDate(),
c.getUTCHours(),
c.getUTCMinutes(),
c.getUTCSeconds(),
c.getUTCMilliseconds()
)
);
}
162 changes: 46 additions & 116 deletions utils/ttl.test.js
Original file line number Diff line number Diff line change
@@ -1,159 +1,89 @@
import { ONE_DAY_IN_MS, ttlExpired } from './ttl';
import { ONE_DAY_IN_MS, ttlExpired, UTCDate } from './ttl';

describe('ttlExpired', () => {
test('same time - use createdAt when posts are null', () => {
test('just created profile', () => {
const now = new Date(1987, 10, 1, 10);
const daglig = {
createdAt: now,
posts: null,
posts: [],
};
const { expired, ttl } = ttlExpired(now, daglig);
const { expired, ttl } = ttlExpired(daglig, now);
expect(expired).toBe(false);
expect(ttl > 0).toBe(true);
expect(ttl).toBe(14 * 60 * 60 * 1000); // 14h left of the current day
});

test('10h old - use createdAt when posts are null', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setHours(createdAt.getHours() - 10);
const daglig = {
createdAt,
posts: null,
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(false);
expect(ttl).toBe(14 * 60 * 60 * 1000);
});

test('12h old - use createdAt when posts are null', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setHours(createdAt.getHours() - 12);
test('created profile but wrote no post till next day', () => {
const createdAt = new Date(1987, 10, 1, 10);
const daglig = {
createdAt,
posts: null,
posts: [],
};
const { expired, ttl } = ttlExpired(now, daglig);
const { expired, ttl } = ttlExpired(daglig, new Date(1987, 10, 2));
expect(expired).toBe(true);
expect(ttl).toBe(0);
});

test('1d old - use createdAt when posts are null', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setDate(createdAt.getDate() - 1);
test('created profile but wrote no post till the end of current day', () => {
const createdAt = new Date(1987, 10, 1, 10);
const daglig = {
createdAt,
posts: null,
posts: [],
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(true);
expect(ttl).toBe(0);
});

test('2d old - use createdAt when posts are null', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setDate(createdAt.getDate() - 2);
const daglig = {
createdAt,
posts: null,
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(true);
expect(ttl).toBe(0);
});

test('same time - use createdAt of oldest post', () => {
const now = new Date(1987, 10, 1, 10);
const daglig = {
createdAt: now,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt: now, likes: [] },
],
};
const { expired, ttl } = ttlExpired(now, daglig);
const { expired, ttl } = ttlExpired(daglig, new Date(1987, 10, 1, 23, 59, 59, 999));
expect(expired).toBe(false);
expect(ttl > 0).toBe(true);
expect(ttl).toBe(1);
});

test('10h old - use createdAt of oldest post', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setHours(createdAt.getHours() - 10);
test('just created profile and directly wrote first post', () => {
const createdAt = new Date(1987, 10, 1, 10);
const daglig = {
createdAt,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt, likes: [] },
],
posts: [{
createdAt,
likes: []
}],
};
const { expired, ttl } = ttlExpired(now, daglig);
const { expired, ttl } = ttlExpired(daglig, createdAt);
expect(expired).toBe(false);
expect(ttl).toBe(14 * 60 * 60 * 1000 + ONE_DAY_IN_MS);
});

test('12h old - use createdAt of oldest post', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setHours(createdAt.getHours() - 12);
test('wrote post yesterday', () => {
const daglig = {
createdAt,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt, likes: [] },
],
createdAt: new Date(1987, 10, 1),
posts: [{
createdAt: new Date(1987, 10, 2),
likes: []
}],
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(true);
expect(ttl).toBe(0);
const { expired, ttl } = ttlExpired(daglig, new Date(1987, 10, 3));
expect(expired).toBe(false);
expect(ttl).toBe(ONE_DAY_IN_MS);
});

test('1d old - use createdAt of oldest post', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setDate(createdAt.getDate() - 1);
test('wrote post yesterday and very close to be deleted', () => {
const daglig = {
createdAt,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt, likes: [] },
],
createdAt: new Date(1987, 10, 1),
posts: [{
createdAt: new Date(1987, 10, 2),
likes: []
}],
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(true);
expect(ttl).toBe(0);
const { expired, ttl } = ttlExpired(daglig, new Date(1987, 10, 3, 23, 59, 59, 999));
expect(expired).toBe(false);
expect(ttl).toBe(1);
});

test('2d old - use createdAt of oldest post', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
createdAt.setDate(createdAt.getDate() - 2);
test('wrote post two days before', () => {
const daglig = {
createdAt,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt, likes: [] },
],
createdAt: new Date(1987, 10, 1),
posts: [{
createdAt: new Date(1987, 10, 2),
likes: []
}],
};
const { expired, ttl } = ttlExpired(now, daglig);
const { expired, ttl } = ttlExpired(daglig, new Date(1987, 10, 4));
expect(expired).toBe(true);
expect(ttl).toBe(0);
});

test('3 extra minutes because of 3 likes', () => {
const now = new Date(1987, 10, 1, 10);
const createdAt = new Date(now);
const daglig = {
createdAt,
posts: [
{ createdAt: new Date(1987, 10, 1, 9), likes: [] },
{ createdAt, likes: ['foo', 'bar', 'baz'] },
],
};
const { expired, ttl } = ttlExpired(now, daglig);
expect(expired).toBe(false);
expect(ttl).toBe(50580000 + ONE_DAY_IN_MS); // 14h and 3min
});
});

0 comments on commit 50e5d95

Please sign in to comment.