diff --git a/src/notebooks/deepnote/deepnoteNotebookCommandListener.unit.test.ts b/src/notebooks/deepnote/deepnoteNotebookCommandListener.unit.test.ts index dd54a44e5..09c118fe8 100644 --- a/src/notebooks/deepnote/deepnoteNotebookCommandListener.unit.test.ts +++ b/src/notebooks/deepnote/deepnoteNotebookCommandListener.unit.test.ts @@ -1,3 +1,4 @@ +import { serializeDeepnoteFile } from '@deepnote/blocks'; import { assert } from 'chai'; import * as sinon from 'sinon'; import { when, reset, anything, mock, instance } from 'ts-mockito'; @@ -14,7 +15,9 @@ import { import { DeepnoteNotebookCommandListener, + getInputBlockMetadata, getNextDeepnoteVariableName, + INPUT_BLOCK_TYPES, InputBlockType } from './deepnoteNotebookCommandListener'; import { formatInputBlockCellContent, getInputBlockLanguage } from './inputBlockContentFormatter'; @@ -23,9 +26,15 @@ import { IConfigurationService, IDisposable } from '../../platform/common/types' import * as notebookUpdater from '../../kernels/execution/notebookUpdater'; import { createMockedNotebookDocument } from '../../test/datascience/editor-integration/helpers'; import { WrappedError } from '../../platform/errors/types'; +import { createBlockFromPocket } from '../../platform/deepnote/pocket'; import { DATAFRAME_SQL_INTEGRATION_ID } from '../../platform/notebooks/deepnote/integrationTypes'; import { mockedVSCodeNamespaces } from '../../test/vscode-mock'; -import { createMockCell } from './deepnoteTestHelpers'; +import { + createDeepnoteFile, + createDeepnoteNotebook, + createDeepnoteProject, + createMockCell +} from './deepnoteTestHelpers'; suite('DeepnoteNotebookCommandListener', () => { let commandListener: DeepnoteNotebookCommandListener; @@ -347,6 +356,23 @@ suite('DeepnoteNotebookCommandListener', () => { }); }); + suite('getInputBlockMetadata', () => { + INPUT_BLOCK_TYPES.forEach((blockType) => { + test(`default ${blockType} metadata is accepted by the @deepnote/blocks serializer`, () => { + const metadata = getInputBlockMetadata(blockType, 'input_1'); + const cell = new NotebookCellData(NotebookCellKind.Code, '', 'python'); + cell.metadata = { __deepnotePocket: { type: blockType, ...metadata }, ...metadata }; + + const block = createBlockFromPocket(cell, 0); + const file = createDeepnoteFile({ + project: createDeepnoteProject({ notebooks: [createDeepnoteNotebook({ blocks: [block] })] }) + }); + + assert.doesNotThrow(() => serializeDeepnoteFile(file)); + }); + }); + }); + suite('addBlock', () => { let sandbox: sinon.SinonSandbox; @@ -538,12 +564,7 @@ suite('DeepnoteNotebookCommandListener', () => { selection: undefined, expectedInsertIndex: 0, expectedVariableName: 'input_1', - expectedMetadataKeys: [ - 'deepnote_variable_name', - 'deepnote_input_label', - 'deepnote_variable_value', - 'deepnote_allowed_file_extensions' - ] + expectedMetadataKeys: ['deepnote_variable_name', 'deepnote_input_label', 'deepnote_variable_value'] }, { description: 'should add button block with correct metadata', diff --git a/src/notebooks/deepnote/deepnoteSchemas.ts b/src/notebooks/deepnote/deepnoteSchemas.ts index 7c8712b46..bfb7aa502 100644 --- a/src/notebooks/deepnote/deepnoteSchemas.ts +++ b/src/notebooks/deepnote/deepnoteSchemas.ts @@ -117,9 +117,8 @@ export const DeepnoteSelectInputMetadataSchema = DeepnoteBaseInputWithLabelMetad .transform((val) => val ?? DEEPNOTE_SELECT_INPUT_DEFAULT_OPTIONS), deepnote_variable_select_type: z .enum(['from-options', 'from-variable']) - // .string() .nullish() - .transform((val) => val ?? null), + .transform((val) => val ?? 'from-options'), deepnote_allow_multiple_values: z .boolean() .nullish() @@ -208,7 +207,7 @@ export const DeepnoteFileInputMetadataSchema = DeepnoteBaseInputWithLabelMetadat deepnote_allowed_file_extensions: z .string() .nullish() - .transform((val) => val ?? null) + .transform((val) => val ?? undefined) }); export const DeepnoteButtonMetadataSchema = DeepnoteBaseInputMetadataSchema.extend({