import { assert, expect } from "chai";

import { Formatter } from "export/formatter";
import { Utility } from "tests/utility";

import { Hyperlink } from "./";

describe("Hyperlink", () => {
    let hyperlink: Hyperlink;

    beforeEach(() => {
        hyperlink = new Hyperlink("https://example.com", 0);
    });

    describe("#constructor()", () => {
        it("should create a hyperlink with correct root key", () => {
            const newJson = Utility.jsonify(hyperlink);
            assert.equal(newJson.rootKey, "w:hyperlink");
        });

        it("should create a hyperlink with right attributes", () => {
            const newJson = Utility.jsonify(hyperlink);
            const attributes = {
                history: 1,
                id: "rId1",
            };
            assert.equal(JSON.stringify(newJson.root[0].root), JSON.stringify(attributes));
        });

        it("should create a hyperlink with a run component", () => {
            const tree = new Formatter().format(hyperlink);
            const runJson = {
                "w:r": [
                    { "w:rPr": [{ "w:rStyle": { _attr: { "w:val": "Hyperlink" } } }] },
                    { "w:t": [{ _attr: { "xml:space": "preserve" } }, "https://example.com"] },
                ],
            };
            expect(tree["w:hyperlink"][1]).to.deep.equal(runJson);
        });

        describe("with optional anchor parameter", () => {
            beforeEach(() => {
                hyperlink = new Hyperlink("Anchor Text", 0, "anchor");
            });

            it("should create an internal link with anchor tag", () => {
                const newJson = Utility.jsonify(hyperlink);
                const attributes = {
                    history: 1,
                    anchor: "anchor",
                };
                assert.equal(JSON.stringify(newJson.root[0].root), JSON.stringify(attributes));
            });
        });
    });
});
