From a3f6cfc531472bd1b4f9ff77db45efce2e2bba7a Mon Sep 17 00:00:00 2001 From: dev-donghwan Date: Wed, 30 Sep 2026 15:44:21 +0900 Subject: [PATCH] [ZEPPELIN-6632] Pass the ipynb extension without a leading dot when exporting a note --- .../websocket/websocket-event.factory.js | 2 +- .../websocket/websocket-event.factory.test.js | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/zeppelin-web/src/components/websocket/websocket-event.factory.js b/zeppelin-web/src/components/websocket/websocket-event.factory.js index befd5b45bd5..61ef7fd45cf 100644 --- a/zeppelin-web/src/components/websocket/websocket-event.factory.js +++ b/zeppelin-web/src/components/websocket/websocket-event.factory.js @@ -202,7 +202,7 @@ function WebsocketEventFactory($rootScope, $websocket, $location, baseUrlSrv, sa } else if (op === 'PARAS_INFO') { $rootScope.$broadcast('updateParaInfos', data); } else if (op === 'CONVERTED_NOTE_NBFORMAT') { - saveAsService.saveAs(data.nbformat, data.noteName, '.ipynb'); + saveAsService.saveAs(data.nbformat, data.noteName, 'ipynb'); } else if (op === 'INTERPRETER_INSTALL_STARTED') { ngToast.info(data.message); } else if (op === 'INTERPRETER_INSTALL_RESULT') { diff --git a/zeppelin-web/src/components/websocket/websocket-event.factory.test.js b/zeppelin-web/src/components/websocket/websocket-event.factory.test.js index 1d95f639802..c7e9c22d8fb 100644 --- a/zeppelin-web/src/components/websocket/websocket-event.factory.test.js +++ b/zeppelin-web/src/components/websocket/websocket-event.factory.test.js @@ -20,6 +20,7 @@ describe('Factory: websocketEvents', function() { let messageCallback; let ngToast; let rootScope; + let saveAsService; let websocketEvents; beforeEach(function() { @@ -34,6 +35,7 @@ describe('Factory: websocketEvents', function() { socket: {readyState: 1}, }; ngToast = {info: jasmine.createSpy('info')}; + saveAsService = {saveAs: jasmine.createSpy('saveAs')}; angular.mock.module('zeppelinWebApp', function($provide) { $provide.value('$websocket', function() { @@ -42,7 +44,7 @@ describe('Factory: websocketEvents', function() { $provide.value('baseUrlSrv', {getWebsocketUrl: function() { return 'ws://localhost/ws'; }}); - $provide.value('saveAsService', {saveAs: angular.noop}); + $provide.value('saveAsService', saveAsService); $provide.value('ngToast', ngToast); }); }); @@ -91,4 +93,18 @@ describe('Factory: websocketEvents', function() { expect(console.log).toHaveBeenCalledWith('Receive << %o', 'NOTICE'); expect(JSON.stringify(console.log.calls.allArgs())).not.toContain(payloadSecret); }); + + it('passes the ipynb extension without a leading dot when saving a converted note', function() { + const nbformat = '{"cells": []}'; + + messageCallback({ + data: JSON.stringify({ + op: 'CONVERTED_NOTE_NBFORMAT', + data: {nbformat: nbformat, noteName: 'test sh'}, + }), + }); + + // saveAsService.saveAs() joins the file name and the extension with a dot itself + expect(saveAsService.saveAs).toHaveBeenCalledWith(nbformat, 'test sh', 'ipynb'); + }); });