package tutorial_1_server.testing;
import com.google.common.collect.Maps;
import com.google.guiceberry.GuiceBerryEnvMain;
import com.google.guiceberry.GuiceBerryModule;
import com.google.guiceberry.TestId;
import com.google.guiceberry.TestScoped;
import com.google.guiceberry.controllable.TestIdServerModule;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import tutorial_1_server.prod.PetStoreServer;
import tutorial_1_server.prod.Pet;
import java.util.Map;
public final class PetStoreEnv3CookiesOverride extends AbstractModule {
@Provides @Singleton
@PortNumber int getPortNumber() {
return FreePortFinder.findFreePort();
}
@Provides @TestScoped
WebDriver getWebDriver(@PortNumber int portNumber, TestId testId) {
WebDriver driver = new HtmlUnitDriver();
// !!! HERE !!!
driver.get("http://localhost:" + portNumber);
driver.manage().addCookie(new Cookie(TestId.COOKIE_NAME, testId.toString()));
return driver;
}
@Provides
@Singleton
PetStoreServer buildPetStoreServer(final PetStoreServerStarter starter,
@PortNumber int portNumber) {
PetStoreServer result = new PetStoreServer(portNumber) {
@Override
protected Module getPetStoreModule() {
return new PetStoreModuleWithTestIdBasedOverride(starter);
}
};
return result;
}
@Override
protected void configure() {
install(new GuiceBerryModule());
bind(GuiceBerryEnvMain.class).to(PetStoreServerStarter.class);
bind(PetStoreServerStarter.class).in(Scopes.SINGLETON);
}
private static final class PetStoreServerStarter implements GuiceBerryEnvMain {
@Inject
private Provider<PetStoreServer> petStoreServer;
Injector serverInjector;
public void run() {
// Starting a server should never be done in a @Provides method
// (or inside Provider's get).
serverInjector = petStoreServer.get().start();
}
}
public static final class PetStoreModuleWithTestIdBasedOverride
extends PetStoreServer.PetStoreModule {
public static final Map<TestId, Pet> override = Maps.newHashMap();
private PetStoreServerStarter starter;
public PetStoreModuleWithTestIdBasedOverride(PetStoreServerStarter starter) {
this.starter = starter;
}
// !!!HERE!!!!
@Override
protected Pet getFeaturedPet() {
TestId testId = starter.serverInjector.getInstance(TestId.class);
Pet featuredPetOverride = override.get(testId);
if (featuredPetOverride != null) {
return featuredPetOverride;
}
return calculateFeaturedPet();
}
@Override
protected void configure() {
super.configure();
install(new TestIdServerModule());
}
}
}