package jj.document.servable;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static jj.server.ServerLocation.*;
import static jj.document.DocumentScriptEnvironment.*;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import jj.document.DocumentConfiguration;
import jj.document.DocumentScriptEnvironment;
import jj.document.ScriptResourceType;
import jj.document.servable.DocumentRequestProcessor;
import jj.document.servable.ScriptHelperDocumentFilter;
import jj.http.server.HttpServerRequest;
import jj.http.server.resource.StaticResource;
import jj.jjmessage.JJMessage;
import jj.resource.ResourceFinder;
import jj.script.module.ScriptResource;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ScriptHelperDocumentFilterTest {
static final String JQUERY_URI = "/" + JQUERY_JS;
static final String JJ_SHA = "be03b9352e1e254cae9a58cff2b20e0c8d513e47";
static final String JJ_URI = "/" + JJ_SHA + "/" + JJ_JS;
String scriptUri;
String clientScriptUri = "client script uri";
String sharedScriptUri = "shared script uri";
String socketUri;
String webSocketUri;
@Mock DocumentScriptEnvironment documentScriptEnvironment;
@Mock ScriptResource scriptResource;
@Mock HttpServerRequest httpRequest;
@Mock StaticResource jqueryJs;
@Mock StaticResource jjJs;
Document document;
@Mock DocumentRequestProcessor documentRequestProcessor;
@Mock DocumentConfiguration configuration;
@Mock ResourceFinder resourceFinder;
@InjectMocks ScriptHelperDocumentFilter filter;
@Before
public void before() {
scriptUri = "/" + JJ_SHA + "/index/blahblahblah";
socketUri = scriptUri + ".socket";
webSocketUri = "ws://localhost:8080" + socketUri;
given(documentScriptEnvironment.serverPath()).willReturn(scriptUri);
given(documentScriptEnvironment.socketUri()).willReturn(socketUri);
given(documentScriptEnvironment.hasServerScript()).willReturn(true);
given(documentRequestProcessor.documentScriptEnvironment()).willReturn(documentScriptEnvironment);
given(documentRequestProcessor.startupJJMessages()).willReturn(Collections.<JJMessage>emptyList());
given(httpRequest.host()).willReturn("localhost:8080");
document = Jsoup.parse("<html><head><title>what</title></head><body></body></html>");
given(documentRequestProcessor.document()).willReturn(document);
given(documentRequestProcessor.httpRequest()).willReturn(httpRequest);
given(resourceFinder.findResource(StaticResource.class, Assets, JQUERY_JS))
.willReturn(jqueryJs);
given(resourceFinder.findResource(StaticResource.class, Assets, JJ_JS))
.willReturn(jjJs);
given(jqueryJs.serverPath()).willReturn(JQUERY_URI);
given(jqueryJs.name()).willReturn(JQUERY_JS);
given(jjJs.sha1()).willReturn(JJ_SHA);
given(jjJs.serverPath()).willReturn(JJ_URI);
given(configuration.clientDebug()).willReturn(true);
}
@Test
public void testNothingIsAddedWhenThereIsNoServerScript() {
// given
given(documentScriptEnvironment.hasServerScript()).willReturn(false);
// when
filter.filter(documentRequestProcessor);
assertThat(document.select("script[type=text/javascript]").size(), is(0));
}
@Test
public void testClientAndSharedScriptsAddedWhenPresent() {
// given
given(documentScriptEnvironment.clientScriptResource()).willReturn(scriptResource);
given(documentScriptEnvironment.sharedScriptResource()).willReturn(scriptResource);
given(scriptResource.serverPath()).willReturn(sharedScriptUri, clientScriptUri);
// when
filter.filter(documentRequestProcessor);
// then
assertThat(document.select("script[type=text/javascript]").size(), is(4));
assertThat(document.select("script[src=" + JQUERY_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").attr("data-jj-socket-url"), is(webSocketUri));
assertThat(document.select("script[src=" + sharedScriptUri + "]").size(), is(1));
assertThat(document.select("script[src=" + clientScriptUri + "]").size(), is(1));
}
@Test
public void testClientScriptIsAddedWhenPresentAndSharedScriptIsAbsent() {
// given
given(documentScriptEnvironment.clientScriptResource()).willReturn(scriptResource);
given(scriptResource.serverPath()).willReturn(clientScriptUri);
// when
filter.filter(documentRequestProcessor);
// then
assertThat(document.select("script[type=text/javascript]").size(), is(3));
assertThat(document.select("script[src=" + JQUERY_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").attr("data-jj-socket-url"), is(webSocketUri));
assertThat(document.select("script[src=" + clientScriptUri + "]").size(), is(1));
}
@Test
public void testClientScriptIsAddedWhenAbsentAndSharedScriptIsPresent() {
// given
given(documentScriptEnvironment.sharedScriptResource()).willReturn(scriptResource);
given(scriptResource.serverPath()).willReturn(sharedScriptUri);
//when
filter.filter(documentRequestProcessor);
// then
assertThat(document.select("script[type=text/javascript]").size(), is(3));
assertThat(document.select("script[src=" + JQUERY_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").attr("data-jj-socket-url"), is(webSocketUri));
assertThat(document.select("script[src=" + sharedScriptUri + "]").size(), is(1));
}
@Test
public void testDefaultScriptsAreAddedWhenNothingIsPresent() {
// given our default state
// when
filter.filter(documentRequestProcessor);
//then
assertThat(document.select("script[type=text/javascript]").size(), is(2));
assertThat(document.select("script[src=" + JQUERY_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").size(), is(1));
assertThat(document.select("script[src=" + JJ_URI + "]").attr("data-jj-socket-url"), is(webSocketUri));
assertThat(document.select("script[src=" + ScriptResourceType.Client.suffix(scriptUri)+ "]").size(), is(0));
assertThat(document.select("script[src=" + ScriptResourceType.Shared.suffix(scriptUri) + "]").size(), is(0));
}
@Test
public void testMessagesAreAddedCorrectlyToTheScript() {
// given
List<JJMessage> messages = Arrays.asList(
JJMessage.makeBind("a.fancybox", "", "click"),
JJMessage.makeBind("a.fancyvideo", "", "click"),
JJMessage.makeBind("#chatbox", "", "enter")
);
given(documentRequestProcessor.startupJJMessages()).willReturn(messages);
filter = new ScriptHelperDocumentFilter(configuration, resourceFinder);
// when
filter.filter(documentRequestProcessor);
// then
assertThat(document.select("#jj-connector-script").attr("data-jj-startup-messages"), is(messages.toString()));
}
@Test
public void testDependencySetup() {
// given our default state
// when
filter.filter(documentRequestProcessor);
//then
verify(jjJs).addDependent(documentScriptEnvironment);
verify(jqueryJs).addDependent(documentScriptEnvironment);
}
}