package com.mindflakes.TeamRED.tests;
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.Query;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.vercer.engine.persist.annotation.AnnotationObjectDatastore;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Iterator;
import com.mindflakes.TeamRED.UCSBScrape.RemoteUCSBMenuFile;
import com.mindflakes.TeamRED.UCSBScrape.UCSBJMenuScraper;
import com.mindflakes.TeamRED.utils.*;
import com.mindflakes.TeamRED.menuClasses.*;
import com.vercer.engine.persist.annotation.AnnotationObjectDatastore;
import static com.google.appengine.api.datastore.Query.FilterOperator.*;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class DatastoreRetrievingTest {
private final LocalServiceTestHelper helper =
new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
private AnnotationObjectDatastore datastore;
private static ArrayList<UCSBJMenuScraper> scrapers;
@BeforeClass
public static void oneTimeSetUp() {
scrapers=new ArrayList<UCSBJMenuScraper>();
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.CARRILLO_THIS_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.CARRILLO_NEXT_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.DLG_THIS_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.DLG_NEXT_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.ORTEGA_THIS_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.ORTEGA_NEXT_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.PORTOLA_THIS_WEEK)));
scrapers.add(new UCSBJMenuScraper(new RemoteUCSBMenuFile(RemoteUCSBMenuFile.PORTOLA_NEXT_WEEK)));
}
@Before
public void setUp() {
helper.setUp();
datastore = new AnnotationObjectDatastore(DatastoreServiceFactory.getDatastoreService());
}
public void addMenus(){
for(UCSBJMenuScraper scraper : scrapers){
for(MealMenu menu : scraper.getMenus()){
datastore.store(menu);
}
}
}
@After
public void tearDown() {
helper.tearDown();
}
// run this test twice to prove we're not leaking any state across tests
private void doTest() {
assertFalse(datastore.find().type(MealMenu.class).returnResultsNow().hasNext());
addMenus();
Iterator<MealMenu> it = datastore.find().type(MealMenu.class).returnResultsNow();
assertTrue(it.hasNext());
while(it.hasNext()){
MealMenu current = it.next();
assertTrue(current!=null);
assertTrue(current.getVenues()!=null);
for(Venue v:current.getVenues()){
assertTrue(v!=null);
assertTrue(v.getFoodItems()!=null);
for(FoodItem food:v.getFoodItems())
assertTrue(food!=null);
}
boolean isInScraper = false;
for(UCSBJMenuScraper scraper : scrapers){
for(MealMenu menu : scraper.getMenus()){
if(current==menu){
isInScraper=true;
break;
}
}
}
assertTrue(isInScraper);
}
}
@Test
public void testInsert1() {
doTest();
}
@Test
public void testInsert2() {
doTest();
}
@Test
public void testSearch(){
assertFalse(datastore.find().type(MealMenu.class).returnResultsNow().hasNext());
addMenus();
Iterator<MealMenu> it = datastore.find().type(MealMenu.class).returnResultsNow();
assertTrue(it.hasNext());
try{
DateTime time = new DateTime(DateTimeZone.forID("America/Los_Angeles"));
Iterator<MealMenu> future_menu = datastore.find()
.type(MealMenu.class)
.addFilter("endMillis",
com.google.appengine.api.datastore.Query.FilterOperator.GREATER_THAN_OR_EQUAL, time.getMillis())
.addSort("endMillis")
.returnResultsNow();
int count=0;
while(future_menu.hasNext()){
future_menu.next();
count++;
}
System.out.println(count);
} catch(IllegalStateException e){
assertTrue(false);
}
}
}