"is instantiable": function(done) { var name = testutil.getUniqueName(); var context = AppFx.Components.create("appfx-searchcontext", name, {}); assert.isNotNull(context); assert.strictEqual(context.get("name"), name); done(); },
var createContextAndSubcontext = function(done) { var contextName = testutil.getUniqueName(); var subcontext1Name = testutil.getUniqueName(); var subcontext2Name = testutil.getUniqueName(); var context = AppFx.Components.create( "appfx-groupcontext", contextName, { contexts: [subcontext1Name, subcontext2Name] }); var subcontext1 = AppFx.Components.create( "appfx-searchcontext", subcontext1Name, { autostart: false }); var subcontext2 = AppFx.Components.create( "appfx-savedsearchcontext", subcontext2Name, { autostart: false }); // Start only the group context. context.start(); done(context, subcontext1); };
var runcacheTest = function( cacheOfContext2, fakeCurrentTimeForContext2, // -1 to use real time doesExpectJobToBeReused, done) { var sharedName = testutil.getUniqueName(); var sharedSearch = TEST_QUERY; var context1 = new SearchContext({ name: sharedName, autostart: false }); context1.set('search', sharedSearch); context1.startSearch(); context1.on("search:start", function(job1) { // (Create directly instead of using // AppFx.Components.create to allow multiple // contexts with same name to be created.) var context2 = new SearchContext({ name: sharedName, cache: cacheOfContext2, autostart: false }); context2.set('search', sharedSearch); var OldDate = Date; if (fakeCurrentTimeForContext2 != -1) { Date = function() { return new OldDate(fakeCurrentTimeForContext2); }; } try { context2.startSearch(); context2.on("search:start", function(job2) { if (doesExpectJobToBeReused) { assert.equal(job2.sid, job1.sid, "Expected context2 to reuse job of context1."); } else { assert.notEqual(job2.sid, job1.sid, "Expected context2 to NOT reuse job of context1."); } done(); }); } finally { Date = OldDate; } }); };
"does not forward events from old subcontext or its models to self": function(done) { var contextName = testutil.getUniqueName(); var subcontextName = testutil.getUniqueName(); var context = AppFx.Components.create( "appfx-groupcontext", contextName, { contexts: [subcontextName] }); var oldSubcontext = AppFx.Components.create( "appfx-searchcontext", subcontextName, { autostart: false }); context.start(); AppFx.Components.revokeInstance(subcontextName); var newSubcontext = AppFx.Components.create( "appfx-searchcontext", subcontextName, { autostart: false }); oldSubcontext.on("ping", function() { throw "Old subcontext should not be receiving events after revocation."; }); oldSubcontext.search.on("change:ping", function(model, value, options) { throw "Old subcontext's job model should not be receiving events after revocation."; }); oldSubcontext.query.on("change:ping", function(model, value, options) { throw "Old subcontext's query model should not be receiving events after revocation."; }); context.trigger("ping", "hi"); context.search.set("ping", "hi"); context.query.set("ping", "hi"); // Succeed by default. // This may be invalidated later by callbacks. done(); }
"will start a new job when a model is changed": function(done) { // HACK: Can't just do a normal // `context.startSearch = createMethodMock();` // because a reference to `startSearch` is used in // the SearchContext constructor. var EarlyMockedSearchContext = SearchContext.extend({ startSearch: createMethodMock() }); var context = new EarlyMockedSearchContext({ name: testutil.getUniqueName() }); context.set('search', TEST_QUERY); assert.equal(context.startSearch.callCount, 1); done(); },
define(function(require, exports, module) { var _ = require("underscore"); var AppFx = require("appfx.main"); var assert = require("testfx/chai").assert; var BaseContext = require("appfx/splunkui/basecontext"); var BaseControl = require("appfx/splunkui/basecontrol"); var testutil = require("testfx/testutil"); var R = AppFx.Components; var MockControl = BaseControl.extend({ salt: testutil.getUniqueName() }); var MockContext = BaseContext.extend({ salt: testutil.getUniqueName() }); var tests = { before: function(done) { done(); }, beforeEach: function(done) { done(); }, after: function(done) { done(); }, afterEach: function(done) { done(); }, "Registry Tests": { /* * Registry API * * Non-Private Methods: * + registerType(htmlClassName, Component) * > Register a new type of component. * + create(htmlClassName, htmlIdAndComponentName, options) : Component * > Instantiates a component. * + getInstance(htmlIdAndComponentName) : Component * > Locates a component instance. * ~ revokeInstance(htmlIdAndComponentName) * > Unregisters a component instance. * ~ bind, has, off * > (Backbone model methods) */ "Registry": { // Tests: [registerType] "should advertise component type after registration": function(done) { _.each([MockControl, MockContext], function(MockComponent) { R.registerType('appfx-mock', MockComponent); assert.isTrue(R.hasType('appfx-mock')); assert.strictEqual(MockComponent, R.getType('appfx-mock')); assert.isTrue(_.indexOf(R.getTypes(), MockComponent) != -1, "getTypes() lacks control after registerType()"); assert.isTrue(_.indexOf(R.getTypeNames(), 'appfx-mock') != -1, "getTypeNames() lacks control after registerType()"); R.revokeType('appfx-mock'); assert.isFalse(R.hasType('appfx-mock')); assert.isTrue(_.indexOf(R.getTypes(), MockComponent) == -1, "getTypes() has control after revokeType()"); assert.isTrue(_.indexOf(R.getTypeNames(), 'appfx-mock') == -1, "getTypeNames() has control after revokeType()"); }); done(); }, // Tests: [create, getInstance, revokeInstance] "should advertise component instance after registration": function(done) { _.each([MockControl, MockContext], function(MockComponent) { R.registerType('appfx-mock', MockComponent); assert.isFalse(R.has('mock1')); var mock1 = R.create('appfx-mock', 'mock1', { // Typical options for a control. But not required. /* contextid: 'foocontext', el: $('<div id="mock1"></div>') */ }); assert.ok(mock1); assert.ok(R.getInstance('mock1')); R.revokeInstance('mock1'); assert.isFalse(R.has('mock1')); R.revokeType('appfx-mock'); }); done(); }, // Tests: [bind, has, off] "looks like a Backbone.Model": function(done) { assert.ok(R.bind); assert.ok(R.has); assert.ok(R.off); done(); }, // Tests: [bind, has] "should fire events when component registered and unregistered": function(done) { _.each([MockControl, MockContext], function(MockComponent) { R.registerType('appfx-mock', MockComponent); var changeSetEventFired = false; var changeClearEventFired = false; R.bind("change:mock", function(sourceRegistry, sourceComponent) { assert.strictEqual(sourceRegistry, R); if (sourceComponent) { changeSetEventFired = true; } else { changeClearEventFired = true; } }); assert.isFalse(R.has('mock')); assert.isFalse(changeSetEventFired); var mock1 = R.create('appfx-mock', 'mock', {}); assert.isTrue(R.has('mock')); assert.isTrue(changeSetEventFired); // Ensure attempt to rebind the name fails assert.throws(function() { R.create('appfx-mock', 'mock', {}); }, /Already have instance with name/); assert.isFalse(changeClearEventFired); R.revokeInstance('mock'); assert.isTrue(changeClearEventFired); R.revokeType('appfx-mock'); }); done(); } } } }; return tests; });
var createSearchContext = function(options_opt) { return AppFx.Components.create( "appfx-searchcontext", testutil.getUniqueName(), options_opt || {}); };