package com.rapidftr.task;
import com.rapidftr.CustomTestRunner;
import com.rapidftr.RapidFtrApplication;
import com.rapidftr.model.Child;
import com.rapidftr.model.User;
import com.rapidftr.repository.ChildRepository;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import java.io.IOException;
import java.util.List;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
@RunWith(CustomTestRunner.class)
public class MigrateUnverifiedDataToVerifiedTest {
private RapidFtrApplication application;
private User unverifiedUser;
private User verifiedUser;
@Before
public void setUp() throws IOException {
application = RapidFtrApplication.getApplicationInstance();
unverifiedUser = new User("username", "pass", false, null, User.UNAUTHENTICATED_DB_KEY, "tw", "user", "pass", "en");
verifiedUser = new User("username", "pass", true, null, "new_db_key", "tw", "user", "pass", "en");
application.setCurrentUser(unverifiedUser);
}
@Test
public void shouldMoveChildRecordsFromUnVerifiedDBToVerified() throws JSONException {
ChildRepository unverifiedChildRepo = mock(ChildRepository.class);
ChildRepository verifiedChildRepo = mock(ChildRepository.class);
List<Child> children = asList(new Child("1", unverifiedUser.getUserName(), "{\"name\":\"some content\"}"),
new Child("2", unverifiedUser.getUserName(), "{\"name\":\"some content\"}"),
new Child("3", unverifiedUser.getUserName(), "{\"name\":\"some content\"}"));
doReturn(children).when(unverifiedChildRepo).allCreatedByCurrentUser();
doNothing().when(verifiedChildRepo).createOrUpdate(children.get(0));
doNothing().when(verifiedChildRepo).createOrUpdate(children.get(1));
doNothing().when(verifiedChildRepo).createOrUpdate(children.get(2));
JSONObject mockJSONObject = mock(JSONObject.class);
doReturn(verifiedUser.getDbKey()).when(mockJSONObject).getString("db_key");
doReturn(verifiedUser.isVerified()).when(mockJSONObject).optBoolean("verified");
MigrateUnverifiedDataToVerified task = new MigrateUnverifiedDataToVerified(mockJSONObject, unverifiedUser, application);
task = spy(task);
doReturn(verifiedUser).when(task).getUserFromResponse();
doReturn(verifiedChildRepo).when(task).getChildRepo(verifiedUser);
doReturn(unverifiedChildRepo).when(task).getChildRepo(unverifiedUser);
task.doInBackground();
verify(unverifiedChildRepo).deleteChildrenByOwner();
verify(verifiedChildRepo).createOrUpdate(children.get(0));
verify(verifiedChildRepo).createOrUpdate(children.get(1));
verify(verifiedChildRepo).createOrUpdate(children.get(2));
}
@Test
public void shouldSetTheResponseDataToCurrentUser() throws JSONException {
JSONObject mockJSONObject = mock(JSONObject.class);
doReturn("DB_KEY_FROM_SERVER").when(mockJSONObject).getString("db_key");
doReturn(true).when(mockJSONObject).optBoolean("verified");
MigrateUnverifiedDataToVerified task = new MigrateUnverifiedDataToVerified(mockJSONObject, unverifiedUser, application);
task = spy(task);
doReturn(mock(ChildRepository.class)).when(task).getChildRepo(Matchers.<User>any());
task.doInBackground();
assertEquals("DB_KEY_FROM_SERVER", application.getCurrentUser().getDbKey());
assertEquals(true, application.getCurrentUser().isVerified());
}
}