diff --git a/extensions/notebook/src/book/bookTreeView.ts b/extensions/notebook/src/book/bookTreeView.ts index f689710ea8..1dfe0d106d 100644 --- a/extensions/notebook/src/book/bookTreeView.ts +++ b/extensions/notebook/src/book/bookTreeView.ts @@ -92,7 +92,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider trustableBookPaths.some(trustableBookPath => trustableBookPath === path.join(bookItem.book.root, path.sep))) - .some(bookItem => normalizedNotebookUri.startsWith(path.join(bookItem.root, 'content', path.sep))); + .some(bookItem => normalizedNotebookUri.startsWith(bookItem.version === BookVersion.v1 ? path.join(bookItem.book.root, 'content', path.sep) : path.join(bookItem.book.root, path.sep))); let isNotebookTrusted = hasTrustedBookPath && this.books.some(bookModel => bookModel.getNotebook(normalizedNotebookUri)); return isNotebookTrusted; } @@ -57,8 +57,11 @@ export class BookTrustManager implements IBookTrustManager { .reduce((accumulator, currentBookItemList) => accumulator.concat(currentBookItemList), []); } - setBookAsTrusted(bookRootPath: string): boolean { - return this.updateTrustedBooks(bookRootPath, TrustBookOperation.Add); + setBookAsTrusted(bookRootPath: string, isTrusted: boolean): boolean { + if (isTrusted) { + return this.updateTrustedBooks(bookRootPath, TrustBookOperation.Add); + } + return this.updateTrustedBooks(bookRootPath, TrustBookOperation.Remove); } getTrustedBookPathsInConfig(): string[] { diff --git a/extensions/notebook/src/test/book/bookTrustManager.test.ts b/extensions/notebook/src/test/book/bookTrustManager.test.ts index 07ffa185c8..67ab7d24a0 100644 --- a/extensions/notebook/src/test/book/bookTrustManager.test.ts +++ b/extensions/notebook/src/test/book/bookTrustManager.test.ts @@ -19,309 +19,389 @@ describe('BookTrustManagerTests', function () { let bookTrustManager: IBookTrustManager; let trustedSubFolders: string[]; let books: BookModel[]; - - afterEach(function (): void { - sinon.restore(); - }); - - beforeEach(() => { - trustedSubFolders = ['/SubFolder/']; - - // Mock Workspace Configuration - let workspaceConfigurtionMock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - workspaceConfigurtionMock.setup(config => config.get(TypeMoq.It.isValue(constants.trustedBooksConfigKey))).returns(() => [].concat(trustedSubFolders)); - workspaceConfigurtionMock.setup(config => config.update(TypeMoq.It.isValue(constants.trustedBooksConfigKey), TypeMoq.It.isAny(), TypeMoq.It.isValue(false))).returns((key: string, newValues: string[]) => { - trustedSubFolders.splice(0, trustedSubFolders.length, ...newValues); // Replace - return Promise.resolve(); - }); - - sinon.replaceGetter(vscode.workspace, 'workspaceFolders', () => { - return [{ - uri: { - fsPath: '/temp/' - }, + let runs = [ + { + it: 'using the jupyter-book legacy version < 0.7.0', + book1: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb'), + 'notebook3': path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'), + 'notInTocNb': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notInToc.ipynb') }, - { - uri: { - fsPath: '/temp2/' - } + book2: { + 'notebook1': path.join(path.sep, 'temp2', 'SubFolder', 'content', 'sample', 'notebook.ipynb') }, - ]; - }); + unknownBook: { + 'unknownNotebook': path.join(path.sep, 'randomfolder', 'randomsubfolder', 'content', 'randomnotebook.ipynb') + } + }, { + it: 'using jupyter-book versions >= 0.7.0', + book1: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notebook2.ipynb'), + 'notebook3': path.join(path.sep, 'temp', 'SubFolder2', 'sample', 'notebook.ipynb'), + 'notInTocNb': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notInToc.ipynb') + }, + book2: { + 'notebook1': path.join(path.sep, 'temp2', 'SubFolder', 'sample', 'notebook.ipynb') + }, + unknownBook: { + 'unknownNotebook': path.join(path.sep, 'randomfolder', 'randomsubfolder', 'randomnotebook.ipynb') + } + } + ]; + runs.forEach(function (run) { + describe('Trusting in Workspaces ' + run.it, function (): void { - sinon.stub(vscode.workspace, 'getConfiguration').returns(workspaceConfigurtionMock.object); + afterEach(function (): void { + sinon.restore(); + }); - // Mock Book Data - let bookTreeItemFormat1: BookTreeItemFormat = { - contentPath: undefined, - root: '/temp/SubFolder/', - tableOfContents: { - sections: [ - { - url: path.join(path.sep, 'sample', 'notebook') + beforeEach(() => { + trustedSubFolders = ['/SubFolder/']; + + // Mock Workspace Configuration + let workspaceConfigurtionMock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + workspaceConfigurtionMock.setup(config => config.get(TypeMoq.It.isValue(constants.trustedBooksConfigKey))).returns(() => [].concat(trustedSubFolders)); + workspaceConfigurtionMock.setup(config => config.update(TypeMoq.It.isValue(constants.trustedBooksConfigKey), TypeMoq.It.isAny(), TypeMoq.It.isValue(false))).returns((key: string, newValues: string[]) => { + trustedSubFolders.splice(0, trustedSubFolders.length, ...newValues); // Replace + return Promise.resolve(); + }); + + sinon.replaceGetter(vscode.workspace, 'workspaceFolders', () => { + return [{ + uri: { + fsPath: '/temp/' + }, }, { - url: path.join(path.sep, 'sample', 'notebook2') - } - ] - }, - isUntitled: undefined, - page: undefined, - title: undefined, - treeItemCollapsibleState: undefined, - type: BookTreeItemType.Book - }; + uri: { + fsPath: '/temp2/' + } + }, + ]; + }); - let bookTreeItemFormat2: BookTreeItemFormat = { - contentPath: undefined, - root: '/temp/SubFolder2/', - tableOfContents: { - sections: [ - { - url: path.join(path.sep, 'sample', 'notebook') - } - ] - }, - isUntitled: undefined, - page: undefined, - title: undefined, - treeItemCollapsibleState: undefined, - type: BookTreeItemType.Book - }; + sinon.stub(vscode.workspace, 'getConfiguration').returns(workspaceConfigurtionMock.object); - let bookTreeItemFormat3: BookTreeItemFormat = { - contentPath: undefined, - root: '/temp2/SubFolder3/', - tableOfContents: { - sections: [ - { - url: path.join(path.sep, 'sample', 'notebook') - } - ] - }, - isUntitled: undefined, - page: undefined, - title: undefined, - treeItemCollapsibleState: undefined, - type: BookTreeItemType.Book - }; + // Mock Book Data + let bookTreeItemFormat1: BookTreeItemFormat = { + contentPath: undefined, + root: '/temp/SubFolder/', + tableOfContents: { + sections: [ + { + url: path.join(path.sep, 'sample', 'notebook') + }, + { + url: path.join(path.sep, 'sample', 'notebook2') + } + ] + }, + isUntitled: undefined, + page: undefined, + title: undefined, + treeItemCollapsibleState: undefined, + type: BookTreeItemType.Book + }; - let bookModel1Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - bookModel1Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat1, undefined), new BookTreeItem(bookTreeItemFormat2, undefined)]); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); + let bookTreeItemFormat2: BookTreeItemFormat = { + contentPath: undefined, + root: '/temp/SubFolder2/', + tableOfContents: { + sections: [ + { + url: path.join(path.sep, 'sample', 'notebook') + } + ] + }, + isUntitled: undefined, + page: undefined, + title: undefined, + treeItemCollapsibleState: undefined, + type: BookTreeItemType.Book + }; - let bookModel2Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - bookModel2Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat3, undefined)]); - bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp2', 'SubFolder', 'content', 'sample', 'notebook.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); + let bookTreeItemFormat3: BookTreeItemFormat = { + contentPath: undefined, + root: '/temp2/SubFolder3/', + tableOfContents: { + sections: [ + { + url: path.join(path.sep, 'sample', 'notebook') + } + ] + }, + isUntitled: undefined, + page: undefined, + title: undefined, + treeItemCollapsibleState: undefined, + type: BookTreeItemType.Book + }; - books = [bookModel1Mock.object, bookModel2Mock.object]; + let bookModel1Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + bookModel1Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat1, undefined), new BookTreeItem(bookTreeItemFormat2, undefined)]); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book1.notebook1))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book1.notebook2))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book1.notebook3))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); - bookTrustManager = new BookTrustManager(books); - }); + let bookModel2Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + bookModel2Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat3, undefined)]); + bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book2.notebook1))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); - it('should trust notebooks in a trusted book within a workspace', async () => { - let notebookUri1 = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'); - let notebookUri2 = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb'); + books = [bookModel1Mock.object, bookModel2Mock.object]; - let isNotebook1Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri1); - let isNotebook2Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri2); + bookTrustManager = new BookTrustManager(books); + }); - should(isNotebook1Trusted).be.true('Notebook 1 should be trusted'); - should(isNotebook2Trusted).be.true('Notebook 2 should be trusted'); + it('should trust notebooks in a trusted book within a workspace', async () => { + let notebookUri1 = run.book1.notebook1; + let notebookUri2 = run.book1.notebook2; - }); + let isNotebook1Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri1); + let isNotebook2Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri2); - it('should NOT trust a notebook in an untrusted book within a workspace', async () => { - let notebookUri = path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + should(isNotebook1Trusted).be.true('Notebook 1 should be trusted'); + should(isNotebook2Trusted).be.true('Notebook 2 should be trusted'); + }); - should(isNotebookTrusted).be.false('Notebook should be trusted'); - }); + it('should NOT trust a notebook in an untrusted book within a workspace', async () => { + let notebookUri = run.book1.notebook3; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - it('should trust notebook after book has been trusted within a workspace', async () => { - let notebookUri = path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrustedBeforeChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + should(isNotebookTrusted).be.false('Notebook should not be trusted'); + }); - should(isNotebookTrustedBeforeChange).be.false('Notebook should NOT be trusted'); + it('should trust notebook after book has been trusted within a workspace', async () => { + let notebookUri = run.book1.notebook3; + let isNotebookTrustedBeforeChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - // add another book subfolder - bookTrustManager.setBookAsTrusted('/SubFolder2/'); + should(isNotebookTrustedBeforeChange).be.false('Notebook should NOT be trusted'); - let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + // add another book subfolder + bookTrustManager.setBookAsTrusted('/SubFolder2/', true); - should(isNotebookTrustedAfterChange).be.true('Notebook should be trusted'); - }); + let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - it('should NOT trust a notebook when untrusting a book within a workspace', async () => { - let notebookUri = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + should(isNotebookTrustedAfterChange).be.true('Notebook should be trusted'); + }); - should(isNotebookTrusted).be.true('Notebook should be trusted'); + it('should NOT trust a notebook when untrusting a book within a workspace', async () => { + let notebookUri = run.book1.notebook1; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - // remove trusted subfolders - trustedSubFolders = []; + should(isNotebookTrusted).be.true('Notebook should be trusted'); - let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + // remove trusted subfolders + trustedSubFolders = []; - should(isNotebookTrustedAfterChange).be.false('Notebook should not be trusted after book removal'); - }); + let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - it('should NOT trust an unknown book within a workspace', async () => { - let notebookUri = path.join(path.sep, 'randomfolder', 'randomsubfolder', 'content', 'randomnotebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + should(isNotebookTrustedAfterChange).be.false('Notebook should not be trusted after book removal'); + }); - should(isNotebookTrusted).be.false('Random notebooks should not be trusted'); - }); + it('should NOT trust an unknown book within a workspace', async () => { + let notebookUri = run.unknownBook.unknownNotebook; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - it('should NOT trust notebook inside trusted subfolder when absent in table of contents ', async () => { - bookTrustManager.setBookAsTrusted('/temp/SubFolder/'); + should(isNotebookTrusted).be.false('Random notebooks should not be trusted'); + }); - let notebookUri = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notInToc.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + it('should NOT trust notebook inside trusted subfolder when absent in table of contents ', async () => { + bookTrustManager.setBookAsTrusted('/temp/SubFolder/', true); - should(isNotebookTrusted).be.false('Notebook should NOT be trusted'); + let notebookUri = run.book1.notInTocNb; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrusted).be.false('Notebook should NOT be trusted'); + }); + }); }); }); + + describe('TrustingInFolder', () => { let bookTrustManager: IBookTrustManager; let books: BookModel[]; let trustedFolders: string[] = []; - beforeEach(() => { - // Mock Workspace Configuration - let workspaceConfigurtionMock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - workspaceConfigurtionMock.setup(config => config.get(TypeMoq.It.isValue(constants.trustedBooksConfigKey))).returns(() => [].concat(trustedFolders)); - workspaceConfigurtionMock.setup(config => config.update(TypeMoq.It.isValue(constants.trustedBooksConfigKey), TypeMoq.It.isAny(), TypeMoq.It.isValue(vscode.ConfigurationTarget.Global))).returns((key: string, newValues: string[], target: vscode.ConfigurationTarget) => { - trustedFolders.splice(0, trustedFolders.length, ...newValues); // Replace - return Promise.resolve(); + let runs = [ + { + it: 'using the jupyter-book legacy version < 0.7.0', + book1: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb'), + 'notInTocNb': path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notInToc.ipynb') + }, + book2: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook2.ipynb') + }, + unknownBook: { + 'unknownNotebook': path.join(path.sep, 'randomfolder', 'randomsubfolder', 'content', 'randomnotebook.ipynb') + } + }, { + it: 'using jupyter-book versions >= 0.7.0', + book1: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notebook2.ipynb'), + 'notInTocNb': path.join(path.sep, 'temp', 'SubFolder', 'sample', 'notInToc.ipynb') + }, + book2: { + 'notebook1': path.join(path.sep, 'temp', 'SubFolder2', 'sample', 'notebook.ipynb'), + 'notebook2': path.join(path.sep, 'temp', 'SubFolder2', 'sample', 'notebook2.ipynb') + }, + unknownBook: { + 'unknownNotebook': path.join(path.sep, 'randomfolder', 'randomsubfolder', 'randomnotebook.ipynb') + } + } + ]; + runs.forEach(function (run) { + describe('Trusting in Workspaces ' + run.it, function (): void { + beforeEach(() => { + trustedFolders = []; + // Mock Workspace Configuration + let workspaceConfigurtionMock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + workspaceConfigurtionMock.setup(config => config.get(TypeMoq.It.isValue(constants.trustedBooksConfigKey))).returns(() => [].concat(trustedFolders)); + workspaceConfigurtionMock.setup(config => config.update(TypeMoq.It.isValue(constants.trustedBooksConfigKey), TypeMoq.It.isAny(), TypeMoq.It.isValue(vscode.ConfigurationTarget.Global))).returns((key: string, newValues: string[], target: vscode.ConfigurationTarget) => { + trustedFolders.splice(0, trustedFolders.length, ...newValues); // Replace + return Promise.resolve(); + }); + + let bookTreeItemFormat1: BookTreeItemFormat = { + contentPath: undefined, + root: '/temp/SubFolder/', + tableOfContents: { + sections: [ + { + url: path.join(path.sep, 'sample', 'notebook') + }, + { + url: path.join(path.sep, 'sample', 'notebook2') + } + ] + }, + isUntitled: undefined, + page: undefined, + title: undefined, + treeItemCollapsibleState: undefined, + type: BookTreeItemType.Book + }; + + let bookTreeItemFormat2: BookTreeItemFormat = { + contentPath: undefined, + root: '/temp/SubFolder2/', + tableOfContents: { + sections: [ + { + url: path.join(path.sep, 'sample', 'notebook') + }, + { + url: path.join(path.sep, 'sample', 'notebook2') + } + ] + }, + isUntitled: undefined, + page: undefined, + title: undefined, + treeItemCollapsibleState: undefined, + type: BookTreeItemType.Book + }; + + let bookModel1Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + bookModel1Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat1, undefined)]); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book1.notebook1))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book1.notebook2))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); + + let bookModel2Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); + bookModel2Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat2, undefined)]); + bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book2.notebook1))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(run.book2.notebook2))).returns((uri: string) => TypeMoq.Mock.ofType().object); + bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); + + books = [bookModel1Mock.object, bookModel2Mock.object]; + + bookTrustManager = new BookTrustManager(books); + }); + + it('should trust notebooks in a trusted book in a folder', async () => { + bookTrustManager.setBookAsTrusted('/temp/SubFolder/', true); + + let notebookUri1 = run.book1.notebook1; + let notebookUri2 = run.book1.notebook2; + + let isNotebook1Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri1); + let isNotebook2Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri2); + + should(isNotebook1Trusted).be.true('Notebook 1 should be trusted'); + should(isNotebook2Trusted).be.true('Notebook 2 should be trusted'); + + }); + + it('should NOT trust a notebook in an untrusted book in a folder', async () => { + //Set book as not trusted before running test + bookTrustManager.setBookAsTrusted('/temp/SubFolder2/', false); + + let notebookUri = run.book2.notebook1; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrusted).be.false('Notebook not should be trusted'); + }); + + it('should trust notebook after book has been added to a folder', async () => { + let notebookUri = run.book2.notebook1; + let isNotebookTrustedBeforeChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrustedBeforeChange).be.false('Notebook should NOT be trusted'); + + bookTrustManager.setBookAsTrusted('/temp/SubFolder2/', true); + + let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrustedAfterChange).be.true('Notebook should be trusted'); + }); + + it('should NOT trust a notebook when removing all books from folders', async () => { + bookTrustManager.setBookAsTrusted('/temp/SubFolder/', true); + bookTrustManager.setBookAsTrusted('/temp/SubFolder2/', true); + let notebookUri = run.book1.notebook1; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + let notebook2Uri = run.book2.notebook1; + let isNotebook2Trusted = bookTrustManager.isNotebookTrustedByDefault(notebook2Uri); + + should(isNotebookTrusted).be.true('Notebook should be trusted'); + should(isNotebook2Trusted).be.true('Notebook2 should be trusted'); + + trustedFolders = []; + + let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + let isNotebook2TrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebook2Uri); + + should(isNotebookTrustedAfterChange).be.false('Notebook should not be trusted after book removal'); + should(isNotebook2TrustedAfterChange).be.false('Notebook2 should not be trusted after book removal'); + }); + + it('should NOT trust an unknown book', async () => { + let notebookUri = run.unknownBook.unknownNotebook; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrusted).be.false('Random notebooks should not be trusted'); + }); + + it('should NOT trust notebook inside trusted subfolder when absent in table of contents ', async () => { + bookTrustManager.setBookAsTrusted('/temp/SubFolder/', true); + + let notebookUri = run.book1.notInTocNb; + let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); + + should(isNotebookTrusted).be.false('Notebook should NOT be trusted'); + }); }); - - let bookTreeItemFormat1: BookTreeItemFormat = { - contentPath: undefined, - root: '/temp/SubFolder/', - tableOfContents: { - sections: [ - { - url: path.join(path.sep, 'sample', 'notebook') - }, - { - url: path.join(path.sep, 'sample', 'notebook2') - } - ] - }, - isUntitled: undefined, - page: undefined, - title: undefined, - treeItemCollapsibleState: undefined, - type: BookTreeItemType.Book - }; - - let bookTreeItemFormat2: BookTreeItemFormat = { - contentPath: undefined, - root: '/temp/SubFolder2/', - tableOfContents: { - sections: [ - { - url: path.join(path.sep, 'sample', 'notebook') - }, - { - url: path.join(path.sep, 'sample', 'notebook2') - } - ] - }, - isUntitled: undefined, - page: undefined, - title: undefined, - treeItemCollapsibleState: undefined, - type: BookTreeItemType.Book - }; - - let bookModel1Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - bookModel1Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat1, undefined)]); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel1Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); - - let bookModel2Mock: TypeMoq.IMock = TypeMoq.Mock.ofType(); - bookModel2Mock.setup(model => model.bookItems).returns(() => [new BookTreeItem(bookTreeItemFormat2, undefined)]); - bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isValue(path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook2.ipynb')))).returns((uri: string) => TypeMoq.Mock.ofType().object); - bookModel2Mock.setup(model => model.getNotebook(TypeMoq.It.isAnyString())).returns((uri: string) => undefined); - - books = [bookModel1Mock.object, bookModel2Mock.object]; - - bookTrustManager = new BookTrustManager(books); }); - - it('should trust notebooks in a trusted book in a folder', async () => { - bookTrustManager.setBookAsTrusted('/temp/SubFolder/'); - - let notebookUri1 = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'); - let notebookUri2 = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook2.ipynb'); - - let isNotebook1Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri1); - let isNotebook2Trusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri2); - - should(isNotebook1Trusted).be.true('Notebook 1 should be trusted'); - should(isNotebook2Trusted).be.true('Notebook 2 should be trusted'); - - }); - - it('should NOT trust a notebook in an untrusted book in a folder', async () => { - let notebookUri = path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrusted).be.false('Notebook should be trusted'); - }); - - it('should trust notebook after book has been added to a folder', async () => { - let notebookUri = path.join(path.sep, 'temp', 'SubFolder2', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrustedBeforeChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrustedBeforeChange).be.false('Notebook should NOT be trusted'); - - bookTrustManager.setBookAsTrusted('/temp/SubFolder2/'); - - let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrustedAfterChange).be.true('Notebook should be trusted'); - }); - - it('should NOT trust a notebook when untrusting a book in folder', async () => { - bookTrustManager.setBookAsTrusted('/temp/SubFolder/'); - let notebookUri = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrusted).be.true('Notebook should be trusted'); - - trustedFolders = []; - - let isNotebookTrustedAfterChange = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrustedAfterChange).be.false('Notebook should not be trusted after book removal'); - }); - - it('should NOT trust an unknown book', async () => { - let notebookUri = path.join(path.sep, 'randomfolder', 'randomsubfolder', 'content', 'randomnotebook.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrusted).be.false('Random notebooks should not be trusted'); - }); - - it('should NOT trust notebook inside trusted subfolder when absent in table of contents ', async () => { - bookTrustManager.setBookAsTrusted('/temp/SubFolder/'); - - let notebookUri = path.join(path.sep, 'temp', 'SubFolder', 'content', 'sample', 'notInToc.ipynb'); - let isNotebookTrusted = bookTrustManager.isNotebookTrustedByDefault(notebookUri); - - should(isNotebookTrusted).be.false('Notebook should NOT be trusted'); - }); - }); });