mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-06 12:52:26 +00:00
Refactor: Replace duplicated extractDTagValue in DeleteModal
Replaced the local `extractDTagValue` function in `js/ui/components/DeleteModal.js` with the shared `getDTagValueFromTags` utility from `js/nostr/nip71.js` (exported via `js/nostr/index.js`). Added a new unit test `tests/ui/components/DeleteModal.test.mjs` to verify the d-tag extraction logic and ensure the refactor is correct and safe. This test uses `jsdom` to mock the necessary DOM environment. Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
1 parent
9913e484ab
commit
4bdcfbdb2e
2 files changed
+72
-16
No files matched your search
@@ -1,20 +1,6 @@
|
|||||||
|
import { getDTagValueFromTags } from "../../nostr/index.js";
|
||||||
import { createModalAccessibility } from "./modalAccessibility.js";
|
import { createModalAccessibility } from "./modalAccessibility.js";
|
||||||
|
|
||||||
function extractDTagValue(tags) {
|
|
||||||
if (!Array.isArray(tags)) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
for (const entry of tags) {
|
|
||||||
if (!Array.isArray(entry) || entry.length < 2) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (entry[0] === "d" && typeof entry[1] === "string") {
|
|
||||||
return entry[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
export class DeleteModal {
|
export class DeleteModal {
|
||||||
constructor({
|
constructor({
|
||||||
removeTrackingScripts,
|
removeTrackingScripts,
|
||||||
@@ -232,7 +218,7 @@ export class DeleteModal {
|
|||||||
video && typeof video.videoRootId === "string" && video.videoRootId.trim().length
|
video && typeof video.videoRootId === "string" && video.videoRootId.trim().length
|
||||||
? video.videoRootId.trim()
|
? video.videoRootId.trim()
|
||||||
: "";
|
: "";
|
||||||
const dTagValue = extractDTagValue(video?.tags);
|
const dTagValue = getDTagValueFromTags(video?.tags);
|
||||||
|
|
||||||
if (this.subtitle) {
|
if (this.subtitle) {
|
||||||
const subtitleParts = [];
|
const subtitleParts = [];
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
import { test, describe, it, beforeEach, afterEach } from "node:test";
|
||||||
|
import assert from "node:assert";
|
||||||
|
import { JSDOM } from "jsdom";
|
||||||
|
|
||||||
|
describe("DeleteModal", () => {
|
||||||
|
let DeleteModal;
|
||||||
|
let modal;
|
||||||
|
let mockModalElement;
|
||||||
|
let subtitle;
|
||||||
|
let metadataList;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
const dom = new JSDOM("<!DOCTYPE html><html><body></body></html>", {
|
||||||
|
url: "http://localhost/",
|
||||||
|
});
|
||||||
|
globalThis.document = dom.window.document;
|
||||||
|
globalThis.window = dom.window;
|
||||||
|
globalThis.HTMLElement = dom.window.HTMLElement;
|
||||||
|
globalThis.EventTarget = dom.window.EventTarget;
|
||||||
|
globalThis.Node = dom.window.Node;
|
||||||
|
globalThis.DOMParser = dom.window.DOMParser;
|
||||||
|
globalThis.Event = dom.window.Event;
|
||||||
|
globalThis.CustomEvent = dom.window.CustomEvent;
|
||||||
|
|
||||||
|
// Dynamic import to ensure globals are set before module execution
|
||||||
|
const module = await import("../../../js/ui/components/DeleteModal.js");
|
||||||
|
DeleteModal = module.DeleteModal;
|
||||||
|
|
||||||
|
// Mock DOM elements
|
||||||
|
mockModalElement = document.createElement('div');
|
||||||
|
subtitle = document.createElement('div');
|
||||||
|
subtitle.id = "deleteModalSubtitle";
|
||||||
|
metadataList = document.createElement('dl');
|
||||||
|
metadataList.id = "deleteModalMetadata";
|
||||||
|
|
||||||
|
mockModalElement.appendChild(subtitle);
|
||||||
|
mockModalElement.appendChild(metadataList);
|
||||||
|
|
||||||
|
modal = new DeleteModal();
|
||||||
|
modal.cacheElements(mockModalElement);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should extract d-tag and display it in subtitle", () => {
|
||||||
|
const video = {
|
||||||
|
tags: [['d', 'my-d-tag']]
|
||||||
|
};
|
||||||
|
modal.setVideo(video);
|
||||||
|
|
||||||
|
assert.ok(subtitle.textContent.includes("d=my-d-tag"), `Subtitle should contain d-tag, got: ${subtitle.textContent}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should extract d-tag and display it in metadata", () => {
|
||||||
|
const video = {
|
||||||
|
tags: [['d', 'my-d-tag']]
|
||||||
|
};
|
||||||
|
modal.setVideo(video);
|
||||||
|
|
||||||
|
const metadataText = metadataList.textContent;
|
||||||
|
assert.ok(metadataText.includes("my-d-tag"), `Metadata should contain d-tag, got: ${metadataText}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle missing d-tag", () => {
|
||||||
|
const video = {
|
||||||
|
tags: [['t', 'hashtag']]
|
||||||
|
};
|
||||||
|
modal.setVideo(video);
|
||||||
|
|
||||||
|
assert.ok(!subtitle.textContent.includes("d="), `Subtitle should not contain d-tag, got: ${subtitle.textContent}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in new issue
Block a user