From 0509234362278f9853a8167ebb9077d83baf3e24 Mon Sep 17 00:00:00 2001 From: Lucy Zhang Date: Tue, 6 Aug 2019 10:39:01 -0700 Subject: [PATCH] Added unit test for books getChildren() method (#6602) * started unit tests for books * added first unit test for getchildren() * fixed dependencies and use tmpdir * latest from master --- extensions/notebook/package.json | 3 +- extensions/notebook/src/book/bookTreeItem.ts | 10 ++- extensions/notebook/src/book/bookTreeView.ts | 2 +- .../notebook/src/test/book/book.test.ts | 86 +++++++++++++++++++ extensions/notebook/yarn.lock | 10 ++- 5 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 extensions/notebook/src/test/book/book.test.ts diff --git a/extensions/notebook/package.json b/extensions/notebook/package.json index 5165e00782..46e4be3501 100644 --- a/extensions/notebook/package.json +++ b/extensions/notebook/package.json @@ -347,6 +347,7 @@ "dependencies": { "@jupyterlab/services": "^3.2.1", "@types/js-yaml": "^3.12.1", + "@types/rimraf": "^2.0.2", "decompress": "^4.2.0", "error-ex": "^1.3.1", "figures": "^2.0.0", @@ -374,4 +375,4 @@ "vscode": "1.1.5" }, "enableProposedApi": true -} \ No newline at end of file +} diff --git a/extensions/notebook/src/book/bookTreeItem.ts b/extensions/notebook/src/book/bookTreeItem.ts index 29d9592f16..0a8c80ae33 100644 --- a/extensions/notebook/src/book/bookTreeItem.ts +++ b/extensions/notebook/src/book/bookTreeItem.ts @@ -100,6 +100,14 @@ export class BookTreeItem extends vscode.TreeItem { } } + public get title(): string { + return this.book.title; + } + + public get uri(): string { + return this._uri; + } + public get root(): string { return this.book.root; } @@ -128,4 +136,4 @@ export class BookTreeItem extends vscode.TreeItem { return undefined; } } -} \ No newline at end of file +} diff --git a/extensions/notebook/src/book/bookTreeView.ts b/extensions/notebook/src/book/bookTreeView.ts index 5224184718..f4f39fa5bf 100644 --- a/extensions/notebook/src/book/bookTreeView.ts +++ b/extensions/notebook/src/book/bookTreeView.ts @@ -121,7 +121,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider Array.isArray(val.sections) ? acc.concat(val).concat(this.flattenArray(val.sections)) : acc.concat(val), []); } - private getBooks(): BookTreeItem[] { + public getBooks(): BookTreeItem[] { let books: BookTreeItem[] = []; for (let i in this._tableOfContentsPath) { let root = path.dirname(path.dirname(this._tableOfContentsPath[i])); diff --git a/extensions/notebook/src/test/book/book.test.ts b/extensions/notebook/src/test/book/book.test.ts new file mode 100644 index 0000000000..74f477c54a --- /dev/null +++ b/extensions/notebook/src/test/book/book.test.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import * as should from 'should'; +import * as TypeMoq from 'typemoq'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as rimraf from 'rimraf'; +import * as os from 'os'; +import { BookTreeViewProvider } from '../../book/bookTreeView'; +import { BookTreeItem } from '../../book/bookTreeItem'; + +describe('BookTreeViewProvider.getChildren', function (): void { + const rootFolderPath = path.join(os.tmpdir(), 'testBook'); + const dataFolderPath = path.join(rootFolderPath, '_data'); + const contentFolderPath = path.join(rootFolderPath, 'content'); + const configFile = path.join(rootFolderPath, '_config.yml'); + const tableOfContentsFile = path.join(dataFolderPath, 'toc.yml'); + const notebookFile = path.join(contentFolderPath, 'notebook.ipynb'); + const markdownFile = path.join(contentFolderPath, 'markdown.md'); + const expectedNotebook = { + title: 'Notebook', + url: '/notebook' + }; + const expectedMarkdown = { + title: 'Markdown', + url: '/markdown' + }; + const expectedExternalLink = { + title: 'GitHub', + url: 'https://github.com/', + external: true + }; + const expectedBook = { + sections: [expectedNotebook, expectedMarkdown, expectedExternalLink], + title: 'Test Book' + }; + + let mockExtensionContext: TypeMoq.IMock; + let bookTreeViewProvider: BookTreeViewProvider; + let book: BookTreeItem; + + this.beforeAll(async () => { + fs.mkdirSync(rootFolderPath); + fs.mkdirSync(dataFolderPath); + fs.mkdirSync(contentFolderPath); + fs.writeFileSync(configFile, 'title: Test Book'); + fs.writeFileSync(tableOfContentsFile, '- title: Notebook\n url: /notebook\n- title: Markdown\n url: /markdown\n- title: GitHub\n url: https://github.com/\n external: true'); + fs.writeFileSync(notebookFile, ''); + fs.writeFileSync(markdownFile, ''); + mockExtensionContext = TypeMoq.Mock.ofType(); + bookTreeViewProvider = new BookTreeViewProvider(rootFolderPath, mockExtensionContext.object); + }); + + it('should return all book nodes when element is undefined', async function (): Promise { + const children = await bookTreeViewProvider.getChildren(); + should(children).be.Array(); + should(children.length).equal(1); + book = children[0]; + should(book.title).equal(expectedBook.title); + }); + + it('should return all page nodes when element is a book', async function (): Promise { + const children = await bookTreeViewProvider.getChildren(book); + should(children).be.Array(); + should(children.length).equal(3); + const notebook = children[0]; + const markdown = children[1]; + const externalLink = children[2]; + should(notebook.title).equal(expectedNotebook.title); + should(notebook.uri).equal(expectedNotebook.url); + should(markdown.title).equal(expectedMarkdown.title); + should(markdown.uri).equal(expectedMarkdown.url); + should(externalLink.title).equal(expectedExternalLink.title); + should(externalLink.uri).equal(expectedExternalLink.url); + }); + + after(async function () { + if (fs.existsSync(rootFolderPath)) { + rimraf.sync(rootFolderPath); + } + }); +}); diff --git a/extensions/notebook/yarn.lock b/extensions/notebook/yarn.lock index 5ae5f6e772..07ff4009a8 100644 --- a/extensions/notebook/yarn.lock +++ b/extensions/notebook/yarn.lock @@ -111,7 +111,7 @@ dependencies: "@types/node" "*" -"@types/glob@^7.1.1": +"@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== @@ -155,6 +155,14 @@ "@types/node" "*" "@types/tough-cookie" "*" +"@types/rimraf@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" + integrity sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/temp-write@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@types/temp-write/-/temp-write-3.3.0.tgz#40fe3d1fae6e98a2e40a13abe83e7a1996ea51ee"