import Blacklist, { BlacklistItem, } from "../../../src/shared/settings/Blacklist"; import { expect } from "chai"; import Key from "../../../src/shared/settings/Key"; describe("BlacklistItem", () => { describe("#fromJSON", () => { it("parses string pattern", () => { const item = BlacklistItem.fromJSON("example.com"); expect(item.pattern).to.equal("example.com"); expect(item.partial).to.be.false; }); it("parses partial blacklist item", () => { const item = BlacklistItem.fromJSON({ url: "example.com", keys: ["j", "k"], }); expect(item.pattern).to.equal("example.com"); expect(item.partial).to.be.true; expect(item.keys).to.deep.equal(["j", "k"]); }); }); describe("#matches", () => { it('matches by "*"', () => { const item = BlacklistItem.fromJSON("*"); expect(item.matches(new URL("https://github.com/abc"))).to.be.true; }); it("matches by hostname", () => { const item = BlacklistItem.fromJSON("github.com"); expect(item.matches(new URL("https://github.com"))).to.be.true; expect(item.matches(new URL("https://gist.github.com"))).to.be.false; expect(item.matches(new URL("https://github.com/ueokande"))).to.be.true; expect(item.matches(new URL("https://github.org"))).to.be.false; expect(item.matches(new URL("https://google.com/search?q=github.org"))).to .be.false; }); it("matches by hostname with wildcard", () => { const item = BlacklistItem.fromJSON("*.github.com"); expect(item.matches(new URL("https://github.com"))).to.be.false; expect(item.matches(new URL("https://gist.github.com"))).to.be.true; }); it("matches by path", () => { const item = BlacklistItem.fromJSON("github.com/abc"); expect(item.matches(new URL("https://github.com/abc"))).to.be.true; expect(item.matches(new URL("https://github.com/abcdef"))).to.be.false; expect(item.matches(new URL("https://gist.github.com/abc"))).to.be.false; }); it("matches by path with wildcard", () => { const item = BlacklistItem.fromJSON("github.com/abc*"); expect(item.matches(new URL("https://github.com/abc"))).to.be.true; expect(item.matches(new URL("https://github.com/abcdef"))).to.be.true; expect(item.matches(new URL("https://gist.github.com/abc"))).to.be.false; }); it("matches address and port", () => { const item = BlacklistItem.fromJSON("127.0.0.1:8888"); expect(item.matches(new URL("http://127.0.0.1:8888/"))).to.be.true; expect(item.matches(new URL("http://127.0.0.1:8888/hello"))).to.be.true; }); it("matches with partial blacklist", () => { const item = BlacklistItem.fromJSON({ url: "google.com", keys: ["j", "k"], }); expect(item.matches(new URL("https://google.com"))).to.be.true; expect(item.matches(new URL("https://yahoo.com"))).to.be.false; }); }); describe("#includesPartialKeys", () => { it("matches with partial keys", () => { const item = BlacklistItem.fromJSON({ url: "google.com", keys: ["j", "k", ""], }); expect( item.includeKey(new URL("http://google.com/maps"), Key.fromMapKey("j")) ).to.be.true; expect( item.includeKey( new URL("http://google.com/maps"), Key.fromMapKey("") ) ).to.be.true; expect( item.includeKey(new URL("http://google.com/maps"), Key.fromMapKey("z")) ).to.be.false; expect( item.includeKey(new URL("http://google.com/maps"), Key.fromMapKey("u")) ).to.be.false; expect( item.includeKey(new URL("http://maps.google.com/"), Key.fromMapKey("j")) ).to.be.false; }); }); }); describe("Blacklist", () => { describe("#fromJSON", () => { it("parses string list", () => { const blacklist = Blacklist.fromJSON(["example.com", "example.org"]); expect(blacklist.toJSON()).to.deep.equals(["example.com", "example.org"]); }); it("parses mixed blacklist", () => { const blacklist = Blacklist.fromJSON([ { url: "example.com", keys: ["j", "k"] }, "example.org", ]); expect(blacklist.toJSON()).to.deep.equals([ { url: "example.com", keys: ["j", "k"] }, "example.org", ]); }); it("parses empty blacklist", () => { const blacklist = Blacklist.fromJSON([]); expect(blacklist.toJSON()).to.deep.equals([]); }); }); describe("#includesEntireBlacklist", () => { it("matches a url with entire blacklist", () => { const blacklist = Blacklist.fromJSON(["google.com", "*.github.com"]); expect(blacklist.includesEntireBlacklist(new URL("https://google.com"))) .to.be.true; expect(blacklist.includesEntireBlacklist(new URL("https://github.com"))) .to.be.false; expect( blacklist.includesEntireBlacklist(new URL("https://gist.github.com")) ).to.be.true; }); it("does not matches with partial blacklist", () => { const blacklist = Blacklist.fromJSON([ "google.com", { url: "yahoo.com", keys: ["j", "k"] }, ]); expect(blacklist.includesEntireBlacklist(new URL("https://google.com"))) .to.be.true; expect(blacklist.includesEntireBlacklist(new URL("https://yahoo.com"))).to .be.false; }); }); describe("#includesKeys", () => { it("matches with entire blacklist or keys in the partial blacklist", () => { const blacklist = Blacklist.fromJSON([ "google.com", { url: "github.com", keys: ["j", "k"] }, ]); expect( blacklist.includeKey(new URL("https://google.com"), Key.fromMapKey("j")) ).to.be.false; expect( blacklist.includeKey(new URL("https://github.com"), Key.fromMapKey("j")) ).to.be.true; expect( blacklist.includeKey(new URL("https://github.com"), Key.fromMapKey("a")) ).to.be.false; }); }); });