"use strict"; const expect = require("chai").expect; var util = require("../util"); var link = require("../../src/plugins/irc-events/link.js"); const path = require("path"); describe("Link plugin", function() { before(function(done) { this.app = util.createWebserver(); this.app.get("/real-test-image.png", function(req, res) { res.sendFile(path.resolve(__dirname, "../../client/img/apple-touch-icon-120x120.png")); }); this.connection = this.app.listen(9002, done); }); after(function(done) { this.connection.close(done); }); beforeEach(function() { this.irc = util.createClient(); this.network = util.createNetwork(); }); it("should be able to fetch basic information about URLs", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/basic" }); link(this.irc, this.network.channels[0], message); this.app.get("/basic", function(req, res) { res.send("test title"); }); this.irc.once("msg:preview", function(data) { expect(data.preview.type).to.equal("link"); expect(data.preview.head).to.equal("test title"); expect(data.preview.body).to.equal("simple description"); expect(message.previews.length).to.equal(1); done(); }); }); it("should prefer og:title over title", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/basic-og" }); link(this.irc, this.network.channels[0], message); this.app.get("/basic-og", function(req, res) { res.send("test"); }); this.irc.once("msg:preview", function(data) { expect(data.preview.head, "opengraph test"); done(); }); }); it("should prefer og:description over description", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/description-og" }); link(this.irc, this.network.channels[0], message); this.app.get("/description-og", function(req, res) { res.send(""); }); this.irc.once("msg:preview", function(data) { expect(data.preview.body).to.equal("opengraph description"); done(); }); }); it("should find og:image with full url", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/thumb" }); link(this.irc, this.network.channels[0], message); this.app.get("/thumb", function(req, res) { res.send("Google"); }); this.irc.once("msg:preview", function(data) { expect(data.preview.head).to.equal("Google"); expect(data.preview.thumb).to.equal("http://localhost:9002/real-test-image.png"); done(); }); }); it("should not use thumbnail with invalid url", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/invalid-thumb" }); link(this.irc, this.network.channels[0], message); this.app.get("/invalid-thumb", function(req, res) { res.send("test"); }); this.irc.once("msg:preview", function(data) { expect(data.preview.thumb).to.be.empty; done(); }); }); it("should send untitled page if there is a thumbnail", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/thumb-no-title" }); link(this.irc, this.network.channels[0], message); this.app.get("/thumb-no-title", function(req, res) { res.send(""); }); this.irc.once("msg:preview", function(data) { expect(data.preview.head).to.equal("Untitled page"); expect(data.preview.thumb).to.equal("http://localhost:9002/real-test-image.png"); done(); }); }); it("should not send thumbnail if image is 404", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/thumb-404" }); link(this.irc, this.network.channels[0], message); this.app.get("/thumb-404", function(req, res) { res.send("404 image"); }); this.irc.once("msg:preview", function(data) { expect(data.preview.head).to.equal("404 image"); expect(data.preview.thumb).to.be.empty; done(); }); }); it("should send image preview", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/real-test-image.png" }); link(this.irc, this.network.channels[0], message); this.irc.once("msg:preview", function(data) { expect(data.preview.type).to.equal("image"); expect(data.preview.link).to.equal("http://localhost:9002/real-test-image.png"); done(); }); }); it("should load multiple URLs found in messages", function(done) { const message = this.irc.createMessage({ text: "http://localhost:9002/one http://localhost:9002/two" }); link(this.irc, this.network.channels[0], message); this.app.get("/one", function(req, res) { res.send("first title"); }); this.app.get("/two", function(req, res) { res.send("second title"); }); const loaded = { one: false, two: false }; this.irc.on("msg:preview", function(data) { if (data.preview.link === "http://localhost:9002/one") { expect(data.preview.head).to.equal("first title"); loaded.one = true; } else if (data.preview.link === "http://localhost:9002/two") { expect(data.preview.head).to.equal("second title"); loaded.two = true; } if (loaded.one && loaded.two) { expect(message.previews.length).to.equal(2); done(); } }); }); });