Files
archived-linsa/web/app/api/metadata/route.test.ts
Aslam 2d270706a5 fix: link (#115)
* start

* .

* seeding connections

* .

* wip

* wip: learning state

* wip: notes section

* wip: many

* topics

* chore: update schema

* update package

* update sidebar

* update page section

* feat: profile

* fix: remove z index

* fix: wrong type

* add avatar

* add avatar

* wip

* .

* store page section key

* remove atom page section

* fix rerender

* fix rerender

* fix rerender

* fix rerender

* fix link

* search light/dark mode

* bubble menu ui

* .

* fix: remove unecessary code

* chore: mark as old for old schema

* chore: adapt new schema

* fix: add topic schema but null for now

* fix: add icon on personal link

* fix: list item

* fix: set url fetched when editing

* fix: remove image

* feat: add icon to link

* feat: custom url zod validation

* fix: metadata test

* chore: update utils

* fix: link

* fix: url fetcher

* .

* .

* fix: add link, section

* chore: seeder

* .

* .

* .

* .

* fix: change checkbox to learning state

* fix: click outside editing form

* feat: constant

* chore: move to master folder

* chore: adapt new schema

* chore: cli for new schema

* fix: new schema for dev seed

* fix: seeding

* update package

* chore: forcegraph seed

* bottombar

* if isEdit delete icon

* showCreate X button

* .

* options

* chore: implement topic from public global group

* chore: update learning state

* fix: change implementation for outside click

* chore: implement new form param

* chore: update env example

* feat: link form refs exception

* new page button layout, link topic search fixed

* chore: enable topic

* chore: update seed

* profile

* chore: move framer motion package from root to web and add nuqs

* chore: add LearningStateValue

* chore: implement active state

* profile

* chore: use fancy switch and update const

* feat: filter implementation

* dropdown menu

* .

* sidebar topics

* topic selected color

* feat: topic detail

* fix: collapsible page

* pages - sorted by, layout, visible mode

* .

* .

* .

* topic status sidebar

* topic button and count

* fix: topic

* page delete/topic buttons

* search ui

* selected topic for page

* selected topic status sidebar

* removed footer

* update package

* .

---------

Co-authored-by: Nikita <github@nikiv.dev>
Co-authored-by: marshennikovaolga <marshennikova@gmail.com>
Co-authored-by: Kisuyo <ig.intr3st@gmail.com>
2024-08-26 15:35:00 +03:00

102 lines
2.5 KiB
TypeScript

/**
* @jest-environment node
*/
import { NextRequest } from "next/server"
import axios from "axios"
import { DEFAULT_VALUES, GET } from "./route"
jest.mock("axios")
const mockedAxios = axios as jest.Mocked<typeof axios>
describe("Metadata Fetcher", () => {
beforeEach(() => {
jest.clearAllMocks()
})
it("should return metadata when URL is valid", async () => {
const mockHtml = `
<html>
<head>
<title>Test Title</title>
<meta name="description" content="Test Description">
<link rel="icon" href="/icon.ico">
</head>
</html>
`
mockedAxios.get.mockResolvedValue({ data: mockHtml })
const req = {
url: process.env.NEXT_PUBLIC_APP_URL + "/api/metadata?url=https://example.com"
} as unknown as NextRequest
const response = await GET(req)
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toEqual({
title: "Test Title",
description: "Test Description",
icon: "https://example.com/icon.ico",
url: "https://example.com"
})
})
it("should return an error when URL is missing", async () => {
const req = {
url: process.env.NEXT_PUBLIC_APP_URL + "/api/metadata"
} as unknown as NextRequest
const response = await GET(req)
const data = await response.json()
expect(response.status).toBe(400)
expect(data).toEqual({ error: "URL is required" })
})
it("should return default values when fetching fails", async () => {
mockedAxios.get.mockRejectedValue(new Error("Network error"))
const req = {
url: process.env.NEXT_PUBLIC_APP_URL + "/api/metadata?url=https://example.com"
} as unknown as NextRequest
const response = await GET(req)
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toEqual({
title: DEFAULT_VALUES.TITLE,
description: DEFAULT_VALUES.DESCRIPTION,
icon: null,
url: "https://example.com"
})
})
it("should handle missing metadata gracefully", async () => {
const mockHtml = `
<html>
<head>
</head>
</html>
`
mockedAxios.get.mockResolvedValue({ data: mockHtml })
const req = {
url: process.env.NEXT_PUBLIC_APP_URL + "/api/metadata?url=https://example.com"
} as unknown as NextRequest
const response = await GET(req)
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toEqual({
title: DEFAULT_VALUES.TITLE,
description: DEFAULT_VALUES.DESCRIPTION,
icon: null,
url: "https://example.com"
})
})
})