From b839aeba78fb51b0e4a542fc5dd76cb4ec718db7 Mon Sep 17 00:00:00 2001 From: Pablo Martin Date: Thu, 5 Jun 2025 15:48:19 +0200 Subject: [PATCH] completed exercise 4.7 --- parts/4/blogApp/src/utils.js | 20 ++++++++- parts/4/blogApp/tests/mostLikes.test.js | 54 +++++++++++++++++++++++++ parts/4/notes.md | 1 + 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 parts/4/blogApp/tests/mostLikes.test.js diff --git a/parts/4/blogApp/src/utils.js b/parts/4/blogApp/src/utils.js index eadc74d..9653c37 100644 --- a/parts/4/blogApp/src/utils.js +++ b/parts/4/blogApp/src/utils.js @@ -52,7 +52,6 @@ const mostPosts = (posts) => { return acc; }, {}); - // Use Object.entries to find the top author const [author, postsCount] = Object.entries(countMap).reduce( (max, entry) => (entry[1] > max[1] ? entry : max), ['', 0] @@ -61,6 +60,24 @@ const mostPosts = (posts) => { return { author, posts: postsCount }; }; +const mostLikes = (posts) => { + if (!posts || posts.length === 0) { + return null; + } + + const likesMap = posts.reduce((acc, post) => { + acc[post.author] = (acc[post.author] || 0) + post.likes; + return acc; + }, {}); + + const [author, likesCount] = Object.entries(likesMap).reduce( + (max, entry) => (entry[1] > max[1] ? entry : max), + ['', 0] + ); + + return { author, likes: likesCount }; + }; + module.exports = { reverse, average, @@ -68,4 +85,5 @@ module.exports = { totalLikes, favoritePost, mostPosts, + mostLikes }; diff --git a/parts/4/blogApp/tests/mostLikes.test.js b/parts/4/blogApp/tests/mostLikes.test.js new file mode 100644 index 0000000..2977375 --- /dev/null +++ b/parts/4/blogApp/tests/mostLikes.test.js @@ -0,0 +1,54 @@ +const { test, describe } = require("node:test"); +const assert = require("node:assert"); +const { mostLikes } = require("../src/utils"); + +describe("most likes ", () => { + const posts = [ + { + _id: "5a422aa71b54a676234d17f8", + title: "Go To Statement Considered Harmful", + author: "Edsger W. Dijkstra", + url: "https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf", + likes: 5, + __v: 0, + }, + { + _id: "5a422aa71b54a676234d17f8", + title: "Go To Statement Considered Harmful", + author: "Edsger W. Dijkstra", + url: "https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf", + likes: 2, + __v: 0, + }, + { + _id: "123", + title: "Lololo", + author: "John Doe", + url: "https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf", + likes: 1, + __v: 0, + }, + ]; + + const emptyArray = []; + + const gibberish = "asdaSd123asd"; + + test("finds top author properly", () => { + assert.deepStrictEqual(mostLikes(posts), { + author: "Edsger W. Dijkstra", + likes: 7, + }); + }); + + test("works fine with empty array", () => { + assert.strictEqual(mostLikes(emptyArray), null); + }); + + test("fails with gibberish input", () => { + const failedCall = () => { + mostLikes(gibberish); + }; + assert.throws(failedCall, Error); + }); +}); diff --git a/parts/4/notes.md b/parts/4/notes.md index ccd63b9..e4593b6 100644 --- a/parts/4/notes.md +++ b/parts/4/notes.md @@ -5,3 +5,4 @@ Exercises: * [X] 4.4 * [X] 4.5 * [X] 4.6 +* [X] 4.7