/**
* Copyright 2015 ArcBees Inc.
*
* 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 com.arcbees.gaestudio.server.service.visualizer;
import java.util.Iterator;
import javax.inject.Inject;
import org.jukito.JukitoModule;
import org.jukito.JukitoRunner;
import org.jukito.TestSingleton;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.arcbees.gaestudio.server.util.DatastoreCountProvider;
import com.arcbees.gaestudio.server.util.DevServerDatastoreCountProvider;
import com.arcbees.gaestudio.shared.DeleteEntities;
import com.arcbees.gaestudio.testutil.GaeTestBase;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@RunWith(JukitoRunner.class)
public class EntitiesServiceImplTest extends GaeTestBase {
public static class EntitiesServiceModule extends JukitoModule {
@Override
protected void configureTest() {
bind(EntitiesService.class).to(EntitiesServiceImpl.class).in(TestSingleton.class);
bind(DatastoreCountProvider.class).to(DevServerDatastoreCountProvider.class).in(TestSingleton.class);
}
}
private static final String ALL_NAMESPACES = null;
private static final String KIND_NAME = "FakeEntity";
private static final String PROPERTY_NAME = "property-name";
private static final String UNINDEXED_PROPERTY_NAME = "unindexed-property-name";
private static final String A_NAME = "a-name";
private static final String ANOTHER_NAME = "another-name";
private static final String A_NAMESPACE = "a-namespace";
private static final String DEFAULT_NAMESPACE = "";
@Inject
EntitiesService entitiesService;
@Test
public void getEntities_twoEntitiesStored_shouldReturnTwoEntities() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
Iterable<Entity> entities = entitiesService.getEntities(KIND_NAME, ALL_NAMESPACES, null, null);
// then
Iterator<Entity> it = entities.iterator();
Entity entity1 = it.next();
Entity entity2 = it.next();
assertEquals(A_NAME, entity1.getProperty(PROPERTY_NAME));
assertEquals(ANOTHER_NAME, entity2.getProperty(PROPERTY_NAME));
assertFalse(it.hasNext());
}
@Test
public void createEmptyEntity_entityStored_shouldReturnEmptyEntity()
throws EntityNotFoundException, InstantiationException, IllegalAccessException {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
// when
Entity entity = entitiesService.createEmptyEntity(KIND_NAME);
// then
assertNotNull(entity);
assertEquals(KIND_NAME, entity.getKind());
assertEquals("", entity.getProperty(PROPERTY_NAME));
}
@Test
public void createEmptyEntity_entityStored_shouldKeepIndexes()
throws EntityNotFoundException, InstantiationException, IllegalAccessException {
// given
createEntityWithMultipleProperties();
// when
Entity entity = entitiesService.createEmptyEntity(KIND_NAME);
// then
assertNotNull(entity);
assertEquals(KIND_NAME, entity.getKind());
assertEquals("", entity.getProperty(PROPERTY_NAME));
assertFalse(entity.isUnindexedProperty(PROPERTY_NAME));
assertEquals("", entity.getProperty(UNINDEXED_PROPERTY_NAME));
assertTrue(entity.isUnindexedProperty(UNINDEXED_PROPERTY_NAME));
}
@Test
public void deleteEntitiesByKind_twoEntitiesStored_shouldHaveNoMoreEntities() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
entitiesService.deleteEntities(KIND_NAME, null, DeleteEntities.KIND, null);
// then
assertEquals(0L, entitiesService.getCount(KIND_NAME, ALL_NAMESPACES));
}
@Test
public void deleteEntitiesByNamespace_twoEntitiesStored_shouldHaveOneMoreEntities() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInNamespace(A_NAMESPACE, KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
entitiesService.deleteEntities(null, "", DeleteEntities.NAMESPACE, null);
// then
assertEquals(1L, entitiesService.getCount(KIND_NAME, ALL_NAMESPACES));
}
@Test
public void getCount_withNamespace_shouldReturnOneEntity() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInNamespace(A_NAMESPACE, KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
long entityCount = entitiesService.getCount(KIND_NAME, A_NAMESPACE);
// then
assertEquals(1L, entityCount);
}
@Test
public void getCount_withDefaultNamespace_shouldReturnOneEntity() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInNamespace(A_NAMESPACE, KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
long entityCount = entitiesService.getCount(KIND_NAME, DEFAULT_NAMESPACE);
// then
assertEquals(1L, entityCount);
}
@Test
public void getCount_twoEntitiesStored_shouldReturnTwoEntities() {
// given
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, A_NAME);
createEntityInDatastore(KIND_NAME, PROPERTY_NAME, ANOTHER_NAME);
// when
long entityCount = entitiesService.getCount(KIND_NAME, ALL_NAMESPACES);
// then
assertEquals(2L, entityCount);
}
private void createEntityWithMultipleProperties() {
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
Entity entity = new Entity(KIND_NAME);
entity.setProperty(PROPERTY_NAME, A_NAME);
entity.setUnindexedProperty(UNINDEXED_PROPERTY_NAME, A_NAME);
datastoreService.put(entity);
}
}