/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.data;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Injector;
import org.junit.Before;
import org.junit.Test;
import org.mockito.internal.util.reflection.Whitebox;
import org.seedstack.seed.core.fixtures.data.TestDTO;
import org.seedstack.seed.core.fixtures.data.TestDTO2;
import org.seedstack.seed.core.fixtures.data.TestDataExporter;
import org.seedstack.seed.core.fixtures.data.TestDataExporter2;
import org.seedstack.seed.core.fixtures.data.TestDataImporter;
import org.seedstack.seed.core.fixtures.data.TestDataImporter2;
import org.skyscreamer.jsonassert.JSONAssert;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class DataManagerImplTest {
public static final String ACTUAL_JSON = "[{\"group\":\"group1\",\"name\":\"test1\",\"items\":[{\"firstName\":\"toto\",\"lastName\":\"titi\"},{\"firstName\":\"machin\",\"lastName\":\"truc\"}]},{\"group\":\"group1\",\"name\":\"test2\",\"items\":[{\"firstName\":\"toto2\",\"lastName\":\"titi2\",\"age\":12}]}]";
private TestDataImporter testDataImporter;
private TestDataImporter2 testDataImporter2;
private TestDataExporter testDataExporter;
private TestDataExporter2 testDataExporter2;
@Before
public void setup() {
testDataExporter = new TestDataExporter();
testDataExporter2 = new TestDataExporter2();
testDataImporter = new TestDataImporter();
testDataImporter2 = new TestDataImporter2();
}
@Test
public void data_are_exported_correctly() throws Exception {
DataManagerImpl underTest = createDataManager();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
underTest.exportData(byteArrayOutputStream, "group1");
JSONAssert.assertEquals(new String(byteArrayOutputStream.toByteArray(), "UTF-8"), ACTUAL_JSON, false);
}
@Test
public void full_data_export_is_working_correctly() throws Exception {
DataManagerImpl underTest = createDataManager();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream();
underTest.exportData(byteArrayOutputStream, "group1");
underTest.exportData(byteArrayOutputStream2);
assertThat(byteArrayOutputStream.toByteArray()).isEqualTo(byteArrayOutputStream2.toByteArray());
}
@Test
public void data_are_imported_correctly() throws Exception {
DataManagerImpl underTest = createDataManager();
underTest.importData(new ByteArrayInputStream(ACTUAL_JSON.getBytes(Charset.forName("UTF-8"))), null, null, true);
assertThat(TestDataImporter.getData().size()).isEqualTo(2);
assertThat(TestDataImporter.getData().get(0).getFirstName()).isEqualTo("toto");
assertThat(TestDataImporter.getData().get(0).getLastName()).isEqualTo("titi");
assertThat(TestDataImporter.getData().get(1).getFirstName()).isEqualTo("machin");
assertThat(TestDataImporter.getData().get(1).getLastName()).isEqualTo("truc");
assertThat(TestDataImporter2.getData().size()).isEqualTo(1);
assertThat(TestDataImporter2.getData().get(0).getFirstName()).isEqualTo("toto2");
assertThat(TestDataImporter2.getData().get(0).getLastName()).isEqualTo("titi2");
}
private Injector mockInjector() {
Injector injector = mock(Injector.class);
when(injector.getInstance(TestDataExporter.class)).thenReturn(testDataExporter);
when(injector.getInstance(TestDataExporter2.class)).thenReturn(testDataExporter2);
when(injector.getInstance(TestDataImporter2.class)).thenReturn(testDataImporter2);
when(injector.getInstance(TestDataImporter.class)).thenReturn(testDataImporter);
return injector;
}
private DataManagerImpl createDataManager() {
DataManagerImpl yamlDataService = new DataManagerImpl();
Whitebox.setInternalState(yamlDataService, "injector", mockInjector());
Whitebox.setInternalState(yamlDataService, "allDataExporters", ImmutableMap.of("group1", ImmutableMap.of("test1", new DataExporterDefinition<>("test1", "group1", TestDTO.class, TestDataExporter.class), "test2", new DataExporterDefinition<>("test2", "group1", TestDTO2.class, TestDataExporter2.class))));
Whitebox.setInternalState(yamlDataService, "allDataImporters", ImmutableMap.of("group1", ImmutableMap.of("test1", new DataImporterDefinition<>("test1", "group1", TestDTO.class, TestDataImporter.class), "test2", new DataImporterDefinition<>("test2", "group1", TestDTO2.class, TestDataImporter2.class))));
return yamlDataService;
}
}