/// import * as React from "react"; import { mount, configure } from "enzyme"; import * as Adapter from 'enzyme-adapter-react-16'; import { FileBrowser } from "../../../src/controls/filePicker/controls/FileBrowser/FileBrowser"; import { MockFileBrowserService } from "../../mock/services/MockFileBrowserService"; import { IFile } from "../../../src/services/FileBrowserService.types"; import { assert } from "chai"; configure({ adapter: new Adapter() }); describe("", ()=>{ test("should render loading animation", async ()=>{ //The purpose of this test is to make sure we will see the loading animation before anything else. let mockFileBrowserService: MockFileBrowserService = new MockFileBrowserService(); let component = mount( {}} onOpenFolder={(folder: IFile) => {}} />); //as in package.json we map spinner to lib-common spinner mount will actually render the whole thing //so let's try to find our spinner by class name let spinner = component.getDOMNode().querySelector(".ms-Spinner-circle"); assert.isOk(spinner); }); test("should load initial data", async ()=>{ //In this test we will call componentDidMount manually //As mounting in test context will not trigger full component lifecycle we have to do it on our own //(It won't be a case if we were to use @testing-library/react but this is a topic for another time:) ) let mockFileBrowserService: MockFileBrowserService = new MockFileBrowserService(); //FileBrowser uses getListItems method on fileBrowserService. //Our mock already provides that method, so let's assign our mock data mockFileBrowserService.getListItemsResult = { nextHref: undefined, items: [{ name: "Test file", absoluteUrl: "https://test.sharepoint.com/sites/tea-point/Shared Documents/TestFile.docx", serverRelativeUrl: "/sites/tea-point/Shared Documents/TestFile.docx", isFolder: false, modified: "", fileIcon: "", fileType: "docx", // URL required to generate thumbnail preview spItemUrl: "", supportsThumbnail: false },{ name: "Another test file", absoluteUrl: "https://test.sharepoint.com/sites/tea-point/Shared Documents/AnotherTestFile.docx", serverRelativeUrl: "/sites/tea-point/Shared Documents/AnotherTestFile.docx", isFolder: false, modified: "", fileIcon: "", fileType: "docx", // URL required to generate thumbnail preview spItemUrl: "", supportsThumbnail: false }] } //As we also want to validate correct data is passed to getListItem method, let's add some assertion in our mock event //Don't hesitate to peek the mock definition to check out how it's done. //To avoid false positives I declare asserted variable. //It's value will be set to true in event handler and asserted at the end of this test let asserted = false; mockFileBrowserService.onGetListItems = (listUrl,folderPath,acceptedExtensions,nextPageParams)=>{ assert.equal(listUrl, "Shared Documents"); assert.equal(folderPath,"/"); assert.deepEqual(acceptedExtensions,["docx","xlsx"]); //nextPageParams should be falsy in this case assert.isNotOk(nextPageParams); asserted = true; } let component = mount( {}} onOpenFolder={(folder: IFile) => {}} />); //You could wonder - why not to test loading animation here instead of the previous test? //I want to avoid situation in which broken loading animation would affect test for loading data. //Those are two different functionalities I wish to test separately //as promised - here we are manually call lifecycle method. Note await keyword. await component.instance().componentDidMount(); //Now, let's make sure our component is rerendered component.update(); //And now let's find our rows. Note we are using lib-commonjs to mock details list which allows us to fully render the component let dataRows = component.getDOMNode().querySelectorAll('[data-automationid="DetailsRowFields"]') //We expect to have to rows. Content of each should be just the name of the document. assert.equal(dataRows[0].textContent,"Test file"); assert.equal(dataRows[1].textContent,"Another test file"); //And finally let's make sure we asserted the call to getListItems assert.isTrue(asserted); }); test("should handle folder change", async ()=>{ //In this test we want to assert if changing the folder will trigger proper event //Same as previously we will have to call lifecycle events and click handlers on our own let mockFileBrowserService: MockFileBrowserService = new MockFileBrowserService(); //First let define first Mock Data let mockData = { nextHref: undefined, items: [{ name: "Test Folder", absoluteUrl: "https://test.sharepoint.com/sites/tea-point/Shared Documents/Test Folder", serverRelativeUrl: "/sites/tea-point/Shared Documents/Test Folder", isFolder: true, modified: "", fileIcon: "", fileType: "folder", // URL required to generate thumbnail preview spItemUrl: "", supportsThumbnail: false }] }; mockFileBrowserService.getListItemsResult = mockData; //Let's mount our component... //The key to this test is to pass onOpenFolder method that will assert validity of the event let asserted = false; let component = mount( {}} onOpenFolder={(folder: IFile) => { assert.deepEqual(folder,mockData.items[0]); asserted = true; }} />); //...and await relevant event await component.instance().componentDidMount(); component.update(); //Now we want to mock click event. There are two ways around it. One possibility is to send click event on some element. //The other one is to call private method of our component with specific argument. In our case, that would be our folder. //In this case I would lean toward the second option. The first one could fail if exception occur in DetailsList and we don't have to worry about it. //However I do plan to include test sample with mocking external components (Will be more useful for functional components) //@ts-ignore component.instance()._handleItemInvoked(mockData.items[0]); assert.isTrue(asserted); }); test("should handle item change", async ()=>{ //In this test we want to assert if selecting a file will trigger proper event //Same as previously we will have to call lifecycle events and click handlers on our own let mockFileBrowserService: MockFileBrowserService = new MockFileBrowserService(); //First let define first Mock Data let mockData = { nextHref: undefined, items: [{ name: "Test File", absoluteUrl: "https://test.sharepoint.com/sites/tea-point/Shared Documents/Test File.docx", serverRelativeUrl: "/sites/tea-point/Shared Documents/Test File.docx", isFolder: false, modified: "", fileIcon: "", fileType: "docx", // URL required to generate thumbnail preview spItemUrl: "", supportsThumbnail: false }] }; mockFileBrowserService.getListItemsResult = mockData; //Also let's define our expected file const expectedFilePicked = { fileName: "Test File", fileNameWithoutExtension: "Test File", fileAbsoluteUrl: "https://test.sharepoint.com/sites/tea-point/Shared Documents/Test File.docx", spItemUrl: "", downloadFileContent: null } //Let's mount our component... //The key to this test is to pass onChange method that will assert validity of the event let asserted = false; let component = mount( { assert.deepEqual(filePickerResult,expectedFilePicked); asserted = true;}} onOpenFolder={(folder: IFile) => {}} />); //...and await relevant event await component.instance().componentDidMount(); component.update(); //We can use same approach as in previous test //@ts-ignore component.instance()._handleItemInvoked(mockData.items[0]); assert.isTrue(asserted); }); });