/*
* Copyright 2011, Unitils.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.unitils.io.filecontent.impl;
import org.junit.Before;
import org.junit.Test;
import org.unitils.UnitilsJUnit4;
import org.unitils.core.UnitilsException;
import org.unitils.io.conversion.ConversionStrategy;
import org.unitils.io.reader.ReadingStrategy;
import org.unitils.mock.Mock;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
/**
* @author Jeroen Horemans
* @author Tim Ducheyne
* @since 3.3
*/
public class DefaultFileContentReaderTest extends UnitilsJUnit4 {
/* Tested object */
private DefaultFileContentReader defaultFileContentReader;
private Mock<ReadingStrategy> readingStrategyMock;
private Mock<ConversionStrategy<?>> stringConversionStrategyMock;
private Mock<ConversionStrategy<?>> mapConversionStrategyMock;
private Mock<InputStream> inputStreamMock;
@Before
public void initialize() throws Exception {
List<ConversionStrategy<?>> conversionStrategies = new ArrayList<ConversionStrategy<?>>();
conversionStrategies.add(stringConversionStrategyMock.getMock());
conversionStrategies.add(mapConversionStrategyMock.getMock());
defaultFileContentReader = new DefaultFileContentReader(readingStrategyMock.getMock(), conversionStrategies, "defaultEncoding");
stringConversionStrategyMock.returns(String.class).getTargetType();
mapConversionStrategyMock.returns(Map.class).getTargetType();
readingStrategyMock.returns(inputStreamMock).getInputStream("fileName", DefaultFileContentReader.class);
}
@Test
public void firstConversionStrategyHasTargetType() throws Exception {
stringConversionStrategyMock.returns("resultString").convertContent(inputStreamMock.getMock(), "utf-8");
String result = defaultFileContentReader.readFileContent("fileName", String.class, "utf-8", DefaultFileContentReader.class);
assertEquals("resultString", result);
inputStreamMock.assertInvoked().close();
}
@Test
public void secondConversionStrategyHasTargetType() throws Exception {
Map<String, String> map = new HashMap<String, String>();
mapConversionStrategyMock.returns(map).convertContent(inputStreamMock.getMock(), "utf-8");
Map result = defaultFileContentReader.readFileContent("fileName", Map.class, "utf-8", DefaultFileContentReader.class);
assertSame(map, result);
}
@Test
public void conversionStrategyHasAssignableTargetType() throws Exception {
Properties properties = new Properties();
mapConversionStrategyMock.returns(properties).convertContent(inputStreamMock.getMock(), "utf-8");
Properties result = defaultFileContentReader.readFileContent("fileName", Properties.class, "utf-8", DefaultFileContentReader.class);
assertSame(properties, result);
}
@Test(expected = UnitilsException.class)
public void noConversionStrategyFoundForTargetType() throws Exception {
defaultFileContentReader.readFileContent("fileName", Set.class, "utf-8", DefaultFileContentReader.class);
}
@Test
public void useDefaultEncodingWhenEncodingIsNull() throws Exception {
stringConversionStrategyMock.returns("resultString").convertContent(inputStreamMock.getMock(), "defaultEncoding");
String result = defaultFileContentReader.readFileContent("fileName", String.class, null, DefaultFileContentReader.class);
assertEquals("resultString", result);
}
@Test
public void useDefaultFileNameIfFileNameIsNull() throws Exception {
stringConversionStrategyMock.returns("extension").getDefaultFileExtension();
readingStrategyMock.returns(inputStreamMock).getDefaultInputStream("extension", DefaultFileContentReader.class);
stringConversionStrategyMock.returns("resultString").convertContent(inputStreamMock.getMock(), "utf-8");
String result = defaultFileContentReader.readFileContent(null, String.class, "utf-8", DefaultFileContentReader.class);
assertEquals("resultString", result);
}
@Test(expected = UnitilsException.class)
public void exceptionDuringReading() throws Exception {
readingStrategyMock.onceRaises(UnsupportedEncodingException.class).getInputStream("fileName", DefaultFileContentReader.class);
defaultFileContentReader.readFileContent("fileName", String.class, "utf-8", DefaultFileContentReader.class);
}
@Test(expected = UnitilsException.class)
public void exceptionDuringConversion() throws Exception {
stringConversionStrategyMock.onceRaises(ClassCastException.class).convertContent(inputStreamMock.getMock(), "utf-8");
defaultFileContentReader.readFileContent("fileName", String.class, "utf-8", DefaultFileContentReader.class);
}
}