package org.glucosio.android.tools;
import android.content.Context;
import android.content.res.Resources;
import android.os.Environment;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import org.glucosio.android.R;
import org.glucosio.android.db.GlucoseReading;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.internal.util.io.IOUtil;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import io.realm.Realm;
/**
* Created by david on 30/10/16.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ReadingToCSV.class, Realm.class, Environment.class})
public class ReadingToCSVTest {
private Context context;
private Realm realm;
private File tmpFolderForTesting;
private File glucosioFolder;
private FormatDateTime dateTool;
@Before
public void setUp() {
realm = mock(Realm.class);
context = mock(Context.class);
dateTool = new FormatDateTime(context);
final Resources resources = mock(Resources.class);
when(resources.getString(Matchers.anyInt())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return String.valueOf(invocation.getArguments()[0]);
}
});
when(context.getResources()).thenReturn(resources);
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
tmpFolderForTesting = new File(tmpDir, UUID.randomUUID().toString());
// Create the folder for glucosio
glucosioFolder = new File(tmpFolderForTesting, "glucosio");
glucosioFolder.mkdirs();
Assert.assertTrue(glucosioFolder.exists() && glucosioFolder.isDirectory());
mockStatic(Environment.class);
when(Environment.getExternalStorageDirectory()).thenReturn(tmpDir);
when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)).thenReturn(tmpFolderForTesting);
}
@After
public void clean() {
removeFolder(tmpFolderForTesting);
}
private void removeFolder(File folder) {
if (!folder.exists() || !folder.isDirectory()) {
return;
}
final File[] files = folder.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isDirectory()) {
removeFolder(f);
} else {
files[i].delete();
}
}
}
folder.delete();
}
@Test
public void whenNoDataGeneratesEmptyCSVWithHeader() throws IOException {
final ReadingToCSV r = createReadingToCSV("mg/dL");
final String path = r.createCSVFile(realm, new ArrayList<GlucoseReading>());
assertFileContentEqualsToString(path, headerAsString());
}
@Test
public void whenOneDataGeneratesCSVWithHeaderAndOneLine() throws IOException {
final Date created = new Date();
List<GlucoseReading> values = new ArrayList<>();
values.add(new GlucoseReading(80, "type", created, "notes"));
final ReadingToCSV r = createReadingToCSV("mg/dL");
final String path = r.createCSVFile(realm, values);
assertFileContentEqualsToString(path, headerAsString(), valuesAsString(values.get(0), "mg/dL"));
}
private ReadingToCSV createReadingToCSV(String um) {
return new ReadingToCSV(context, um);
}
private String headerAsString() {
return new StringBuilder().append(R.string.dialog_add_date)
.append(',')
.append(R.string.dialog_add_time)
.append(',')
.append(R.string.dialog_add_concentration)
.append(',')
.append(R.string.helloactivity_spinner_preferred_glucose_unit)
.append(',')
.append(R.string.dialog_add_measured)
.append(',')
.append(R.string.dialog_add_notes)
.toString();
}
private String valuesAsString(GlucoseReading reading, String units) {
return new StringBuilder().append(dateTool.convertRawDate(reading.getCreated()))
.append(',')
.append(dateTool.convertRawTime(reading.getCreated()))
.append(',')
.append(reading.getReading())
.append(',')
.append(units)
.append(',')
.append(reading.getReading_type())
.append(',')
.append(reading.getNotes())
.toString();
}
private void assertFileContentEqualsToString(String path, String... expectedValues) throws IOException {
Assert.assertNotNull(path);
final File file = new File(path);
Assert.assertTrue(file.exists() && file.isFile());
InputStream is = new FileInputStream(file);
try {
Collection<String> lines = IOUtil.readLines(is);
Assert.assertEquals(expectedValues.length, lines.size());
Iterator<String> iterator = lines.iterator();
for (int i = 0; i < lines.size(); i++) {
Assert.assertTrue(iterator.hasNext());
Assert.assertEquals(expectedValues[i], iterator.next());
}
} finally {
IOUtil.closeQuietly(is);
}
}
}