/* * Copyright 2015 Hewlett-Packard Development Company, L.P. * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. */ package com.hp.autonomy.frontend.find.core.export.service; import com.google.common.collect.ImmutableMap; import com.hp.autonomy.frontend.configuration.ConfigService; import com.hp.autonomy.searchcomponents.core.config.FieldInfo; import com.hp.autonomy.searchcomponents.core.config.FieldType; import com.hp.autonomy.searchcomponents.core.config.FieldValue; import com.hp.autonomy.searchcomponents.core.config.FieldsInfo; import com.hp.autonomy.searchcomponents.core.config.HavenSearchCapable; import com.hp.autonomy.searchcomponents.core.fields.FieldDisplayNameGenerator; import com.hp.autonomy.searchcomponents.core.fields.FieldPathNormaliser; import com.hp.autonomy.searchcomponents.core.test.CoreTestContext; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; import static com.hp.autonomy.searchcomponents.core.test.CoreTestContext.CORE_CLASSES_PROPERTY; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @SuppressWarnings({"unused", "SpringJavaAutowiredMembersInspection"}) @RunWith(SpringRunner.class) @SpringBootTest( classes = {CoreTestContext.class, CsvExportStrategy.class}, properties = CORE_CLASSES_PROPERTY, webEnvironment = SpringBootTest.WebEnvironment.NONE) public class CsvExportStrategyTest { @Autowired private FieldPathNormaliser fieldPathNormaliser; @Autowired private FieldDisplayNameGenerator fieldDisplayNameGenerator; @MockBean private ConfigService<HavenSearchCapable> configService; @Mock private HavenSearchCapable config; @Autowired private CsvExportStrategy csvExportStrategy; private FieldInfo<String> authorInfo; @Before public void setUp() { when(configService.getConfig()).thenReturn(config); authorInfo = FieldInfo.<String>builder() .id("authors") .name(fieldPathNormaliser.normaliseFieldPath("AUTHOR")) .name(fieldPathNormaliser.normaliseFieldPath("author")) .displayName("Authors") .value(new FieldValue<>("Aiskhulos", "Aeschylus")) .build(); when(config.getFieldsInfo()).thenReturn(FieldsInfo.builder() .populateResponseMap("authors", authorInfo) .populateResponseMap("categories", FieldInfo.<String>builder() .id("categories") .name(fieldPathNormaliser.normaliseFieldPath("CATEGORY")) .name(fieldPathNormaliser.normaliseFieldPath("category")) .build()) .populateResponseMap("databases", FieldInfo.<String>builder() .id("databases") .name(fieldPathNormaliser.normaliseFieldPath("DATABASE")) .name(fieldPathNormaliser.normaliseFieldPath("database")) .build()) .build()); } @Test public void writeHeader() throws IOException { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); csvExportStrategy.writeHeader(byteArrayOutputStream, Stream.of("header1", "header2", "header3") .map(s -> FieldInfo.builder().displayName(s).build()) .collect(Collectors.toList())); assertThat(byteArrayOutputStream.toString(), endsWith("header1,header2,header3\r\n")); } @Test public void getFieldNames() { assertThat(csvExportStrategy.getFieldNames(new MetadataNode[]{mock(MetadataNode.class)}, Collections.emptyList()), hasSize(4)); } @Test public void getConfiguredFields() { assertThat(csvExportStrategy.getConfiguredFieldsById().keySet(), hasSize(3)); } @Test public void getFilteredFields() { assertThat(csvExportStrategy.getFieldNames(new MetadataNode[]{mock(MetadataNode.class)}, Collections.singletonList("authors")), hasSize(1)); } @SuppressWarnings("OptionalGetWithoutIsPresent") @Test public void getFieldInfoForMetadataNode() { final MetadataNode metadataInfo = new ReferenceMetadataNode(); final Optional<? extends FieldInfo<?>> maybeReferenceInfo = csvExportStrategy.getFieldInfoForMetadataNode("reference", ImmutableMap.of("reference", metadataInfo), Collections.emptyList()); assertTrue(maybeReferenceInfo.isPresent()); assertEquals("Reference", maybeReferenceInfo.get().getDisplayName()); } @Test public void getFieldInfoForUnselectedMetadataNode() { final MetadataNode metadataInfo = new ReferenceMetadataNode(); final Optional<? extends FieldInfo<?>> maybeReferenceInfo = csvExportStrategy.getFieldInfoForMetadataNode("reference", ImmutableMap.of("reference", metadataInfo), Collections.singletonList("bad")); assertFalse(maybeReferenceInfo.isPresent()); } @SuppressWarnings("OptionalGetWithoutIsPresent") @Test public void getFieldInfoForKnownNode() { final Optional<? extends FieldInfo<?>> maybeAuthorInfo = csvExportStrategy.getFieldInfoForNode("author", Collections.singletonList("authors")); assertTrue(maybeAuthorInfo.isPresent()); assertEquals("Authors", maybeAuthorInfo.get().getDisplayName()); } @Test public void getFieldInfoForUnselectedKnownNode() { final Optional<? extends FieldInfo<?>> maybeAuthorInfo = csvExportStrategy.getFieldInfoForNode("author", Collections.singletonList("bad")); assertFalse(maybeAuthorInfo.isPresent()); } @Test public void getFieldInfoForUnknownNode() { assertFalse(csvExportStrategy.getFieldInfoForNode("bad", Collections.singletonList("bad")).isPresent()); } @Test public void getDisplayValue() { assertEquals("Aeschylus", csvExportStrategy.getDisplayValue(authorInfo, "Aiskhulos")); } @Test public void getDisplayValueUnmappedValue() { assertEquals("Homer", csvExportStrategy.getDisplayValue(authorInfo, "Homer")); } @Test public void getDisplayValueNullValue() { assertNull(csvExportStrategy.getDisplayValue(authorInfo, null)); } @Test public void exportRecord() throws IOException { try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { csvExportStrategy.exportRecord(outputStream, Arrays.asList("simple", "", "with ,", "with , and \"")); assertThat(outputStream.toString().trim(), is("simple,,\"with ,\",\"with , and \"\"\"")); } } @Test public void combineNoValues() { assertThat(csvExportStrategy.combineValues(null), is("")); } @Test public void combineSingleValue() { assertThat(csvExportStrategy.combineValues(Collections.singletonList("Homer")), is("Homer")); } @Test public void combineMultipleValues() { assertThat(csvExportStrategy.combineValues(Arrays.asList("Homer", "Hesiod")), is("Homer, Hesiod")); } @Test public void getExportFormat() { assertThat(csvExportStrategy.getExportFormat(), is(ExportFormat.CSV)); } private static class ReferenceMetadataNode implements MetadataNode { @Override public String getDisplayName() { return "Reference"; } @Override public FieldType getFieldType() { return FieldType.STRING; } @Override public String getName() { return "reference"; } } }