diff --git a/package-lock.json b/package-lock.json index 8cb754874..559b1ca16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11628,6 +11628,39 @@ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true }, + "html-element-map": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.0.tgz", + "integrity": "sha512-AqCt/m9YaiMwaaAyOPdq4Ga0cM+jdDWWGueUMkdROZcTeClaGpN0AQeyGchZhTegQoABmc6+IqH7oCR/8vhQYg==", + "dev": true, + "requires": { + "array-filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + } + } + }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -11686,34 +11719,43 @@ } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.0.1.tgz", + "integrity": "sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w==", "dev": true, "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.4.4", + "entities": "^2.0.0" }, "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dom-serializer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz", + "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", "dev": true }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "domutils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.0.tgz", + "integrity": "sha512-Ho16rzNMOFk2fPwChGh3D2D9OEHAfG19HgmRR2l+WLSsIstNsAYBzePH412bL0y5T44ejABIVfTHQ8nqi/tBCg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0" } } } @@ -15331,18 +15373,6 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", - "dev": true - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", - "dev": true - }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -15364,22 +15394,10 @@ "lodash._root": "^3.0.0" } }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", - "dev": true - }, - "lodash.flatten": { + "lodash.flattendeep": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lodash.get": { @@ -15451,12 +15469,6 @@ "lodash.isarray": "^3.0.0" } }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -16110,6 +16122,12 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -17237,6 +17255,23 @@ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -18538,6 +18573,21 @@ "fast-diff": "1.1.2" } }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, "ramda": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", @@ -19431,6 +19481,16 @@ "inherits": "^2.0.1" } }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", diff --git a/package.json b/package.json index 0e0d36533..cb140857a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "@microsoft/sp-tslint-rules": "1.12.0", "@microsoft/sp-webpart-workbench": "1.12.0", "@types/chart.js": "2.7.40", - "@types/enzyme": "2.8.7", + "@types/enzyme": "^2.8.12", + "@types/es6-promise": "0.0.33", "@types/jest": "25.2.3", "@types/lodash": "4.14.149", "@types/react": "16.9.36", @@ -64,7 +65,7 @@ "amd-loader": "0.0.8", "chai": "^4.3.4", "codecov": "3.6.5", - "enzyme": "^2.9.1", + "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.6", "gulp": "4.0.2", "husky": "5.2.0", @@ -121,8 +122,32 @@ "moduleNameMapper": { "@ms/sp-telemetry": "identity-obj-proxy", "@microsoft/sp-webpart-base": "identity-obj-proxy", + "@microsoft/sp-core-library": "identity-obj-proxy", "@microsoft/sp-application-base": "identity-obj-proxy", - "^resx-strings/en-us.json": "/node_modules/@microsoft/sp-core-library/lib/resx-strings/en-us.json", + "office-ui-fabric-react/lib/FocusZone": "identity-obj-proxy", + "office-ui-fabric-react/lib/List": "identity-obj-proxy", + "office-ui-fabric-react/lib/Spinner": "identity-obj-proxy", + "office-ui-fabric-react/lib/Image": "identity-obj-proxy", + "office-ui-fabric-react/lib/Button": "identity-obj-proxy", + "office-ui-fabric-react/lib/components/Button": "identity-obj-proxy", + "office-ui-fabric-react/lib/Selection": "identity-obj-proxy", + "office-ui-fabric-react/lib/Icon": "identity-obj-proxy", + "office-ui-fabric-react/lib/Styling": "identity-obj-proxy", + "office-ui-fabric-react/lib/Check": "identity-obj-proxy", + "office-ui-fabric-react/lib/DetailsList": "identity-obj-proxy", + "office-ui-fabric-react/lib/CommandBar": "identity-obj-proxy", + "office-ui-fabric-react/lib/ContextualMenu": "identity-obj-proxy", + "office-ui-fabric-react/lib/ScrollablePane": "identity-obj-proxy", + "office-ui-fabric-react/lib/Breadcrumb": "identity-obj-proxy", + "office-ui-fabric-react/lib/Link": "identity-obj-proxy", + "office-ui-fabric-react/lib/Dialog": "identity-obj-proxy", + "office-ui-fabric-react/lib/common/DirectionalHint": "identity-obj-proxy", + "office-ui-fabric-react/lib/Persona": "identity-obj-proxy", + "office-ui-fabric-react/lib/HoverCard": "identity-obj-proxy", + "office-ui-fabric-react/lib/components/Icon": "identity-obj-proxy", + "@pnp/sp": "identity-obj-proxy", + "'@pnp/sp/fields": "identity-obj-proxy", + "ControlStrings": "identity-obj-proxy", "\\.(css|scss)$": "identity-obj-proxy" } } diff --git a/tests/controls/documentLibraryBrowser/DocumentLibraryBrowser.test.tsx b/tests/controls/documentLibraryBrowser/DocumentLibraryBrowser.test.tsx new file mode 100644 index 000000000..32a134236 --- /dev/null +++ b/tests/controls/documentLibraryBrowser/DocumentLibraryBrowser.test.tsx @@ -0,0 +1,94 @@ +/// + +import * as React from "react"; +import { mount, configure } from "enzyme"; +import * as Adapter from 'enzyme-adapter-react-16'; +import { DocumentLibraryBrowser } from "../../../src/controls/filePicker/controls/DocumentLibraryBrowser/DocumentLibraryBrowser"; +import { MockFileBrowserService } from "../../mock/services/MockFileBrowserService"; +import { assert } from "chai"; +import { ILibrary } from "../../../src/services/FileBrowserService.types"; + +configure({ adapter: new Adapter() }); + +describe("", ()=>{ + test("should load initial data", async ()=>{ + let browserService = new MockFileBrowserService(); + browserService.getSiteMediaLibrariesResult = [{ + title: "Test library title", + absoluteUrl: "https://test.sharepoint.com/sites/test-site/TestLibrary", + serverRelativeUrl: "/sites/test-site/TestLibrary", + webRelativeUrl: "/sites/test-site/TestLibrary", + iconPath: "/sites/test-site/Assets/icon.png" + }] + let documentLibraryBrowser = mount({ + + }} + />); + assert.equal(documentLibraryBrowser.getDOMNode().tagName, "SPINNER"); + + await documentLibraryBrowser.instance().componentDidMount(); + documentLibraryBrowser.update(); + + assert.equal(documentLibraryBrowser.getDOMNode().tagName, "DIV"); + assert.deepEqual(documentLibraryBrowser.instance().state.lists,browserService.getSiteMediaLibrariesResult); + }); + test("should render library title", async ()=>{ + let browserService = new MockFileBrowserService(); + browserService.getSiteMediaLibrariesResult = [{ + title: "Test library title", + absoluteUrl: "https://test.sharepoint.com/sites/test-site/TestLibrary", + serverRelativeUrl: "/sites/test-site/TestLibrary", + webRelativeUrl: "/sites/test-site/TestLibrary", + iconPath: "/sites/test-site/Assets/icon.png" + }] + let documentLibraryBrowser = mount({ + + }} + />); + //@ts-ignore + let libraryTitle = documentLibraryBrowser.instance()._onRenderLibraryTile(browserService.getSiteMediaLibrariesResult[0],0); + let iconControl = libraryTitle.props.children.props.children.props.children[0]; + let buttonControl = libraryTitle.props.children.props.children.props.children[1]; + assert.equal(iconControl.type,"Image"); + assert.equal(buttonControl.type,"DefaultButton"); + }); + test("should call onOpenLibrary", async ()=>{ + let asserted = false; + let browserService = new MockFileBrowserService(); + browserService.getSiteMediaLibrariesResult = [{ + title: "Test library title", + absoluteUrl: "https://test.sharepoint.com/sites/test-site/TestLibrary", + serverRelativeUrl: "/sites/test-site/TestLibrary", + webRelativeUrl: "/sites/test-site/TestLibrary", + iconPath: "/sites/test-site/Assets/icon.png" + }] + let documentLibraryBrowser = mount({ + asserted = true; + assert.deepEqual(selectedLibrary,browserService.getSiteMediaLibrariesResult[0]); + }} + />); + //@ts-ignore + documentLibraryBrowser.instance()._handleOpenLibrary(browserService.getSiteMediaLibrariesResult[0]); + assert.isTrue(asserted); + }); + test("should _getItemCountForPage 0", async ()=>{ + let browserService = new MockFileBrowserService(); + let documentLibraryBrowser = mount({ + }} + />); + //@ts-ignore + documentLibraryBrowser.instance()._columnsCount = 4; + //@ts-ignore + assert.equal(documentLibraryBrowser.instance()._getItemCountForPage(0,{ + width: 1000 + }),12); + }); +}); \ No newline at end of file diff --git a/tests/controls/filePicker/SiteFilePickerTab.test.tsx b/tests/controls/filePicker/SiteFilePickerTab.test.tsx new file mode 100644 index 000000000..eacac8797 --- /dev/null +++ b/tests/controls/filePicker/SiteFilePickerTab.test.tsx @@ -0,0 +1,52 @@ +/// +import * as React from "react"; +import { mount, configure } from "enzyme"; +import * as Adapter from 'enzyme-adapter-react-16'; +import { MockFileBrowserService } from "../../mock/services/MockFileBrowserService"; +import SiteFilePickerTab from "../../../src/controls/filePicker/SiteFilePickerTab/SiteFilePickerTab"; +import { assert } from "chai"; + +configure({ adapter: new Adapter() }); + +jest.mock("office-ui-fabric-react/lib/Utilities",()=>({ + IRenderFunction:{ + + }, + IRectangle:{ + + }, + css: ()=>{ + + } +})) + +describe("", ()=>{ + test("should load initial data", async ()=>{ + let browserService = new MockFileBrowserService(); + browserService.getSiteMediaLibrariesResult = [{ + title: "Test library title", + absoluteUrl: "https://test.sharepoint.com/sites/test-site/TestLibrary", + serverRelativeUrl: "/sites/test-site/TestLibrary", + webRelativeUrl: "/sites/test-site/TestLibrary", + iconPath: "/sites/test-site/Assets/icon.png" + }]; + let spContext = { + pageContext:{ + web:{ + title: "Test Web", + id: "test-web-id", + serverRelativeUrl: "/sites/test-web" + } + } + } + let siteFilePicker = mount({}} + onClose={()=>{}} + />) + + assert.isOk(siteFilePicker); + }); +}); \ No newline at end of file diff --git a/tests/mock/services/MockFileBrowserService.ts b/tests/mock/services/MockFileBrowserService.ts new file mode 100644 index 000000000..3e386751f --- /dev/null +++ b/tests/mock/services/MockFileBrowserService.ts @@ -0,0 +1,22 @@ +import { FilesQueryResult, IFile, ILibrary } from "../../../src/services/FileBrowserService.types"; + +export class MockFileBrowserService { + public getListItemsResult: FilesQueryResult; + public getFileThumbnailUrlResultMap: Map = new Map(); + public getSiteMediaLibrariesResult: ILibrary[] = []; + constructor() { + + } + public getListItems = (listUrl: string, folderPath: string, acceptedFilesExtensions?: string[], nextPageQueryStringParams?: string): Promise => { + return Promise.resolve(this.getListItemsResult); + } + public getFileThumbnailUrl = (file: IFile, thumbnailWidth: number, thumbnailHeight: number): string => { + return this.getFileThumbnailUrlResultMap.get(file.name); + } + public getSiteMediaLibraries = (includePageLibraries: boolean = false) => { + return Promise.resolve(this.getSiteMediaLibrariesResult); + } + public downloadSPFileContent = (absoluteFileUrl: string, fileName: string): Promise => { + return Promise.resolve(new File([], "test.file")); + } +} \ No newline at end of file diff --git a/tests/services/SPService.test.ts b/tests/services/SPService.test.ts index c62558c83..eafc3b4ea 100644 --- a/tests/services/SPService.test.ts +++ b/tests/services/SPService.test.ts @@ -205,4 +205,33 @@ describe("SPService", () => { assert.isNull(libs); }); + test.each([[ + "test filter", + "TestFieldName", + undefined, + undefined, + "https://test.sharepoint.com/sites/test-site/_api/web/lists('test-list-id')/items?$select=Id,TestFieldName&$filter=startswith(TestFieldName,'test%20filter')&$orderby=undefined" + ] + ])("getListItems %j", async (filterText, columnName, field, keyColumnName, expectedApi) => { + let calledApi; + let ctx = { + pageContext: { + web: { + absoluteUrl: "https://test.sharepoint.com/sites/test-site" + } + }, + spHttpClient: { + get: (apiUrl: string,) => { + calledApi = apiUrl; + return Promise.resolve({ + ok: true, + json: () => Promise.resolve([]) + }); + } + } + } + let spService = new SPService(ctx as any); + let items = await spService.getListItems(filterText, "test-list-id", columnName, field, keyColumnName); + assert.equal(calledApi, expectedApi); + }); }); \ No newline at end of file diff --git a/tests/setup.js b/tests/setup.js index 993f04d4c..ed5edb141 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -1,14 +1,21 @@ jest.mock("@microsoft/sp-http", () => { - return { - SPHttpClient: { - configurations: { - v1: 1 - } - }, - HttpClient: { - configurations: { - v1: 1 - } + return { + SPHttpClient: { + configurations: { + v1: 1 } + }, + HttpClient: { + configurations: { + v1: 1 + } + } + } +}); +jest.mock("@microsoft/decorators", () => { + return { + __decorate: (control) => { + return control; } - }); \ No newline at end of file + } +}) \ No newline at end of file