/*
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.parse;
import org.junit.After;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import bolts.Task;
import static org.junit.Assert.assertTrue;
public class OfflineQueryControllerTest {
@After
public void tearDown() {
Parse.disableLocalDatastore();
}
@Test
public void testFindFromNetwork() {
TestNetworkQueryController networkController = new TestNetworkQueryController();
OfflineQueryController controller = new OfflineQueryController(null, networkController);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.build();
controller.findAsync(state, null, null);
networkController.verifyFind();
}
@Test
public void testCountFromNetwork() {
TestNetworkQueryController networkController = new TestNetworkQueryController();
OfflineQueryController controller = new OfflineQueryController(null, networkController);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.build();
controller.countAsync(state, null, null);
networkController.verifyCount();
}
@Test
public void testGetFromNetwork() {
TestNetworkQueryController networkController = new TestNetworkQueryController();
OfflineQueryController controller = new OfflineQueryController(null, networkController);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.build();
controller.getFirstAsync(state, null, null);
networkController.verifyFind();
}
@Test
public void testFindFromLDS() {
Parse.enableLocalDatastore(null);
TestOfflineStore offlineStore = new TestOfflineStore();
OfflineQueryController controller = new OfflineQueryController(offlineStore, null);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.fromLocalDatastore()
.build();
controller.findAsync(state, null, null);
offlineStore.verifyFind();
}
@Test
public void testCountFromLDS() {
Parse.enableLocalDatastore(null);
TestOfflineStore offlineStore = new TestOfflineStore();
OfflineQueryController controller = new OfflineQueryController(offlineStore, null);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.fromLocalDatastore()
.build();
controller.countAsync(state, null, null);
offlineStore.verifyCount();
}
@Test
public void testGetFromLDS() {
Parse.enableLocalDatastore(null);
TestOfflineStore offlineStore = new TestOfflineStore();
OfflineQueryController controller = new OfflineQueryController(offlineStore, null);
ParseQuery.State<ParseObject> state = new ParseQuery.State.Builder<>("TestObject")
.fromLocalDatastore()
.build();
controller.getFirstAsync(state, null, null);
offlineStore.verifyFind();
}
private static class TestOfflineStore extends OfflineStore {
private AtomicBoolean findCalled = new AtomicBoolean();
private AtomicBoolean countCalled = new AtomicBoolean();
TestOfflineStore() {
super((OfflineSQLiteOpenHelper) null);
}
@Override
<T extends ParseObject> Task<List<T>> findFromPinAsync(
String name, ParseQuery.State<T> state, ParseUser user) {
findCalled.set(true);
return Task.forResult(null);
}
@Override
<T extends ParseObject> Task<Integer> countFromPinAsync(
String name, ParseQuery.State<T> state, ParseUser user) {
countCalled.set(true);
return Task.forResult(null);
}
public void verifyFind() {
assertTrue(findCalled.get());
}
public void verifyCount() {
assertTrue(countCalled.get());
}
}
private static class TestNetworkQueryController implements ParseQueryController {
private AtomicBoolean findCalled = new AtomicBoolean();
private AtomicBoolean countCalled = new AtomicBoolean();
@Override
public <T extends ParseObject> Task<List<T>> findAsync(
ParseQuery.State<T> state, ParseUser user, Task<Void> cancellationToken) {
findCalled.set(true);
return Task.forResult(null);
}
@Override
public <T extends ParseObject> Task<Integer> countAsync(
ParseQuery.State<T> state, ParseUser user, Task<Void> cancellationToken) {
countCalled.set(true);
return Task.forResult(null);
}
@Override
public <T extends ParseObject> Task<T> getFirstAsync(
ParseQuery.State<T> state, ParseUser user, Task<Void> cancellationToken) {
throw new IllegalStateException("Should not be called");
}
public void verifyFind() {
assertTrue(findCalled.get());
}
public void verifyCount() {
assertTrue(countCalled.get());
}
}
}