/*\
title: test-backlinks.js
type: application/javascript
tags: [[$:/tags/test-spec]]

Tests the backlinks mechanism.

\*/
"use strict";

describe("Backlinks tests", function() {
	function setupWiki(wikiOptions) {
		wikiOptions = wikiOptions || {};
		// Create a wiki
		var wiki = new $tw.Wiki(wikiOptions);
		wiki.addIndexersToWiki();

		wiki.addTiddler({
			title: "TestIncoming",
			text: "",
		});
		
		wiki.addTiddler({
			title: "TestOutgoing",
			text: "A link to [[TestIncoming]]",
		});
		return wiki;
	}

	describe("a tiddler with no links to it", function() {
		var wiki = new $tw.Wiki();

		wiki.addTiddler({
			title: "TestIncoming",
			text: ""});

		it("should have no backlinks", function() {
			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("");
		});
	});

	describe("A tiddler added to the wiki with a link to it", function() {
		var wiki = setupWiki();

		it("should have a backlink", function() {
			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
		});
	});

	describe("A tiddler that has a link added to it later", function() {
		it("should have an additional backlink", function() {
			var wiki = setupWiki();

			wiki.addTiddler({
				title: "TestOutgoing2",
				text: "Nothing yet!"});

			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");

			wiki.addTiddler({
				title: "TestOutgoing2",
				text: "Updated with link to [[TestIncoming]]"});

			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing,TestOutgoing2");
		});
	});

	describe("A tiddler that has a link remove from it later", function() {
		var wiki = setupWiki();

		it("should have one fewer backlink", function() {
			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");

			wiki.addTiddler({
				title: "TestOutgoing",
				text: "No link to ~TestIncoming"});

			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("");
		});
	});

	describe("A tiddler linking to another that gets renamed", function() {
		var wiki = setupWiki();

		it("should have its name changed in the backlinks", function() {
			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");

			wiki.renameTiddler("TestOutgoing", "TestExtroverted");

			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestExtroverted");
		});
	});

	describe("A tiddler linking to another that gets deleted", function() {
		var wiki = setupWiki();

		it("should be removed from backlinks", function() {
			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");

			wiki.deleteTiddler("TestOutgoing");

			expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("");
		});
	});

	describe("Binary tiddlers should not be parsed", function() {
		var wiki = setupWiki();

		wiki.addTiddler({
			title: "TestDoc.doc",
			text: "A link to [[TestOutgoing]]",
			type: "application/msword"
		});

		wiki.addTiddler({
			title: "TestExcel.xls",
			text: "A link to [[TestOutgoing]]",
			type: "application/excel"
		});

		wiki.addTiddler({
			title: "TestOutgoing",
			text: "Some links to [[TestDoc.doc]] and [[TestExcel.xls]]."
		});

		it("should ignore office files", function() {
			expect(wiki.getIndexer("BackIndexer").subIndexers.link._getTarget(wiki.getTiddler("TestExcel.xls"))).toEqual([]);

			expect(wiki.filterTiddlers("[all[]] +[backlinks[]]").join(",")).toBe("TestOutgoing");
			
			// make it tw5 tiddler
			wiki.addTiddler({
				title: "TestExcel.xls",
				text: "A link to [[TestOutgoing]]"
			});

			expect(wiki.filterTiddlers("[all[]] +[backlinks[]]").join(",")).toBe("TestOutgoing,TestExcel.xls");
		});
	});
});
