diff --git a/IPython/html/static/services/sessions/js/session.js b/IPython/html/static/services/sessions/js/session.js index fbca98f..dc41e87 100644 --- a/IPython/html/static/services/sessions/js/session.js +++ b/IPython/html/static/services/sessions/js/session.js @@ -48,6 +48,10 @@ define([ * POST /api/sessions */ Session.prototype.start = function (success, error) { + if (this.kernel !== null) { + throw new Error("session has already been started"); + }; + var that = this; var on_success = function (data, status, xhr) { var kernel_service_url = utils.url_path_join(that.base_url, "api/kernels"); @@ -95,23 +99,31 @@ define([ * PATCH /api/sessions/[:session_id] */ Session.prototype.change = function (notebook_name, notebook_path, kernel_name, success, error) { - this.notebook_model.name = notebook_name; - this.notebook_model.path = notebook_path; - this.kernel_model.name = kernel_name; + if (notebook_name !== undefined) { + this.notebook_model.name = notebook_name; + } + if (notebook_path !== undefined) { + this.notebook_model.path = notebook_path; + } + if (kernel_name !== undefined) { + this.kernel_model.name = kernel_name; + } + + console.log(JSON.stringify(this._get_model())); $.ajax(this.session_url, { processData: false, cache: false, type: "PATCH", data: JSON.stringify(this._get_model()), - dataType : "json", + dataType: "json", success: this._on_success(success), error: this._on_error(error) }); }; Session.prototype.rename_notebook = function (name, path, success, error) { - this.change(name, path, this.kernel_model.name, success, error); + this.change(name, path, undefined, success, error); }; /** diff --git a/IPython/html/tests/services/session.js b/IPython/html/tests/services/session.js index fa6c057..bb23551 100644 --- a/IPython/html/tests/services/session.js +++ b/IPython/html/tests/services/session.js @@ -4,21 +4,107 @@ // casper.notebook_test(function () { + var that = this; + var get_info = function () { + return that.evaluate(function () { + return JSON.parse(JSON.stringify(IPython.notebook.session._get_model())); + }); + }; + + // test that the kernel is running this.then(function () { this.test.assert(this.kernel_running(), 'session: kernel is running'); }); + // test list this.thenEvaluate(function () { - IPython.notebook.session.delete(); + IPython._sessions = null; + IPython.notebook.session.list(function (data) { + IPython._sessions = data; + }); + }); + this.waitFor(function () { + return this.evaluate(function () { + return IPython._sessions !== null; + }); + }); + this.then(function () { + var num_sessions = this.evaluate(function () { + return IPython._sessions.length; + }); + this.test.assertEquals(num_sessions, 1, 'one session running'); }); + // test get_info + var session_info = get_info(); + this.thenEvaluate(function () { + IPython._session_info = null; + IPython.notebook.session.get_info(function (data) { + IPython._session_info = data; + }); + }); this.waitFor(function () { return this.evaluate(function () { - return IPython.notebook.kernel.is_fully_disconnected(); + return IPython._session_info !== null; }); }); + this.then(function () { + var new_session_info = this.evaluate(function () { + return IPython._session_info; + }); + this.test.assertEquals(session_info.notebook.name, new_session_info.notebook.name, 'session: notebook name correct'); + this.test.assertEquals(session_info.notebook.path, new_session_info.notebook.path, 'session: notebook path correct'); + this.test.assertEquals(session_info.kernel.name, new_session_info.kernel.name, 'session: kernel name correct'); + this.test.assertEquals(session_info.kernel.id, new_session_info.kernel.id, 'session: kernel id correct'); + }); + + // test rename_notebook + // + // TODO: the PATCH request isn't supported by phantom, so this test always + // fails, see https://github.com/ariya/phantomjs/issues/11384 + // when this is fixed we can properly run this test + // + // this.thenEvaluate(function () { + // IPython._renamed = false; + // IPython.notebook.session.rename_notebook( + // "foo", + // "bar", + // function (data) { + // IPython._renamed = true; + // } + // ); + // }); + // this.waitFor(function () { + // return this.evaluate(function () { + // return IPython._renamed; + // }); + // }); + // this.then(function () { + // var info = get_info(); + // this.test.assertEquals(info.notebook.name, "foo", "notebook was renamed"); + // this.test.assertEquals(info.notebook.path, "bar", "notebook path was changed"); + // }); + // test delete + this.thenEvaluate(function () { + IPython.notebook.session.delete(); + }); + this.waitFor(function () { + return this.evaluate(function () { + return IPython.notebook.kernel.is_fully_disconnected(); + }); + }); this.then(function () { this.test.assert(!this.kernel_running(), 'session deletes kernel'); }); + + // test start after delete -- should throw an error + this.then(function () { + var start = function () { + this.evaluate(function () { + IPython.notebook.session.start(); + }); + }; + this.test.assertRaises(start, [], 'error raised on start after delete'); + }); });