c9-core/plugins/c9.core/ext_test.js

218 wiersze
8.5 KiB
JavaScript

/*global describe:false, it:false */
"use client";
require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai) {
var expect = chai.expect;
expect.setupArchitectTest([
"plugins/c9.core/ext",
{
consumes: ["ext", "Plugin"],
provides: [],
setup: main
}
], architect);
function main(options, imports, register) {
var ext = imports.ext;
var Plugin = imports.Plugin;
describe('plugin', function() {
this.timeout(1000);
it('should expose the constructor arguments', function(done) {
var deps = [1, 2];
var plugin = new Plugin("Ajax.org", deps);
expect(plugin.developer).to.equal("Ajax.org");
expect(plugin.deps).to.equal(deps);
done();
});
it('should only allow setting the api once', function(done) {
var plugin = new Plugin("Ajax.org", []);
var func = function(a) {};
plugin.freezePublicAPI({
test: func
});
plugin.test = "nothing";
expect(plugin.test).to.equal(func);
done();
});
it('should give access to the event emitter before freezing the api', function(done) {
var plugin = new Plugin("Ajax.org", []);
var emit = plugin.getEmitter();
plugin.freezePublicAPI({});
plugin.on("test", function() { done(); });
emit("test");
});
it('should not give access to the event emitter after freezing the api', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.freezePublicAPI({});
expect(plugin.getEmitter).to.not.ok;
done();
});
it('should call load event when name is set', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.on("load", function() { done(); });
plugin.name = "test";
});
it('should only allow the name to be set once', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.name = "test";
expect(function() { plugin.name = "test2";}).to.throw("Plugin Name Exception");
done();
});
it('should call sticky event when adding handler later', function(done) {
var plugin = new Plugin("Ajax.org", []);
var emit = plugin.getEmitter();
plugin.name = "test";
emit.sticky("ready");
plugin.on("ready", done);
});
it('should call sticky event for each plugin added', function(done) {
var plugin = new Plugin("Ajax.org", []);
var plugin2 = new Plugin("Ajax.org", []);
var plugin3 = new Plugin("Ajax.org", []);
var emit = plugin.getEmitter();
plugin.name = "test";
plugin2.name = "test2";
plugin3.name = "test3";
emit.sticky("create", {}, plugin2);
emit.sticky("create", {}, plugin3);
var z = 0;
plugin.on("create", function() {
if (++z == 2) done();
else if (z > 2)
throw new Error("Called too often initially");
});
});
it('should call sticky event only for the non-unloaded plugins', function(done) {
var plugin = new Plugin("Ajax.org", []);
var plugin2 = new Plugin("Ajax.org", []);
var plugin3 = new Plugin("Ajax.org", []);
var emit = plugin.getEmitter();
plugin.name = "test";
plugin2.name = "test2";
plugin3.name = "test3";
emit.sticky("create", {}, plugin2);
emit.sticky("create", {}, plugin3);
var z = 0, q = 0, timer;
plugin.on("create", function() {
if (++z == 2) {
plugin3.unload();
plugin.on("create", function() {
++q;
clearTimeout(timer);
timer = setTimeout(function() {
if (q == 1) done();
else throw new Error("Called too often after unload");
});
});
}
else if (z > 2) {
throw new Error("Called too often initially");
}
});
});
it('should call unload event when unload() is called', function(done) {
var plugin = new Plugin("Ajax.org", []);
var loaded = false;
plugin.on("unload", function error() {
if (!loaded)
throw new Error("shouldn't call unload");
done();
});
plugin.unload();
loaded = true;
plugin.load();
plugin.unload();
});
it('should call disable event when disable() is called', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.on("disable", function() { done(); });
plugin.enable();
plugin.disable();
});
it('should call enable event when enable() is called', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.on("enable", function() { done(); });
plugin.enable();
});
it('should destroy all assets when it\'s unloaded', function(done) {
var plugin = new Plugin("Ajax.org", []);
var count = 0;
function check() {
if (++count == 4)
done();
}
var el1 = { destroy: check, childNodes: []};
var el2 = { destroy: check, childNodes: []};
plugin.load();
plugin.on("load", check);
expect(plugin.listeners("load").length).to.equal(1);
plugin.addElement(el1, el2);
plugin.addEvent(plugin, "load", check);
plugin.addOther(check);
plugin.unload();
if (!plugin.listeners("load").length)
check();
});
//@todo haven't tested getElement
});
describe('ext', function() {
it('should register a plugin when the plugin\'s name is set', function(done) {
var plugin = new Plugin("Ajax.org", []);
expect(plugin.registered).to.equal(false);
ext.on("register", function reg() {
expect(plugin.registered).to.equal(true);
done();
ext.off("register", reg);
});
plugin.name = "test";
});
it('should call the unregister event when the plugin is unloaded', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.name = "test";
ext.on("unregister", function unreg() {
expect(plugin.registered).to.equal(false);
done();
ext.off("register", unreg);
});
plugin.unload();
});
it('should return false on unload() when the dependency tree is not in check', function(done) {
var plugin = new Plugin("Ajax.org", []);
plugin.name = "test";
var plugin2 = new Plugin("Ajax.org", ["test"]);
plugin2.name = "test2";
expect(plugin.unload()).to.equal(false);
done();
});
});
register();
}
});