package org.webpieces.router.api.simplesvr;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.webpieces.compiler.api.CompileConfig;
import org.webpieces.ctx.api.Current;
import org.webpieces.ctx.api.HttpMethod;
import org.webpieces.ctx.api.RequestContext;
import org.webpieces.ctx.api.RouterRequest;
import org.webpieces.devrouter.api.DevRouterFactory;
import org.webpieces.router.api.RouterConfig;
import org.webpieces.router.api.RouterService;
import org.webpieces.router.api.RouterSvcFactory;
import org.webpieces.router.api.dto.RedirectResponse;
import org.webpieces.router.api.mocks.MockResponseStream;
import org.webpieces.router.api.mocks.VirtualFileInputStream;
import org.webpieces.router.impl.ctx.FlashImpl;
import org.webpieces.router.impl.ctx.SessionImpl;
import org.webpieces.router.impl.ctx.ValidationImpl;
import org.webpieces.util.file.VirtualFile;
import org.webpieces.util.file.VirtualFileImpl;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
import org.webpieces.util.security.SecretKeyInfo;
import com.google.inject.Binder;
import com.google.inject.Module;
@RunWith(Parameterized.class)
public class TestSimpleRoutes {
private static final Logger log = LoggerFactory.getLogger(TestSimpleRoutes.class);
private RouterService server;
@SuppressWarnings("rawtypes")
@Parameterized.Parameters
public static Collection bothServers() {
String moduleFileContents = AppModules.class.getName();
VirtualFile f = new VirtualFileInputStream(moduleFileContents.getBytes(), "testAppModules");
TestModule module = new TestModule();
RouterConfig config = new RouterConfig()
.setMetaFile(f)
.setWebappOverrides(module)
.setSecretKey(SecretKeyInfo.generateForTest());
RouterService prodSvc = RouterSvcFactory.create(config);
//for dev must be null
config.setWebappOverrides(null);
String filePath = System.getProperty("user.dir");
File myCodePath = new File(filePath + "/src/test/java");
CompileConfig compileConfig = new CompileConfig(new VirtualFileImpl(myCodePath));
RouterService devSvc = DevRouterFactory.create(config, compileConfig);
return Arrays.asList(new Object[][] {
{ prodSvc, module },
{ devSvc, module }
});
}
private static class TestModule implements Module {
public MockSomeService mockService = new MockSomeService();
@Override
public void configure(Binder binder) {
binder.bind(SomeService.class).toInstance(mockService);
}
}
public TestSimpleRoutes(RouterService svc, TestModule module) {
this.server = svc;
log.info("constructing test class for server="+svc.getClass().getSimpleName());
}
@Before
public void setUp() {
server.start();
}
@Test
public void testBasicRoute() {
RouterRequest req = createHttpRequest(HttpMethod.GET, "/something");
MockResponseStream mockResponseStream = new MockResponseStream();
Current.setContext(new RequestContext(new ValidationImpl(null), new FlashImpl(null), new SessionImpl(null), req));
server.incomingCompleteRequest(req, mockResponseStream);
List<RedirectResponse> responses = mockResponseStream.getSendRedirectCalledList();
Assert.assertEquals(1, responses.size());
RedirectResponse response = responses.get(0);
Assert.assertEquals(req.domain, response.domain);
Assert.assertFalse(response.isHttps);
Assert.assertEquals("/something", response.redirectToPath);
}
@Test
public void testOneParamRoute() {
RouterRequest req = createHttpRequest(HttpMethod.POST, "/meeting");
MockResponseStream mockResponseStream = new MockResponseStream();
Current.setContext(new RequestContext(new ValidationImpl(null), new FlashImpl(null), new SessionImpl(null), req));
server.incomingCompleteRequest(req, mockResponseStream);
List<RedirectResponse> responses = mockResponseStream.getSendRedirectCalledList();
Assert.assertEquals(1, responses.size());
RedirectResponse response = responses.get(0);
Assert.assertEquals(req.domain, response.domain);
Assert.assertFalse(response.isHttps);
Assert.assertEquals("/meeting/888", response.redirectToPath);
}
private RouterRequest createHttpRequest(HttpMethod method, String path) {
RouterRequest r = new RouterRequest();
r.method = method;
r.relativePath = path;
return r;
}
}