/**
* Copyright 2009-2016 the original author or authors.
*
* 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.apache.ibatis.type;
import org.apache.ibatis.BaseDataTest;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import javax.sql.DataSource;
import java.io.*;
import java.sql.Blob;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Tests for {@link BlobInputStreamTypeHandler}.
*
* @since 3.4.0
* @author Kazuki Shimizu
*/
public class BlobInputStreamTypeHandlerTest extends BaseTypeHandlerTest {
private static final TypeHandler<InputStream> TYPE_HANDLER = new BlobInputStreamTypeHandler();
private static SqlSessionFactory sqlSessionFactory;
@Mock
protected Blob blob;
@BeforeClass
public static void setupSqlSessionFactory() throws Exception {
DataSource dataSource = BaseDataTest.createUnpooledDataSource("org/apache/ibatis/type/jdbc.properties");
BaseDataTest.runScript(dataSource, "org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("Production", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(Mapper.class);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
}
@Override
@Test
public void shouldSetParameter() throws Exception {
InputStream in = new ByteArrayInputStream("Hello".getBytes());
TYPE_HANDLER.setParameter(ps, 1, in, null);
verify(ps).setBlob(1, in);
}
@Override
@Test
public void shouldGetResultFromResultSetByName() throws Exception {
InputStream in = new ByteArrayInputStream("Hello".getBytes());
when(rs.getBlob("column")).thenReturn(blob);
when(rs.wasNull()).thenReturn(false);
when(blob.getBinaryStream()).thenReturn(in);
assertThat(TYPE_HANDLER.getResult(rs, "column")).isEqualTo(in);
}
@Override
@Test
public void shouldGetResultNullFromResultSetByName() throws Exception {
when(rs.getBlob("column")).thenReturn(null);
when(rs.wasNull()).thenReturn(true);
assertThat(TYPE_HANDLER.getResult(rs, "column")).isNull();
}
@Override
@Test
public void shouldGetResultFromResultSetByPosition() throws Exception {
InputStream in = new ByteArrayInputStream("Hello".getBytes());
when(rs.getBlob(1)).thenReturn(blob);
when(rs.wasNull()).thenReturn(false);
when(blob.getBinaryStream()).thenReturn(in);
assertThat(TYPE_HANDLER.getResult(rs, 1)).isEqualTo(in);
}
@Override
@Test
public void shouldGetResultNullFromResultSetByPosition() throws Exception {
when(rs.getBlob(1)).thenReturn(null);
when(rs.wasNull()).thenReturn(true);
assertThat(TYPE_HANDLER.getResult(rs, 1)).isNull();
}
@Override
@Test
public void shouldGetResultFromCallableStatement() throws Exception {
InputStream in = new ByteArrayInputStream("Hello".getBytes());
when(cs.getBlob(1)).thenReturn(blob);
when(cs.wasNull()).thenReturn(false);
when(blob.getBinaryStream()).thenReturn(in);
assertThat(TYPE_HANDLER.getResult(cs, 1)).isEqualTo(in);
}
@Override
@Test
public void shouldGetResultNullFromCallableStatement() throws Exception {
when(cs.getBlob(1)).thenReturn(null);
when(cs.wasNull()).thenReturn(true);
assertThat(TYPE_HANDLER.getResult(cs, 1)).isNull();
}
@Test
public void integrationTest() throws IOException {
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(Mapper.class);
// insert (InputStream -> Blob)
{
BlobContent blobContent = new BlobContent();
blobContent.setId(1);
blobContent.setContent(new ByteArrayInputStream("Hello".getBytes()));
mapper.insert(blobContent);
session.commit();
}
// select (Blob -> InputStream)
{
BlobContent blobContent = mapper.findOne(1);
assertThat(new BufferedReader(new InputStreamReader(blobContent.getContent())).readLine()).isEqualTo("Hello");
}
} finally {
session.close();
}
}
interface Mapper {
@Select("SELECT ID, CONTENT FROM TEST_BLOB WHERE ID = #{id}")
BlobContent findOne(int id);
@Insert("INSERT INTO TEST_BLOB (ID, CONTENT) VALUES(#{id}, #{content})")
void insert(BlobContent blobContent);
}
static class BlobContent {
private int id;
private InputStream content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public InputStream getContent() {
return content;
}
public void setContent(InputStream content) {
this.content = content;
}
}
}