From d8be2c92f0a0158610e0242c77dcc60758918577 Mon Sep 17 00:00:00 2001 From: fzzinchemical Date: Fri, 28 Mar 2025 07:49:42 +0100 Subject: [PATCH] refactor: rename drop functions for clarity and update tests --- src/plugins/rule34/api.ts | 8 +- src/plugins/rule34/messages.ts | 6 +- src/plugins/rule34/test.ts | 14 +-- src/plugins/yandere/api.ts | 184 ++++++++++++++++++--------------- src/plugins/yandere/test.ts | 32 ++++++ 5 files changed, 146 insertions(+), 98 deletions(-) create mode 100644 src/plugins/yandere/test.ts diff --git a/src/plugins/rule34/api.ts b/src/plugins/rule34/api.ts index a04c53a..f0e5171 100755 --- a/src/plugins/rule34/api.ts +++ b/src/plugins/rule34/api.ts @@ -69,18 +69,18 @@ for (const k of baseResponse) { hyperlinkarray.push(k.file_url); } -export async function drop() { +export async function dropRule() { if (hyperlinkarray.length === 0) { await refresh(); - return await drop(); + return await dropRule(); } return hyperlinkarray.pop()!; } -export async function drop5() { +export async function dropRule5() { let tmp = ""; for (let i = 0; i < 5; i++) { - tmp += await drop() + "\n"; + tmp += await dropRule() + "\n"; } return tmp; } diff --git a/src/plugins/rule34/messages.ts b/src/plugins/rule34/messages.ts index a258184..cfc0646 100644 --- a/src/plugins/rule34/messages.ts +++ b/src/plugins/rule34/messages.ts @@ -1,5 +1,5 @@ import { Bot, Message } from "npm:discordeno@18.0.1"; -import { drop5, drop, refresh } from "./api.ts"; +import { dropRule5, dropRule, refresh } from "./api.ts"; import { logMessage } from "@root/logging.ts"; import { defaultString } from "@root/defaultString.ts"; @@ -13,7 +13,7 @@ export async function rule34MessageHandler(bot: Bot, message: Message) { message.guildId === undefined ) { bot.helpers.sendMessage(message.channelId, { - content: defaultString(await drop()), + content: defaultString(await dropRule()), }); } break; @@ -24,7 +24,7 @@ export async function rule34MessageHandler(bot: Bot, message: Message) { message.guildId === undefined ) { bot.helpers.sendMessage(message.channelId, { - content: defaultString(await drop5()), + content: defaultString(await dropRule5()), }); } break; diff --git a/src/plugins/rule34/test.ts b/src/plugins/rule34/test.ts index e082453..5ec73b2 100644 --- a/src/plugins/rule34/test.ts +++ b/src/plugins/rule34/test.ts @@ -1,8 +1,8 @@ -import { assert } from "jsr:@std/assert" -import {refresh, drop} from "@root/plugins/rule34/api.ts" +import { assert } from "jsr:@std/assert"; +import { dropRule, refresh } from "@root/plugins/rule34/api.ts"; -Deno.test("Test Drop", async() => { - await refresh() - const link = await drop() - assert(link !== "", "Empty String was dropped!") -}) \ No newline at end of file +Deno.test("Test Drop", async () => { + await refresh(); + const link = await dropRule(); + assert(link !== "", "Empty String was dropped!"); +}); diff --git a/src/plugins/yandere/api.ts b/src/plugins/yandere/api.ts index 1400e6f..12f3215 100755 --- a/src/plugins/yandere/api.ts +++ b/src/plugins/yandere/api.ts @@ -1,112 +1,128 @@ -const apiUrl ="https://yande.re/post.json?api_version=2"; +import { assert } from "@std/assert/assert"; + +const apiUrl = "https://yande.re/post.json?api_version=2"; type APIResponse = { - posts: { - id: number; - tags: string; - created_at: string; - creator_id: number; - approver_id: number; - author: string; - change: number; - source: string; - score: number; - md5: string; - file_size: number; - file_ext: string; - file_url: string; - is_shown_in_index: boolean; - preview_url: string; - preview_width: number; - preview_height: number; - actual_preview_width: number; - actual_preview_height: number; - sample_url: string; - sample_width: number; - sample_height: number; - sample_file_size: number; - jpeg_url: string; - jpeg_width: number; - jpeg_height: number; - rating: string; - is_rating_locked: boolean; - has_children: boolean; - parent_id: number; - status: string; - is_pending: boolean; - width: number; - height: number; - is_held: boolean; - frames_pending_string: string; - frames_pending: []; - frames_string: string; - frames: []; - is_note_locked: boolean; - last_noted_at: string; - last_commented_at: string; - }[]; + posts: { + id: number; + tags: string; + created_at: string; + creator_id: number; + approver_id: number; + author: string; + change: number; + source: string; + score: number; + md5: string; + file_size: number; + file_ext: string; + file_url: string; + is_shown_in_index: boolean; + preview_url: string; + preview_width: number; + preview_height: number; + actual_preview_width: number; + actual_preview_height: number; + sample_url: string; + sample_width: number; + sample_height: number; + sample_file_size: number; + jpeg_url: string; + jpeg_width: number; + jpeg_height: number; + rating: string; + is_rating_locked: boolean; + has_children: boolean; + parent_id: number; + status: string; + is_pending: boolean; + width: number; + height: number; + is_held: boolean; + frames_pending_string: string; + frames_pending: []; + frames_string: string; + frames: []; + is_note_locked: boolean; + last_noted_at: string; + last_commented_at: string; + }[]; }; let page = 1; -let baseRequest = await fetch(apiUrl, { headers: { "Accept": "application/json" } }) - .then(async (response) => { - if (!response.ok) { - throw new Error("Network response was not ok"); - } - return await response.json(); - }); - +let baseRequest = await fetch(apiUrl, { + headers: { "Accept": "application/json" }, +}) + .then(async (response) => { + if (!response.ok) { + throw new Error("Network response was not ok"); + } + return await response.json(); + }); const hyperlinkarray: string[] = []; for (const k of baseRequest.posts) { - hyperlinkarray.push(k.file_url); + hyperlinkarray.push(k.file_url); } -export function setPage(newpage: number) { - page = newpage; - hyperlinkarray.length = 0; - refresh(); +export async function setPage(newpage: number) { + page = newpage; + hyperlinkarray.length = 0; + await refresh(); } export function getPage() { - return page; + return page; } - +//duplicate code, also found in rule34/api.ts export async function refresh() { - await fetch(`${apiUrl}&page=${page}`, { headers: { "Accept": "application/json" } }) - .then(async (response) => { - if (!response.ok) { - throw new Error("Network response was not ok"); - } - baseRequest = await response.json(); - for (const k of baseRequest.posts) { - if (!hyperlinkarray.includes(k.file_url)) { - hyperlinkarray.push(k.file_url); - } - } - }); + await fetch(`${apiUrl}&page=${page}`, { + headers: { "Accept": "application/json" }, + }) + .then(async (response) => { + if (!response.ok) { + throw new Error("Network response was not ok"); + } + baseRequest = await response.json(); + for (const k of baseRequest.posts) { + if (!hyperlinkarray.includes(k.file_url)) { + hyperlinkarray.push(k.file_url); + } + } + }); } export async function fetchNextPage() { - page += 1; - await refresh(); + page += 1; + await refresh(); } export async function dropYandere() { - if (hyperlinkarray.length === 0) { - await fetchNextPage(); - return await dropYandere(); - } - return hyperlinkarray.pop()!; + if (hyperlinkarray.length === 0) { + await fetchNextPage(); + return await dropYandere(); + } + return hyperlinkarray.pop()!; } export async function dropYandere5() { - let tmp = ""; - for (let i = 0; i < 5; i++) { - tmp += await dropYandere() + "\n"; - } - return tmp; + let tmp = ""; + for (let i = 0; i < 5; i++) { + tmp += await dropYandere() + "\n"; + } + return tmp; } +//Test Stack resize when fetching new data +Deno.test("Refresh Stack", async () => { + await refresh(); + const previousStack = [...hyperlinkarray]; + await new Promise((r) => setTimeout(r, 10000)); + await refresh(); + assert( + previousStack.length <= hyperlinkarray.length, + "Stack-size did not increase as expected!", + ); +}); diff --git a/src/plugins/yandere/test.ts b/src/plugins/yandere/test.ts new file mode 100644 index 0000000..9564495 --- /dev/null +++ b/src/plugins/yandere/test.ts @@ -0,0 +1,32 @@ +import { assert } from "@std/assert/assert"; +import { + dropYandere, + getPage, + refresh, + setPage, +} from "@root/plugins/yandere/api.ts"; +import { assertEquals } from "@std/assert/equals"; +//tests +/* +get page, +switch page, +drop, + */ + +Deno.test("Get default Page", async () => { + assertEquals(getPage(), 1); +}); + +Deno.test("Switching page", async () => { + assertEquals(getPage(), 1); + await setPage(2); + assertEquals(getPage(), 2); + await setPage(100); + assertEquals(getPage(), 100); +}); + +Deno.test("Test Drop", async () => { + await refresh(); + const link = await dropYandere(); + assert(link !== "", "Empty String was dropped!"); +});