import { mount, shallow } from "enzyme"; import _ from "lodash"; import React from "react"; import { Form } from "react-bootstrap"; import { DocumentAttributeKeys } from "../../../search/constants"; import { AvailableFacetManager } from "../../../search/facets/AvailableFacetManager"; import { AvailableFacetRetriever } from "../../../search/facets/AvailableFacetRetriever"; import { DateFacet } from "../../../search/facets/components/DateFacet"; import { Facet } from "../../../search/facets/components/Facet"; import { FacetCheckbox } from "../../../search/facets/components/FacetCheckbox"; import { Facets } from "../../../search/facets/Facets"; import { SelectedFacetManager } from "../../../search/facets/SelectedFacetManager"; import { mockAttributeTypeLookup, mockDataSourceIdValueCountPairs, mockDataSourceNameLookup, mockDateDocumentAttributeValueCountPairs, mockDocumentAttributeValueCountPairs, mockDocumentAttributeValue, } from "../../mock/mock"; const mockNoopProps = { selectedFacets: SelectedFacetManager.empty(), onSelectedFacetsChanged: _.noop, onExpand: _.noop, }; describe("A ", () => { it("renders correctly when doesn't have index", () => { const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders correctly when doesn't have query result", () => { const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders string value correctly", () => { const mockAttributeName = "mockAttributeName"; const mockAvailableFacets: AvailableFacetRetriever = { get: (attributeName: string) => mockDocumentAttributeValueCountPairs, getAvailableAttributeNames: () => [mockAttributeName], }; const mockAttributeTypeLookup = { [mockAttributeName]: "STRING_VALUE", }; const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders date value correctly", () => { const mockAttributeName = "mockDateAttributeName"; const mockAvailableFacets: AvailableFacetRetriever = { get: (attributeName: string) => mockDateDocumentAttributeValueCountPairs, getAvailableAttributeNames: () => [mockAttributeName], }; const mockAttributeTypeLookup = { [mockAttributeName]: "DATE_VALUE", }; const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders data source id correctly when data source lookup provided", () => { const mockAvailableFacets: AvailableFacetRetriever = { get: (attributeName: string) => mockDataSourceIdValueCountPairs, getAvailableAttributeNames: () => [DocumentAttributeKeys.DataSourceId], }; const mockAttributeTypeLookup = { [DocumentAttributeKeys.DataSourceId]: "STRING_VALUE", }; const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders data source id correctly when data source lookup not provided", () => { const mockAvailableFacets: AvailableFacetRetriever = { get: (attributeName: string) => mockDataSourceIdValueCountPairs, getAvailableAttributeNames: () => [DocumentAttributeKeys.DataSourceId], }; const mockAttributeTypeLookup = { [DocumentAttributeKeys.DataSourceId]: "STRING_VALUE", }; const component = shallow( ); expect(component).toMatchSnapshot(); }); it("renders multiple values correctly", () => { const mockStringAttribute1Name = "mockString1AttributeName"; const mockStringAttribute2Name = "mockStringAttribute2Name"; const mockDateAttributeName = "mockDateAttributeName"; const mockAvailableFacets: AvailableFacetRetriever = { get: (attributeName: string) => { switch (attributeName) { case mockStringAttribute1Name: case mockStringAttribute2Name: return mockDocumentAttributeValueCountPairs; case mockDateAttributeName: return mockDateDocumentAttributeValueCountPairs; default: return []; } }, getAvailableAttributeNames: () => [ mockStringAttribute1Name, mockStringAttribute2Name, mockDateAttributeName, ], }; const mockAttributeTypeLookup = { [mockStringAttribute1Name]: "STRING_VALUE", [mockStringAttribute2Name]: "STRING_VALUE", [mockDateAttributeName]: "DATE_VALUE", }; const component = shallow( ); expect(component).toMatchSnapshot(); }); it("Renders correctly when no available facets, but some facet is selected", () => { const mockSelectedFacets = SelectedFacetManager.empty().setIsSelected( "mockAttributeKey", mockDocumentAttributeValue, true ); const facets = shallow( ); expect(facets).toMatchSnapshot(); }); it("Integration test", () => { const mockStringAttribute1Name = "mockStringAttribute1Name"; const mockStringAttribute2Name = "mockStringAttribute2Name"; const mockDateAttributeName = "mockDateAttributeName"; let availableFacetManager = AvailableFacetManager.empty().setAll({ [mockStringAttribute1Name]: mockDocumentAttributeValueCountPairs, [mockStringAttribute2Name]: mockDocumentAttributeValueCountPairs, [mockDateAttributeName]: mockDateDocumentAttributeValueCountPairs, }); const mockAttributeTypeLookup = { [mockStringAttribute1Name]: "STRING_VALUE", [mockStringAttribute2Name]: "STRING_VALUE", [mockDateAttributeName]: "DATE_VALUE", }; const facets = mount( ); const firstFacetName = mockStringAttribute1Name; // Check correct facet is first expect( facets .find(Facet) .first() .find(".facet-title") .text() .startsWith(firstFacetName) ).toBeTruthy(); // Check the value of the first facet is rendered correctly expect( shallow( facets .find(Facet) .first() .find(FacetCheckbox) .first() .find(Form.Check) .prop("label") as React.ReactElement ).html() ).toMatch(/mockStringValue1/); // Change the values of the first facet availableFacetManager = availableFacetManager.set(firstFacetName, [ { DocumentAttributeValue: { StringValue: "mockUpdatedValue", }, Count: 10, }, ]); facets.setProps({ attributeTypeLookup: mockAttributeTypeLookup, availableFacets: availableFacetManager, }); // Check correct facet is first expect( facets .find(Facet) .first() .find(".facet-title") .text() .startsWith(firstFacetName) ).toBeTruthy(); // Check the value of the first facet is rendered correctly expect( shallow( facets .find(Facet) .first() .find(FacetCheckbox) .first() .find(Form.Check) .prop("label") as React.ReactElement ).html() ).toMatch(/mockUpdatedValue/); }); it("Integration test date facet handles changes to available facets correctly", () => { const mockStringAttribute1Name = "mockStringAttribute1Name"; const mockDateAttributeName = "mockDateAttributeName"; let availableFacetManager = AvailableFacetManager.empty().setAll({ [mockStringAttribute1Name]: mockDocumentAttributeValueCountPairs, [mockDateAttributeName]: mockDateDocumentAttributeValueCountPairs, }); const mockAttributeTypeLookup = { [mockStringAttribute1Name]: "STRING_VALUE", [mockDateAttributeName]: "DATE_VALUE", }; const facets = mount( ); const dateFacet = facets.find(DateFacet); expect(dateFacet.instance().state.slider.value).toBeUndefined(); // Change the values of the date facet const mockSliderValue: [number, number] = [2019, 2020]; dateFacet.instance().handleChange(mockSliderValue); expect(dateFacet.instance().state.slider.value).toEqual(mockSliderValue); // Change the values of the string facet availableFacetManager = availableFacetManager.set( mockStringAttribute1Name, [ { DocumentAttributeValue: { StringValue: "mockUpdatedValue", }, Count: 10, }, ] ); facets.setProps({ attributeTypeLookup: mockAttributeTypeLookup, availableFacets: availableFacetManager, }); // Ensure slider value didn't change expect(dateFacet.instance().state.slider.value).toEqual(mockSliderValue); // Change the value of the date facet availableFacetManager = availableFacetManager.set(mockDateAttributeName, [ { DocumentAttributeValue: { StringValue: "2019-03-26T14:33:14.000Z", }, Count: 10, }, ]); facets.setProps({ attributeTypeLookup: mockAttributeTypeLookup, availableFacets: availableFacetManager, }); // Ensure slider value did change expect(dateFacet.instance().state.slider.value).toBeUndefined(); }); });